diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000000..f42d602ac3 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,4 @@ +# Ignore composer specific files and vendor folder +composer.phar +composer.lock +vendor diff --git a/.env.docker b/.env.docker index 69765bff51..e8d5405cbd 100644 --- a/.env.docker +++ b/.env.docker @@ -1,7 +1,6 @@ APP_ENV=${FF_APP_ENV} APP_DEBUG=false -APP_FORCE_SSL=false -APP_FORCE_ROOT= +APP_NAME=FireflyIII APP_KEY=${FF_APP_KEY} APP_LOG=daily APP_LOG_LEVEL=warning @@ -28,7 +27,7 @@ REDIS_PASSWORD=null REDIS_PORT=6379 MAIL_DRIVER=smtp -MAIL_HOST=mailtrap.io +MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 MAIL_FROM=changeme@example.com MAIL_USERNAME=null @@ -41,6 +40,8 @@ SHOW_INCOMPLETE_TRANSLATIONS=false CACHE_PREFIX=firefly +EXCHANGE_RATE_SERVICE=fixerio + GOOGLE_MAPS_API_KEY= ANALYTICS_ID= SITE_OWNER=mail@example.com @@ -48,7 +49,7 @@ USE_ENCRYPTION=true PUSHER_KEY= PUSHER_SECRET= -PUSHER_APP_ID= +PUSHER_ID= DEMO_USERNAME= DEMO_PASSWORD= diff --git a/.env.example b/.env.example old mode 100755 new mode 100644 index 9a28c9f373..acf43299bf --- a/.env.example +++ b/.env.example @@ -1,7 +1,6 @@ APP_ENV=production APP_DEBUG=false -APP_FORCE_SSL=false -APP_FORCE_ROOT= +APP_NAME=FireflyIII APP_KEY=SomeRandomStringOf32CharsExactly APP_LOG=daily APP_LOG_LEVEL=warning @@ -28,7 +27,7 @@ REDIS_PASSWORD=null REDIS_PORT=6379 MAIL_DRIVER=smtp -MAIL_HOST=mailtrap.io +MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 MAIL_FROM=changeme@example.com MAIL_USERNAME=null @@ -50,7 +49,7 @@ USE_ENCRYPTION=true PUSHER_KEY= PUSHER_SECRET= -PUSHER_APP_ID= +PUSHER_ID= DEMO_USERNAME= DEMO_PASSWORD= diff --git a/.env.sandstorm b/.env.sandstorm index ed8d9d511b..77d1aec95c 100755 --- a/.env.sandstorm +++ b/.env.sandstorm @@ -1,7 +1,6 @@ APP_ENV=production APP_DEBUG=true -APP_FORCE_SSL=false -APP_FORCE_ROOT= +APP_NAME=FireflyIII APP_KEY=SomeRandomStringOf32CharsExactly APP_LOG=syslog APP_LOG_LEVEL=debug @@ -28,7 +27,7 @@ REDIS_PASSWORD=null REDIS_PORT=6379 MAIL_DRIVER=smtp -MAIL_HOST=mailtrap.io +MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 MAIL_FROM=changeme@example.com MAIL_USERNAME=null @@ -41,6 +40,8 @@ SHOW_INCOMPLETE_TRANSLATIONS=false CACHE_PREFIX=firefly +EXCHANGE_RATE_SERVICE=fixerio + GOOGLE_MAPS_API_KEY= ANALYTICS_ID= SITE_OWNER=mail@example.com @@ -48,8 +49,7 @@ USE_ENCRYPTION=true PUSHER_KEY= PUSHER_SECRET= -PUSHER_APP_ID= +PUSHER_ID= DEMO_USERNAME= DEMO_PASSWORD= - diff --git a/.env.testing b/.env.testing old mode 100755 new mode 100644 index 2cafd4c2f8..4d67254078 --- a/.env.testing +++ b/.env.testing @@ -1,7 +1,6 @@ APP_ENV=testing APP_DEBUG=true -APP_FORCE_SSL=false -APP_FORCE_ROOT= +APP_NAME=FireflyIII APP_KEY=TestTestTestTestTestTestTestTest APP_LOG=daily APP_LOG_LEVEL=debug @@ -11,7 +10,7 @@ DB_CONNECTION=sqlite DB_HOST=127.0.0.1 DB_PORT=3306 DB_USERNAME=homestead -DB_PASSWORD=secret +DB_PASSWORD= BROADCAST_DRIVER=log CACHE_DRIVER=file @@ -26,8 +25,8 @@ REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 -MAIL_DRIVER=log -MAIL_HOST=mailtrap.io +MAIL_DRIVER=smtp +MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 MAIL_FROM=changeme@example.com MAIL_USERNAME=null @@ -38,9 +37,19 @@ SEND_REGISTRATION_MAIL=true SEND_ERROR_MESSAGE=true SHOW_INCOMPLETE_TRANSLATIONS=false +CACHE_PREFIX=firefly + +EXCHANGE_RATE_SERVICE=fixerio + +GOOGLE_MAPS_API_KEY= ANALYTICS_ID= SITE_OWNER=mail@example.com +USE_ENCRYPTION=true PUSHER_KEY= PUSHER_SECRET= -PUSHER_APP_ID= +PUSHER_ID= + +DEMO_USERNAME= +DEMO_PASSWORD= + diff --git a/.gitattributes b/.gitattributes old mode 100755 new mode 100644 index a8763f8ef5..967315dd3d --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,5 @@ * text=auto *.css linguist-vendored *.scss linguist-vendored +*.js linguist-vendored +CHANGELOG.md export-ignore diff --git a/.gitignore b/.gitignore old mode 100755 new mode 100644 index d4cfc0d4fb..e8992ef3ee --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,14 @@ /node_modules +/public/hot /public/storage +/storage/*.key /vendor +/.vagrant Homestead.json Homestead.yaml +npm-debug.log +yarn-error.log .env public/google*.html report.html +composer.phar diff --git a/CHANGELOG.md b/CHANGELOG.md index 6849b2014b..fcfd509534 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,45 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## [4.6.6] - 2015-05-25 +### Added +- #826, reported by @pkoziol. +- #855, by @ms32035 +- #786, by @SmilingWorlock +- #875, by @gavu +- #834, by @gavu (and others) + + +### Changed +- Upgraded to Laravel 5.5 +- Add version parameter to CSS and JS files +- #823, #824 fixed Docker config by @DieBauer + +### Fixed +- #830 +- #822, reported by @gazben +- #827, reported by @pkoziol +- #835, reported by @gavu +- #836, reported by @pkoziol +- #838, reported by @gavu +- #839, reported by @gavu +- #843, reported by @gavu +- #837, reported by @gavu +- #845, reported by @gavu +- #846, reported by @gavu +- #848, reported by @gavu +- #854, reported by @gavu +- #866, reported by @pkoziol +- #847, reported by @gavu +- #853, reported by @gavu +- #857, reported by @pkoziol +- #865, reported by @simonsmiley +- #826, reported by @pkoziol +- #856, reported by @ms32035 +- #860, reported by @gavu +- #861, reported by @gavu +- #870, reported by @gavu + ## [4.6.5] - 2017-09-09 ### Added diff --git a/Dockerfile b/Dockerfile index 792f7b2c8d..a77bb0928c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,18 +23,31 @@ RUN docker-php-ext-install -j$(nproc) curl gd intl json mcrypt readline tidy zip # Generate locales supported by firefly RUN echo "en_US.UTF-8 UTF-8\nde_DE.UTF-8 UTF-8\nnl_NL.UTF-8 UTF-8\npt_BR.UTF-8 UTF-8" > /etc/locale.gen && locale-gen -COPY docker/apache2.conf /etc/apache2/apache2.conf +COPY ./docker/apache2.conf /etc/apache2/apache2.conf + # Enable apache mod rewrite.. RUN a2enmod rewrite +# Enable apache mod ssl.. +RUN a2enmod ssl + # Setup the Composer installer -run curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer +RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer -RUN cd /var/www && composer create-project grumpydictator/firefly-iii --no-dev --prefer-dist firefly-iii 4.6.4 -COPY docker/entrypoint.sh /var/www/firefly-iii/docker/entrypoint.sh -ADD docker/apache-firefly.conf /etc/apache2/sites-available/000-default.conf -RUN chown -R www-data:www-data /var/www && chmod -R 775 /var/www/firefly-iii/storage +# Copy Apache Configs +COPY ./docker/apache-firefly.conf /etc/apache2/sites-available/000-default.conf + +ENV FIREFLY_PATH /var/www/firefly-iii + +WORKDIR $FIREFLY_PATH + +# The working directory +COPY . $FIREFLY_PATH + +RUN chown -R www-data:www-data /var/www && chmod -R 775 $FIREFLY_PATH/storage + +RUN composer install --prefer-dist --no-dev --no-scripts -WORKDIR /var/www/firefly-iii EXPOSE 80 -ENTRYPOINT ["/var/www/firefly-iii/docker/entrypoint.sh"] + +ENTRYPOINT ["docker/entrypoint.sh"] diff --git a/README.md b/README.md index b962d6bc54..c618f2ce6f 100644 --- a/README.md +++ b/README.md @@ -6,21 +6,31 @@ [![The useful financial reports of Firefly III](https://i.nder.be/h7sk6nb7/400)](https://i.nder.be/ccn0u2mp) [![Even more useful reports in Firefly III](https://i.nder.be/g237hr35/400)](https://i.nder.be/gm8hbh7z) -"Firefly III" is a financial manager. It can help you keep track of expenses, income, budgets and everything in between. It even supports credit cards, shared household accounts and savings accounts! It's pretty fancy. You should use it to save and organise money. +"Firefly III" is a financial manager for your personal finances. +It can help you keep track of your expenses and income. +Firefly III supports the use of budgets. You can categorize and tag your transactions. +It also supports credit cards, shared household accounts and savings accounts. +There are many financial reports available. ## Try it out! [![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/firefly-iii/firefly-iii/tree/master) -Firefly III can be run on Heroku. Register for a free Heroku account and instantly run Firefly III on your very own cloud instance. There is also a [demo site](https://firefly-iii.nder.be) with an example financial administration already present. +Firefly III can be run on Heroku. +Register for a free Heroku account and instantly run Firefly III on your very own cloud instance. +There is also a [demo site](https://firefly-iii.nder.be) with an example financial administration already present. ## Getting started -To install Firefly III, you'll need a web server (preferrably on Linux) and access to the command line. Then, please read the [installation guide](https://firefly-iii.github.io/using-installing.html). +To install Firefly III, you'll need a web server (preferrably on Linux) and access to the command line. +Then, please read the [installation guide](https://firefly-iii.github.io/using-installing.html). +At the moment, installation is fairly complex. I hope to improve this in the future. If you need support, please open a ticket. ## More about Firefly III -Personal financial management is pretty difficult, and everybody has their own approach to it. Some people make budgets, other people limit their cashflow by throwing away their credit cards, others try to increase their current cashflow. There are tons of ways to save and earn money. +Personal financial management is pretty difficult, and everybody has their own approach to it. +Some people make budgets, other people limit their cashflow by throwing away their credit cards, +others try to increase their current cashflow. There are tons of ways to save and earn money. Firefly works on the principle that if you know where you're money is going, you can stop it from going there. @@ -31,7 +41,8 @@ Firefly works on the principle that if you know where you're money is going, you - Firefly has lots of features without being fancy or bloated. - If you feel you're missing something you can just ask me and I'll add it! -Firefly is pretty awesome. [You can read more about Firefly III, and its features, on the Github Pages](https://firefly-iii.github.io/). +Firefly III has become pretty awesome over the years! (but please excuse me for bragging, it's just that I'm proud of it). +[You can read more about Firefly III, and its features, on the Github Pages](https://firefly-iii.github.io/). ### Contributing diff --git a/app/Console/Commands/CreateExport.php b/app/Console/Commands/CreateExport.php new file mode 100644 index 0000000000..0420ac7eea --- /dev/null +++ b/app/Console/Commands/CreateExport.php @@ -0,0 +1,143 @@ +verifyAccessToken()) { + $this->error('Invalid access token.'); + + return; + } + $this->line('Full export is running...'); + // make repositories + /** @var UserRepositoryInterface $userRepository */ + $userRepository = app(UserRepositoryInterface::class); + /** @var ExportJobRepositoryInterface $jobRepository */ + $jobRepository = app(ExportJobRepositoryInterface::class); + /** @var AccountRepositoryInterface $accountRepository */ + $accountRepository = app(AccountRepositoryInterface::class); + /** @var JournalRepositoryInterface $journalRepository */ + $journalRepository = app(JournalRepositoryInterface::class); + + // set user + $user = $userRepository->find(intval($this->option('user'))); + $jobRepository->setUser($user); + $journalRepository->setUser($user); + $accountRepository->setUser($user); + + // first date + $firstJournal = $journalRepository->first(); + $first = new Carbon; + if (!is_null($firstJournal->id)) { + $first = $firstJournal->date; + } + + // create job and settings. + $job = $jobRepository->create(); + $settings = [ + 'accounts' => $accountRepository->getAccountsByType([AccountType::ASSET, AccountType::DEFAULT]), + 'startDate' => $first, + 'endDate' => new Carbon, + 'exportFormat' => 'csv', + 'includeAttachments' => $this->option('with_attachments'), + 'includeOldUploads' => $this->option('with_uploads'), + 'job' => $job, + ]; + + + /** @var ProcessorInterface $processor */ + $processor = app(ProcessorInterface::class); + $processor->setSettings($settings); + + $processor->collectJournals(); + $processor->convertJournals(); + $processor->exportJournals(); + if ($settings['includeAttachments']) { + $processor->collectAttachments(); + } + + if ($settings['includeOldUploads']) { + $processor->collectOldUploads(); + } + + $processor->createZipFile(); + $disk = Storage::disk('export'); + $fileName = sprintf('export-%s.zip', date('Y-m-d_H-i-s')); + $disk->move($job->key . '.zip', $fileName); + + $this->line('The export has finished! You can find the ZIP file in this location:'); + $this->line(storage_path(sprintf('export/%s', $fileName))); + + return; + } +} diff --git a/app/Console/Commands/CreateImport.php b/app/Console/Commands/CreateImport.php index 191f361582..d0be59aa1e 100644 --- a/app/Console/Commands/CreateImport.php +++ b/app/Console/Commands/CreateImport.php @@ -30,6 +30,7 @@ use Monolog\Formatter\LineFormatter; */ class CreateImport extends Command { + use VerifiesAccessToken; /** * The console command description. * @@ -42,7 +43,13 @@ class CreateImport extends Command * * @var string */ - protected $signature = 'firefly:create-import {file} {configuration} {--user=1} {--type=csv} {--start}'; + protected $signature = 'firefly:create-import + {file : The file to import.} + {configuration : The configuration file to use for the import/} + {--type=csv : The file type of the import.} + {--user= : The user ID that the import should import for.} + {--token= : The user\'s access token.} + {--start : Starts the job immediately.}'; /** * Create a new command instance. @@ -61,6 +68,11 @@ class CreateImport extends Command */ public function handle() { + if (!$this->verifyAccessToken()) { + $this->error('Invalid access token.'); + + return; + } /** @var UserRepositoryInterface $userRepository */ $userRepository = app(UserRepositoryInterface::class); $file = $this->argument('file'); @@ -150,12 +162,12 @@ class CreateImport extends Command $cwd = getcwd(); $validTypes = array_keys(config('firefly.import_formats')); $type = strtolower($this->option('type')); - if (is_null($user->id)) { $this->error(sprintf('There is no user with ID %d.', $this->option('user'))); return false; } + if (!in_array($type, $validTypes)) { $this->error(sprintf('Cannot import file of type "%s"', $type)); diff --git a/app/Console/Commands/DecryptAttachment.php b/app/Console/Commands/DecryptAttachment.php index d1ffbdb8c6..9e70200f85 100644 --- a/app/Console/Commands/DecryptAttachment.php +++ b/app/Console/Commands/DecryptAttachment.php @@ -51,6 +51,10 @@ class DecryptAttachment extends Command /** * Execute the console command. + * + * @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's five its fine. + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + * */ public function handle() { diff --git a/app/Console/Commands/UpgradeDatabase.php b/app/Console/Commands/UpgradeDatabase.php index 27ab338d93..62fdc69d14 100644 --- a/app/Console/Commands/UpgradeDatabase.php +++ b/app/Console/Commands/UpgradeDatabase.php @@ -35,8 +35,10 @@ use Schema; /** * Class UpgradeDatabase * - * @SuppressWarnings(PHPMD.CouplingBetweenObjects) // it just touches a lot of things. + * Upgrade user database. * + * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) // it just touches a lot of things. * @package FireflyIII\Console\Commands */ class UpgradeDatabase extends Command @@ -138,6 +140,9 @@ class UpgradeDatabase extends Command /** * Each (asset) account must have a reference to a preferred currency. If the account does not have one, it's forced upon the account. + * + * @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's seven but it can't really be helped. + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function updateAccountCurrencies(): void { @@ -192,6 +197,8 @@ class UpgradeDatabase extends Command * * Both source and destination must match the respective currency preference of the related asset account. * So FF3 must verify all transactions. + * + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function updateOtherCurrencies(): void { @@ -210,6 +217,9 @@ class UpgradeDatabase extends Command ->leftJoin('accounts', 'accounts.id', '=', 'transactions.account_id') ->leftJoin('account_types', 'account_types.id', '=', 'accounts.account_type_id') ->whereIn('account_types.type', [AccountType::DEFAULT, AccountType::ASSET])->first(['transactions.*']); + if (is_null($transaction)) { + return; + } /** @var Account $account */ $account = $transaction->account; $currency = $repository->find(intval($account->getMeta('currency_id'))); @@ -251,7 +261,7 @@ class UpgradeDatabase extends Command */ public function updateTransferCurrencies() { - $set = TransactionJournal + $set = TransactionJournal ::leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id') ->where('transaction_types.type', TransactionType::TRANSFER) ->get(['transaction_journals.*']); @@ -350,6 +360,12 @@ class UpgradeDatabase extends Command * * The transaction that is sent to this function MUST be the source transaction (amount negative). * + * Method is long and complex bit I'm taking it for granted. + * + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + * @SuppressWarnings(PHPMD.NPathComplexity) + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * * @param Transaction $transaction */ private function updateTransactionCurrency(Transaction $transaction): void diff --git a/app/Console/Commands/VerifiesAccessToken.php b/app/Console/Commands/VerifiesAccessToken.php new file mode 100644 index 0000000000..889f64ad0e --- /dev/null +++ b/app/Console/Commands/VerifiesAccessToken.php @@ -0,0 +1,69 @@ +option('user')); + $token = strval($this->option('token')); + /** @var UserRepositoryInterface $repository */ + $repository = app(UserRepositoryInterface::class); + $user = $repository->find($userId); + + if (is_null($user->id)) { + Log::error(sprintf('verifyAccessToken(): no such user for input "%d"', $userId)); + + return false; + } + $accessToken = Preferences::getForUser($user, 'access_token', null); + if (is_null($accessToken)) { + Log::error(sprintf('User #%d has no access token, so cannot access command line options.', $userId)); + + return false; + } + if (!($accessToken->data === $token)) { + Log::error(sprintf('Invalid access token for user #%d.', $userId)); + + return false; + } + + return true; + } + +} \ No newline at end of file diff --git a/app/Console/Commands/VerifyDatabase.php b/app/Console/Commands/VerifyDatabase.php index 4f1ab1938f..1eddd1fdab 100644 --- a/app/Console/Commands/VerifyDatabase.php +++ b/app/Console/Commands/VerifyDatabase.php @@ -17,6 +17,7 @@ use Crypt; use FireflyIII\Models\Account; use FireflyIII\Models\AccountType; use FireflyIII\Models\Budget; +use FireflyIII\Models\LinkType; use FireflyIII\Models\PiggyBankEvent; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; @@ -26,12 +27,15 @@ use FireflyIII\User; use Illuminate\Console\Command; use Illuminate\Contracts\Encryption\DecryptException; use Illuminate\Database\Eloquent\Builder; +use Preferences; use Schema; use stdClass; /** * Class VerifyDatabase * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + * * @package FireflyIII\Console\Commands */ class VerifyDatabase extends Command @@ -70,38 +74,64 @@ class VerifyDatabase extends Command $this->reportObject('budget'); $this->reportObject('category'); $this->reportObject('tag'); - - // accounts with no transactions. $this->reportAccounts(); - // budgets with no limits $this->reportBudgetLimits(); - // budgets with no transactions - - // sum of transactions is not zero. $this->reportSum(); - // any deleted transaction journals that have transactions that are NOT deleted: $this->reportJournals(); - // deleted transactions that are connected to a not deleted journal. $this->reportTransactions(); - // deleted accounts that still have not deleted transactions or journals attached to them. $this->reportDeletedAccounts(); - - // report on journals with no transactions at all. $this->reportNoTransactions(); - - // transfers with budgets. $this->reportTransfersBudgets(); - - // report on journals with the wrong types of accounts. $this->reportIncorrectJournals(); - - // report (and fix) piggy banks $this->repairPiggyBanks(); + $this->createLinkTypes(); + $this->createAccessTokens(); } /** - * Make sure there are only transfers linked to piggy bank events. + * Create user access tokens, if not present already. + */ + private function createAccessTokens() + { + $users = User::get(); + /** @var User $user */ + foreach ($users as $user) { + $pref = Preferences::getForUser($user, 'access_token', null); + if (is_null($pref)) { + $token = $user->generateAccessToken(); + Preferences::setForUser($user, 'access_token', $token); + $this->line(sprintf('Generated access token for user %s', $user->email)); + } + } + } + + /** + * Create default link types if necessary. + */ + private function createLinkTypes() + { + $set = [ + 'Related' => ['relates to', 'relates to'], + 'Refund' => ['(partially) refunds', 'is (partially) refunded by'], + 'Paid' => ['(partially) pays for', 'is (partially) paid for by'], + 'Reimbursement' => ['(partially) reimburses', 'is (partially) reimbursed by'], + ]; + foreach ($set as $name => $values) { + $link = LinkType::where('name', $name)->where('outward', $values[0])->where('inward', $values[1])->first(); + if (is_null($link)) { + $link = new LinkType; + $link->name = $name; + $link->outward = $values[0]; + $link->inward = $values[1]; + } + $link->editable = false; + $link->save(); + } + } + + /** + * Eeport (and fix) piggy banks. Make sure there are only transfers linked to piggy bank events. */ private function repairPiggyBanks(): void { diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index bd85ef2c8e..fc047b3970 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -1,54 +1,26 @@ load(__DIR__ . '/Commands'); + require base_path('routes/console.php'); } + + /** + * Define the application's command schedule. + * + * @param \Illuminate\Console\Scheduling\Schedule $schedule + * @return void + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ + protected function schedule(Schedule $schedule) + { + } } diff --git a/app/Events/AdminRequestedTestMessage.php b/app/Events/AdminRequestedTestMessage.php new file mode 100644 index 0000000000..ce783fc8ef --- /dev/null +++ b/app/Events/AdminRequestedTestMessage.php @@ -0,0 +1,44 @@ +id, $user->email, $ipAddress)); + $this->user = $user; + $this->ipAddress = $ipAddress; + } +} diff --git a/app/Events/UserChangedEmail.php b/app/Events/UserChangedEmail.php new file mode 100644 index 0000000000..5da0caeb79 --- /dev/null +++ b/app/Events/UserChangedEmail.php @@ -0,0 +1,51 @@ +user = $user; + $this->ipAddress = $ipAddress; + $this->oldEmail = $oldEmail; + $this->newEmail = $newEmail; + } +} \ No newline at end of file diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 14cb6b0df5..772a52171b 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -1,50 +1,45 @@ expectsJson()) { - return response()->json(['error' => 'Unauthenticated.'], 401); - } - - return redirect()->guest('login'); - } } diff --git a/app/Export/Collector/AttachmentCollector.php b/app/Export/Collector/AttachmentCollector.php index e3b8f295e9..e87fb5ec8d 100644 --- a/app/Export/Collector/AttachmentCollector.php +++ b/app/Export/Collector/AttachmentCollector.php @@ -122,6 +122,7 @@ class AttachmentCollector extends BasicCollector implements CollectorInterface */ private function getAttachments(): Collection { + $this->repository->setUser($this->user); $attachments = $this->repository->getBetween($this->start, $this->end); return $attachments; diff --git a/app/Export/Collector/BasicCollector.php b/app/Export/Collector/BasicCollector.php index 1780f43246..41ebc2d57c 100644 --- a/app/Export/Collector/BasicCollector.php +++ b/app/Export/Collector/BasicCollector.php @@ -15,6 +15,7 @@ namespace FireflyIII\Export\Collector; use FireflyIII\Models\ExportJob; +use FireflyIII\User; use Illuminate\Support\Collection; /** @@ -26,6 +27,8 @@ class BasicCollector { /** @var ExportJob */ protected $job; + /** @var User */ + protected $user; /** @var Collection */ private $entries; @@ -58,7 +61,16 @@ class BasicCollector */ public function setJob(ExportJob $job) { - $this->job = $job; + $this->job = $job; + $this->user = $job->user; + } + + /** + * @param User $user + */ + public function setUser(User $user) + { + $this->user = $user; } diff --git a/app/Export/Collector/JournalExportCollector.php b/app/Export/Collector/JournalExportCollector.php deleted file mode 100644 index b0e04e115e..0000000000 --- a/app/Export/Collector/JournalExportCollector.php +++ /dev/null @@ -1,347 +0,0 @@ -getWorkSet(); - - /* - * Extract: - * possible budget ids for journals - * possible category ids journals - * possible budget ids for transactions - * possible category ids for transactions - * - * possible IBAN and account numbers? - * - */ - $journals = $this->extractJournalIds(); - $transactions = $this->extractTransactionIds(); - - - // extend work set with category data from journals: - $this->categoryDataForJournals($journals); - - // extend work set with category cate from transactions (overrules journals): - $this->categoryDataForTransactions($transactions); - - // same for budgets: - $this->budgetDataForJournals($journals); - $this->budgetDataForTransactions($transactions); - - $this->setEntries($this->workSet); - - return true; - } - - /** - * @param Collection $accounts - */ - public function setAccounts(Collection $accounts) - { - $this->accounts = $accounts; - } - - /** - * @param Carbon $start - * @param Carbon $end - */ - public function setDates(Carbon $start, Carbon $end) - { - $this->start = $start; - $this->end = $end; - } - - /** - * @param array $journals - * - * @return bool - */ - private function budgetDataForJournals(array $journals): bool - { - $set = DB::table('budget_transaction_journal') - ->leftJoin('budgets', 'budgets.id', '=', 'budget_transaction_journal.budget_id') - ->whereIn('budget_transaction_journal.transaction_journal_id', $journals) - ->get( - [ - 'budget_transaction_journal.budget_id', - 'budget_transaction_journal.transaction_journal_id', - 'budgets.name', - 'budgets.encrypted', - ] - ); - $set->each( - function ($obj) { - $obj->name = Steam::decrypt(intval($obj->encrypted), $obj->name); - } - ); - $array = []; - foreach ($set as $obj) { - $array[$obj->transaction_journal_id] = ['id' => $obj->budget_id, 'name' => $obj->name]; - } - - $this->workSet->each( - function ($obj) use ($array) { - if (isset($array[$obj->transaction_journal_id])) { - $obj->budget_id = $array[$obj->transaction_journal_id]['id']; - $obj->budget_name = $array[$obj->transaction_journal_id]['name']; - } - } - ); - - return true; - - } - - /** - * @param array $transactions - * - * @return bool - */ - private function budgetDataForTransactions(array $transactions): bool - { - $set = DB::table('budget_transaction') - ->leftJoin('budgets', 'budgets.id', '=', 'budget_transaction.budget_id') - ->whereIn('budget_transaction.transaction_id', $transactions) - ->get( - [ - 'budget_transaction.budget_id', - 'budget_transaction.transaction_id', - 'budgets.name', - 'budgets.encrypted', - ] - ); - $set->each( - function ($obj) { - $obj->name = Steam::decrypt(intval($obj->encrypted), $obj->name); - } - ); - $array = []; - foreach ($set as $obj) { - $array[$obj->transaction_id] = ['id' => $obj->budget_id, 'name' => $obj->name]; - } - - $this->workSet->each( - function ($obj) use ($array) { - - // first transaction - if (isset($array[$obj->id])) { - $obj->budget_id = $array[$obj->id]['id']; - $obj->budget_name = $array[$obj->id]['name']; - } - } - ); - - return true; - - } - - /** - * @param array $journals - * - * @return bool - */ - private function categoryDataForJournals(array $journals): bool - { - $set = DB::table('category_transaction_journal') - ->leftJoin('categories', 'categories.id', '=', 'category_transaction_journal.category_id') - ->whereIn('category_transaction_journal.transaction_journal_id', $journals) - ->get( - [ - 'category_transaction_journal.category_id', - 'category_transaction_journal.transaction_journal_id', - 'categories.name', - 'categories.encrypted', - ] - ); - $set->each( - function ($obj) { - $obj->name = Steam::decrypt(intval($obj->encrypted), $obj->name); - } - ); - $array = []; - foreach ($set as $obj) { - $array[$obj->transaction_journal_id] = ['id' => $obj->category_id, 'name' => $obj->name]; - } - - $this->workSet->each( - function ($obj) use ($array) { - if (isset($array[$obj->transaction_journal_id])) { - $obj->category_id = $array[$obj->transaction_journal_id]['id']; - $obj->category_name = $array[$obj->transaction_journal_id]['name']; - } - } - ); - - return true; - - } - - /** - * @param array $transactions - * - * @return bool - */ - private function categoryDataForTransactions(array $transactions): bool - { - $set = DB::table('category_transaction') - ->leftJoin('categories', 'categories.id', '=', 'category_transaction.category_id') - ->whereIn('category_transaction.transaction_id', $transactions) - ->get( - [ - 'category_transaction.category_id', - 'category_transaction.transaction_id', - 'categories.name', - 'categories.encrypted', - ] - ); - $set->each( - function ($obj) { - $obj->name = Steam::decrypt(intval($obj->encrypted), $obj->name); - } - ); - $array = []; - foreach ($set as $obj) { - $array[$obj->transaction_id] = ['id' => $obj->category_id, 'name' => $obj->name]; - } - - $this->workSet->each( - function ($obj) use ($array) { - - // first transaction - if (isset($array[$obj->id])) { - $obj->category_id = $array[$obj->id]['id']; - $obj->category_name = $array[$obj->id]['name']; - } - } - ); - - return true; - - } - - /** - * @return array - */ - private function extractJournalIds(): array - { - return $this->workSet->pluck('transaction_journal_id')->toArray(); - } - - /** - * @return array - */ - private function extractTransactionIds() - { - $set = $this->workSet->pluck('id')->toArray(); - $opposing = $this->workSet->pluck('opposing_id')->toArray(); - $complete = $set + $opposing; - - return array_unique($complete); - } - - /** - * @SuppressWarnings(PHPMD.ExcessiveMethodLength) - */ - private function getWorkSet() - { - $accountIds = $this->accounts->pluck('id')->toArray(); - $this->workSet = Transaction::leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id') - ->leftJoin( - 'transactions AS opposing', function (JoinClause $join) { - $join->on('opposing.transaction_journal_id', '=', 'transactions.transaction_journal_id') - ->where('opposing.amount', '=', DB::raw('transactions.amount * -1')) - ->where('transactions.identifier', '=', DB::raw('opposing.identifier')); - } - ) - ->leftJoin('accounts', 'transactions.account_id', '=', 'accounts.id') - ->leftJoin('accounts AS opposing_accounts', 'opposing.account_id', '=', 'opposing_accounts.id') - ->leftJoin('transaction_types', 'transaction_journals.transaction_type_id', 'transaction_types.id') - ->leftJoin('transaction_currencies', 'transactions.transaction_currency_id', '=', 'transaction_currencies.id') - ->whereIn('transactions.account_id', $accountIds) - ->where('transaction_journals.user_id', $this->job->user_id) - ->where('transaction_journals.date', '>=', $this->start->format('Y-m-d')) - ->where('transaction_journals.date', '<=', $this->end->format('Y-m-d')) - ->where('transaction_journals.completed', 1) - ->whereNull('transaction_journals.deleted_at') - ->whereNull('transactions.deleted_at') - ->whereNull('opposing.deleted_at') - ->orderBy('transaction_journals.date', 'DESC') - ->orderBy('transactions.identifier', 'ASC') - ->get( - [ - 'transactions.id', - 'transactions.amount', - 'transactions.description', - 'transactions.account_id', - 'accounts.name as account_name', - 'accounts.encrypted as account_name_encrypted', - 'transactions.identifier', - - 'opposing.id as opposing_id', - 'opposing.amount AS opposing_amount', - 'opposing.description as opposing_description', - 'opposing.account_id as opposing_account_id', - 'opposing_accounts.name as opposing_account_name', - 'opposing_accounts.encrypted as opposing_account_encrypted', - 'opposing.identifier as opposing_identifier', - - 'transaction_journals.id as transaction_journal_id', - 'transaction_journals.date', - 'transaction_journals.description as journal_description', - 'transaction_journals.encrypted as journal_encrypted', - 'transaction_journals.transaction_type_id', - 'transaction_types.type as transaction_type', - 'transactions.transaction_currency_id', - 'transaction_currencies.code AS transaction_currency_code', - - ] - ); - } -} diff --git a/app/Export/Collector/UploadCollector.php b/app/Export/Collector/UploadCollector.php index a27de79610..3647e478b8 100644 --- a/app/Export/Collector/UploadCollector.php +++ b/app/Export/Collector/UploadCollector.php @@ -30,8 +30,6 @@ class UploadCollector extends BasicCollector implements CollectorInterface private $exportDisk; /** @var \Illuminate\Contracts\Filesystem\Filesystem */ private $uploadDisk; - /** @var string */ - private $vintageFormat; /** * AttachmentCollector constructor. diff --git a/app/Export/Entry/Entry.php b/app/Export/Entry/Entry.php index 8aff206d47..1422750e6b 100644 --- a/app/Export/Entry/Entry.php +++ b/app/Export/Entry/Entry.php @@ -31,6 +31,7 @@ use Steam; * * Class Entry * @SuppressWarnings(PHPMD.LongVariable) + * @SuppressWarnings(PHPMD.TooManyFields) * * @package FireflyIII\Export\Entry */ @@ -84,40 +85,12 @@ final class Entry { } - /** - * @param $object - * - * @return Entry - */ - public static function fromObject($object): Entry - { - $entry = new self; - $entry->journal_id = $object->transaction_journal_id; - $entry->description = Steam::decrypt(intval($object->journal_encrypted), $object->journal_description); - $entry->amount = $object->amount; - $entry->date = $object->date; - $entry->transaction_type = $object->transaction_type; - $entry->currency_code = $object->transaction_currency_code; - $entry->asset_account_id = $object->account_id; - $entry->asset_account_name = Steam::decrypt(intval($object->account_name_encrypted), $object->account_name); - $entry->opposing_account_id = $object->opposing_account_id; - $entry->opposing_account_name = Steam::decrypt(intval($object->opposing_account_encrypted), $object->opposing_account_name); - $entry->category_id = $object->category_id ?? ''; - $entry->category_name = $object->category_name ?? ''; - $entry->budget_id = $object->budget_id ?? ''; - $entry->budget_name = $object->budget_name ?? ''; - - // update description when transaction description is different: - if (!is_null($object->description) && $object->description !== $entry->description) { - $entry->description = $entry->description . ' (' . $object->description . ')'; - } - - return $entry; - } - /** * Converts a given transaction (as collected by the collector) into an export entry. * + * @SuppressWarnings(PHPMD.CyclomaticComplexity) // complex but little choice. + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) // cannot be helped + * * @param Transaction $transaction * * @return Entry diff --git a/app/Export/ExpandedProcessor.php b/app/Export/ExpandedProcessor.php index 8babc5b473..b4a0ddc3e5 100644 --- a/app/Export/ExpandedProcessor.php +++ b/app/Export/ExpandedProcessor.php @@ -34,6 +34,8 @@ use ZipArchive; /** * Class ExpandedProcessor * + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) // its doing a lot. + * * @package FireflyIII\Export */ class ExpandedProcessor implements ProcessorInterface @@ -84,13 +86,17 @@ class ExpandedProcessor implements ProcessorInterface } /** + * Collects all transaction journals. + * * @return bool + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function collectJournals(): bool { // use journal collector thing. /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); + $collector->setUser($this->job->user); $collector->setAccounts($this->accounts)->setRange($this->settings['startDate'], $this->settings['endDate']) ->withOpposingAccount()->withBudgetInformation()->withCategoryInformation() ->removeFilter(InternalTransferFilter::class); @@ -101,6 +107,7 @@ class ExpandedProcessor implements ProcessorInterface $opposingIds = $transactions->pluck('opposing_account_id')->toArray(); $notes = $this->getNotes($ids); $tags = $this->getTags($ids); + /** @var array $ibans */ $ibans = $this->getIbans($assetIds) + $this->getIbans($opposingIds); $currencies = $this->getAccountCurrencies($ibans); $transactions->each( diff --git a/app/Export/Processor.php b/app/Export/Processor.php deleted file mode 100644 index 8df3a93dce..0000000000 --- a/app/Export/Processor.php +++ /dev/null @@ -1,203 +0,0 @@ -journals = new Collection; - $this->exportEntries = new Collection; - $this->files = new Collection; - - } - - /** - * @return bool - */ - public function collectAttachments(): bool - { - /** @var AttachmentCollector $attachmentCollector */ - $attachmentCollector = app(AttachmentCollector::class); - $attachmentCollector->setJob($this->job); - $attachmentCollector->setDates($this->settings['startDate'], $this->settings['endDate']); - $attachmentCollector->run(); - $this->files = $this->files->merge($attachmentCollector->getEntries()); - - return true; - } - - /** - * @return bool - */ - public function collectJournals(): bool - { - /** @var JournalExportCollector $collector */ - $collector = app(JournalExportCollector::class); - $collector->setJob($this->job); - $collector->setDates($this->settings['startDate'], $this->settings['endDate']); - $collector->setAccounts($this->settings['accounts']); - $collector->run(); - $this->journals = $collector->getEntries(); - Log::debug(sprintf('Count %d journals in collectJournals() ', $this->journals->count())); - - return true; - } - - /** - * @return bool - */ - public function collectOldUploads(): bool - { - /** @var UploadCollector $uploadCollector */ - $uploadCollector = app(UploadCollector::class); - $uploadCollector->setJob($this->job); - $uploadCollector->run(); - - $this->files = $this->files->merge($uploadCollector->getEntries()); - - return true; - } - - /** - * @return bool - */ - public function convertJournals(): bool - { - $count = 0; - foreach ($this->journals as $object) { - $this->exportEntries->push(Entry::fromObject($object)); - $count++; - } - Log::debug(sprintf('Count %d entries in exportEntries (convertJournals)', $this->exportEntries->count())); - - return true; - } - - /** - * @return bool - * @throws FireflyException - */ - public function createZipFile(): bool - { - $zip = new ZipArchive; - $file = $this->job->key . '.zip'; - $fullPath = storage_path('export') . '/' . $file; - - if ($zip->open($fullPath, ZipArchive::CREATE) !== true) { - throw new FireflyException('Cannot store zip file.'); - } - // for each file in the collection, add it to the zip file. - $disk = Storage::disk('export'); - foreach ($this->getFiles() as $entry) { - // is part of this job? - $zipFileName = str_replace($this->job->key . '-', '', $entry); - $zip->addFromString($zipFileName, $disk->get($entry)); - } - - $zip->close(); - - // delete the files: - $this->deleteFiles(); - - return true; - } - - /** - * @return bool - */ - public function exportJournals(): bool - { - $exporterClass = config('firefly.export_formats.' . $this->exportFormat); - $exporter = app($exporterClass); - $exporter->setJob($this->job); - $exporter->setEntries($this->exportEntries); - $exporter->run(); - $this->files->push($exporter->getFileName()); - - return true; - } - - /** - * @return Collection - */ - public function getFiles(): Collection - { - return $this->files; - } - - /** - * @param array $settings - */ - public function setSettings(array $settings) - { - // save settings - $this->settings = $settings; - $this->accounts = $settings['accounts']; - $this->exportFormat = $settings['exportFormat']; - $this->includeAttachments = $settings['includeAttachments']; - $this->includeOldUploads = $settings['includeOldUploads']; - $this->job = $settings['job']; - } - - /** - * - */ - private function deleteFiles() - { - $disk = Storage::disk('export'); - foreach ($this->getFiles() as $file) { - $disk->delete($file); - } - } -} diff --git a/app/Generator/Report/Audit/MonthReportGenerator.php b/app/Generator/Report/Audit/MonthReportGenerator.php index 43e23ad1a4..e5c97c92b5 100644 --- a/app/Generator/Report/Audit/MonthReportGenerator.php +++ b/app/Generator/Report/Audit/MonthReportGenerator.php @@ -145,6 +145,9 @@ class MonthReportGenerator implements ReportGeneratorInterface * @param Carbon $date * * @return array + * + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) // not that long + * */ private function getAuditReport(Account $account, Carbon $date): array { @@ -175,9 +178,6 @@ class MonthReportGenerator implements ReportGeneratorInterface $transaction->currency = $currency; } - /* - * Reverse set again. - */ $return = [ 'journals' => $journals->reverse(), 'exists' => $journals->count() > 0, diff --git a/app/Handlers/Events/AdminEventHandler.php b/app/Handlers/Events/AdminEventHandler.php new file mode 100644 index 0000000000..55b83abadf --- /dev/null +++ b/app/Handlers/Events/AdminEventHandler.php @@ -0,0 +1,55 @@ +user->email; + $ipAddress = $event->ipAddress; + + Log::debug(sprintf('Now in sendTestMessage event handler. Email is %s, IP is %s', $email, $ipAddress)); + try { + Log::debug('Trying to send message...'); + Mail::to($email)->send(new AdminTestMail($email, $ipAddress)); + // @codeCoverageIgnoreStart + } catch (Swift_TransportException $e) { + Log::debug('Send message failed! :('); + Log::error($e->getMessage()); + Log::error($e->getTraceAsString()); + Session::flash('error', 'Possible email error: ' . $e->getMessage()); + } + Log::debug('If no error above this line, message was sent.'); + // @codeCoverageIgnoreEnd + return true; + } +} \ No newline at end of file diff --git a/app/Handlers/Events/StoredJournalEventHandler.php b/app/Handlers/Events/StoredJournalEventHandler.php index 6d266d0dda..6ade7937ac 100644 --- a/app/Handlers/Events/StoredJournalEventHandler.php +++ b/app/Handlers/Events/StoredJournalEventHandler.php @@ -19,8 +19,8 @@ use FireflyIII\Models\RuleGroup; use FireflyIII\Repositories\Journal\JournalRepositoryInterface as JRI; use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface as PRI; use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface as RGRI; -use FireflyIII\Rules\Processor; use FireflyIII\Support\Events\BillScanner; +use FireflyIII\TransactionRules\Processor; use Log; /** @@ -57,11 +57,12 @@ class StoredJournalEventHandler /** * This method connects a new transfer to a piggy bank. * - * - * * @param StoredTransactionJournal $event * * @return bool + * + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function connectToPiggyBank(StoredTransactionJournal $event): bool { diff --git a/app/Handlers/Events/UpdatedJournalEventHandler.php b/app/Handlers/Events/UpdatedJournalEventHandler.php index 17303c9134..345b1c0bdc 100644 --- a/app/Handlers/Events/UpdatedJournalEventHandler.php +++ b/app/Handlers/Events/UpdatedJournalEventHandler.php @@ -18,8 +18,8 @@ use FireflyIII\Events\UpdatedTransactionJournal; use FireflyIII\Models\Rule; use FireflyIII\Models\RuleGroup; use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; -use FireflyIII\Rules\Processor; use FireflyIII\Support\Events\BillScanner; +use FireflyIII\TransactionRules\Processor; /** * @codeCoverageIgnore diff --git a/app/Handlers/Events/UserEventHandler.php b/app/Handlers/Events/UserEventHandler.php index 8c7eb4a90c..1f17e6a39c 100644 --- a/app/Handlers/Events/UserEventHandler.php +++ b/app/Handlers/Events/UserEventHandler.php @@ -15,11 +15,15 @@ namespace FireflyIII\Handlers\Events; use FireflyIII\Events\RegisteredUser; use FireflyIII\Events\RequestedNewPassword; +use FireflyIII\Events\UserChangedEmail; +use FireflyIII\Mail\ConfirmEmailChangeMail; use FireflyIII\Mail\RegisteredUser as RegisteredUserMail; use FireflyIII\Mail\RequestedNewPassword as RequestedNewPasswordMail; +use FireflyIII\Mail\UndoEmailChangeMail; use FireflyIII\Repositories\User\UserRepositoryInterface; use Log; use Mail; +use Preferences; use Swift_TransportException; /** @@ -54,6 +58,54 @@ class UserEventHandler return true; } + /** + * @param UserChangedEmail $event + * + * @return bool + */ + public function sendEmailChangeConfirmMail(UserChangedEmail $event): bool + { + $newEmail = $event->newEmail; + $oldEmail = $event->oldEmail; + $user = $event->user; + $ipAddress = $event->ipAddress; + $token = Preferences::getForUser($user, 'email_change_confirm_token', 'invalid'); + $uri = route('profile.confirm-email-change', [$token->data]); + try { + Mail::to($newEmail)->send(new ConfirmEmailChangeMail($newEmail, $oldEmail, $uri, $ipAddress)); + // @codeCoverageIgnoreStart + } catch (Swift_TransportException $e) { + Log::error($e->getMessage()); + } + + // @codeCoverageIgnoreEnd + return true; + } + + /** + * @param UserChangedEmail $event + * + * @return bool + */ + public function sendEmailChangeUndoMail(UserChangedEmail $event): bool + { + $newEmail = $event->newEmail; + $oldEmail = $event->oldEmail; + $user = $event->user; + $ipAddress = $event->ipAddress; + $token = Preferences::getForUser($user, 'email_change_undo_token', 'invalid'); + $uri = route('profile.undo-email-change', [$token->data, hash('sha256', $oldEmail)]); + try { + Mail::to($oldEmail)->send(new UndoEmailChangeMail($newEmail, $oldEmail, $uri, $ipAddress)); + // @codeCoverageIgnoreStart + } catch (Swift_TransportException $e) { + Log::error($e->getMessage()); + } + + // @codeCoverageIgnoreEnd + return true; + } + /** * @param RequestedNewPassword $event * diff --git a/app/Helpers/Attachments/AttachmentHelper.php b/app/Helpers/Attachments/AttachmentHelper.php index 62d2e1c0d6..f111e0a30a 100644 --- a/app/Helpers/Attachments/AttachmentHelper.php +++ b/app/Helpers/Attachments/AttachmentHelper.php @@ -169,7 +169,6 @@ class AttachmentHelper implements AttachmentHelperInterface // store it: $this->uploadDisk->put($attachment->fileName(), $encrypted); - $attachment->uploaded = 1; // update attachment $attachment->save(); $this->attachments->push($attachment); @@ -180,8 +179,6 @@ class AttachmentHelper implements AttachmentHelperInterface // return it. return $attachment; - - } /** diff --git a/app/Helpers/Chart/MetaPieChart.php b/app/Helpers/Chart/MetaPieChart.php index c3b8297cd1..b03c2fb47b 100644 --- a/app/Helpers/Chart/MetaPieChart.php +++ b/app/Helpers/Chart/MetaPieChart.php @@ -32,6 +32,8 @@ use Steam; * Class MetaPieChart * * @package FireflyIII\Helpers\Chart + * + * */ class MetaPieChart implements MetaPieChartInterface { @@ -83,12 +85,15 @@ class MetaPieChart implements MetaPieChartInterface * @param string $group * * @return array + * + * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ public function generate(string $direction, string $group): array { $transactions = $this->getTransactions($direction); $grouped = $this->groupByFields($transactions, $this->grouping[$group]); $chartData = $this->organizeByType($group, $grouped); + $key = strval(trans('firefly.everything_else')); // also collect all other transactions if ($this->collectOtherObjects && $direction === 'expense') { @@ -96,11 +101,12 @@ class MetaPieChart implements MetaPieChartInterface $collector = app(JournalCollectorInterface::class); $collector->setUser($this->user); $collector->setAccounts($this->accounts)->setRange($this->start, $this->end)->setTypes([TransactionType::WITHDRAWAL]); - $journals = $collector->getJournals(); - $sum = strval($journals->sum('transaction_amount')); - $sum = bcmul($sum, '-1'); - $sum = bcsub($sum, $this->total); - $chartData[strval(trans('firefly.everything_else'))] = $sum; + + $journals = $collector->getJournals(); + $sum = strval($journals->sum('transaction_amount')); + $sum = bcmul($sum, '-1'); + $sum = bcsub($sum, $this->total); + $chartData[$key] = $sum; } if ($this->collectOtherObjects && $direction === 'income') { @@ -108,10 +114,10 @@ class MetaPieChart implements MetaPieChartInterface $collector = app(JournalCollectorInterface::class); $collector->setUser($this->user); $collector->setAccounts($this->accounts)->setRange($this->start, $this->end)->setTypes([TransactionType::DEPOSIT]); - $journals = $collector->getJournals(); - $sum = strval($journals->sum('transaction_amount')); - $sum = bcsub($sum, $this->total); - $chartData[strval(trans('firefly.everything_else'))] = $sum; + $journals = $collector->getJournals(); + $sum = strval($journals->sum('transaction_amount')); + $sum = bcsub($sum, $this->total); + $chartData[$key] = $sum; } return $chartData; @@ -258,12 +264,9 @@ class MetaPieChart implements MetaPieChartInterface $collector->removeFilter(TransferFilter::class); } - if ($this->budgets->count() > 0) { - $collector->setBudgets($this->budgets); - } - if ($this->categories->count() > 0) { - $collector->setCategories($this->categories); - } + $collector->setBudgets($this->budgets); + $collector->setCategories($this->categories); + if ($this->tags->count() > 0) { $collector->setTags($this->tags); $collector->withCategoryInformation(); @@ -278,6 +281,9 @@ class MetaPieChart implements MetaPieChartInterface * @param array $fields * * @return array + * + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * */ protected function groupByFields(Collection $set, array $fields): array { diff --git a/app/Helpers/Collector/JournalCollector.php b/app/Helpers/Collector/JournalCollector.php index 939831be30..f0e84c26de 100644 --- a/app/Helpers/Collector/JournalCollector.php +++ b/app/Helpers/Collector/JournalCollector.php @@ -43,6 +43,9 @@ use Steam; * Class JournalCollector * * @package FireflyIII\Helpers\Collector + * + * @SuppressWarnings(PHPMD.ExcessiveClassComplexity) + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class JournalCollector implements JournalCollectorInterface { @@ -413,10 +416,10 @@ class JournalCollector implements JournalCollectorInterface $this->offset = $offset; $this->query->skip($offset); Log::debug(sprintf('Changed offset to %d', $offset)); + + return $this; } - if (is_null($this->limit)) { - Log::debug('The limit is zero, cannot set the page.'); - } + Log::debug('The limit is zero, cannot set the page.'); return $this; } diff --git a/app/Helpers/Report/BalanceReportHelper.php b/app/Helpers/Report/BalanceReportHelper.php index fdd7563ef5..3fd6c5417a 100644 --- a/app/Helpers/Report/BalanceReportHelper.php +++ b/app/Helpers/Report/BalanceReportHelper.php @@ -67,8 +67,10 @@ class BalanceReportHelper implements BalanceReportHelperInterface /** @var BudgetLimit $budgetLimit */ foreach ($budgetLimits as $budgetLimit) { - $line = $this->createBalanceLine($budgetLimit, $accounts); - $balance->addBalanceLine($line); + if (!is_null($budgetLimit->budget)) { + $line = $this->createBalanceLine($budgetLimit, $accounts); + $balance->addBalanceLine($line); + } } $noBudgetLine = $this->createNoBudgetLine($accounts, $start, $end); diff --git a/app/Helpers/Report/BudgetReportHelper.php b/app/Helpers/Report/BudgetReportHelper.php index 7fecb90c89..c0469114b1 100644 --- a/app/Helpers/Report/BudgetReportHelper.php +++ b/app/Helpers/Report/BudgetReportHelper.php @@ -42,6 +42,7 @@ class BudgetReportHelper implements BudgetReportHelperInterface /** * @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's exactly 5. + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) // all the arrays make it long. * @param Carbon $start * @param Carbon $end * @param Collection $accounts diff --git a/app/Http/Controllers/AccountController.php b/app/Http/Controllers/AccountController.php index 995a3c9e5d..f64f72b098 100644 --- a/app/Http/Controllers/AccountController.php +++ b/app/Http/Controllers/AccountController.php @@ -39,6 +39,7 @@ use View; * Class AccountController * * @package FireflyIII\Http\Controllers + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class AccountController extends Controller { @@ -141,9 +142,14 @@ class AccountController extends Controller } /** + * Edit an account. + * * @param Request $request * @param Account $account * + * @SuppressWarnings(PHPMD.CyclomaticComplexity) // long and complex but not that excessively so. + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) + * * @return View */ public function edit(Request $request, Account $account) @@ -237,12 +243,16 @@ class AccountController extends Controller /** + * Show an account. * @param Request $request * @param JournalRepositoryInterface $repository * @param Account $account * @param string $moment * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|View + * + * @SuppressWarnings(PHPMD.CyclomaticComplexity) // long and complex but not that excessively so. + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function show(Request $request, JournalRepositoryInterface $repository, Account $account, string $moment = '') { @@ -389,6 +399,8 @@ class AccountController extends Controller * @param Account $account The account involved. * * @return Collection + * + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ private function getPeriodOverview(Account $account): Collection { @@ -399,7 +411,7 @@ class AccountController extends Controller $start = Navigation::startOfPeriod($start, $range); $end = Navigation::endOfX(new Carbon, $range, null); $entries = new Collection; - + $count = 0; // properties for cache $cache = new CacheProperties; $cache->addProperty($start); @@ -412,24 +424,20 @@ class AccountController extends Controller } Log::debug('Going to get period expenses and incomes.'); - while ($end >= $start) { + while ($end >= $start && $count < 90) { $end = Navigation::startOfPeriod($end, $range); $currentEnd = Navigation::endOfPeriod($end, $range); // try a collector for income: /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); - $collector->setAccounts(new Collection([$account]))->setRange($end, $currentEnd) - ->setTypes([TransactionType::DEPOSIT]) - ->withOpposingAccount(); + $collector->setAccounts(new Collection([$account]))->setRange($end, $currentEnd)->setTypes([TransactionType::DEPOSIT])->withOpposingAccount(); $earned = strval($collector->getJournals()->sum('transaction_amount')); // try a collector for expenses: /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); - $collector->setAccounts(new Collection([$account]))->setRange($end, $currentEnd) - ->setTypes([TransactionType::WITHDRAWAL]) - ->withOpposingAccount(); + $collector->setAccounts(new Collection([$account]))->setRange($end, $currentEnd)->setTypes([TransactionType::WITHDRAWAL])->withOpposingAccount(); $spent = strval($collector->getJournals()->sum('transaction_amount')); $dateStr = $end->format('Y-m-d'); $dateName = Navigation::periodShow($end, $range); @@ -442,7 +450,7 @@ class AccountController extends Controller 'date' => clone $end] ); $end = Navigation::subtractPeriod($end, $range, 1); - + $count++; } $cache->store($entries); diff --git a/app/Http/Controllers/Admin/HomeController.php b/app/Http/Controllers/Admin/HomeController.php index 6cc7090a62..66da4a214c 100644 --- a/app/Http/Controllers/Admin/HomeController.php +++ b/app/Http/Controllers/Admin/HomeController.php @@ -14,7 +14,11 @@ declare(strict_types=1); namespace FireflyIII\Http\Controllers\Admin; +use FireflyIII\Events\AdminRequestedTestMessage; use FireflyIII\Http\Controllers\Controller; +use Illuminate\Http\Request; +use Session; +use Log; /** * Class HomeController @@ -34,4 +38,18 @@ class HomeController extends Controller return view('admin.index', compact('title', 'mainTitleIcon')); } + /** + * @param Request $request + * + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + */ + public function testMessage(Request $request) + { + $ipAddress = $request->ip(); + Log::debug(sprintf('Now in testMessage() controller. IP is %s', $ipAddress)); + event(new AdminRequestedTestMessage(auth()->user(), $ipAddress)); + Session::flash('info', strval(trans('firefly.send_test_triggered'))); + return redirect(route('admin.index')); + } + } diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index 1a82b02e86..bcc52d66cf 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -48,6 +48,32 @@ class UserController extends Controller ); } + /** + * @param User $user + * + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + */ + public function delete(User $user) + { + $subTitle = trans('firefly.delete_user', ['email' => $user->email]); + + return view('admin.users.delete', compact('user', 'subTitle')); + } + + /** + * @param User $user + * @param UserRepositoryInterface $repository + * + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + */ + public function destroy(User $user, UserRepositoryInterface $repository) + { + $repository->destroy($user); + Session::flash('success', strval(trans('firefly.user_deleted'))); + + return redirect(route('admin.users')); + } + /** * @param User $user * @@ -64,9 +90,10 @@ class UserController extends Controller $subTitle = strval(trans('firefly.edit_user', ['email' => $user->email])); $subTitleIcon = 'fa-user-o'; $codes = [ - '' => strval(trans('firefly.no_block_code')), - 'bounced' => strval(trans('firefly.block_code_bounced')), - 'expired' => strval(trans('firefly.block_code_expired')), + '' => strval(trans('firefly.no_block_code')), + 'bounced' => strval(trans('firefly.block_code_bounced')), + 'expired' => strval(trans('firefly.block_code_expired')), + 'email_changed' => strval(trans('firefly.block_code_email_changed')), ]; return view('admin.users.edit', compact('user', 'subTitle', 'subTitleIcon', 'codes')); @@ -143,6 +170,7 @@ class UserController extends Controller } $repository->changeStatus($user, $data['blocked'], $data['blocked_code']); + $repository->updateEmail($user, $data['email']); Session::flash('success', strval(trans('firefly.updated_user', ['email' => $user->email]))); Preferences::mark(); diff --git a/app/Http/Controllers/AttachmentController.php b/app/Http/Controllers/AttachmentController.php index 6827d58fe2..34cd62b272 100644 --- a/app/Http/Controllers/AttachmentController.php +++ b/app/Http/Controllers/AttachmentController.php @@ -99,7 +99,6 @@ class AttachmentController extends Controller public function download(AttachmentRepositoryInterface $repository, Attachment $attachment) { - if ($repository->exists($attachment)) { $content = $repository->getContent($attachment); $quoted = sprintf('"%s"', addcslashes(basename($attachment->filename), '"\\')); diff --git a/app/Http/Controllers/Auth/ForgotPasswordController.php b/app/Http/Controllers/Auth/ForgotPasswordController.php index d1cfdd7832..4d497d63c4 100644 --- a/app/Http/Controllers/Auth/ForgotPasswordController.php +++ b/app/Http/Controllers/Auth/ForgotPasswordController.php @@ -1,31 +1,34 @@ middleware('guest'); - } - /** - * Send a reset link to the given user. - * - * @param Request $request - * - * @param UserRepositoryInterface $repository - * - * @return \Illuminate\Http\RedirectResponse - */ - public function sendResetLinkEmail(Request $request, UserRepositoryInterface $repository) - { - $this->validate($request, ['email' => 'required|email']); - - // verify if the user is not a demo user. If so, we give him back an error. - $user = User::where('email', $request->get('email'))->first(); - - if (!is_null($user) && $repository->hasRole($user, 'demo')) { - return back()->withErrors(['email' => trans('firefly.cannot_reset_demo_user')]); - } - - $response = $this->broker()->sendResetLink($request->only('email')); - - if ($response === Password::RESET_LINK_SENT) { - return back()->with('status', trans($response)); - } - - // If an error was returned by the password broker, we will get this message - // translated so we can notify a user of the problem. We'll redirect back - // to where the users came from so they can attempt this process again. - return back()->withErrors(['email' => trans($response)]); // @codeCoverageIgnore } } diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index f74d1a1e7f..8c5a860e13 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -1,38 +1,49 @@ middleware('guest', ['except' => 'logout']); + $this->middleware('guest')->except('logout'); } /** - * Handle a login request to the application. - * - * @param Request $request - * - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Http\Response - */ - public function login(Request $request) - { - $this->validateLogin($request); - $lockedOut = $this->hasTooManyLoginAttempts($request); - if ($lockedOut) { - $this->fireLockoutEvent($request); - - return $this->sendLockoutResponse($request); - } - - $credentials = $this->credentials($request); - $credentials['blocked'] = 0; // must not be blocked. - - if ($this->guard()->attempt($credentials, $request->has('remember'))) { - return $this->sendLoginResponse($request); - } - - $errorMessage = $this->getBlockedError($credentials['email']); - - if (!$lockedOut) { - $this->incrementLoginAttempts($request); - } - - return $this->sendFailedLoginResponse($request, $errorMessage); - } - - /** - * @param Request $request - * @param CookieJar $cookieJar - * - * @return $this - */ - public function logout(Request $request, CookieJar $cookieJar) - { - if (intval(getenv('SANDSTORM')) === 1) { - return view('error')->with('message', strval(trans('firefly.sandstorm_not_available'))); - } - - $cookie = $cookieJar->forever('twoFactorAuthenticated', 'false'); - - $this->guard()->logout(); - - $request->session()->flush(); - - $request->session()->regenerate(); - - return redirect('/')->withCookie($cookie); - } - - /** - * @return string - */ - public function redirectTo(): string - { - return route('index'); - } - - /** - * Show the application login form. - * - * @param Request $request - * - * @param CookieJar $cookieJar + * Show the application's login form. * * @return \Illuminate\Http\Response */ @@ -120,8 +63,9 @@ class LoginController extends Controller { // forget 2fa cookie: $cookie = $cookieJar->forever('twoFactorAuthenticated', 'false'); + // is allowed to? - $singleUserMode = FireflyConfig::get('single_user_mode', Config::get('firefly.configuration.single_user_mode'))->data; + $singleUserMode = FireflyConfig::get('single_user_mode', config('firefly.configuration.single_user_mode'))->data; $userCount = User::count(); $allowRegistration = true; if ($singleUserMode === true && $userCount > 0) { @@ -133,59 +77,4 @@ class LoginController extends Controller return view('auth.login', compact('allowRegistration', 'email', 'remember'))->withCookie($cookie); } - - /** - * Get the failed login message. - * - * @param string $message - * - * @return string - */ - protected function getFailedLoginMessage(string $message) - { - if (strlen($message) > 0) { - return $message; - } - - return Lang::has('auth.failed') ? Lang::get('auth.failed') : 'These credentials do not match our records.'; - } - - /** - * Get the failed login response instance. - * - * @param \Illuminate\Http\Request $request - * @param string $message - * - * @return \Illuminate\Http\RedirectResponse - */ - protected function sendFailedLoginResponse(Request $request, string $message) - { - return redirect()->back() - ->withInput($request->only($this->username(), 'remember')) - ->withErrors( - [ - $this->username() => $this->getFailedLoginMessage($message), - ] - ); - } - - /** - * @param string $email - * - * @return string - */ - private function getBlockedError(string $email): string - { - // check if user is blocked: - $errorMessage = ''; - /** @var User $foundUser */ - $foundUser = User::where('email', $email)->where('blocked', 1)->first(); - if (!is_null($foundUser)) { - // user exists, but is blocked: - $code = strlen(strval($foundUser->blocked_code)) > 0 ? $foundUser->blocked_code : 'general_blocked'; - $errorMessage = strval(trans('firefly.' . $code . '_error', ['email' => $email])); - } - - return $errorMessage; - } } diff --git a/app/Http/Controllers/Auth/PasswordController.php b/app/Http/Controllers/Auth/PasswordController.php deleted file mode 100644 index 035b11bb13..0000000000 --- a/app/Http/Controllers/Auth/PasswordController.php +++ /dev/null @@ -1,88 +0,0 @@ -middleware('guest'); - } - - /** - * Send a reset link to the given user. - * @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's 7 but ok - * - * @param \Illuminate\Http\Request $request - * - * @return \Symfony\Component\HttpFoundation\Response - */ - public function sendResetLinkEmail(Request $request) - { - $this->validate($request, ['email' => 'required|email']); - - $user = User::whereEmail($request->get('email'))->first(); - $response = 'passwords.blocked'; - - if (is_null($user)) { - $response = Password::INVALID_USER; - } - - if (!is_null($user) && intval($user->blocked) === 0) { - $response = Password::sendResetLink( - $request->only('email'), function (Message $message) { - $message->subject($this->getEmailSubject()); - } - ); - } - - switch ($response) { - case Password::RESET_LINK_SENT: - return $this->getSendResetLinkEmailSuccessResponse($response); - - case Password::INVALID_USER: - case 'passwords.blocked': - default: - return $this->getSendResetLinkEmailFailureResponse($response); - } - } - -} diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index b91b436c0c..ee94e2b711 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -1,43 +1,44 @@ data; + $singleUserMode = FireflyConfig::get('single_user_mode', config('firefly.configuration.single_user_mode'))->data; $userCount = User::count(); if ($singleUserMode === true && $userCount > 0) { $message = 'Registration is currently not available.'; @@ -68,29 +72,19 @@ class RegisterController extends Controller return view('error', compact('message')); } + $this->validator($request->all())->validate(); - $validator = $this->validator($request->all()); + event(new Registered($user = $this->create($request->all()))); - if ($validator->fails()) { - $this->throwValidationException($request, $validator); - } - - $user = $this->create($request->all()); - - // trigger user registration event: - event(new RegisteredUser($user, $request->ip())); - - Auth::login($user); + $this->guard()->login($user); Session::flash('success', strval(trans('firefly.registered'))); - Session::flash('gaEventCategory', 'user'); - Session::flash('gaEventAction', 'new-registration'); - return redirect($this->redirectPath()); + return $this->registered($request, $user) + ?: redirect($this->redirectPath()); } /** - * OLD * Show the application registration form. * * @param Request $request @@ -100,10 +94,10 @@ class RegisterController extends Controller public function showRegistrationForm(Request $request) { // is demo site? - $isDemoSite = FireflyConfig::get('is_demo_site', Config::get('firefly.configuration.is_demo_site'))->data; + $isDemoSite = FireflyConfig::get('is_demo_site', config('firefly.configuration.is_demo_site'))->data; // is allowed to? - $singleUserMode = FireflyConfig::get('single_user_mode', Config::get('firefly.configuration.single_user_mode'))->data; + $singleUserMode = FireflyConfig::get('single_user_mode', config('firefly.configuration.single_user_mode'))->data; $userCount = User::count(); if ($singleUserMode === true && $userCount > 0) { $message = 'Registration is currently not available.'; @@ -113,6 +107,7 @@ class RegisterController extends Controller $email = $request->old('email'); + return view('auth.register', compact('isDemoSite', 'email')); } @@ -121,19 +116,16 @@ class RegisterController extends Controller * * @param array $data * - * @return User + * @return \FireflyIII\User */ protected function create(array $data) { - /** @var User $user */ - $user = User::create( + return User::create( [ 'email' => $data['email'], 'password' => bcrypt($data['password']), ] ); - - return $user; } /** @@ -147,8 +139,8 @@ class RegisterController extends Controller { return Validator::make( $data, [ - 'email' => 'required|email|max:255|unique:users', - 'password' => 'required|min:6|confirmed', + 'email' => 'required|string|email|max:255|unique:users', + 'password' => 'required|string|secure_password|confirmed', ] ); } diff --git a/app/Http/Controllers/Auth/ResetPasswordController.php b/app/Http/Controllers/Auth/ResetPasswordController.php index 1cdb78b988..4957935a8d 100644 --- a/app/Http/Controllers/Auth/ResetPasswordController.php +++ b/app/Http/Controllers/Auth/ResetPasswordController.php @@ -1,32 +1,43 @@ middleware('guest'); } } diff --git a/app/Http/Controllers/Auth/TwoFactorController.php b/app/Http/Controllers/Auth/TwoFactorController.php index f0b2b74993..ccf9e33b7f 100644 --- a/app/Http/Controllers/Auth/TwoFactorController.php +++ b/app/Http/Controllers/Auth/TwoFactorController.php @@ -34,6 +34,8 @@ class TwoFactorController extends Controller * * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View * @throws FireflyException + * + * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ public function index(Request $request) { diff --git a/app/Http/Controllers/BudgetController.php b/app/Http/Controllers/BudgetController.php index 8b89aaf4be..e371aeeeab 100644 --- a/app/Http/Controllers/BudgetController.php +++ b/app/Http/Controllers/BudgetController.php @@ -40,6 +40,7 @@ use View; * Class BudgetController * * @package FireflyIII\Http\Controllers + * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class BudgetController extends Controller { @@ -168,6 +169,9 @@ class BudgetController extends Controller * @param string|null $moment * * @return View + * + * @SuppressWarnings(PHPMD.CyclomaticComplexity) complex because of while loop + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function index(string $moment = null) { @@ -182,7 +186,6 @@ class BudgetController extends Controller $end = Navigation::endOfPeriod($start, $range); } catch (Exception $e) { // start and end are already defined. - } } $next = clone $end; @@ -190,16 +193,12 @@ class BudgetController extends Controller $prev = clone $start; $prev->subDay(); $prev = Navigation::startOfPeriod($prev, $range); - - $this->repository->cleanupBudgets(); - - $budgets = $this->repository->getActiveBudgets(); $inactive = $this->repository->getInactiveBudgets(); $periodStart = $start->formatLocalized($this->monthAndDayFormat); $periodEnd = $end->formatLocalized($this->monthAndDayFormat); - $budgetInformation = $this->collectBudgetInformation($budgets, $start, $end); + $budgetInformation = $this->repository->collectBudgetInformation($budgets, $start, $end); $defaultCurrency = Amount::getDefaultCurrency(); $available = $this->repository->getAvailableBudget($defaultCurrency, $start, $end); $spent = array_sum(array_column($budgetInformation, 'spent')); @@ -246,12 +245,80 @@ class BudgetController extends Controller ); } + /** + * @param Carbon $start + * @param Carbon $end + * + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + */ + public function infoIncome(Carbon $start, Carbon $end) + { + // properties for cache + $cache = new CacheProperties; + $cache->addProperty($start); + $cache->addProperty($end); + $cache->addProperty('info-income'); + + if ($cache->has()) { + $result = $cache->get(); // @codeCoverageIgnore + } + if (!$cache->has()) { + $result = [ + 'available' => '0', + 'earned' => '0', + 'suggested' => '0', + ]; + $currency = Amount::getDefaultCurrency(); + $range = Preferences::get('viewRange', '1M')->data; + $begin = Navigation::subtractPeriod($start, $range, 3); + + // get average amount available. + $total = '0'; + $count = 0; + $currentStart = clone $begin; + while ($currentStart < $start) { + $currentEnd = Navigation::endOfPeriod($currentStart, $range); + $total = bcadd($total, $this->repository->getAvailableBudget($currency, $currentStart, $currentEnd)); + $currentStart = Navigation::addPeriod($currentStart, $range, 0); + $count++; + } + $result['available'] = bcdiv($total, strval($count)); + + // amount earned in this period: + $subDay = clone $end; + $subDay->subDay(); + /** @var JournalCollectorInterface $collector */ + $collector = app(JournalCollectorInterface::class); + $collector->setAllAssetAccounts()->setRange($begin, $subDay)->setTypes([TransactionType::DEPOSIT])->withOpposingAccount(); + $result['earned'] = bcdiv(strval($collector->getJournals()->sum('transaction_amount')), strval($count)); + + // amount spent in period + /** @var JournalCollectorInterface $collector */ + $collector = app(JournalCollectorInterface::class); + $collector->setAllAssetAccounts()->setRange($begin, $subDay)->setTypes([TransactionType::WITHDRAWAL])->withOpposingAccount(); + $result['spent'] = bcdiv(strval($collector->getJournals()->sum('transaction_amount')), strval($count)); + // suggestion starts with the amount spent + $result['suggested'] = bcmul($result['spent'], '-1'); + $result['suggested'] = bccomp($result['suggested'], $result['earned']) === 1 ? $result['earned'] : $result['suggested']; + // unless it's more than you earned. So min() of suggested/earned + + + $cache->store($result); + } + + + return view('budgets.info', compact('result', 'begin', 'currentEnd')); + } + /** * @param Request $request * @param JournalRepositoryInterface $repository * @param string $moment * * @return View + * + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function noBudget(Request $request, JournalRepositoryInterface $repository, string $moment = '') { @@ -455,49 +522,6 @@ class BudgetController extends Controller return view('budgets.income', compact('available', 'start', 'end')); } - /** - * @param Collection $budgets - * @param Carbon $start - * @param Carbon $end - * - * @return array - */ - private function collectBudgetInformation(Collection $budgets, Carbon $start, Carbon $end): array - { - // get account information - /** @var AccountRepositoryInterface $accountRepository */ - $accountRepository = app(AccountRepositoryInterface::class); - $accounts = $accountRepository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET, AccountType::CASH]); - $return = []; - /** @var Budget $budget */ - foreach ($budgets as $budget) { - $budgetId = $budget->id; - $return[$budgetId] = [ - 'spent' => $this->repository->spentInPeriod(new Collection([$budget]), $accounts, $start, $end), - 'budgeted' => '0', - 'currentRep' => false, - ]; - $budgetLimits = $this->repository->getBudgetLimits($budget, $start, $end); - $otherLimits = new Collection; - - // get all the budget limits relevant between start and end and examine them: - /** @var BudgetLimit $limit */ - foreach ($budgetLimits as $limit) { - if ($limit->start_date->isSameDay($start) && $limit->end_date->isSameDay($end) - ) { - $return[$budgetId]['currentLimit'] = $limit; - $return[$budgetId]['budgeted'] = $limit->amount; - continue; - } - // otherwise it's just one of the many relevant repetitions: - $otherLimits->push($limit); - } - $return[$budgetId]['otherLimits'] = $otherLimits; - } - - return $return; - } - /** * @param Budget $budget * @param Carbon $start diff --git a/app/Http/Controllers/CategoryController.php b/app/Http/Controllers/CategoryController.php index 240e2e18ed..056260f5b5 100644 --- a/app/Http/Controllers/CategoryController.php +++ b/app/Http/Controllers/CategoryController.php @@ -204,7 +204,8 @@ class CategoryController extends Controller /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); - $collector->setAllAssetAccounts()->setRange($start, $end)->setLimit($pageSize)->setPage($page)->withoutCategory()->withOpposingAccount(); + $collector->setAllAssetAccounts()->setRange($start, $end)->setLimit($pageSize)->setPage($page)->withoutCategory()->withOpposingAccount() + ->setTypes([TransactionType::WITHDRAWAL, TransactionType::DEPOSIT, TransactionType::TRANSFER]); $collector->removeFilter(InternalTransferFilter::class); $journals = $collector->getPaginatedJournals(); $journals->setPath(route('categories.no-category')); @@ -232,11 +233,12 @@ class CategoryController extends Controller $end = null; $periods = new Collection; - // prep for "all" view. if ($moment === 'all') { $subTitle = trans('firefly.all_journals_for_category', ['name' => $category->name]); - $start = $repository->firstUseDate($category); + $first = $repository->firstUseDate($category); + /** @var Carbon $start */ + $start = is_null($first) ? new Carbon : $first; $end = new Carbon; } @@ -254,7 +256,9 @@ class CategoryController extends Controller // prep for current period if (strlen($moment) === 0) { + /** @var Carbon $start */ $start = clone session('start', Navigation::startOfPeriod(new Carbon, $range)); + /** @var Carbon $end */ $end = clone session('end', Navigation::endOfPeriod(new Carbon, $range)); $periods = $this->getPeriodOverview($category); $subTitle = trans( @@ -358,11 +362,11 @@ class CategoryController extends Controller $end = Navigation::startOfPeriod($end, $range); $currentEnd = Navigation::endOfPeriod($end, $range); - // count journals without budget in this period: + // count journals without category in this period: /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); $collector->setAllAssetAccounts()->setRange($end, $currentEnd)->withoutCategory() - ->withOpposingAccount(); + ->withOpposingAccount()->setTypes([TransactionType::WITHDRAWAL, TransactionType::DEPOSIT, TransactionType::TRANSFER]); $collector->removeFilter(InternalTransferFilter::class); $count = $collector->getJournals()->count(); @@ -420,13 +424,14 @@ class CategoryController extends Controller $accountRepository = app(AccountRepositoryInterface::class); $accounts = $accountRepository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); $first = $repository->firstUseDate($category); - if ($first->year === 1900) { + if (is_null($first)) { $first = new Carbon; } $range = Preferences::get('viewRange', '1M')->data; $first = Navigation::startOfPeriod($first, $range); $end = Navigation::endOfX(new Carbon, $range, null); $entries = new Collection; + $count = 0; // properties for entries with their amounts. $cache = new CacheProperties(); @@ -438,7 +443,7 @@ class CategoryController extends Controller if ($cache->has()) { return $cache->get(); // @codeCoverageIgnore } - while ($end >= $first) { + while ($end >= $first && $count < 90) { $end = Navigation::startOfPeriod($end, $range); $currentEnd = Navigation::endOfPeriod($end, $range); $spent = $repository->spentInPeriod(new Collection([$category]), $accounts, $end, $currentEnd); @@ -466,6 +471,7 @@ class CategoryController extends Controller ] ); $end = Navigation::subtractPeriod($end, $range, 1); + $count++; } $cache->store($entries); diff --git a/app/Http/Controllers/Chart/CategoryController.php b/app/Http/Controllers/Chart/CategoryController.php index b6ac5e0973..ce453131bc 100644 --- a/app/Http/Controllers/Chart/CategoryController.php +++ b/app/Http/Controllers/Chart/CategoryController.php @@ -67,7 +67,7 @@ class CategoryController extends Controller $start = $repository->firstUseDate($category); - if ($start->year === 1900) { + if (is_null($start)) { $start = new Carbon; } diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index ed1835d9c9..87f254a110 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -44,6 +44,8 @@ class Controller extends BaseController protected $monthAndDayFormat; /** @var string */ protected $monthFormat; + /** @var string */ + protected $redirectUri = '/'; /** * Controller constructor. @@ -61,6 +63,7 @@ class Controller extends BaseController View::share('IS_DEMO_SITE', $isDemoSite); View::share('DEMO_USERNAME', env('DEMO_USERNAME', '')); View::share('DEMO_PASSWORD', env('DEMO_PASSWORD', '')); + View::share('FF_VERSION', config('firefly.version')); $this->middleware( @@ -115,10 +118,10 @@ class Controller extends BaseController { $uri = strval(session($identifier)); if (!(strpos($identifier, 'delete') === false) && !(strpos($uri, '/show/') === false)) { - $uri = route('index'); + $uri = $this->redirectUri; } - if (!(strpos($uri, 'javascript') === false)) { - $uri = route('index'); + if (!(strpos($uri, 'jscript') === false)) { + $uri = $this->redirectUri; } return $uri; diff --git a/app/Http/Controllers/ExportController.php b/app/Http/Controllers/ExportController.php index 5cdd3bed06..c60452c653 100644 --- a/app/Http/Controllers/ExportController.php +++ b/app/Http/Controllers/ExportController.php @@ -46,7 +46,7 @@ class ExportController extends Controller $this->middleware( function ($request, $next) { View::share('mainTitleIcon', 'fa-file-archive-o'); - View::share('title', trans('firefly.export_data')); + View::share('title', trans('firefly.export_and_backup_data')); return $next($request); } diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index e29bb0d6f5..c7a992bd27 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -129,9 +129,9 @@ class HomeController extends Controller /** @var Carbon $start */ $start = session('start', Carbon::now()->startOfMonth()); /** @var Carbon $end */ - $end = session('end', Carbon::now()->endOfMonth()); - $accounts = $repository->getAccountsById($frontPage->data); - $showDepositsFrontpage = Preferences::get('showDepositsFrontpage', false)->data; + $end = session('end', Carbon::now()->endOfMonth()); + $accounts = $repository->getAccountsById($frontPage->data); + $showDeps = Preferences::get('showDepositsFrontpage', false)->data; // zero bills? Hide some elements from view. /** @var BillRepositoryInterface $billRepository */ @@ -146,7 +146,7 @@ class HomeController extends Controller } return view( - 'index', compact('count', 'subTitle', 'transactions', 'showDepositsFrontpage', 'billCount') + 'index', compact('count', 'subTitle', 'transactions', 'showDeps', 'billCount') ); } diff --git a/app/Http/Controllers/Import/BankController.php b/app/Http/Controllers/Import/BankController.php index 661da55a77..3e2d59b9c3 100644 --- a/app/Http/Controllers/Import/BankController.php +++ b/app/Http/Controllers/Import/BankController.php @@ -79,7 +79,6 @@ class BankController extends Controller return redirect(route('import.bank.form', [$bank])); } $remoteAccounts = array_keys($remoteAccounts); - $class = config(sprintf('firefly.import_pre.%s', $bank)); // get import file diff --git a/app/Http/Controllers/Json/BoxController.php b/app/Http/Controllers/Json/BoxController.php new file mode 100644 index 0000000000..b6c7751142 --- /dev/null +++ b/app/Http/Controllers/Json/BoxController.php @@ -0,0 +1,193 @@ +startOfMonth()); + $end = session('end', Carbon::now()->endOfMonth()); + $today = new Carbon; + $cache = new CacheProperties; + $cache->addProperty($start); + $cache->addProperty($end); + $cache->addProperty($today); + $cache->addProperty('box-available'); + if ($cache->has()) { + return Response::json($cache->get()); // @codeCoverageIgnore + } + // get available amount + $currency = app('amount')->getDefaultCurrency(); + $available = $repository->getAvailableBudget($currency, $start, $end); + + + // get spent amount: + $budgets = $repository->getActiveBudgets(); + $budgetInformation = $repository->collectBudgetInformation($budgets, $start, $end); + $spent = strval(array_sum(array_column($budgetInformation, 'spent'))); + $left = bcadd($available, $spent); + // left less than zero? then it's zero: + if (bccomp($left, '0') === -1) { + $left = '0'; + } + $days = $today->diffInDays($end) + 1; + $perDay = '0'; + if ($days !== 0) { + $perDay = bcdiv($left, strval($days)); + } + + $return = [ + 'perDay' => app('amount')->formatAnything($currency, $perDay, false), + 'left' => app('amount')->formatAnything($currency, $left, false), + ]; + + $cache->store($return); + + return Response::json($return); + } + + /** + * @return \Illuminate\Http\JsonResponse + */ + public function balance() + { + $start = session('start', Carbon::now()->startOfMonth()); + $end = session('end', Carbon::now()->endOfMonth()); + + $cache = new CacheProperties; + $cache->addProperty($start); + $cache->addProperty($end); + $cache->addProperty('box-balance'); + if ($cache->has()) { + return Response::json($cache->get()); // @codeCoverageIgnore + } + + // try a collector for income: + /** @var JournalCollectorInterface $collector */ + $collector = app(JournalCollectorInterface::class); + $collector->setAllAssetAccounts()->setRange($start, $end) + ->setTypes([TransactionType::DEPOSIT]) + ->withOpposingAccount(); + $income = strval($collector->getJournals()->sum('transaction_amount')); + $currency = app('amount')->getDefaultCurrency(); + + // expense: + // try a collector for expenses: + /** @var JournalCollectorInterface $collector */ + $collector = app(JournalCollectorInterface::class); + $collector->setAllAssetAccounts()->setRange($start, $end) + ->setTypes([TransactionType::WITHDRAWAL]) + ->withOpposingAccount(); + $expense = strval($collector->getJournals()->sum('transaction_amount')); + + $response = [ + 'income' => app('amount')->formatAnything($currency, $income, false), + 'expense' => app('amount')->formatAnything($currency, $expense, false), + 'combined' => app('amount')->formatAnything($currency, bcadd($income, $expense), false), + ]; + + $cache->store($response); + + return Response::json($response); + } + + /** + * @param BillRepositoryInterface $repository + * + * @return \Illuminate\Http\JsonResponse + */ + public function bills(BillRepositoryInterface $repository) + { + $start = session('start', Carbon::now()->startOfMonth()); + $end = session('end', Carbon::now()->endOfMonth()); + + $cache = new CacheProperties; + $cache->addProperty($start); + $cache->addProperty($end); + $cache->addProperty('box-bills'); + if ($cache->has()) { + return Response::json($cache->get()); // @codeCoverageIgnore + } + + /* + * Since both this method and the chart use the exact same data, we can suffice + * with calling the one method in the bill repository that will get this amount. + */ + $paidAmount = bcmul($repository->getBillsPaidInRange($start, $end), '-1'); + $unpaidAmount = $repository->getBillsUnpaidInRange($start, $end); // will be a positive amount. + $currency = app('amount')->getDefaultCurrency(); + + $return = [ + 'paid' => app('amount')->formatAnything($currency, $paidAmount, false), + 'unpaid' => app('amount')->formatAnything($currency, $unpaidAmount, false), + ]; + $cache->store($return); + + return Response::json($return); + } + + /** + * @param AccountRepositoryInterface $repository + * + * @return \Illuminate\Http\JsonResponse + */ + public function netWorth(AccountRepositoryInterface $repository) + { + $today = new Carbon(date('Y-m-d')); // needed so its per day. + $cache = new CacheProperties; + $cache->addProperty($today); + $cache->addProperty('box-net-worth'); + if ($cache->has()) { + return Response::json($cache->get()); // @codeCoverageIgnore + } + $accounts = $repository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); + $currency = app('amount')->getDefaultCurrency(); + $balances = app('steam')->balancesByAccounts($accounts, $today); + $sum = '0'; + foreach ($balances as $entry) { + $sum = bcadd($sum, $entry); + } + + $return = [ + 'net_worth' => app('amount')->formatAnything($currency, $sum, false), + ]; + + $cache->store($return); + + return Response::json($return); + } + +} \ No newline at end of file diff --git a/app/Http/Controllers/JsonController.php b/app/Http/Controllers/JsonController.php index 4805e620eb..4058e30cce 100644 --- a/app/Http/Controllers/JsonController.php +++ b/app/Http/Controllers/JsonController.php @@ -60,114 +60,6 @@ class JsonController extends Controller return Response::json(['html' => $view]); } - /** - * @param BillRepositoryInterface $repository - * - * @return \Symfony\Component\HttpFoundation\Response - */ - public function boxBillsPaid(BillRepositoryInterface $repository) - { - $start = session('start', Carbon::now()->startOfMonth()); - $end = session('end', Carbon::now()->endOfMonth()); - - /* - * Since both this method and the chart use the exact same data, we can suffice - * with calling the one method in the bill repository that will get this amount. - */ - $amount = $repository->getBillsPaidInRange($start, $end); // will be a negative amount. - $amount = bcmul($amount, '-1'); - $currency = Amount::getDefaultCurrency(); - - $data = ['box' => 'bills-paid', 'amount' => Amount::formatAnything($currency, $amount, false), 'amount_raw' => $amount]; - - return Response::json($data); - } - - /** - * @param BillRepositoryInterface $repository - * - * @return \Illuminate\Http\JsonResponse - */ - public function boxBillsUnpaid(BillRepositoryInterface $repository) - { - $start = session('start', Carbon::now()->startOfMonth()); - $end = session('end', Carbon::now()->endOfMonth()); - $amount = $repository->getBillsUnpaidInRange($start, $end); // will be a positive amount. - $currency = Amount::getDefaultCurrency(); - $data = ['box' => 'bills-unpaid', 'amount' => Amount::formatAnything($currency, $amount, false), 'amount_raw' => $amount]; - - return Response::json($data); - } - - /** - * @return \Illuminate\Http\JsonResponse - * @internal param AccountTaskerInterface $accountTasker - * @internal param AccountRepositoryInterface $repository - * - */ - public function boxIn() - { - $start = session('start', Carbon::now()->startOfMonth()); - $end = session('end', Carbon::now()->endOfMonth()); - - // works for json too! - $cache = new CacheProperties; - $cache->addProperty($start); - $cache->addProperty($end); - $cache->addProperty('box-in'); - if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore - } - - // try a collector for income: - /** @var JournalCollectorInterface $collector */ - $collector = app(JournalCollectorInterface::class); - $collector->setAllAssetAccounts()->setRange($start, $end) - ->setTypes([TransactionType::DEPOSIT]) - ->withOpposingAccount(); - - $amount = strval($collector->getJournals()->sum('transaction_amount')); - $currency = Amount::getDefaultCurrency(); - $data = ['box' => 'in', 'amount' => Amount::formatAnything($currency, $amount, false), 'amount_raw' => $amount]; - $cache->store($data); - - return Response::json($data); - } - - /** - * @return \Symfony\Component\HttpFoundation\Response - * @internal param AccountTaskerInterface $accountTasker - * @internal param AccountRepositoryInterface $repository - * - */ - public function boxOut() - { - $start = session('start', Carbon::now()->startOfMonth()); - $end = session('end', Carbon::now()->endOfMonth()); - - // works for json too! - $cache = new CacheProperties; - $cache->addProperty($start); - $cache->addProperty($end); - $cache->addProperty('box-out'); - if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore - } - - // try a collector for expenses: - /** @var JournalCollectorInterface $collector */ - $collector = app(JournalCollectorInterface::class); - $collector->setAllAssetAccounts()->setRange($start, $end) - ->setTypes([TransactionType::WITHDRAWAL]) - ->withOpposingAccount(); - $amount = strval($collector->getJournals()->sum('transaction_amount')); - $currency = Amount::getDefaultCurrency(); - $data = ['box' => 'out', 'amount' => Amount::formatAnything($currency, $amount, false), 'amount_raw' => $amount]; - $cache->store($data); - - return Response::json($data); - } - /** * @param BudgetRepositoryInterface $repository * diff --git a/app/Http/Controllers/PreferencesController.php b/app/Http/Controllers/PreferencesController.php index 7ef95c1307..4948c7efdd 100644 --- a/app/Http/Controllers/PreferencesController.php +++ b/app/Http/Controllers/PreferencesController.php @@ -85,27 +85,27 @@ class PreferencesController extends Controller */ public function index(AccountRepositoryInterface $repository) { - $accounts = $repository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); - $viewRangePref = Preferences::get('viewRange', '1M'); - $viewRange = $viewRangePref->data; - $frontPageAccounts = Preferences::get('frontPageAccounts', []); - $language = Preferences::get('language', config('firefly.default_language', 'en_US'))->data; - $transactionPageSize = Preferences::get('transactionPageSize', 50)->data; - $customFiscalYear = Preferences::get('customFiscalYear', 0)->data; - $showDepositsFrontpage = Preferences::get('showDepositsFrontpage', false)->data; - $fiscalYearStartStr = Preferences::get('fiscalYearStart', '01-01')->data; - $fiscalYearStart = date('Y') . '-' . $fiscalYearStartStr; - $tjOptionalFields = Preferences::get('transaction_journal_optional_fields', [])->data; - $is2faEnabled = Preferences::get('twoFactorAuthEnabled', 0)->data; // twoFactorAuthEnabled - $has2faSecret = !is_null(Preferences::get('twoFactorAuthSecret')); // hasTwoFactorAuthSecret - $showIncomplete = env('SHOW_INCOMPLETE_TRANSLATIONS', false) === true; + $accounts = $repository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); + $viewRangePref = Preferences::get('viewRange', '1M'); + $viewRange = $viewRangePref->data; + $frontPageAccounts = Preferences::get('frontPageAccounts', []); + $language = Preferences::get('language', config('firefly.default_language', 'en_US'))->data; + $transactionPageSize = Preferences::get('transactionPageSize', 50)->data; + $customFiscalYear = Preferences::get('customFiscalYear', 0)->data; + $showDeps = Preferences::get('showDepositsFrontpage', false)->data; + $fiscalYearStartStr = Preferences::get('fiscalYearStart', '01-01')->data; + $fiscalYearStart = date('Y') . '-' . $fiscalYearStartStr; + $tjOptionalFields = Preferences::get('transaction_journal_optional_fields', [])->data; + $is2faEnabled = Preferences::get('twoFactorAuthEnabled', 0)->data; // twoFactorAuthEnabled + $has2faSecret = !is_null(Preferences::get('twoFactorAuthSecret')); // hasTwoFactorAuthSecret + $showIncomplete = env('SHOW_INCOMPLETE_TRANSLATIONS', false) === true; return view( 'preferences.index', compact( 'language', 'accounts', 'frontPageAccounts', 'tjOptionalFields', 'viewRange', 'customFiscalYear', 'transactionPageSize', 'fiscalYearStart', 'is2faEnabled', - 'has2faSecret', 'showIncomplete', 'showDepositsFrontpage' + 'has2faSecret', 'showIncomplete', 'showDeps' ) ); } diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php index 780c3038f4..79ab6bb5a4 100644 --- a/app/Http/Controllers/ProfileController.php +++ b/app/Http/Controllers/ProfileController.php @@ -13,14 +13,20 @@ declare(strict_types=1); namespace FireflyIII\Http\Controllers; +use Auth; +use FireflyIII\Events\UserChangedEmail; +use FireflyIII\Exceptions\FireflyException; use FireflyIII\Exceptions\ValidationException; use FireflyIII\Http\Middleware\IsLimitedUser; use FireflyIII\Http\Requests\DeleteAccountFormRequest; +use FireflyIII\Http\Requests\EmailFormRequest; use FireflyIII\Http\Requests\ProfileFormRequest; +use FireflyIII\Models\Preference; use FireflyIII\Repositories\User\UserRepositoryInterface; use FireflyIII\User; use Hash; use Log; +use Preferences; use Session; use View; @@ -47,10 +53,23 @@ class ProfileController extends Controller return $next($request); } ); - $this->middleware(IsLimitedUser::class); + $this->middleware(IsLimitedUser::class)->except(['confirmEmailChange', 'undoEmailChange']); } + /** + * @return View + */ + public function changeEmail() + { + $title = auth()->user()->email; + $email = auth()->user()->email; + $subTitle = strval(trans('firefly.change_your_email')); + $subTitleIcon = 'fa-envelope'; + + return view('profile.change-email', compact('title', 'subTitle', 'subTitleIcon', 'email')); + } + /** * @return View */ @@ -63,6 +82,37 @@ class ProfileController extends Controller return view('profile.change-password', compact('title', 'subTitle', 'subTitleIcon')); } + /** + * @param string $token + * + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @throws FireflyException + */ + public function confirmEmailChange(string $token) + { + // find preference with this token value. + $set = Preferences::findByName('email_change_confirm_token'); + $user = null; + /** @var Preference $preference */ + foreach ($set as $preference) { + if ($preference->data === $token) { + $user = $preference->user; + } + } + // update user to clear blocked and blocked_code. + if (is_null($user)) { + throw new FireflyException('Invalid token.'); + } + $user->blocked = 0; + $user->blocked_code = ''; + $user->save(); + + // return to login. + Session::flash('success', strval(trans('firefly.login_with_new_email'))); + + return redirect(route('login')); + } + /** * @return View */ @@ -84,7 +134,57 @@ class ProfileController extends Controller $subTitle = auth()->user()->email; $userId = auth()->user()->id; - return view('profile.index', compact('subTitle', 'userId')); + // get access token or create one. + $accessToken = Preferences::get('access_token', null); + if (is_null($accessToken)) { + $token = auth()->user()->generateAccessToken(); + $accessToken = Preferences::set('access_token', $token); + } + + return view('profile.index', compact('subTitle', 'userId', 'accessToken')); + } + + /** + * @param EmailFormRequest $request + * @param UserRepositoryInterface $repository + * + * @return $this|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + */ + public function postChangeEmail(EmailFormRequest $request, UserRepositoryInterface $repository) + { + /** @var User $user */ + $user = auth()->user(); + $newEmail = $request->string('email'); + $oldEmail = $user->email; + if ($newEmail === $user->email) { + Session::flash('error', strval(trans('firefly.email_not_changed'))); + + return redirect(route('profile.change-email'))->withInput(); + } + $existing = $repository->findByEmail($newEmail); + if (!is_null($existing)) { + // force user logout. + $this->guard()->logout(); + $request->session()->invalidate(); + + Session::flash('success', strval(trans('firefly.email_changed'))); + + return redirect(route('index')); + } + + // now actually update user: + $repository->changeEmail($user, $newEmail); + + // call event. + $ipAddress = $request->ip(); + event(new UserChangedEmail($user, $newEmail, $oldEmail, $ipAddress)); + + // force user logout. + Auth::guard()->logout(); + $request->session()->invalidate(); + Session::flash('success', strval(trans('firefly.email_changed'))); + + return redirect(route('index')); } /** @@ -140,6 +240,64 @@ class ProfileController extends Controller return redirect(route('index')); } + /** + * + */ + function regenerate() + { + $token = auth()->user()->generateAccessToken(); + Preferences::set('access_token', $token); + Session::flash('success', strval(trans('firefly.token_regenerated'))); + + return redirect(route('profile.index')); + } + + /** + * @param string $token + * @param string $hash + * + * @throws FireflyException + */ + public function undoEmailChange(string $token, string $hash) + { + // find preference with this token value. + $set = Preferences::findByName('email_change_undo_token'); + $user = null; + /** @var Preference $preference */ + foreach ($set as $preference) { + if ($preference->data === $token) { + $user = $preference->user; + } + } + if (is_null($user)) { + throw new FireflyException('Invalid token.'); + } + + // found user. + // which email address to return to? + $set = Preferences::beginsWith($user, 'previous_email_'); + $match = null; + foreach ($set as $entry) { + $hashed = hash('sha256', $entry->data); + if ($hashed === $hash) { + $match = $entry->data; + break; + } + } + if (is_null($match)) { + throw new FireflyException('Invalid token.'); + } + // change user back + $user->email = $match; + $user->blocked = 0; + $user->blocked_code = ''; + $user->save(); + + // return to login. + Session::flash('success', strval(trans('firefly.login_with_old_email'))); + + return redirect(route('login')); + } /** * @param User $user diff --git a/app/Http/Controllers/RuleController.php b/app/Http/Controllers/RuleController.php index 46de443874..a8fc1b5e4f 100644 --- a/app/Http/Controllers/RuleController.php +++ b/app/Http/Controllers/RuleController.php @@ -27,7 +27,7 @@ use FireflyIII\Models\RuleTrigger; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Rule\RuleRepositoryInterface; use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; -use FireflyIII\Rules\TransactionMatcher; +use FireflyIII\TransactionRules\TransactionMatcher; use Illuminate\Http\Request; use Preferences; use Response; @@ -196,9 +196,9 @@ class RuleController extends Controller return view( 'rules.rule.edit', compact( - 'rule', 'subTitle', - 'primaryTrigger', 'oldTriggers', 'oldActions', 'triggerCount', 'actionCount', 'ruleGroups' - ) + 'rule', 'subTitle', + 'primaryTrigger', 'oldTriggers', 'oldActions', 'triggerCount', 'actionCount', 'ruleGroups' + ) ); } diff --git a/app/Http/Controllers/SearchController.php b/app/Http/Controllers/SearchController.php index 615947e108..596616359b 100644 --- a/app/Http/Controllers/SearchController.php +++ b/app/Http/Controllers/SearchController.php @@ -51,7 +51,7 @@ class SearchController extends Controller */ public function index(Request $request, SearchInterface $searcher) { - $fullQuery = $request->get('q'); + $fullQuery = strval($request->get('q')); // parse search terms: $searcher->parseQuery($fullQuery); diff --git a/app/Http/Controllers/TagController.php b/app/Http/Controllers/TagController.php index f4ecb7f429..0c9ffcda95 100644 --- a/app/Http/Controllers/TagController.php +++ b/app/Http/Controllers/TagController.php @@ -53,6 +53,7 @@ class TagController extends Controller { parent::__construct(); View::share('hideTags', true); + $this->redirectUri = route('tags.index'); $this->middleware( function ($request, $next) { @@ -194,17 +195,13 @@ class TagController extends Controller $end = null; $periods = new Collection; $apiKey = env('GOOGLE_MAPS_API_KEY', ''); - $sum = '0'; $path = route('tags.show', [$tag->id]); - // prep for "all" view. if ($moment === 'all') { $subTitle = trans('firefly.all_journals_for_tag', ['tag' => $tag->tag]); $start = $repository->firstUseDate($tag); $end = new Carbon; - $sum = $repository->sumOfTag($tag, null, null); - $result = $repository->resultOfTag($tag, null, null); $path = route('tags.show', [$tag->id, 'all']); } @@ -218,18 +215,16 @@ class TagController extends Controller 'start' => $start->formatLocalized($this->monthAndDayFormat), 'end' => $end->formatLocalized($this->monthAndDayFormat)] ); $periods = $this->getPeriodOverview($tag); - $sum = $repository->sumOfTag($tag, $start, $end); - $result = $repository->resultOfTag($tag, $start, $end); $path = route('tags.show', [$tag->id, $moment]); } // prep for current period if (strlen($moment) === 0) { - $start = clone session('start', Navigation::startOfPeriod(new Carbon, $range)); + /** @var Carbon $start */ + $start = clone session('start', Navigation::startOfPeriod(new Carbon, $range)); + /** @var Carbon $end */ $end = clone session('end', Navigation::endOfPeriod(new Carbon, $range)); $periods = $this->getPeriodOverview($tag); - $sum = $repository->sumOfTag($tag, $start, $end); - $result = $repository->resultOfTag($tag, $start, $end); $subTitle = trans( 'firefly.journals_in_period_for_tag', ['tag' => $tag->tag, 'start' => $start->formatLocalized($this->monthAndDayFormat), 'end' => $end->formatLocalized($this->monthAndDayFormat)] @@ -243,8 +238,9 @@ class TagController extends Controller $journals = $collector->getPaginatedJournals(); $journals->setPath($path); + $sums = $repository->sumsOfTag($tag, $start, $end); - return view('tags.show', compact('apiKey', 'tag', 'result', 'periods', 'subTitle', 'subTitleIcon', 'journals', 'sum', 'start', 'end', 'moment')); + return view('tags.show', compact('apiKey', 'tag', 'sums', 'periods', 'subTitle', 'subTitleIcon', 'journals', 'start', 'end', 'moment')); } /** diff --git a/app/Http/Controllers/Transaction/ConvertController.php b/app/Http/Controllers/Transaction/ConvertController.php index b01335dce7..196d6b5efd 100644 --- a/app/Http/Controllers/Transaction/ConvertController.php +++ b/app/Http/Controllers/Transaction/ConvertController.php @@ -85,7 +85,7 @@ class ConvertController extends Controller // cannot convert split. if ($journal->transactions()->count() > 2) { - Session::flash('error', trans('firefly.cannot_convert_split_journl')); + Session::flash('error', trans('firefly.cannot_convert_split_journal')); return redirect(route('transactions.show', [$journal->id])); } @@ -134,7 +134,7 @@ class ConvertController extends Controller } if ($journal->transactions()->count() > 2) { - Session::flash('error', trans('firefly.cannot_convert_split_journl')); + Session::flash('error', trans('firefly.cannot_convert_split_journal')); return redirect(route('transactions.show', [$journal->id])); } @@ -185,7 +185,7 @@ class ConvertController extends Controller case TransactionType::DEPOSIT . '-' . TransactionType::WITHDRAWAL: case TransactionType::TRANSFER . '-' . TransactionType::WITHDRAWAL: // three and five - if ($data['destination_account_expense'] === '') { + if ($data['destination_account_expense'] === '' || is_null($data['destination_account_expense'])) { // destination is a cash account. $destination = $accountRepository->getCashAccount(); @@ -232,7 +232,7 @@ class ConvertController extends Controller case TransactionType::WITHDRAWAL . '-' . TransactionType::DEPOSIT: case TransactionType::TRANSFER . '-' . TransactionType::DEPOSIT: - if ($data['source_account_revenue'] === '') { + if ($data['source_account_revenue'] === '' || is_null($data['source_account_revenue'])) { // destination is a cash account. $destination = $accountRepository->getCashAccount(); diff --git a/app/Http/Controllers/Transaction/LinkController.php b/app/Http/Controllers/Transaction/LinkController.php index 98aaf10651..10a9555433 100644 --- a/app/Http/Controllers/Transaction/LinkController.php +++ b/app/Http/Controllers/Transaction/LinkController.php @@ -94,7 +94,12 @@ class LinkController extends Controller public function store( JournalLinkRequest $request, LinkTypeRepositoryInterface $repository, JournalRepositoryInterface $journalRepository, TransactionJournal $journal ) { - $linkInfo = $request->getLinkInfo(); + $linkInfo = $request->getLinkInfo(); + if ($linkInfo['transaction_journal_id'] === 0) { + Session::flash('error', trans('firefly.invalid_link_selection')); + + return redirect(route('transactions.show', [$journal->id])); + } $linkType = $repository->find($linkInfo['link_type_id']); $other = $journalRepository->find($linkInfo['transaction_journal_id']); $alreadyLinked = $repository->findLink($journal, $other); diff --git a/app/Http/Controllers/Transaction/SplitController.php b/app/Http/Controllers/Transaction/SplitController.php index 8f3783a476..1d35c2a45f 100644 --- a/app/Http/Controllers/Transaction/SplitController.php +++ b/app/Http/Controllers/Transaction/SplitController.php @@ -184,6 +184,7 @@ class SplitController extends Controller */ private function arrayFromInput(SplitJournalFormRequest $request): array { + $tags = is_null($request->get('tags')) ? '' : $request->get('tags'); $array = [ 'journal_description' => $request->get('journal_description'), 'journal_source_account_id' => $request->get('journal_source_account_id'), @@ -200,7 +201,7 @@ class SplitController extends Controller 'invoice_date' => $request->get('invoice_date'), 'internal_reference' => $request->get('internal_reference'), 'notes' => $request->get('notes'), - 'tags' => explode(',', $request->get('tags')), + 'tags' => explode(',', $tags), // transactions. 'transactions' => $this->getTransactionDataFromRequest($request), diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 5224ad8579..13a6da81ac 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -1,14 +1,15 @@ Authorize::class, 'guest' => RedirectIfAuthenticated::class, 'throttle' => ThrottleRequests::class, - 'range' => Range::class, ]; } diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php index 5733cb1c1a..5e4d6f9ed6 100644 --- a/app/Http/Middleware/Authenticate.php +++ b/app/Http/Middleware/Authenticate.php @@ -44,8 +44,13 @@ class Authenticate return redirect()->guest('login'); } if (intval(auth()->user()->blocked) === 1) { + $message = strval(trans('firefly.block_account_logout')); + if (auth()->user()->blocked_code === 'email_changed') { + $message = strval(trans('firefly.email_changed_logout')); + } + + Session::flash('logoutMessage', $message); Auth::guard($guard)->logout(); - Session::flash('logoutMessage', trans('firefly.block_account_logout')); return redirect()->guest('login'); } diff --git a/app/Http/Middleware/EncryptCookies.php b/app/Http/Middleware/EncryptCookies.php index 85188c9c17..0bae9d6f94 100644 --- a/app/Http/Middleware/EncryptCookies.php +++ b/app/Http/Middleware/EncryptCookies.php @@ -1,25 +1,21 @@ check()) { - return redirect('/'); + return redirect('/home'); } return $next($request); diff --git a/app/Http/Middleware/StartFireflySession.php b/app/Http/Middleware/StartFireflySession.php deleted file mode 100644 index c419b0e8c3..0000000000 --- a/app/Http/Middleware/StartFireflySession.php +++ /dev/null @@ -1,54 +0,0 @@ -fullUrl(); - if ($request->method() === 'GET' && $request->route() && !$request->ajax()) { - if (strpos($fullUrl, '/javascript/') === false) { - $session->setPreviousUrl($fullUrl); - } - } - } - -} diff --git a/app/Http/Middleware/TrimStrings.php b/app/Http/Middleware/TrimStrings.php new file mode 100644 index 0000000000..d336ed707b --- /dev/null +++ b/app/Http/Middleware/TrimStrings.php @@ -0,0 +1,30 @@ + 'FORWARDED', + Request::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR', + Request::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST', + Request::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT', + Request::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO', + ]; + /** + * The trusted proxies for this application. + * + * @var array + */ + protected $proxies; +} diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php index 98ded14137..0629fe38e5 100644 --- a/app/Http/Middleware/VerifyCsrfToken.php +++ b/app/Http/Middleware/VerifyCsrfToken.php @@ -1,27 +1,21 @@ headers->setCookie( - new Cookie( - 'XSRF-TOKEN', $request->session()->token(), Carbon::now()->getTimestamp() + 60 * $config['lifetime'], - $config['path'], $config['domain'], $config['secure'], true - ) - ); - - return $response; - } } diff --git a/app/Http/Requests/AccountFormRequest.php b/app/Http/Requests/AccountFormRequest.php index bf24b65418..edf5693c81 100644 --- a/app/Http/Requests/AccountFormRequest.php +++ b/app/Http/Requests/AccountFormRequest.php @@ -75,13 +75,13 @@ class AccountFormRequest extends Request return [ 'id' => $idRule, 'name' => $nameRule, - 'openingBalance' => 'numeric|required_with:openingBalanceDate', - 'openingBalanceDate' => 'date|required_with:openingBalance', - 'iban' => 'iban', - 'BIC' => 'bic', - 'virtualBalance' => 'numeric', + 'openingBalance' => 'numeric|required_with:openingBalanceDate|nullable', + 'openingBalanceDate' => 'date|required_with:openingBalance|nullable', + 'iban' => 'iban|nullable', + 'BIC' => 'bic|nullable', + 'virtualBalance' => 'numeric|nullable', 'currency_id' => 'exists:transaction_currencies,id', - 'accountNumber' => 'between:1,255|uniqueAccountNumberForUser', + 'accountNumber' => 'between:1,255|uniqueAccountNumberForUser|nullable', 'accountRole' => 'in:' . $accountRoles, 'active' => 'boolean', 'ccType' => 'in:' . $ccPaymentTypes, diff --git a/app/Http/Requests/AttachmentFormRequest.php b/app/Http/Requests/AttachmentFormRequest.php index 30d2fe6d2b..e5ab3f9b2c 100644 --- a/app/Http/Requests/AttachmentFormRequest.php +++ b/app/Http/Requests/AttachmentFormRequest.php @@ -47,11 +47,11 @@ class AttachmentFormRequest extends Request */ public function rules() { - + // fixed return [ - 'title' => 'between:1,255', - 'description' => 'between:1,65536', - 'notes' => 'between:1,65536', + 'title' => 'between:1,255|nullable', + 'description' => 'between:1,65536|nullable', + 'notes' => 'between:1,65536|nullable', ]; } } diff --git a/app/Http/Requests/BillFormRequest.php b/app/Http/Requests/BillFormRequest.php index 1dbe2d707b..08f270fc33 100644 --- a/app/Http/Requests/BillFormRequest.php +++ b/app/Http/Requests/BillFormRequest.php @@ -61,7 +61,7 @@ class BillFormRequest extends Request $nameRule .= ',' . intval($this->get('id')); $matchRule .= ',' . intval($this->get('id')); } - + // is OK $rules = [ 'name' => $nameRule, 'match' => $matchRule, diff --git a/app/Http/Requests/BudgetFormRequest.php b/app/Http/Requests/BudgetFormRequest.php index 5c6f1ce537..6e6aeeb039 100644 --- a/app/Http/Requests/BudgetFormRequest.php +++ b/app/Http/Requests/BudgetFormRequest.php @@ -47,6 +47,7 @@ class BudgetFormRequest extends Request */ public function rules() { + // fixed /** @var BudgetRepositoryInterface $repository */ $repository = app(BudgetRepositoryInterface::class); $nameRule = 'required|between:1,100|uniqueObjectForUser:budgets,name'; diff --git a/app/Http/Requests/BudgetIncomeRequest.php b/app/Http/Requests/BudgetIncomeRequest.php index 7f2375e3b0..b29df8781d 100644 --- a/app/Http/Requests/BudgetIncomeRequest.php +++ b/app/Http/Requests/BudgetIncomeRequest.php @@ -35,6 +35,7 @@ class BudgetIncomeRequest extends Request */ public function rules() { + // fixed return [ 'amount' => 'numeric|required|min:0', 'start' => 'required|date|before:end', diff --git a/app/Http/Requests/CategoryFormRequest.php b/app/Http/Requests/CategoryFormRequest.php index 9fb1942d20..d925a558d5 100644 --- a/app/Http/Requests/CategoryFormRequest.php +++ b/app/Http/Requests/CategoryFormRequest.php @@ -54,6 +54,7 @@ class CategoryFormRequest extends Request $nameRule = 'required|between:1,100|uniqueObjectForUser:categories,name,' . intval($this->get('id')); } + // fixed return [ 'name' => $nameRule, ]; diff --git a/app/Http/Requests/ConfigurationRequest.php b/app/Http/Requests/ConfigurationRequest.php index 15cfe56a43..214839f6ca 100644 --- a/app/Http/Requests/ConfigurationRequest.php +++ b/app/Http/Requests/ConfigurationRequest.php @@ -46,6 +46,7 @@ class ConfigurationRequest extends Request */ public function rules() { + // fixed $rules = [ 'single_user_mode' => 'between:0,1|numeric', 'is_demo_site' => 'between:0,1|numeric', diff --git a/app/Http/Requests/CurrencyFormRequest.php b/app/Http/Requests/CurrencyFormRequest.php index 6a779665e5..2bb64be03f 100644 --- a/app/Http/Requests/CurrencyFormRequest.php +++ b/app/Http/Requests/CurrencyFormRequest.php @@ -48,7 +48,7 @@ class CurrencyFormRequest extends Request */ public function rules() { - + // fixed $rules = [ 'name' => 'required|max:48|min:1|unique:transaction_currencies,name', 'code' => 'required|min:3|max:3|unique:transaction_currencies,code', diff --git a/app/Http/Requests/DeleteAccountFormRequest.php b/app/Http/Requests/DeleteAccountFormRequest.php index b3dd484d7e..6cf51a3e25 100644 --- a/app/Http/Requests/DeleteAccountFormRequest.php +++ b/app/Http/Requests/DeleteAccountFormRequest.php @@ -35,6 +35,7 @@ class DeleteAccountFormRequest extends Request */ public function rules() { + // fixed return [ 'password' => 'required', ]; diff --git a/app/Http/Requests/EmailFormRequest.php b/app/Http/Requests/EmailFormRequest.php new file mode 100644 index 0000000000..5201d92202 --- /dev/null +++ b/app/Http/Requests/EmailFormRequest.php @@ -0,0 +1,42 @@ +check(); + } + + /** + * @return array + */ + public function rules() + { + // fixed + return [ + 'email' => 'required|email', + ]; + } +} diff --git a/app/Http/Requests/ExportFormRequest.php b/app/Http/Requests/ExportFormRequest.php index 7b02ec5520..61e3c16171 100644 --- a/app/Http/Requests/ExportFormRequest.php +++ b/app/Http/Requests/ExportFormRequest.php @@ -42,6 +42,8 @@ class ExportFormRequest extends Request $today = Carbon::create()->addDay()->format('Y-m-d'); $formats = join(',', array_keys(config('firefly.export_formats'))); + // fixed + return [ 'export_start_range' => 'required|date|after:' . $first, 'export_end_range' => 'required|date|before:' . $today, diff --git a/app/Http/Requests/ImportUploadRequest.php b/app/Http/Requests/ImportUploadRequest.php index 758ee6164a..cc58773848 100644 --- a/app/Http/Requests/ImportUploadRequest.php +++ b/app/Http/Requests/ImportUploadRequest.php @@ -35,6 +35,7 @@ class ImportUploadRequest extends Request */ public function rules() { + // fixed $types = array_keys(config('firefly.import_formats')); return [ diff --git a/app/Http/Requests/JournalFormRequest.php b/app/Http/Requests/JournalFormRequest.php index f38acfbc4d..bf01081db3 100644 --- a/app/Http/Requests/JournalFormRequest.php +++ b/app/Http/Requests/JournalFormRequest.php @@ -88,29 +88,29 @@ class JournalFormRequest extends Request 'date' => 'required|date', // then, custom fields: - 'interest_date' => 'date', - 'book_date' => 'date', - 'process_date' => 'date', - 'due_date' => 'date', - 'payment_date' => 'date', - 'invoice_date' => 'date', - 'internal_reference' => 'min:1,max:255', - 'notes' => 'min:1,max:50000', + 'interest_date' => 'date|nullable', + 'book_date' => 'date|nullable', + 'process_date' => 'date|nullable', + 'due_date' => 'date|nullable', + 'payment_date' => 'date|nullable', + 'invoice_date' => 'date|nullable', + 'internal_reference' => 'min:1,max:255|nullable', + 'notes' => 'min:1,max:50000|nullable', // and then transaction rules: 'description' => 'required|between:1,255', 'amount' => 'numeric|required|more:0', - 'budget_id' => 'mustExist:budgets,id|belongsToUser:budgets,id', - 'category' => 'between:1,255', - 'source_account_id' => 'numeric|belongsToUser:accounts,id', - 'source_account_name' => 'between:1,255', - 'destination_account_id' => 'numeric|belongsToUser:accounts,id', - 'destination_account_name' => 'between:1,255', - 'piggy_bank_id' => 'between:1,255', + 'budget_id' => 'mustExist:budgets,id|belongsToUser:budgets,id|nullable', + 'category' => 'between:1,255|nullable', + 'source_account_id' => 'numeric|belongsToUser:accounts,id|nullable', + 'source_account_name' => 'between:1,255|nullable', + 'destination_account_id' => 'numeric|belongsToUser:accounts,id|nullable', + 'destination_account_name' => 'between:1,255|nullable', + 'piggy_bank_id' => 'between:1,255|nullable', // foreign currency amounts - 'native_amount' => 'numeric|more:0', - 'source_amount' => 'numeric|more:0', - 'destination_amount' => 'numeric', + 'native_amount' => 'numeric|more:0|nullable', + 'source_amount' => 'numeric|more:0|nullable', + 'destination_amount' => 'numeric|more:0|nullable', ]; // some rules get an upgrade depending on the type of data: @@ -133,10 +133,10 @@ class JournalFormRequest extends Request switch ($what) { case strtolower(TransactionType::WITHDRAWAL): $rules['source_account_id'] = 'required|exists:accounts,id|belongsToUser:accounts'; - $rules['destination_account_name'] = 'between:1,255'; + $rules['destination_account_name'] = 'between:1,255|nullable'; break; case strtolower(TransactionType::DEPOSIT): - $rules['source_account_name'] = 'between:1,255'; + $rules['source_account_name'] = 'between:1,255|nullable'; $rules['destination_account_id'] = 'required|exists:accounts,id|belongsToUser:accounts'; break; case strtolower(TransactionType::TRANSFER): diff --git a/app/Http/Requests/JournalLinkRequest.php b/app/Http/Requests/JournalLinkRequest.php index 50b2069d47..0e509a726a 100644 --- a/app/Http/Requests/JournalLinkRequest.php +++ b/app/Http/Requests/JournalLinkRequest.php @@ -65,6 +65,7 @@ class JournalLinkRequest extends Request } $string = join(',', $combinations); + // fixed return [ 'link_type' => sprintf('required|in:%s', $string), 'link_other' => 'belongsToUser:transaction_journals', diff --git a/app/Http/Requests/LinkTypeFormRequest.php b/app/Http/Requests/LinkTypeFormRequest.php index 625e40d0d5..7bc9d267bd 100644 --- a/app/Http/Requests/LinkTypeFormRequest.php +++ b/app/Http/Requests/LinkTypeFormRequest.php @@ -36,6 +36,8 @@ class LinkTypeFormRequest extends Request */ public function rules() { + // fixed + /** @var LinkTypeRepositoryInterface $repository */ $repository = app(LinkTypeRepositoryInterface::class); $nameRule = 'required|min:1|unique:link_types,name'; diff --git a/app/Http/Requests/MassDeleteJournalRequest.php b/app/Http/Requests/MassDeleteJournalRequest.php index 004f4aa4ed..b8755ae186 100644 --- a/app/Http/Requests/MassDeleteJournalRequest.php +++ b/app/Http/Requests/MassDeleteJournalRequest.php @@ -35,6 +35,7 @@ class MassDeleteJournalRequest extends Request */ public function rules() { + // fixed return [ 'confirm_mass_delete.*' => 'required|belongsToUser:transaction_journals,id', ]; diff --git a/app/Http/Requests/MassEditJournalRequest.php b/app/Http/Requests/MassEditJournalRequest.php index 7067d34e05..008a03aeb9 100644 --- a/app/Http/Requests/MassEditJournalRequest.php +++ b/app/Http/Requests/MassEditJournalRequest.php @@ -35,6 +35,8 @@ class MassEditJournalRequest extends Request */ public function rules() { + // fixed + return [ 'description.*' => 'required|min:1,max:255', 'source_account_id.*' => 'numeric|belongsToUser:accounts,id', diff --git a/app/Http/Requests/NewUserFormRequest.php b/app/Http/Requests/NewUserFormRequest.php index b5ef0fd040..0beb467f8f 100644 --- a/app/Http/Requests/NewUserFormRequest.php +++ b/app/Http/Requests/NewUserFormRequest.php @@ -35,6 +35,7 @@ class NewUserFormRequest extends Request */ public function rules() { + // fixed return [ 'bank_name' => 'required|between:1,200', 'bank_balance' => 'required|numeric', diff --git a/app/Http/Requests/PiggyBankFormRequest.php b/app/Http/Requests/PiggyBankFormRequest.php index c2d9f7f9e5..132cacf3a8 100644 --- a/app/Http/Requests/PiggyBankFormRequest.php +++ b/app/Http/Requests/PiggyBankFormRequest.php @@ -53,8 +53,7 @@ class PiggyBankFormRequest extends Request public function rules() { - $nameRule = 'required|between:1,255|uniquePiggyBankForUser'; - $targetDateRule = 'date'; + $nameRule = 'required|between:1,255|uniquePiggyBankForUser'; if (intval($this->get('id'))) { $nameRule = 'required|between:1,255|uniquePiggyBankForUser:' . intval($this->get('id')); } @@ -66,7 +65,7 @@ class PiggyBankFormRequest extends Request 'targetamount' => 'required|numeric|more:0', 'amount_currency_id_targetamount' => 'required|exists:transaction_currencies,id', 'startdate' => 'date', - 'targetdate' => $targetDateRule, + 'targetdate' => 'date|nullable', 'order' => 'integer|min:1', ]; diff --git a/app/Http/Requests/ProfileFormRequest.php b/app/Http/Requests/ProfileFormRequest.php index 3310897272..d5707e9ab9 100644 --- a/app/Http/Requests/ProfileFormRequest.php +++ b/app/Http/Requests/ProfileFormRequest.php @@ -35,6 +35,7 @@ class ProfileFormRequest extends Request */ public function rules() { + // fixed return [ 'current_password' => 'required', 'new_password' => 'required|confirmed|secure_password', diff --git a/app/Http/Requests/ReportFormRequest.php b/app/Http/Requests/ReportFormRequest.php index db8b5fbe74..94788699a6 100644 --- a/app/Http/Requests/ReportFormRequest.php +++ b/app/Http/Requests/ReportFormRequest.php @@ -44,6 +44,7 @@ class ReportFormRequest extends Request */ public function getAccountList(): Collection { + // fixed /** @var AccountRepositoryInterface $repository */ $repository = app(AccountRepositoryInterface::class); $set = $this->get('accounts'); diff --git a/app/Http/Requests/RuleFormRequest.php b/app/Http/Requests/RuleFormRequest.php index d2a965ca6d..bc4338ded6 100644 --- a/app/Http/Requests/RuleFormRequest.php +++ b/app/Http/Requests/RuleFormRequest.php @@ -72,7 +72,7 @@ class RuleFormRequest extends Request } $rules = [ 'title' => $titleRule, - 'description' => 'between:1,5000', + 'description' => 'between:1,5000|nullable', 'stop_processing' => 'boolean', 'rule_group_id' => 'required|belongsToUser:rule_groups', 'trigger' => 'required|in:store-journal,update-journal', diff --git a/app/Http/Requests/RuleGroupFormRequest.php b/app/Http/Requests/RuleGroupFormRequest.php index 4e94676e23..22a6224d8b 100644 --- a/app/Http/Requests/RuleGroupFormRequest.php +++ b/app/Http/Requests/RuleGroupFormRequest.php @@ -48,6 +48,7 @@ class RuleGroupFormRequest extends Request */ public function rules() { + // fixed /** @var RuleGroupRepositoryInterface $repository */ $repository = app(RuleGroupRepositoryInterface::class); $titleRule = 'required|between:1,100|uniqueObjectForUser:rule_groups,title'; @@ -57,7 +58,7 @@ class RuleGroupFormRequest extends Request return [ 'title' => $titleRule, - 'description' => 'between:1,5000', + 'description' => 'between:1,5000|nullable', ]; } } diff --git a/app/Http/Requests/SelectTransactionsRequest.php b/app/Http/Requests/SelectTransactionsRequest.php index 5b85dd3b26..98ee89afeb 100644 --- a/app/Http/Requests/SelectTransactionsRequest.php +++ b/app/Http/Requests/SelectTransactionsRequest.php @@ -37,10 +37,10 @@ class SelectTransactionsRequest extends Request */ public function rules() { + // fixed $sessionFirst = clone session('first'); - - $first = $sessionFirst->subDay()->format('Y-m-d'); - $today = Carbon::create()->addDay()->format('Y-m-d'); + $first = $sessionFirst->subDay()->format('Y-m-d'); + $today = Carbon::create()->addDay()->format('Y-m-d'); return [ 'start_date' => 'required|date|after:' . $first, diff --git a/app/Http/Requests/SplitJournalFormRequest.php b/app/Http/Requests/SplitJournalFormRequest.php index 1a2f0defa3..c1f63f357e 100644 --- a/app/Http/Requests/SplitJournalFormRequest.php +++ b/app/Http/Requests/SplitJournalFormRequest.php @@ -68,16 +68,16 @@ class SplitJournalFormRequest extends Request 'journal_source_account_name.*' => 'between:1,255', 'journal_currency_id' => 'required|exists:transaction_currencies,id', 'date' => 'required|date', - 'interest_date' => 'date', - 'book_date' => 'date', - 'process_date' => 'date', + 'interest_date' => 'date|nullable', + 'book_date' => 'date|nullable', + 'process_date' => 'date|nullable', 'transactions.*.description' => 'required|between:1,255', 'transactions.*.destination_account_id' => 'numeric|belongsToUser:accounts,id', - 'transactions.*.destination_account_name' => 'between:1,255', + 'transactions.*.destination_account_name' => 'between:1,255|nullable', 'transactions.*.amount' => 'required|numeric', 'transactions.*.budget_id' => 'belongsToUser:budgets,id', - 'transactions.*.category' => 'between:1,255', - 'transactions.*.piggy_bank_id' => 'between:1,255', + 'transactions.*.category' => 'between:1,255|nullable', + 'transactions.*.piggy_bank_id' => 'between:1,255|nullable', ]; } diff --git a/app/Http/Requests/TagFormRequest.php b/app/Http/Requests/TagFormRequest.php index 71f1fdd796..c3ccc74ea3 100644 --- a/app/Http/Requests/TagFormRequest.php +++ b/app/Http/Requests/TagFormRequest.php @@ -77,11 +77,11 @@ class TagFormRequest extends Request return [ 'tag' => $tagRule, 'id' => $idRule, - 'description' => 'min:1', - 'date' => 'date', - 'latitude' => 'numeric|min:-90|max:90', - 'longitude' => 'numeric|min:-90|max:90', - 'zoomLevel' => 'numeric|min:0|max:80', + 'description' => 'min:1|nullable', + 'date' => 'date|nullable', + 'latitude' => 'numeric|min:-90|max:90|nullable', + 'longitude' => 'numeric|min:-90|max:90|nullable', + 'zoomLevel' => 'numeric|min:0|max:80|nullable', ]; } } diff --git a/app/Http/Requests/TestRuleFormRequest.php b/app/Http/Requests/TestRuleFormRequest.php index c2d3bd8c61..5fc20c0c2c 100644 --- a/app/Http/Requests/TestRuleFormRequest.php +++ b/app/Http/Requests/TestRuleFormRequest.php @@ -35,7 +35,7 @@ class TestRuleFormRequest extends Request */ public function rules() { - + // fixed $validTriggers = array_keys(config('firefly.rule-triggers')); $rules = [ 'rule-trigger.*' => 'required|min:1|in:' . join(',', $validTriggers), diff --git a/app/Http/Requests/TokenFormRequest.php b/app/Http/Requests/TokenFormRequest.php index 8e30d3eaa7..bcef626dd7 100644 --- a/app/Http/Requests/TokenFormRequest.php +++ b/app/Http/Requests/TokenFormRequest.php @@ -35,7 +35,7 @@ class TokenFormRequest extends Request */ public function rules() { - + // fixed $rules = [ 'code' => 'required|2faCode', ]; diff --git a/app/Http/Requests/UserFormRequest.php b/app/Http/Requests/UserFormRequest.php index baba06cc63..f4cbfda5b4 100644 --- a/app/Http/Requests/UserFormRequest.php +++ b/app/Http/Requests/UserFormRequest.php @@ -52,7 +52,7 @@ class UserFormRequest extends Request 'id' => 'required|exists:users,id', 'email' => 'email|required', 'password' => 'confirmed|secure_password', - 'blocked_code' => 'between:0,30', + 'blocked_code' => 'between:0,30|nullable', 'blocked' => 'between:0,1|numeric', ]; } diff --git a/app/Http/Requests/UserRegistrationRequest.php b/app/Http/Requests/UserRegistrationRequest.php index 7875dc5358..0a41f34de8 100644 --- a/app/Http/Requests/UserRegistrationRequest.php +++ b/app/Http/Requests/UserRegistrationRequest.php @@ -33,6 +33,7 @@ class UserRegistrationRequest extends Request */ public function rules() { + // fixed return [ 'email' => 'email|required', 'password' => 'confirmed|secure_password', diff --git a/app/Http/breadcrumbs.php b/app/Http/breadcrumbs.php index cd0ed7939f..ee01c256f2 100644 --- a/app/Http/breadcrumbs.php +++ b/app/Http/breadcrumbs.php @@ -138,6 +138,12 @@ Breadcrumbs::register( $breadcrumbs->push(trans('firefly.edit_user', ['email' => $user->email]), route('admin.users.edit', [$user->id])); } ); +Breadcrumbs::register( + 'admin.users.delete', function (BreadCrumbGenerator $breadcrumbs, User $user) { + $breadcrumbs->parent('admin.users'); + $breadcrumbs->push(trans('firefly.delete_user', ['email' => $user->email]), route('admin.users.delete', [$user->id])); +} +); Breadcrumbs::register( 'admin.users.domains', function (BreadCrumbGenerator $breadcrumbs) { diff --git a/app/Import/Converter/Amount.php b/app/Import/Converter/Amount.php index 1177b86a2e..bf1f23fdf9 100644 --- a/app/Import/Converter/Amount.php +++ b/app/Import/Converter/Amount.php @@ -36,6 +36,10 @@ class Amount implements ConverterInterface */ public function convert($value): string { + if(is_null($value)) { + return '0'; + } + $value = strval($value); Log::debug(sprintf('Start with amount "%s"', $value)); $len = strlen($value); $decimalPosition = $len - 3; diff --git a/app/Import/FileProcessor/CsvProcessor.php b/app/Import/FileProcessor/CsvProcessor.php index d671a65d63..7f301c277b 100644 --- a/app/Import/FileProcessor/CsvProcessor.php +++ b/app/Import/FileProcessor/CsvProcessor.php @@ -175,32 +175,24 @@ class CsvProcessor implements FileProcessorInterface */ private function getJsonError(int $jsonError): string { - switch ($jsonError) { - default: - return 'Unknown JSON error'; - case JSON_ERROR_NONE: - return 'No JSON error'; - case JSON_ERROR_DEPTH: - return 'JSON_ERROR_DEPTH'; - case JSON_ERROR_STATE_MISMATCH: - return 'JSON_ERROR_STATE_MISMATCH'; - case JSON_ERROR_CTRL_CHAR: - return 'JSON_ERROR_CTRL_CHAR'; - case JSON_ERROR_SYNTAX: - return 'JSON_ERROR_SYNTAX'; - case JSON_ERROR_UTF8: - return 'JSON_ERROR_UTF8'; - case JSON_ERROR_RECURSION: - return 'JSON_ERROR_RECURSION'; - case JSON_ERROR_INF_OR_NAN: - return 'JSON_ERROR_INF_OR_NAN'; - case JSON_ERROR_UNSUPPORTED_TYPE: - return 'JSON_ERROR_UNSUPPORTED_TYPE'; - case JSON_ERROR_INVALID_PROPERTY_NAME: - return 'JSON_ERROR_INVALID_PROPERTY_NAME'; - case JSON_ERROR_UTF16: - return 'JSON_ERROR_UTF16'; + $messages = [ + JSON_ERROR_NONE => 'No JSON error', + JSON_ERROR_DEPTH => 'The maximum stack depth has been exceeded.', + JSON_ERROR_STATE_MISMATCH => 'Invalid or malformed JSON.', + JSON_ERROR_CTRL_CHAR => 'Control character error, possibly incorrectly encoded.', + JSON_ERROR_SYNTAX => 'Syntax error.', + JSON_ERROR_UTF8 => 'Malformed UTF-8 characters, possibly incorrectly encoded.', + JSON_ERROR_RECURSION => 'One or more recursive references in the value to be encoded.', + JSON_ERROR_INF_OR_NAN => 'One or more NAN or INF values in the value to be encoded.', + JSON_ERROR_UNSUPPORTED_TYPE => 'A value of a type that cannot be encoded was given.', + JSON_ERROR_INVALID_PROPERTY_NAME => 'A property name that cannot be encoded was given.', + JSON_ERROR_UTF16 => 'Malformed UTF-16 characters, possibly incorrectly encoded.', + ]; + if (isset($messages[$jsonError])) { + return $messages[$jsonError]; } + + return 'Unknown JSON error'; } /** diff --git a/app/Import/Object/ImportBill.php b/app/Import/Object/ImportBill.php index 1760b33126..c85c755f05 100644 --- a/app/Import/Object/ImportBill.php +++ b/app/Import/Object/ImportBill.php @@ -17,6 +17,7 @@ use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\User; use Illuminate\Support\Collection; use Log; +use Steam; /** * Class ImportBill @@ -26,6 +27,8 @@ use Log; class ImportBill { + /** @var string */ + private $amount = '1'; /** @var Bill */ private $bill; /** @var array */ @@ -59,6 +62,14 @@ class ImportBill return $this->bill; } + /** + * @param string $amount + */ + public function setAmount(string $amount) + { + $this->amount = Steam::positive($amount); + } + /** * @param array $id */ @@ -220,12 +231,22 @@ class ImportBill return true; } - Log::debug('Found no bill so must create one ourselves.'); - $data = [ - 'name' => $name, + 'name' => $name, + 'match' => $name, + 'amount_min' => bcmul($this->amount, '0.9'), + 'amount_max' => bcmul($this->amount, '1.1'), + 'user_id' => $this->user->id, + 'date' => date('Y-m-d'), + 'repeat_freq' => 'monthly', + 'skip' => '0', + 'automatch' => '0', + 'active' => '1', ]; + Log::debug('Found no bill so must create one ourselves. Assume default values.', $data); + + $this->bill = $this->repository->store($data); Log::debug(sprintf('Successfully stored new bill #%d: %s', $this->bill->id, $this->bill->name)); diff --git a/app/Import/Routine/ImportRoutine.php b/app/Import/Routine/ImportRoutine.php index b032bc06d8..18ac666a07 100644 --- a/app/Import/Routine/ImportRoutine.php +++ b/app/Import/Routine/ImportRoutine.php @@ -71,7 +71,7 @@ class ImportRoutine $this->job->save(); Log::debug('Updated job...'); - + Log::debug(sprintf('%d journals in $storage->journals', $storage->journals->count())); $this->journals = $storage->journals; $this->errors = $storage->errors; diff --git a/app/Import/Storage/ImportStorage.php b/app/Import/Storage/ImportStorage.php index 66ba023c17..f0d9e3f9f4 100644 --- a/app/Import/Storage/ImportStorage.php +++ b/app/Import/Storage/ImportStorage.php @@ -39,11 +39,11 @@ class ImportStorage /** @var string */ private $dateFormat = 'Ymd'; // yes, hard coded /** @var ImportJob */ - private $job; + protected $job; /** @var Collection */ private $objects; /** @var Collection */ - private $rules; + protected $rules; /** @var array */ private $transfers = []; @@ -173,6 +173,10 @@ class ImportStorage // store meta object things: $this->storeCategory($journal, $importJournal->category->getCategory()); $this->storeBudget($journal, $importJournal->budget->getBudget()); + + // to save bill, also give it the amount: + $importJournal->bill->setAmount($amount); + $this->storeBill($journal, $importJournal->bill->getBill()); $this->storeMeta($journal, $importJournal->metaDates); $journal->setMeta('notes', $importJournal->notes); diff --git a/app/Import/Storage/ImportSupport.php b/app/Import/Storage/ImportSupport.php index 7c2f487e48..80bb804ec1 100644 --- a/app/Import/Storage/ImportSupport.php +++ b/app/Import/Storage/ImportSupport.php @@ -23,22 +23,34 @@ use FireflyIII\Models\AccountType; use FireflyIII\Models\Bill; use FireflyIII\Models\Budget; use FireflyIII\Models\Category; +use FireflyIII\Models\ImportJob; use FireflyIII\Models\Rule; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournalMeta; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Tag\TagRepositoryInterface; -use FireflyIII\Rules\Processor; +use FireflyIII\TransactionRules\Processor; use Illuminate\Database\Query\JoinClause; use Illuminate\Support\Collection; use Log; +/** + * Trait ImportSupport + * + * @package FireflyIII\Import\Storage + */ trait ImportSupport { /** @var int */ protected $defaultCurrencyId = 1; + /** @var Collection */ + protected $rules; + + /** @var ImportJob */ + protected $job; + /** * @param TransactionJournal $journal * diff --git a/app/Jobs/ExecuteRuleGroupOnExistingTransactions.php b/app/Jobs/ExecuteRuleGroupOnExistingTransactions.php index 417895ab40..2729c9312e 100644 --- a/app/Jobs/ExecuteRuleGroupOnExistingTransactions.php +++ b/app/Jobs/ExecuteRuleGroupOnExistingTransactions.php @@ -16,7 +16,7 @@ namespace FireflyIII\Jobs; use Carbon\Carbon; use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Models\RuleGroup; -use FireflyIII\Rules\Processor; +use FireflyIII\TransactionRules\Processor; use FireflyIII\User; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Queue\InteractsWithQueue; diff --git a/app/Jobs/ExecuteRuleOnExistingTransactions.php b/app/Jobs/ExecuteRuleOnExistingTransactions.php index b8f9c2bb6a..e1dff7ef7d 100644 --- a/app/Jobs/ExecuteRuleOnExistingTransactions.php +++ b/app/Jobs/ExecuteRuleOnExistingTransactions.php @@ -14,12 +14,13 @@ namespace FireflyIII\Jobs; use Carbon\Carbon; use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Models\Rule; -use FireflyIII\Rules\Processor; +use FireflyIII\TransactionRules\Processor; use FireflyIII\User; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use Illuminate\Support\Collection; +use Log; /** * Class ExecuteRuleOnExistingTransactions @@ -128,18 +129,27 @@ class ExecuteRuleOnExistingTransactions extends Job implements ShouldQueue { // Lookup all journals that match the parameters specified $transactions = $this->collectJournals(); - $processor = Processor::make($this->rule); - + $processor = Processor::make($this->rule, true); + $hits = 0; + $misses = 0; + $total = 0; // Execute the rules for each transaction foreach ($transactions as $transaction) { - - $processor->handleTransaction($transaction); - + $total++; + $result = $processor->handleTransaction($transaction); + if($result) { + $hits++; + } + if(!$result) { + $misses++; + } + Log::info(sprintf('Current progress: %d Transactions. Hits: %d, misses: %d', $total, $hits, $misses)); // Stop processing this group if the rule specifies 'stop_processing' if ($processor->getRule()->stop_processing) { break; } } + Log::info(sprintf('Total transactions: %d. Hits: %d, misses: %d', $total, $hits, $misses)); } diff --git a/app/Jobs/MailError.php b/app/Jobs/MailError.php index fd4a0164ff..44454c1815 100644 --- a/app/Jobs/MailError.php +++ b/app/Jobs/MailError.php @@ -55,8 +55,7 @@ class MailError extends Job implements ShouldQueue $this->destination = $destination; $this->ipAddress = $ipAddress; $this->exception = $exceptionData; - - $debug = $exceptionData; + $debug = $exceptionData; unset($debug['stackTrace']); Log::error('Exception is: ' . json_encode($debug)); } diff --git a/app/Mail/AdminTestMail.php b/app/Mail/AdminTestMail.php new file mode 100644 index 0000000000..b75495ff9e --- /dev/null +++ b/app/Mail/AdminTestMail.php @@ -0,0 +1,53 @@ +email = $email; + $this->ipAddress = $ipAddress; + } + + /** + * Build the message. + * + * @return $this + */ + public function build() + { + return $this->view('emails.admin-test-html')->text('emails.admin-test-text') + ->subject('A test message from your Firefly III installation'); + } +} diff --git a/app/Mail/ConfirmEmailChangeMail.php b/app/Mail/ConfirmEmailChangeMail.php new file mode 100644 index 0000000000..1e54293460 --- /dev/null +++ b/app/Mail/ConfirmEmailChangeMail.php @@ -0,0 +1,49 @@ +newEmail = $newEmail; + $this->oldEmail = $oldEmail; + $this->uri = $uri; + $this->ipAddress = $ipAddress; + } + + /** + * Build the message. + * + * @return $this + */ + public function build() + { + return $this->view('emails.confirm-email-change-html')->text('emails.confirm-email-change-text') + ->subject('Your Firefly III email address has changed.'); + } +} diff --git a/app/Mail/UndoEmailChangeMail.php b/app/Mail/UndoEmailChangeMail.php new file mode 100644 index 0000000000..5686795fb2 --- /dev/null +++ b/app/Mail/UndoEmailChangeMail.php @@ -0,0 +1,50 @@ +newEmail = $newEmail; + $this->oldEmail = $oldEmail; + $this->uri = $uri; + $this->ipAddress = $ipAddress; + } + + /** + * Build the message. + * + * @return $this + */ + public function build() + { + return $this->view('emails.undo-email-change-html')->text('emails.undo-email-change-text') + ->subject('Your Firefly III email address has changed.'); + } +} diff --git a/app/Models/LinkType.php b/app/Models/LinkType.php index 94d5cf74a1..300f77cc47 100644 --- a/app/Models/LinkType.php +++ b/app/Models/LinkType.php @@ -37,6 +37,9 @@ class LinkType extends Model 'editable' => 'boolean', ]; + /** @var array */ + protected $fillable = ['name', 'inward', 'outward', 'editable']; + /** * @param $value * diff --git a/app/Models/Transaction.php b/app/Models/Transaction.php index cb3938ddde..45462db855 100644 --- a/app/Models/Transaction.php +++ b/app/Models/Transaction.php @@ -23,13 +23,15 @@ use Watson\Validating\ValidatingTrait; * Class Transaction * * @property-read int $journal_id - * @property-read Carbon $date + * @property Carbon $date * @property-read string $transaction_description - * @property-read string $transaction_amount - * @property-read string $transaction_foreign_amount - * @property-read string $transaction_type_type + * @property string $transaction_amount + * @property string $transaction_foreign_amount + * @property string $transaction_type_type + * @property string $foreign_currency_symbol + * @property int $foreign_currency_dp * - * @property-read int $account_id + * @property int $account_id * @property-read string $account_name * @property string $account_iban * @property string $account_number diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 0458f6077b..3f50341318 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -13,8 +13,8 @@ declare(strict_types=1); namespace FireflyIII\Providers; +use Illuminate\Support\Facades\Schema; use Illuminate\Support\ServiceProvider; -use URL; /** * Class AppServiceProvider @@ -30,17 +30,7 @@ class AppServiceProvider extends ServiceProvider */ public function boot() { - - // force root URL. - $forcedUrl = env('APP_FORCE_ROOT', ''); - if (strlen(strval($forcedUrl)) > 0) { - URL::forceRootUrl($forcedUrl); - } - - // force https urls - if (env('APP_FORCE_SSL', false)) { - URL::forceScheme('https'); - } + Schema::defaultStringLength(191); } /** diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index 9e209b3a5c..7ea8ef4210 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -1,25 +1,20 @@ id === (int)$userId; - } - ); + require base_path('routes/channels.php'); } } diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index e1e1e4de4e..943e879183 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -36,26 +36,39 @@ class EventServiceProvider extends ServiceProvider */ protected $listen = [ - // new event handlers: - 'FireflyIII\Events\RegisteredUser' => // is a User related event. + // is a User related event. + 'FireflyIII\Events\RegisteredUser' => [ 'FireflyIII\Handlers\Events\UserEventHandler@sendRegistrationMail', 'FireflyIII\Handlers\Events\UserEventHandler@attachUserRole', ], - 'FireflyIII\Events\RequestedNewPassword' => [ // is a User related event. - 'FireflyIII\Handlers\Events\UserEventHandler@sendNewPassword', + // is a User related event. + 'FireflyIII\Events\RequestedNewPassword' => [ + 'FireflyIII\Handlers\Events\UserEventHandler@sendNewPassword', ], - 'FireflyIII\Events\StoredTransactionJournal' => // is a Transaction Journal related event. + // is a User related event. + 'FireflyIII\Events\UserChangedEmail' => [ + 'FireflyIII\Handlers\Events\UserEventHandler@sendEmailChangeConfirmMail', + 'FireflyIII\Handlers\Events\UserEventHandler@sendEmailChangeUndoMail', + ], + // admin related + 'FireflyIII\Events\AdminRequestedTestMessage' => [ + 'FireflyIII\Handlers\Events\AdminEventHandler@sendTestMessage', + ], + // is a Transaction Journal related event. + 'FireflyIII\Events\StoredTransactionJournal' => [ 'FireflyIII\Handlers\Events\StoredJournalEventHandler@scanBills', 'FireflyIII\Handlers\Events\StoredJournalEventHandler@connectToPiggyBank', 'FireflyIII\Handlers\Events\StoredJournalEventHandler@processRules', ], - 'FireflyIII\Events\UpdatedTransactionJournal' => // is a Transaction Journal related event. + // is a Transaction Journal related event. + 'FireflyIII\Events\UpdatedTransactionJournal' => [ 'FireflyIII\Handlers\Events\UpdatedJournalEventHandler@scanBills', 'FireflyIII\Handlers\Events\UpdatedJournalEventHandler@processRules', ], + ]; /** diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index b704a42cc4..2885354337 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -1,25 +1,21 @@ mapWebRoutes(); - $this->mapApiRoutes(); + $this->mapWebRoutes(); + // } @@ -66,15 +62,10 @@ class RouteServiceProvider extends ServiceProvider */ protected function mapApiRoutes() { - Route::group( - [ - 'middleware' => 'api', - 'namespace' => $this->namespace, - 'prefix' => 'api', - ], function ($router) { - require base_path('routes/api.php'); - } - ); + Route::prefix('api') + ->middleware('api') + ->namespace($this->namespace) + ->group(base_path('routes/api.php')); } /** @@ -86,13 +77,8 @@ class RouteServiceProvider extends ServiceProvider */ protected function mapWebRoutes() { - Route::group( - [ - 'middleware' => 'web', - 'namespace' => $this->namespace, - ], function ($router) { - require base_path('routes/web.php'); - } - ); + Route::middleware('web') + ->namespace($this->namespace) + ->group(base_path('routes/web.php')); } } diff --git a/app/Repositories/Budget/BudgetRepository.php b/app/Repositories/Budget/BudgetRepository.php index 8754c70ca8..6d4db0c635 100644 --- a/app/Repositories/Budget/BudgetRepository.php +++ b/app/Repositories/Budget/BudgetRepository.php @@ -15,6 +15,7 @@ namespace FireflyIII\Repositories\Budget; use Carbon\Carbon; use FireflyIII\Helpers\Collector\JournalCollectorInterface; +use FireflyIII\Models\AccountType; use FireflyIII\Models\AvailableBudget; use FireflyIII\Models\Budget; use FireflyIII\Models\BudgetLimit; @@ -22,6 +23,7 @@ use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; +use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\User; use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Collection; @@ -220,6 +222,53 @@ class BudgetRepository implements BudgetRepositoryInterface return $set; } + /** + * This method collects various info on budgets, used on the budget page and on the index. + * + * @param Collection $budgets + * @param Carbon $start + * @param Carbon $end + * + * @return array + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + */ + public function collectBudgetInformation(Collection $budgets, Carbon $start, Carbon $end): array + { + // get account information + /** @var AccountRepositoryInterface $accountRepository */ + $accountRepository = app(AccountRepositoryInterface::class); + $accounts = $accountRepository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET, AccountType::CASH]); + $return = []; + /** @var Budget $budget */ + foreach ($budgets as $budget) { + $budgetId = $budget->id; + $return[$budgetId] = [ + 'spent' => $this->spentInPeriod(new Collection([$budget]), $accounts, $start, $end), + 'budgeted' => '0', + 'currentRep' => false, + ]; + $budgetLimits = $this->getBudgetLimits($budget, $start, $end); + $otherLimits = new Collection; + + // get all the budget limits relevant between start and end and examine them: + /** @var BudgetLimit $limit */ + foreach ($budgetLimits as $limit) { + if ($limit->start_date->isSameDay($start) && $limit->end_date->isSameDay($end) + ) { + $return[$budgetId]['currentLimit'] = $limit; + $return[$budgetId]['budgeted'] = $limit->amount; + continue; + } + // otherwise it's just one of the many relevant repetitions: + $otherLimits->push($limit); + } + $return[$budgetId]['otherLimits'] = $otherLimits; + } + + return $return; + } + + /** * @param TransactionCurrency $currency * @param Carbon $start diff --git a/app/Repositories/Budget/BudgetRepositoryInterface.php b/app/Repositories/Budget/BudgetRepositoryInterface.php index eb522deb77..18520faf54 100644 --- a/app/Repositories/Budget/BudgetRepositoryInterface.php +++ b/app/Repositories/Budget/BudgetRepositoryInterface.php @@ -32,6 +32,18 @@ interface BudgetRepositoryInterface */ public function cleanupBudgets(): bool; + /** + * This method collects various info on budgets, used on the budget page and on the index. + * + * @param Collection $budgets + * @param Carbon $start + * @param Carbon $end + * + * @return array + * @SuppressWarnings(PHPMD.CyclomaticComplexity) + */ + public function collectBudgetInformation(Collection $budgets, Carbon $start, Carbon $end): array; + /** * @param Budget $budget * diff --git a/app/Repositories/Category/CategoryRepository.php b/app/Repositories/Category/CategoryRepository.php index e0a9f262b7..bf551a2b44 100644 --- a/app/Repositories/Category/CategoryRepository.php +++ b/app/Repositories/Category/CategoryRepository.php @@ -17,7 +17,6 @@ use Carbon\Carbon; use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Models\Category; use FireflyIII\Models\Transaction; -use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; use FireflyIII\User; use Illuminate\Support\Collection; @@ -105,33 +104,28 @@ class CategoryRepository implements CategoryRepositoryInterface /** * @param Category $category * - * @return Carbon + * @return Carbon|null */ - public function firstUseDate(Category $category): Carbon + public function firstUseDate(Category $category): ?Carbon { - $first = new Carbon; + $firstJournalDate = $this->getFirstJournalDate($category); + $firstTransactionDate = $this->getFirstTransactionDate($category); - /** @var TransactionJournal $firstJournal */ - $firstJournal = $category->transactionJournals()->orderBy('date', 'ASC')->first(['transaction_journals.date']); - - // if transaction journal exists and date is before $first, then - // new date: - if (!is_null($firstJournal) && $firstJournal->date->lessThanOrEqualTo($first)) { - $first = $firstJournal->date; + if (is_null($firstTransactionDate) && is_null($firstJournalDate)) { + return null; + } + if (is_null($firstTransactionDate)) { + return $firstJournalDate; + } + if (is_null($firstJournalDate)) { + return $firstTransactionDate; } - // check transactions: - $firstTransaction = $category->transactions() - ->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id') - ->orderBy('transaction_journals.date', 'ASC')->first(['transaction_journals.date']); - - - // transaction exists, and date is before $first, this date becomes first. - if (!is_null($firstTransaction) && Carbon::parse($firstTransaction->date)->lessThanOrEqualTo($first)) { - $first = new Carbon($firstTransaction->date); + if ($firstTransactionDate < $firstJournalDate) { + return $firstTransactionDate; } - return $first; + return $firstJournalDate; } /** @@ -156,26 +150,28 @@ class CategoryRepository implements CategoryRepositoryInterface * @param Category $category * @param Collection $accounts * - * @return Carbon + * @return Carbon|null */ - public function lastUseDate(Category $category, Collection $accounts): Carbon + public function lastUseDate(Category $category, Collection $accounts): ?Carbon { - $last = new Carbon('1900-01-01'); - $lastJournalDate = $this->getLastJournalDate($category, $accounts); - - if ($lastJournalDate->year !== 1900) { - $last = clone $lastJournalDate; - unset($lastJournalDate); - } - + $lastJournalDate = $this->getLastJournalDate($category, $accounts); $lastTransactionDate = $this->getLastTransactionDate($category, $accounts); - if ($lastTransactionDate->year !== 1900 && $lastTransactionDate < $last) { - $last = clone $lastTransactionDate; - unset($lastTransactionDate); + if (is_null($lastTransactionDate) && is_null($lastJournalDate)) { + return null; + } + if (is_null($lastTransactionDate)) { + return $lastJournalDate; + } + if (is_null($lastJournalDate)) { + return $lastTransactionDate; } - return $last; + if ($lastTransactionDate < $lastJournalDate) { + return $lastTransactionDate; + } + + return $lastJournalDate; } /** @@ -456,13 +452,50 @@ class CategoryRepository implements CategoryRepositoryInterface return $category; } + /** + * @param Category $category + * + * @return Carbon|null + */ + private function getFirstJournalDate(Category $category): ?Carbon + { + $query = $category->transactionJournals()->orderBy('date', 'ASC'); + $result = $query->first(['transaction_journals.*']); + + if (!is_null($result)) { + return $result->date; + } + + return null; + } + + /** + * @param Category $category + * + * @return Carbon|null + */ + private function getFirstTransactionDate(Category $category): ?Carbon + { + // check transactions: + $query = $category->transactions() + ->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id') + ->orderBy('transaction_journals.date', 'DESC'); + + $lastTransaction = $query->first(['transaction_journals.*']); + if (!is_null($lastTransaction)) { + return new Carbon($lastTransaction->date); + } + + return null; + } + /** * @param Category $category * @param Collection $accounts * - * @return Carbon + * @return Carbon|null */ - private function getLastJournalDate(Category $category, Collection $accounts): Carbon + private function getLastJournalDate(Category $category, Collection $accounts): ?Carbon { $query = $category->transactionJournals()->orderBy('date', 'DESC'); @@ -477,16 +510,16 @@ class CategoryRepository implements CategoryRepositoryInterface return $result->date; } - return new Carbon('1900-01-01'); + return null; } /** * @param Category $category * @param Collection $accounts * - * @return Carbon + * @return Carbon|null */ - private function getLastTransactionDate(Category $category, Collection $accounts): Carbon + private function getLastTransactionDate(Category $category, Collection $accounts): ?Carbon { // check transactions: $query = $category->transactions() @@ -502,7 +535,7 @@ class CategoryRepository implements CategoryRepositoryInterface return new Carbon($lastTransaction->date); } - return new Carbon('1900-01-01'); + return null; } } diff --git a/app/Repositories/Category/CategoryRepositoryInterface.php b/app/Repositories/Category/CategoryRepositoryInterface.php index c85568f0a6..62f902e019 100644 --- a/app/Repositories/Category/CategoryRepositoryInterface.php +++ b/app/Repositories/Category/CategoryRepositoryInterface.php @@ -63,9 +63,9 @@ interface CategoryRepositoryInterface /** * @param Category $category * - * @return Carbon + * @return Carbon|null */ - public function firstUseDate(Category $category): Carbon; + public function firstUseDate(Category $category): ?Carbon; /** * Returns a list of all the categories belonging to a user. @@ -75,14 +75,14 @@ interface CategoryRepositoryInterface public function getCategories(): Collection; /** - * Return most recent transaction(journal) date. + * Return most recent transaction(journal) date or null when never used before. * * @param Category $category * @param Collection $accounts * - * @return Carbon + * @return Carbon|null */ - public function lastUseDate(Category $category, Collection $accounts): Carbon; + public function lastUseDate(Category $category, Collection $accounts): ?Carbon; /** * @param Collection $categories diff --git a/app/Repositories/ExportJob/ExportJobRepository.php b/app/Repositories/ExportJob/ExportJobRepository.php index a0eb52fc86..aa6973b6b2 100644 --- a/app/Repositories/ExportJob/ExportJobRepository.php +++ b/app/Repositories/ExportJob/ExportJobRepository.php @@ -18,6 +18,7 @@ use FireflyIII\Models\ExportJob; use FireflyIII\User; use Illuminate\Support\Str; use Storage; +use Log; /** * Class ExportJobRepository @@ -37,6 +38,7 @@ class ExportJobRepository implements ExportJobRepositoryInterface */ public function changeStatus(ExportJob $job, string $status): bool { + Log::debug(sprintf('Change status of job #%d to "%s"', $job->id, $status)); $job->change($status); return true; diff --git a/app/Repositories/Journal/JournalRepository.php b/app/Repositories/Journal/JournalRepository.php index 58bde274d0..84e964735c 100644 --- a/app/Repositories/Journal/JournalRepository.php +++ b/app/Repositories/Journal/JournalRepository.php @@ -196,7 +196,7 @@ class JournalRepository implements JournalRepositoryInterface $journal->save(); // store stuff: - $this->storeCategoryWithJournal($journal, $data['category']); + $this->storeCategoryWithJournal($journal, strval($data['category'])); $this->storeBudgetWithJournal($journal, $data['budget_id']); // store two transactions: @@ -271,7 +271,7 @@ class JournalRepository implements JournalRepositoryInterface $journal->categories()->detach(); $journal->budgets()->detach(); - $this->storeCategoryWithJournal($journal, $data['category']); + $this->storeCategoryWithJournal($journal, strval($data['category'])); $this->storeBudgetWithJournal($journal, $data['budget_id']); // negative because source loses money. diff --git a/app/Repositories/Tag/TagRepository.php b/app/Repositories/Tag/TagRepository.php index bc0b780065..0c393442c8 100644 --- a/app/Repositories/Tag/TagRepository.php +++ b/app/Repositories/Tag/TagRepository.php @@ -16,6 +16,7 @@ namespace FireflyIII\Repositories\Tag; use Carbon\Carbon; use FireflyIII\Helpers\Collector\JournalCollectorInterface; +use FireflyIII\Helpers\Filter\InternalTransferFilter; use FireflyIII\Models\Tag; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; @@ -186,34 +187,6 @@ class TagRepository implements TagRepositoryInterface return new Carbon; } - /** - * Same as sum of tag but substracts income instead of adding it as well. - * - * @param Tag $tag - * @param Carbon|null $start - * @param Carbon|null $end - * - * @return string - */ - public function resultOfTag(Tag $tag, ?Carbon $start, ?Carbon $end): string - { - /** @var JournalCollectorInterface $collector */ - $collector = app(JournalCollectorInterface::class); - - if (!is_null($start) && !is_null($end)) { - $collector->setRange($start, $end); - } - - $collector->setAllAssetAccounts()->setTag($tag); - $journals = $collector->getJournals(); - $sum = '0'; - foreach ($journals as $journal) { - $sum = bcadd($sum, strval($journal->transaction_amount)); - } - - return strval($sum); - } - /** * @param User $user */ @@ -290,6 +263,44 @@ class TagRepository implements TagRepositoryInterface return strval($sum); } + /** + * @param Tag $tag + * @param Carbon|null $start + * @param Carbon|null $end + * + * @return array + */ + public function sumsOfTag(Tag $tag, ?Carbon $start, ?Carbon $end): array + { + /** @var JournalCollectorInterface $collector */ + $collector = app(JournalCollectorInterface::class); + + if (!is_null($start) && !is_null($end)) { + $collector->setRange($start, $end); + } + + $collector->setAllAssetAccounts()->setTag($tag)->withOpposingAccount(); + $collector->removeFilter(InternalTransferFilter::class); + $journals = $collector->getJournals(); + + $sums = [ + TransactionType::WITHDRAWAL => '0', + TransactionType::DEPOSIT => '0', + TransactionType::TRANSFER => '0', + ]; + + foreach ($journals as $journal) { + $amount = app('steam')->positive(strval($journal->transaction_amount)); + $type = $journal->transaction_type_type; + if ($type === TransactionType::WITHDRAWAL) { + $amount = bcmul($amount, '-1'); + } + $sums[$type] = bcadd($sums[$type], $amount); + } + + return $sums; + } + /** * Generates a tag cloud. * diff --git a/app/Repositories/Tag/TagRepositoryInterface.php b/app/Repositories/Tag/TagRepositoryInterface.php index 688c71dd90..0dc6772e9c 100644 --- a/app/Repositories/Tag/TagRepositoryInterface.php +++ b/app/Repositories/Tag/TagRepositoryInterface.php @@ -103,15 +103,6 @@ interface TagRepositoryInterface */ public function lastUseDate(Tag $tag): Carbon; - /** - * @param Tag $tag - * @param Carbon|null $start - * @param Carbon|null $end - * - * @return string - */ - public function resultOfTag(Tag $tag, ?Carbon $start, ?Carbon $end): string; - /** * @param User $user */ @@ -126,6 +117,17 @@ interface TagRepositoryInterface */ public function spentInPeriod(Tag $tag, Carbon $start, Carbon $end): string; + /** + * Calculates various amounts in tag. + * + * @param Tag $tag + * @param Carbon|null $start + * @param Carbon|null $end + * + * @return array + */ + public function sumsOfTag(Tag $tag, ?Carbon $start, ?Carbon $end): array; + /** * This method stores a tag. * diff --git a/app/Repositories/User/UserRepository.php b/app/Repositories/User/UserRepository.php index ae31df83c9..37ebc03148 100644 --- a/app/Repositories/User/UserRepository.php +++ b/app/Repositories/User/UserRepository.php @@ -52,6 +52,38 @@ class UserRepository implements UserRepositoryInterface return true; } + /** + * This updates the users email address and records some things so it can be confirmed or undone later. + * The user is blocked until the change is confirmed. + * + * @param User $user + * @param string $newEmail + * + * @see updateEmail + * + * @return bool + */ + public function changeEmail(User $user, string $newEmail): bool + { + $oldEmail = $user->email; + + // save old email as pref + Preferences::setForUser($user, 'previous_email_latest', $oldEmail); + Preferences::setForUser($user, 'previous_email_' . date('Y-m-d-H-i-s'), $oldEmail); + + // set undo and confirm token: + Preferences::setForUser($user, 'email_change_undo_token', strval(bin2hex(random_bytes(16)))); + Preferences::setForUser($user, 'email_change_confirm_token', strval(bin2hex(random_bytes(16)))); + // update user + + $user->email = $newEmail; + $user->blocked = 1; + $user->blocked_code = 'email_changed'; + $user->save(); + + return true; + } + /** * @param User $user * @param string $password @@ -119,6 +151,16 @@ class UserRepository implements UserRepositoryInterface return new User; } + /** + * @param string $email + * + * @return User|null + */ + public function findByEmail(string $email): ?User + { + return User::where('email', $email)->first(); + } + /** * Return basic user information. * @@ -175,4 +217,29 @@ class UserRepository implements UserRepositoryInterface { return $user->hasRole($role); } + + /** + * This updates the users email address. Same as changeEmail just without most logging. This makes sure that the undo/confirm routine can't catch this one. + * The user is NOT blocked. + * + * @param User $user + * @param string $newEmail + * + * @see changeEmail + * + * @return bool + */ + public function updateEmail(User $user, string $newEmail): bool + { + $oldEmail = $user->email; + + // save old email as pref + Preferences::setForUser($user, 'admin_previous_email_latest', $oldEmail); + Preferences::setForUser($user, 'admin_previous_email_' . date('Y-m-d-H-i-s'), $oldEmail); + + $user->email = $newEmail; + $user->save(); + + return true; + } } diff --git a/app/Repositories/User/UserRepositoryInterface.php b/app/Repositories/User/UserRepositoryInterface.php index 118ecf4a84..a3a184fd89 100644 --- a/app/Repositories/User/UserRepositoryInterface.php +++ b/app/Repositories/User/UserRepositoryInterface.php @@ -42,6 +42,19 @@ interface UserRepositoryInterface */ public function attachRole(User $user, string $role): bool; + /** + * This updates the users email address and records some things so it can be confirmed or undone later. + * The user is blocked until the change is confirmed. + * + * @param User $user + * @param string $newEmail + * + * @see updateEmail + * + * @return bool + */ + public function changeEmail(User $user, string $newEmail): bool; + /** * @param User $user * @param string $password @@ -80,6 +93,13 @@ interface UserRepositoryInterface */ public function find(int $userId): User; + /** + * @param string $email + * + * @return User|null + */ + public function findByEmail(string $email): ?User; + /** * Return basic user information. * @@ -96,4 +116,17 @@ interface UserRepositoryInterface * @return bool */ public function hasRole(User $user, string $role): bool; + + /** + * This updates the users email address. Same as changeEmail just without most logging. This makes sure that the undo/confirm routine can't catch this one. + * The user is NOT blocked. + * + * @param User $user + * @param string $newEmail + * + * @see changeEmail + * + * @return bool + */ + public function updateEmail(User $user, string $newEmail): bool; } diff --git a/app/Services/Bunq/Object/MonetaryAccountBank.php b/app/Services/Bunq/Object/MonetaryAccountBank.php index 858e0176a9..75d1e81790 100644 --- a/app/Services/Bunq/Object/MonetaryAccountBank.php +++ b/app/Services/Bunq/Object/MonetaryAccountBank.php @@ -93,8 +93,9 @@ class MonetaryAccountBank extends BunqObject foreach ($data['alias'] as $alias) { $this->aliases[] = new Alias($alias); } + /** @var array $filter */ foreach ($data['notification_filters'] as $filter) { - $this->notificationFilters = new NotificationFilter($filter); + $this->notificationFilters[] = new NotificationFilter($filter); } return; diff --git a/app/Services/Bunq/Request/BunqRequest.php b/app/Services/Bunq/Request/BunqRequest.php index b54cbd8890..fc67efaf0f 100644 --- a/app/Services/Bunq/Request/BunqRequest.php +++ b/app/Services/Bunq/Request/BunqRequest.php @@ -28,18 +28,27 @@ abstract class BunqRequest { /** @var string */ protected $secret = ''; + /** @var ServerPublicKey */ + protected $serverPublicKey; /** @var string */ private $privateKey = ''; /** @var string */ private $server = ''; - /** @var ServerPublicKey */ - private $serverPublicKey; private $upperCaseHeaders - = [ + = [ 'x-bunq-client-response-id' => 'X-Bunq-Client-Response-Id', 'x-bunq-client-request-id' => 'X-Bunq-Client-Request-Id', ]; + /** + * @return ServerPublicKey + */ + public function getServerPublicKey(): ServerPublicKey + { + return $this->serverPublicKey; + } + + /** * BunqRequest constructor. */ @@ -203,7 +212,7 @@ abstract class BunqRequest $body = $response->body; $array = json_decode($body, true); $responseHeaders = $response->headers->getAll(); - $statusCode = $response->status_code; + $statusCode = intval($response->status_code); $array['ResponseHeaders'] = $responseHeaders; $array['ResponseStatusCode'] = $statusCode; @@ -247,7 +256,7 @@ abstract class BunqRequest $body = $response->body; $array = json_decode($body, true); $responseHeaders = $response->headers->getAll(); - $statusCode = $response->status_code; + $statusCode = intval($response->status_code); $array['ResponseHeaders'] = $responseHeaders; $array['ResponseStatusCode'] = $statusCode; @@ -285,7 +294,7 @@ abstract class BunqRequest $body = $response->body; $array = json_decode($body, true); $responseHeaders = $response->headers->getAll(); - $statusCode = $response->status_code; + $statusCode = intval($response->status_code); $array['ResponseHeaders'] = $responseHeaders; $array['ResponseStatusCode'] = $statusCode; diff --git a/app/Services/Bunq/Request/InstallationTokenRequest.php b/app/Services/Bunq/Request/InstallationTokenRequest.php index 829c5986e3..6873306782 100644 --- a/app/Services/Bunq/Request/InstallationTokenRequest.php +++ b/app/Services/Bunq/Request/InstallationTokenRequest.php @@ -30,8 +30,6 @@ class InstallationTokenRequest extends BunqRequest private $installationToken; /** @var string */ private $publicKey = ''; - /** @var ServerPublicKey */ - private $serverPublicKey; /** * @@ -87,22 +85,6 @@ class InstallationTokenRequest extends BunqRequest $this->publicKey = $publicKey; } - /** - * @return ServerPublicKey - */ - public function getServerPublicKey(): ServerPublicKey - { - return $this->serverPublicKey; - } - - /** - * @param bool $fake - */ - public function setFake(bool $fake) - { - $this->fake = $fake; - } - /** * @param array $response * diff --git a/app/Services/Currency/FixerIO.php b/app/Services/Currency/FixerIO.php index 7a3290bb96..abeaf1eadf 100644 --- a/app/Services/Currency/FixerIO.php +++ b/app/Services/Currency/FixerIO.php @@ -18,6 +18,7 @@ use FireflyIII\Models\TransactionCurrency; use FireflyIII\User; use Log; use Requests; +use Requests_Exception; /** * Class FixerIO @@ -31,16 +32,26 @@ class FixerIO implements ExchangeRateInterface public function getRate(TransactionCurrency $fromCurrency, TransactionCurrency $toCurrency, Carbon $date): CurrencyExchangeRate { - $uri = sprintf('https://api.fixer.io/%s?base=%s&symbols=%s', $date->format('Y-m-d'), $fromCurrency->code, $toCurrency->code); - $result = Requests::get($uri); + $uri = sprintf('https://api.fixer.io/%s?base=%s&symbols=%s', $date->format('Y-m-d'), $fromCurrency->code, $toCurrency->code); + $statusCode = -1; + $body = ''; + try { + $result = Requests::get($uri); + $statusCode = $result->status_code; + $body = $result->body; + } catch (Requests_Exception $e) { + // don't care about error + $body = sprintf('Requests_Exception: %s', $e->getMessage()); + } + // Requests_Exception $rate = 1.0; $content = null; - if ($result->status_code !== 200) { - Log::error(sprintf('Something went wrong. Received error code %d and body "%s" from FixerIO.', $result->status_code, $result->body)); + if ($statusCode !== 200) { + Log::error(sprintf('Something went wrong. Received error code %d and body "%s" from FixerIO.', $statusCode, $body)); } // get rate from body: - if ($result->status_code === 200) { - $content = json_decode($result->body, true); + if ($statusCode === 200) { + $content = json_decode($body, true); } if (!is_null($content)) { $code = $toCurrency->code; diff --git a/app/Support/Amount.php b/app/Support/Amount.php index 4cf65c0519..49b1872155 100644 --- a/app/Support/Amount.php +++ b/app/Support/Amount.php @@ -55,11 +55,11 @@ class Amount // there are five possible positions for the "+" or "-" sign (if it is even used) // pos_a and pos_e could be the ( and ) symbol. - $pos_a = ''; // before everything - $pos_b = ''; // before currency symbol - $pos_c = ''; // after currency symbol - $pos_d = ''; // before amount - $pos_e = ''; // after everything + $posA = ''; // before everything + $posB = ''; // before currency symbol + $posC = ''; // after currency symbol + $posD = ''; // before amount + $posE = ''; // after everything // format would be (currency before amount) // AB%sC_D%vE @@ -73,32 +73,32 @@ class Amount default: case 0: // ( and ) around the whole thing - $pos_a = '('; - $pos_e = ')'; + $posA = '('; + $posE = ')'; break; case 1: // The sign string precedes the quantity and currency_symbol - $pos_a = $sign; + $posA = $sign; break; case 2: // The sign string succeeds the quantity and currency_symbol - $pos_e = $sign; + $posE = $sign; break; case 3: // The sign string immediately precedes the currency_symbol - $pos_b = $sign; + $posB = $sign; break; case 4: // The sign string immediately succeeds the currency_symbol - $pos_c = $sign; + $posC = $sign; } // default is amount before currency - $format = $pos_a . $pos_d . '%v' . $space . $pos_b . '%s' . $pos_c . $pos_e; + $format = $posA . $posD . '%v' . $space . $posB . '%s' . $posC . $posE; if ($csPrecedes) { // alternative is currency before amount - $format = $pos_a . $pos_b . '%s' . $pos_c . $space . $pos_d . '%v' . $pos_e; + $format = $posA . $posB . '%s' . $posC . $space . $posD . '%v' . $posE; } return $format; @@ -287,6 +287,58 @@ class Amount } + /** + * @param TransactionJournal $journal + * @param bool $coloured + * + * @return string + */ + public function journalTotalAmount(TransactionJournal $journal, bool $coloured = true): string + { + $transactions = $journal->transactions()->where('amount', '>', 0)->get(); + $totals = []; + $type = $journal->transactionType->type; + /** @var TransactionModel $transaction */ + foreach ($transactions as $transaction) { + // model some fields to fit "transactionAmount()": + $currencyId = $transaction->transaction_currency_id; + + if (!isset($totals[$currencyId])) { + $totals[$currencyId] = [ + 'amount' => '0', + 'symbol' => $transaction->transactionCurrency->symbol, + 'dp' => $transaction->transactionCurrency->decimal_places, + ]; + } + $totals[$currencyId]['amount'] = bcadd($transaction->amount, $totals[$currencyId]['amount']); + + if (!is_null($transaction->foreign_currency_id)) { + $foreignId = $transaction->foreign_currency_id; + if (!isset($totals[$foreignId])) { + $totals[$foreignId] = [ + 'amount' => '0', + 'symbol' => $transaction->foreignCurrency->symbol, + 'dp' => $transaction->foreignCurrency->decimal_places, + ]; + } + $totals[$foreignId]['amount'] = bcadd($transaction->foreign_amount, $totals[$foreignId]['amount']); + } + } + $array = []; + foreach ($totals as $total) { + $currency = new TransactionCurrency; + $currency->symbol = $total['symbol']; + $currency->decimal_places = $total['dp']; + if ($type === TransactionType::WITHDRAWAL) { + $total['amount'] = bcmul($total['amount'], '-1'); + } + $array[] = $this->formatAnything($currency, $total['amount']); + } + + return join(' / ', $array); + + } + /** * This formats a transaction, IF that transaction has been "collected" using the JournalCollector. * diff --git a/app/Support/ExpandedForm.php b/app/Support/ExpandedForm.php index 5ba557a21d..dd645a1d2d 100644 --- a/app/Support/ExpandedForm.php +++ b/app/Support/ExpandedForm.php @@ -332,7 +332,7 @@ class ExpandedForm $previousValue = null; try { - $previousValue = Input::old('post_submit_action'); + $previousValue = request()->old('post_submit_action'); } catch (RuntimeException $e) { // don't care } @@ -488,8 +488,8 @@ class ExpandedForm $value = isset($preFilled[$name]) && is_null($value) ? $preFilled[$name] : $value; } try { - if (!is_null(Input::old($name))) { - $value = Input::old($name); + if (!is_null(request()->old($name))) { + $value = request()->old($name); } } catch (RuntimeException $e) { // don't care about session errors. diff --git a/app/Support/Import/Information/BunqInformation.php b/app/Support/Import/Information/BunqInformation.php index dc1428e103..466d90c6c8 100644 --- a/app/Support/Import/Information/BunqInformation.php +++ b/app/Support/Import/Information/BunqInformation.php @@ -66,9 +66,9 @@ class BunqInformation implements InformationInterface } Log::debug('Now in getAccounts()'); $sessionToken = $this->startSession(); - $id = $this->getUserInformation($sessionToken); + $userId = $this->getUserInformation($sessionToken); // get list of Bunq accounts: - $accounts = $this->getMonetaryAccounts($sessionToken, $id); + $accounts = $this->getMonetaryAccounts($sessionToken, $userId); $return = []; /** @var MonetaryAccountBank $account */ foreach ($accounts as $account) { diff --git a/app/Support/Import/Prerequisites/BunqPrerequisites.php b/app/Support/Import/Prerequisites/BunqPrerequisites.php index a83d4ec4c8..8cd8da9697 100644 --- a/app/Support/Import/Prerequisites/BunqPrerequisites.php +++ b/app/Support/Import/Prerequisites/BunqPrerequisites.php @@ -68,7 +68,6 @@ class BunqPrerequisites implements PrerequisitesInterface { $apiKey = Preferences::getForUser($this->user, 'bunq_api_key', false); - return ($apiKey->data === false || is_null($apiKey->data)); } @@ -119,9 +118,9 @@ class BunqPrerequisites implements PrerequisitesInterface { Log::debug('Generate new key pair for user.'); $keyConfig = [ - "digest_alg" => "sha512", - "private_key_bits" => 2048, - "private_key_type" => OPENSSL_KEYTYPE_RSA, + 'digest_alg' => 'sha512', + 'private_key_bits' => 2048, + 'private_key_type' => OPENSSL_KEYTYPE_RSA, ]; // Create the private and public key $res = openssl_pkey_new($keyConfig); @@ -258,10 +257,10 @@ class BunqPrerequisites implements PrerequisitesInterface if ($response->status_code !== 200) { throw new FireflyException(sprintf('Could not retrieve external IP: %d %s', $response->status_code, $response->body)); } - $ip = $response->body; - Preferences::setForUser($this->user, 'external_ip', $ip); + $serverIp = $response->body; + Preferences::setForUser($this->user, 'external_ip', $serverIp); - return $ip; + return $serverIp; } return $preference->data; diff --git a/app/Support/Navigation.php b/app/Support/Navigation.php index c73f4ab9ec..15a3ade60d 100644 --- a/app/Support/Navigation.php +++ b/app/Support/Navigation.php @@ -62,6 +62,13 @@ class Navigation $function = $functionMap[$repeatFreq]; $date->$function($add); + // if period is 1M and diff in month is 2 and new DOM = 1, sub a day: + $months = ['1M', 'month', 'monthly']; + $difference = $date->month - $theDate->month; + if (in_array($repeatFreq, $months) && $difference === 2 && $date->day === 1) { + $date->subDay(); + } + return $date; } diff --git a/app/Support/Preferences.php b/app/Support/Preferences.php index 743a6444e1..0c52f496c9 100644 --- a/app/Support/Preferences.php +++ b/app/Support/Preferences.php @@ -16,6 +16,7 @@ namespace FireflyIII\Support; use Cache; use FireflyIII\Models\Preference; use FireflyIII\User; +use Illuminate\Support\Collection; use Session; /** @@ -25,13 +26,26 @@ use Session; */ class Preferences { + /** + * @param User $user + * @param string $search + * + * @return Collection + */ + public function beginsWith(User $user, string $search): Collection + { + $set = Preference::where('user_id', $user->id)->where('name', 'LIKE', $search . '%')->get(); + + return $set; + } + /** * @param $name * * @return bool * @throws \Exception */ - public function delete($name): bool + public function delete(string $name): bool { $fullName = sprintf('preference%s%s', auth()->user()->id, $name); if (Cache::has($fullName)) { @@ -42,6 +56,18 @@ class Preferences return true; } + /** + * @param string $name + * + * @return Collection + */ + public function findByName(string $name): Collection + { + $set = Preference::where('name', $name)->get(); + + return $set; + } + /** * @param $name * @param null $default diff --git a/app/Support/Search/Search.php b/app/Support/Search/Search.php index 55dea965d2..cbc478007a 100644 --- a/app/Support/Search/Search.php +++ b/app/Support/Search/Search.php @@ -204,8 +204,8 @@ class Search implements SearchInterface // first "modifier" is always the text of the search: // check descr of journal: if (count($this->words) > 0 - && !$this->strpos_arr(strtolower(strval($transaction->description)), $this->words) - && !$this->strpos_arr(strtolower(strval($transaction->transaction_description)), $this->words) + && !$this->strposArray(strtolower(strval($transaction->description)), $this->words) + && !$this->strposArray(strtolower(strval($transaction->transaction_description)), $this->words) ) { Log::debug('Description does not match', $this->words); @@ -230,7 +230,7 @@ class Search implements SearchInterface * * @return bool */ - private function strpos_arr(string $haystack, array $needle) + private function strposArray(string $haystack, array $needle) { if (strlen($haystack) === 0) { return false; diff --git a/app/Support/Twig/AmountFormat.php b/app/Support/Twig/AmountFormat.php index 3f9cd2ebcf..c438b7261a 100644 --- a/app/Support/Twig/AmountFormat.php +++ b/app/Support/Twig/AmountFormat.php @@ -49,6 +49,7 @@ class AmountFormat extends Twig_Extension $this->formatAmountBySymbol(), $this->transactionAmount(), $this->journalAmount(), + $this->journalTotalAmount(), $this->formatDestinationAfter(), $this->formatDestinationBefore(), $this->formatSourceAfter(), @@ -261,6 +262,19 @@ class AmountFormat extends Twig_Extension ); } + /** + * @return Twig_SimpleFunction + */ + protected function journalTotalAmount(): Twig_SimpleFunction + { + return new Twig_SimpleFunction( + 'journalTotalAmount', function (TransactionJournal $journal): string { + + return app('amount')->journalTotalAmount($journal, true); + }, ['is_safe' => ['html']] + ); + } + /** * @return Twig_SimpleFunction */ diff --git a/app/Support/Twig/Transaction.php b/app/Support/Twig/Transaction.php index 3774940216..3c4902972e 100644 --- a/app/Support/Twig/Transaction.php +++ b/app/Support/Twig/Transaction.php @@ -119,16 +119,15 @@ class Transaction extends Twig_Extension return new Twig_SimpleFunction( 'transactionDestinationAccount', function (TransactionModel $transaction): string { - $name = Steam::decrypt(intval($transaction->account_encrypted), $transaction->account_name); - $id = intval($transaction->account_id); - $type = $transaction->account_type; + $name = Steam::decrypt(intval($transaction->account_encrypted), $transaction->account_name); + $transactionId = intval($transaction->account_id); + $type = $transaction->account_type; // name is present in object, use that one: if (bccomp($transaction->transaction_amount, '0') === -1 && !is_null($transaction->opposing_account_id)) { - - $name = $transaction->opposing_account_name; - $id = intval($transaction->opposing_account_id); - $type = $transaction->opposing_account_type; + $name = $transaction->opposing_account_name; + $transactionId = intval($transaction->opposing_account_id); + $type = $transaction->opposing_account_type; } // Find the opposing account and use that one: @@ -136,21 +135,23 @@ class Transaction extends Twig_Extension // if the amount is negative, find the opposing account and use that one: $journalId = $transaction->journal_id; /** @var TransactionModel $other */ - $other = TransactionModel::where('transaction_journal_id', $journalId)->where('transactions.id', '!=', $transaction->id) - ->where('amount', '=', bcmul($transaction->transaction_amount, '-1'))->where('identifier', $transaction->identifier) - ->leftJoin('accounts', 'accounts.id', '=', 'transactions.account_id') - ->leftJoin('account_types', 'account_types.id', '=', 'accounts.account_type_id') - ->first(['transactions.account_id', 'accounts.encrypted', 'accounts.name', 'account_types.type']); - $name = Steam::decrypt(intval($other->encrypted), $other->name); - $id = $other->account_id; - $type = $other->type; + $other = TransactionModel::where('transaction_journal_id', $journalId)->where('transactions.id', '!=', $transaction->id) + ->where('amount', '=', bcmul($transaction->transaction_amount, '-1'))->where( + 'identifier', $transaction->identifier + ) + ->leftJoin('accounts', 'accounts.id', '=', 'transactions.account_id') + ->leftJoin('account_types', 'account_types.id', '=', 'accounts.account_type_id') + ->first(['transactions.account_id', 'accounts.encrypted', 'accounts.name', 'account_types.type']); + $name = Steam::decrypt(intval($other->encrypted), $other->name); + $transactionId = $other->account_id; + $type = $other->type; } if ($type === AccountType::CASH) { return '(cash)'; } - return sprintf('%1$s', e($name), route('accounts.show', [$id])); + return sprintf('%1$s', e($name), route('accounts.show', [$transactionId])); }, ['is_safe' => ['html']] ); @@ -193,36 +194,37 @@ class Transaction extends Twig_Extension 'transactionSourceAccount', function (TransactionModel $transaction): string { // if the amount is negative, assume that the current account (the one in $transaction) is indeed the source account. - $name = Steam::decrypt(intval($transaction->account_encrypted), $transaction->account_name); - $id = intval($transaction->account_id); - $type = $transaction->account_type; + $name = Steam::decrypt(intval($transaction->account_encrypted), $transaction->account_name); + $transactionId = intval($transaction->account_id); + $type = $transaction->account_type; // name is present in object, use that one: if (bccomp($transaction->transaction_amount, '0') === 1 && !is_null($transaction->opposing_account_id)) { - - $name = $transaction->opposing_account_name; - $id = intval($transaction->opposing_account_id); - $type = $transaction->opposing_account_type; + $name = $transaction->opposing_account_name; + $transactionId = intval($transaction->opposing_account_id); + $type = $transaction->opposing_account_type; } // Find the opposing account and use that one: if (bccomp($transaction->transaction_amount, '0') === 1 && is_null($transaction->opposing_account_id)) { $journalId = $transaction->journal_id; /** @var TransactionModel $other */ - $other = TransactionModel::where('transaction_journal_id', $journalId)->where('transactions.id', '!=', $transaction->id) - ->where('amount', '=', bcmul($transaction->transaction_amount, '-1'))->where('identifier', $transaction->identifier) - ->leftJoin('accounts', 'accounts.id', '=', 'transactions.account_id') - ->leftJoin('account_types', 'account_types.id', '=', 'accounts.account_type_id') - ->first(['transactions.account_id', 'accounts.encrypted', 'accounts.name', 'account_types.type']); - $name = Steam::decrypt(intval($other->encrypted), $other->name); - $id = $other->account_id; - $type = $other->type; + $other = TransactionModel::where('transaction_journal_id', $journalId)->where('transactions.id', '!=', $transaction->id) + ->where('amount', '=', bcmul($transaction->transaction_amount, '-1'))->where( + 'identifier', $transaction->identifier + ) + ->leftJoin('accounts', 'accounts.id', '=', 'transactions.account_id') + ->leftJoin('account_types', 'account_types.id', '=', 'accounts.account_type_id') + ->first(['transactions.account_id', 'accounts.encrypted', 'accounts.name', 'account_types.type']); + $name = Steam::decrypt(intval($other->encrypted), $other->name); + $transactionId = $other->account_id; + $type = $other->type; } if ($type === AccountType::CASH) { return '(cash)'; } - return sprintf('%1$s', e($name), route('accounts.show', [$id])); + return sprintf('%1$s', e($name), route('accounts.show', [$transactionId])); }, ['is_safe' => ['html']] ); diff --git a/app/Support/Twig/Translation.php b/app/Support/Twig/Translation.php index 40ce29ebdb..32426796f7 100644 --- a/app/Support/Twig/Translation.php +++ b/app/Support/Twig/Translation.php @@ -71,8 +71,8 @@ class Translation extends Twig_Extension public function journalLinkTranslation(): Twig_SimpleFunction { return new Twig_SimpleFunction( - 'journalLinkTranslation', function (int $linkTypeId, string $direction, string $original) { - $key = sprintf('firefly.%d_%s', $linkTypeId, $direction); + 'journalLinkTranslation', function (string $direction, string $original) { + $key = sprintf('firefly.%s_%s', $original, $direction); $translation = trans($key); if ($key === $translation) { return $original; diff --git a/app/Rules/Actions/ActionInterface.php b/app/TransactionRules/Actions/ActionInterface.php similarity index 88% rename from app/Rules/Actions/ActionInterface.php rename to app/TransactionRules/Actions/ActionInterface.php index 7d8696f047..9753d65a0d 100644 --- a/app/Rules/Actions/ActionInterface.php +++ b/app/TransactionRules/Actions/ActionInterface.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Actions; +namespace FireflyIII\TransactionRules\Actions; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; @@ -19,7 +19,7 @@ use FireflyIII\Models\TransactionJournal; /** * Interface ActionInterface * - * @package FireflyIII\Rules\Action + * @package FireflyIII\TransactionRules\Action */ interface ActionInterface { diff --git a/app/Rules/Actions/AddTag.php b/app/TransactionRules/Actions/AddTag.php similarity index 94% rename from app/Rules/Actions/AddTag.php rename to app/TransactionRules/Actions/AddTag.php index 38560c83aa..3a12c8c694 100644 --- a/app/Rules/Actions/AddTag.php +++ b/app/TransactionRules/Actions/AddTag.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Actions; +namespace FireflyIII\TransactionRules\Actions; use FireflyIII\Models\RuleAction; @@ -22,7 +22,7 @@ use Log; /** * Class AddTag * - * @package FireflyIII\Rules\Actions + * @package FireflyIII\TransactionRules\Actions */ class AddTag implements ActionInterface { diff --git a/app/Rules/Actions/AppendDescription.php b/app/TransactionRules/Actions/AppendDescription.php similarity index 92% rename from app/Rules/Actions/AppendDescription.php rename to app/TransactionRules/Actions/AppendDescription.php index 0bca1c7397..1fa7134e74 100644 --- a/app/Rules/Actions/AppendDescription.php +++ b/app/TransactionRules/Actions/AppendDescription.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Actions; +namespace FireflyIII\TransactionRules\Actions; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; @@ -20,7 +20,7 @@ use Log; /** * Class AppendDescription * - * @package FireflyIII\Rules\Actions + * @package FireflyIII\TransactionRules\Actions */ class AppendDescription implements ActionInterface { diff --git a/app/Rules/Actions/ClearBudget.php b/app/TransactionRules/Actions/ClearBudget.php similarity index 91% rename from app/Rules/Actions/ClearBudget.php rename to app/TransactionRules/Actions/ClearBudget.php index 4f029089ac..7706c43152 100644 --- a/app/Rules/Actions/ClearBudget.php +++ b/app/TransactionRules/Actions/ClearBudget.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Actions; +namespace FireflyIII\TransactionRules\Actions; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; @@ -20,7 +20,7 @@ use Log; /** * Class ClearBudget * - * @package FireflyIII\Rules\Action + * @package FireflyIII\TransactionRules\Action */ class ClearBudget implements ActionInterface { diff --git a/app/Rules/Actions/ClearCategory.php b/app/TransactionRules/Actions/ClearCategory.php similarity index 91% rename from app/Rules/Actions/ClearCategory.php rename to app/TransactionRules/Actions/ClearCategory.php index 6eea4ce560..6e939e4501 100644 --- a/app/Rules/Actions/ClearCategory.php +++ b/app/TransactionRules/Actions/ClearCategory.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Actions; +namespace FireflyIII\TransactionRules\Actions; use FireflyIII\Models\RuleAction; @@ -21,7 +21,7 @@ use Log; /** * Class ClearCategory * - * @package FireflyIII\Rules\Action + * @package FireflyIII\TransactionRules\Action */ class ClearCategory implements ActionInterface { diff --git a/app/Rules/Actions/PrependDescription.php b/app/TransactionRules/Actions/PrependDescription.php similarity index 92% rename from app/Rules/Actions/PrependDescription.php rename to app/TransactionRules/Actions/PrependDescription.php index a59b5e6172..a56634b86b 100644 --- a/app/Rules/Actions/PrependDescription.php +++ b/app/TransactionRules/Actions/PrependDescription.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Actions; +namespace FireflyIII\TransactionRules\Actions; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; @@ -20,7 +20,7 @@ use Log; /** * Class AppendDescription * - * @package FireflyIII\Rules\Actions + * @package FireflyIII\TransactionRules\Actions */ class PrependDescription implements ActionInterface { diff --git a/app/Rules/Actions/RemoveAllTags.php b/app/TransactionRules/Actions/RemoveAllTags.php similarity index 91% rename from app/Rules/Actions/RemoveAllTags.php rename to app/TransactionRules/Actions/RemoveAllTags.php index 32290d7a70..90db7bef20 100644 --- a/app/Rules/Actions/RemoveAllTags.php +++ b/app/TransactionRules/Actions/RemoveAllTags.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Actions; +namespace FireflyIII\TransactionRules\Actions; use FireflyIII\Models\RuleAction; @@ -21,7 +21,7 @@ use Log; /** * Class RemoveAllTags * - * @package FireflyIII\Rules\Actions + * @package FireflyIII\TransactionRules\Actions */ class RemoveAllTags implements ActionInterface { diff --git a/app/Rules/Actions/RemoveTag.php b/app/TransactionRules/Actions/RemoveTag.php similarity index 94% rename from app/Rules/Actions/RemoveTag.php rename to app/TransactionRules/Actions/RemoveTag.php index 525579f0ed..6e06cffed1 100644 --- a/app/Rules/Actions/RemoveTag.php +++ b/app/TransactionRules/Actions/RemoveTag.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Actions; +namespace FireflyIII\TransactionRules\Actions; use FireflyIII\Models\RuleAction; @@ -22,7 +22,7 @@ use Log; /** * Class RemoveTag * - * @package FireflyIII\Rules\Actions + * @package FireflyIII\TransactionRules\Actions */ class RemoveTag implements ActionInterface { diff --git a/app/Rules/Actions/SetBudget.php b/app/TransactionRules/Actions/SetBudget.php similarity index 95% rename from app/Rules/Actions/SetBudget.php rename to app/TransactionRules/Actions/SetBudget.php index 599f0214da..8723ac4fe6 100644 --- a/app/Rules/Actions/SetBudget.php +++ b/app/TransactionRules/Actions/SetBudget.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Actions; +namespace FireflyIII\TransactionRules\Actions; use FireflyIII\Models\Budget; @@ -24,7 +24,7 @@ use Log; /** * Class SetBudget * - * @package FireflyIII\Rules\Action + * @package FireflyIII\TransactionRules\Action */ class SetBudget implements ActionInterface { diff --git a/app/Rules/Actions/SetCategory.php b/app/TransactionRules/Actions/SetCategory.php similarity index 93% rename from app/Rules/Actions/SetCategory.php rename to app/TransactionRules/Actions/SetCategory.php index 8b1953db5d..c32ba04c56 100644 --- a/app/Rules/Actions/SetCategory.php +++ b/app/TransactionRules/Actions/SetCategory.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Actions; +namespace FireflyIII\TransactionRules\Actions; use FireflyIII\Models\Category; @@ -22,7 +22,7 @@ use Log; /** * Class SetCategory * - * @package FireflyIII\Rules\Action + * @package FireflyIII\TransactionRules\Action */ class SetCategory implements ActionInterface { diff --git a/app/Rules/Actions/SetDescription.php b/app/TransactionRules/Actions/SetDescription.php similarity index 93% rename from app/Rules/Actions/SetDescription.php rename to app/TransactionRules/Actions/SetDescription.php index fd882f405d..17c5eb1a13 100644 --- a/app/Rules/Actions/SetDescription.php +++ b/app/TransactionRules/Actions/SetDescription.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Actions; +namespace FireflyIII\TransactionRules\Actions; use FireflyIII\Models\RuleAction; use FireflyIII\Models\TransactionJournal; @@ -20,7 +20,7 @@ use Log; /** * Class SetDescription * - * @package FireflyIII\Rules\Actions + * @package FireflyIII\TransactionRules\Actions */ class SetDescription implements ActionInterface { diff --git a/app/Rules/Actions/SetDestinationAccount.php b/app/TransactionRules/Actions/SetDestinationAccount.php similarity index 97% rename from app/Rules/Actions/SetDestinationAccount.php rename to app/TransactionRules/Actions/SetDestinationAccount.php index 00249b2660..9646006810 100644 --- a/app/Rules/Actions/SetDestinationAccount.php +++ b/app/TransactionRules/Actions/SetDestinationAccount.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Actions; +namespace FireflyIII\TransactionRules\Actions; use FireflyIII\Models\Account; @@ -25,7 +25,7 @@ use Log; /** * Class SetDestinationAccount * - * @package FireflyIII\Rules\Action + * @package FireflyIII\TransactionRules\Action */ class SetDestinationAccount implements ActionInterface { diff --git a/app/Rules/Actions/SetSourceAccount.php b/app/TransactionRules/Actions/SetSourceAccount.php similarity index 97% rename from app/Rules/Actions/SetSourceAccount.php rename to app/TransactionRules/Actions/SetSourceAccount.php index f651f0fbe1..4b27c044d2 100644 --- a/app/Rules/Actions/SetSourceAccount.php +++ b/app/TransactionRules/Actions/SetSourceAccount.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Actions; +namespace FireflyIII\TransactionRules\Actions; use FireflyIII\Models\Account; @@ -25,7 +25,7 @@ use Log; /** * Class SetSourceAccount * - * @package FireflyIII\Rules\Action + * @package FireflyIII\TransactionRules\Action */ class SetSourceAccount implements ActionInterface { diff --git a/app/Rules/Factory/ActionFactory.php b/app/TransactionRules/Factory/ActionFactory.php similarity index 90% rename from app/Rules/Factory/ActionFactory.php rename to app/TransactionRules/Factory/ActionFactory.php index 16d33605e3..c69fe01470 100644 --- a/app/Rules/Factory/ActionFactory.php +++ b/app/TransactionRules/Factory/ActionFactory.php @@ -11,25 +11,25 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Factory; +namespace FireflyIII\TransactionRules\Factory; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\RuleAction; -use FireflyIII\Rules\Actions\ActionInterface; use FireflyIII\Support\Domain; +use FireflyIII\TransactionRules\Actions\ActionInterface; use Log; /** * Interface ActionInterface * - * @package FireflyIII\Rules\Actions + * @package FireflyIII\TransactionRules\Actions */ class ActionFactory { protected static $actionTypes = []; /** - * This method returns the actual implementation (Rules/Actions/[object]) for a given + * This method returns the actual implementation (TransactionRules/Actions/[object]) for a given * RuleAction (database object). If for example the database object contains action_type "change_category" * with value "Groceries" this method will return a corresponding SetCategory object preset * to "Groceries". Any transaction journal then fed to this object will have its category changed. diff --git a/app/Rules/Factory/TriggerFactory.php b/app/TransactionRules/Factory/TriggerFactory.php similarity index 92% rename from app/Rules/Factory/TriggerFactory.php rename to app/TransactionRules/Factory/TriggerFactory.php index 9f98560f0f..5bbe7faff5 100644 --- a/app/Rules/Factory/TriggerFactory.php +++ b/app/TransactionRules/Factory/TriggerFactory.php @@ -11,19 +11,19 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Factory; +namespace FireflyIII\TransactionRules\Factory; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\RuleTrigger; -use FireflyIII\Rules\Triggers\AbstractTrigger; -use FireflyIII\Rules\Triggers\TriggerInterface; use FireflyIII\Support\Domain; +use FireflyIII\TransactionRules\Triggers\AbstractTrigger; +use FireflyIII\TransactionRules\Triggers\TriggerInterface; use Log; /** * Interface TriggerInterface * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ class TriggerFactory { @@ -31,7 +31,7 @@ class TriggerFactory /** * Returns the trigger for the given type and journal. This method returns the actual implementation - * (Rules/Triggers/[object]) for a given RuleTrigger (database object). If for example the database object + * (TransactionRules/Triggers/[object]) for a given RuleTrigger (database object). If for example the database object * contains trigger_type "description_is" with value "Rent" this method will return a corresponding * DescriptionIs object preset to "Rent". Any transaction journal then fed to this object will * be triggered if its description actually is "Rent". diff --git a/app/Rules/Processor.php b/app/TransactionRules/Processor.php similarity index 93% rename from app/Rules/Processor.php rename to app/TransactionRules/Processor.php index 5916da22e5..509b229d26 100644 --- a/app/Rules/Processor.php +++ b/app/TransactionRules/Processor.php @@ -11,24 +11,24 @@ declare(strict_types=1); -namespace FireflyIII\Rules; +namespace FireflyIII\TransactionRules; use FireflyIII\Models\Rule; use FireflyIII\Models\RuleAction; use FireflyIII\Models\RuleTrigger; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; -use FireflyIII\Rules\Actions\ActionInterface; -use FireflyIII\Rules\Factory\ActionFactory; -use FireflyIII\Rules\Factory\TriggerFactory; -use FireflyIII\Rules\Triggers\AbstractTrigger; +use FireflyIII\TransactionRules\Actions\ActionInterface; +use FireflyIII\TransactionRules\Factory\ActionFactory; +use FireflyIII\TransactionRules\Factory\TriggerFactory; +use FireflyIII\TransactionRules\Triggers\AbstractTrigger; use Illuminate\Support\Collection; use Log; /** * Class Processor * - * @package FireflyIII\Rules + * @package FireflyIII\TransactionRules */ final class Processor { @@ -40,7 +40,7 @@ final class Processor public $rule; /** @var Collection */ public $triggers; - + /** @var int */ protected $foundTriggers = 0; /** @@ -170,9 +170,14 @@ final class Processor // get all triggers: $triggered = $this->triggered(); if ($triggered) { + Log::debug('Rule is triggered, go to actions.'); if ($this->actions->count() > 0) { + Log::debug('Has more than zero actions.'); $this->actions(); } + if ($this->actions->count() === 0) { + Log::info('Rule has no actions!'); + } return true; } diff --git a/app/Rules/TransactionMatcher.php b/app/TransactionRules/TransactionMatcher.php similarity index 98% rename from app/Rules/TransactionMatcher.php rename to app/TransactionRules/TransactionMatcher.php index b192f64d7d..185e5fbbaa 100644 --- a/app/Rules/TransactionMatcher.php +++ b/app/TransactionRules/TransactionMatcher.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules; +namespace FireflyIII\TransactionRules; use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Models\Rule; @@ -25,7 +25,7 @@ use Log; * Class TransactionMatcher is used to find a list of * transaction matching a set of triggers * - * @package FireflyIII\Rules + * @package FireflyIII\TransactionRules */ class TransactionMatcher { diff --git a/app/Rules/Triggers/AbstractTrigger.php b/app/TransactionRules/Triggers/AbstractTrigger.php similarity index 96% rename from app/Rules/Triggers/AbstractTrigger.php rename to app/TransactionRules/Triggers/AbstractTrigger.php index b008a1b91c..02f6426087 100644 --- a/app/Rules/Triggers/AbstractTrigger.php +++ b/app/TransactionRules/Triggers/AbstractTrigger.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\RuleTrigger; use FireflyIII\Models\TransactionJournal; @@ -21,7 +21,7 @@ use FireflyIII\Models\TransactionJournal; * * Class AbstractTrigger * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ class AbstractTrigger { diff --git a/app/Rules/Triggers/AmountExactly.php b/app/TransactionRules/Triggers/AmountExactly.php similarity index 95% rename from app/Rules/Triggers/AmountExactly.php rename to app/TransactionRules/Triggers/AmountExactly.php index d160f8495e..6a504bede2 100644 --- a/app/Rules/Triggers/AmountExactly.php +++ b/app/TransactionRules/Triggers/AmountExactly.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\TransactionJournal; @@ -20,7 +20,7 @@ use Log; /** * Class AmountExactly * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ final class AmountExactly extends AbstractTrigger implements TriggerInterface { diff --git a/app/Rules/Triggers/AmountLess.php b/app/TransactionRules/Triggers/AmountLess.php similarity index 95% rename from app/Rules/Triggers/AmountLess.php rename to app/TransactionRules/Triggers/AmountLess.php index 433ccb2491..8db1a7fa12 100644 --- a/app/Rules/Triggers/AmountLess.php +++ b/app/TransactionRules/Triggers/AmountLess.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\TransactionJournal; @@ -20,7 +20,7 @@ use Log; /** * Class AmountLess * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ final class AmountLess extends AbstractTrigger implements TriggerInterface { diff --git a/app/Rules/Triggers/AmountMore.php b/app/TransactionRules/Triggers/AmountMore.php similarity index 96% rename from app/Rules/Triggers/AmountMore.php rename to app/TransactionRules/Triggers/AmountMore.php index 8a7f1544b6..fa40dde155 100644 --- a/app/Rules/Triggers/AmountMore.php +++ b/app/TransactionRules/Triggers/AmountMore.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\TransactionJournal; @@ -20,7 +20,7 @@ use Log; /** * Class AmountMore * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ final class AmountMore extends AbstractTrigger implements TriggerInterface { diff --git a/app/Rules/Triggers/BudgetIs.php b/app/TransactionRules/Triggers/BudgetIs.php similarity index 97% rename from app/Rules/Triggers/BudgetIs.php rename to app/TransactionRules/Triggers/BudgetIs.php index ecc2d01b92..fa5c400cdb 100644 --- a/app/Rules/Triggers/BudgetIs.php +++ b/app/TransactionRules/Triggers/BudgetIs.php @@ -9,7 +9,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; @@ -18,7 +18,7 @@ use Log; /** * Class BudgetIs * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ final class BudgetIs extends AbstractTrigger implements TriggerInterface { diff --git a/app/Rules/Triggers/CategoryIs.php b/app/TransactionRules/Triggers/CategoryIs.php similarity index 97% rename from app/Rules/Triggers/CategoryIs.php rename to app/TransactionRules/Triggers/CategoryIs.php index caf39abaaf..c522b899f5 100644 --- a/app/Rules/Triggers/CategoryIs.php +++ b/app/TransactionRules/Triggers/CategoryIs.php @@ -9,7 +9,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; @@ -18,7 +18,7 @@ use Log; /** * Class CategoryIs * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ final class CategoryIs extends AbstractTrigger implements TriggerInterface { diff --git a/app/Rules/Triggers/DescriptionContains.php b/app/TransactionRules/Triggers/DescriptionContains.php similarity index 96% rename from app/Rules/Triggers/DescriptionContains.php rename to app/TransactionRules/Triggers/DescriptionContains.php index 45fbf08205..83814a1570 100644 --- a/app/Rules/Triggers/DescriptionContains.php +++ b/app/TransactionRules/Triggers/DescriptionContains.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\TransactionJournal; @@ -20,7 +20,7 @@ use Log; /** * Class DescriptionContains * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ final class DescriptionContains extends AbstractTrigger implements TriggerInterface { diff --git a/app/Rules/Triggers/DescriptionEnds.php b/app/TransactionRules/Triggers/DescriptionEnds.php similarity index 96% rename from app/Rules/Triggers/DescriptionEnds.php rename to app/TransactionRules/Triggers/DescriptionEnds.php index 31c8d269ea..f4358ed670 100644 --- a/app/Rules/Triggers/DescriptionEnds.php +++ b/app/TransactionRules/Triggers/DescriptionEnds.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\TransactionJournal; use Log; @@ -19,7 +19,7 @@ use Log; /** * Class DescriptionEnds * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ final class DescriptionEnds extends AbstractTrigger implements TriggerInterface { diff --git a/app/Rules/Triggers/DescriptionIs.php b/app/TransactionRules/Triggers/DescriptionIs.php similarity index 95% rename from app/Rules/Triggers/DescriptionIs.php rename to app/TransactionRules/Triggers/DescriptionIs.php index de471e5dc7..63d5702072 100644 --- a/app/Rules/Triggers/DescriptionIs.php +++ b/app/TransactionRules/Triggers/DescriptionIs.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\TransactionJournal; use Log; @@ -19,7 +19,7 @@ use Log; /** * Class DescriptionIs * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ final class DescriptionIs extends AbstractTrigger implements TriggerInterface { diff --git a/app/Rules/Triggers/DescriptionStarts.php b/app/TransactionRules/Triggers/DescriptionStarts.php similarity index 96% rename from app/Rules/Triggers/DescriptionStarts.php rename to app/TransactionRules/Triggers/DescriptionStarts.php index 6bb9232fc3..d0da5ee04e 100644 --- a/app/Rules/Triggers/DescriptionStarts.php +++ b/app/TransactionRules/Triggers/DescriptionStarts.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\TransactionJournal; use Log; @@ -19,7 +19,7 @@ use Log; /** * Class DescriptionStarts * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ final class DescriptionStarts extends AbstractTrigger implements TriggerInterface { diff --git a/app/Rules/Triggers/FromAccountContains.php b/app/TransactionRules/Triggers/FromAccountContains.php similarity index 96% rename from app/Rules/Triggers/FromAccountContains.php rename to app/TransactionRules/Triggers/FromAccountContains.php index 54fef61b20..0d4dace539 100644 --- a/app/Rules/Triggers/FromAccountContains.php +++ b/app/TransactionRules/Triggers/FromAccountContains.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\Account; use FireflyIII\Models\TransactionJournal; @@ -20,7 +20,7 @@ use Log; /** * Class FromAccountContains * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ final class FromAccountContains extends AbstractTrigger implements TriggerInterface { diff --git a/app/Rules/Triggers/FromAccountEnds.php b/app/TransactionRules/Triggers/FromAccountEnds.php similarity index 96% rename from app/Rules/Triggers/FromAccountEnds.php rename to app/TransactionRules/Triggers/FromAccountEnds.php index 6121bb9580..f0215e96fb 100644 --- a/app/Rules/Triggers/FromAccountEnds.php +++ b/app/TransactionRules/Triggers/FromAccountEnds.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\Account; use FireflyIII\Models\TransactionJournal; @@ -20,7 +20,7 @@ use Log; /** * Class FromAccountEnds * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ final class FromAccountEnds extends AbstractTrigger implements TriggerInterface { diff --git a/app/Rules/Triggers/FromAccountIs.php b/app/TransactionRules/Triggers/FromAccountIs.php similarity index 95% rename from app/Rules/Triggers/FromAccountIs.php rename to app/TransactionRules/Triggers/FromAccountIs.php index 06339eb331..9314ef39ae 100644 --- a/app/Rules/Triggers/FromAccountIs.php +++ b/app/TransactionRules/Triggers/FromAccountIs.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\Account; use FireflyIII\Models\TransactionJournal; @@ -20,7 +20,7 @@ use Log; /** * Class FromAccountIs * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ final class FromAccountIs extends AbstractTrigger implements TriggerInterface { diff --git a/app/Rules/Triggers/FromAccountStarts.php b/app/TransactionRules/Triggers/FromAccountStarts.php similarity index 96% rename from app/Rules/Triggers/FromAccountStarts.php rename to app/TransactionRules/Triggers/FromAccountStarts.php index 52ab178289..8908785e44 100644 --- a/app/Rules/Triggers/FromAccountStarts.php +++ b/app/TransactionRules/Triggers/FromAccountStarts.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\Account; use FireflyIII\Models\TransactionJournal; @@ -20,7 +20,7 @@ use Log; /** * Class FromAccountStarts * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ final class FromAccountStarts extends AbstractTrigger implements TriggerInterface { diff --git a/app/Rules/Triggers/HasAnyBudget.php b/app/TransactionRules/Triggers/HasAnyBudget.php similarity index 95% rename from app/Rules/Triggers/HasAnyBudget.php rename to app/TransactionRules/Triggers/HasAnyBudget.php index 74d77eab01..e2bb39f2a5 100644 --- a/app/Rules/Triggers/HasAnyBudget.php +++ b/app/TransactionRules/Triggers/HasAnyBudget.php @@ -10,7 +10,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\TransactionJournal; use Log; @@ -18,7 +18,7 @@ use Log; /** * Class HasAnyBudget * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ final class HasAnyBudget extends AbstractTrigger implements TriggerInterface { diff --git a/app/Rules/Triggers/HasAnyCategory.php b/app/TransactionRules/Triggers/HasAnyCategory.php similarity index 95% rename from app/Rules/Triggers/HasAnyCategory.php rename to app/TransactionRules/Triggers/HasAnyCategory.php index c7902e0e95..1efe0a7315 100644 --- a/app/Rules/Triggers/HasAnyCategory.php +++ b/app/TransactionRules/Triggers/HasAnyCategory.php @@ -10,7 +10,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\TransactionJournal; use Log; @@ -18,7 +18,7 @@ use Log; /** * Class HasAnyCategory * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ final class HasAnyCategory extends AbstractTrigger implements TriggerInterface { diff --git a/app/Rules/Triggers/HasAnyTag.php b/app/TransactionRules/Triggers/HasAnyTag.php similarity index 95% rename from app/Rules/Triggers/HasAnyTag.php rename to app/TransactionRules/Triggers/HasAnyTag.php index a7e2ecd5bd..ffc6f94791 100644 --- a/app/Rules/Triggers/HasAnyTag.php +++ b/app/TransactionRules/Triggers/HasAnyTag.php @@ -10,7 +10,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\TransactionJournal; use Log; @@ -18,7 +18,7 @@ use Log; /** * Class HasAnyTag * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ final class HasAnyTag extends AbstractTrigger implements TriggerInterface { diff --git a/app/Rules/Triggers/HasAttachment.php b/app/TransactionRules/Triggers/HasAttachment.php similarity index 97% rename from app/Rules/Triggers/HasAttachment.php rename to app/TransactionRules/Triggers/HasAttachment.php index 6fc86c6a6c..9e0f04a7c3 100644 --- a/app/Rules/Triggers/HasAttachment.php +++ b/app/TransactionRules/Triggers/HasAttachment.php @@ -9,7 +9,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\TransactionJournal; diff --git a/app/Rules/Triggers/HasNoBudget.php b/app/TransactionRules/Triggers/HasNoBudget.php similarity index 95% rename from app/Rules/Triggers/HasNoBudget.php rename to app/TransactionRules/Triggers/HasNoBudget.php index 9df4143805..f64b9d359e 100644 --- a/app/Rules/Triggers/HasNoBudget.php +++ b/app/TransactionRules/Triggers/HasNoBudget.php @@ -10,7 +10,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\TransactionJournal; use Log; @@ -18,7 +18,7 @@ use Log; /** * Class HasNoBudget * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ final class HasNoBudget extends AbstractTrigger implements TriggerInterface { diff --git a/app/Rules/Triggers/HasNoCategory.php b/app/TransactionRules/Triggers/HasNoCategory.php similarity index 95% rename from app/Rules/Triggers/HasNoCategory.php rename to app/TransactionRules/Triggers/HasNoCategory.php index 4f6e367b30..fad320c8f5 100644 --- a/app/Rules/Triggers/HasNoCategory.php +++ b/app/TransactionRules/Triggers/HasNoCategory.php @@ -10,7 +10,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\TransactionJournal; use Log; @@ -18,7 +18,7 @@ use Log; /** * Class HasNoCategory * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ final class HasNoCategory extends AbstractTrigger implements TriggerInterface { diff --git a/app/Rules/Triggers/HasNoTag.php b/app/TransactionRules/Triggers/HasNoTag.php similarity index 95% rename from app/Rules/Triggers/HasNoTag.php rename to app/TransactionRules/Triggers/HasNoTag.php index 813aaf82ff..afa6e2afd2 100644 --- a/app/Rules/Triggers/HasNoTag.php +++ b/app/TransactionRules/Triggers/HasNoTag.php @@ -10,7 +10,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\TransactionJournal; use Log; @@ -18,7 +18,7 @@ use Log; /** * Class HasNoTag * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ final class HasNoTag extends AbstractTrigger implements TriggerInterface { diff --git a/app/Rules/Triggers/TagIs.php b/app/TransactionRules/Triggers/TagIs.php similarity index 95% rename from app/Rules/Triggers/TagIs.php rename to app/TransactionRules/Triggers/TagIs.php index 9ea19ac2ed..0d9dc9b33b 100644 --- a/app/Rules/Triggers/TagIs.php +++ b/app/TransactionRules/Triggers/TagIs.php @@ -9,7 +9,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\Tag; use FireflyIII\Models\TransactionJournal; @@ -18,7 +18,7 @@ use Log; /** * Class TagIs * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ final class TagIs extends AbstractTrigger implements TriggerInterface { diff --git a/app/Rules/Triggers/ToAccountContains.php b/app/TransactionRules/Triggers/ToAccountContains.php similarity index 96% rename from app/Rules/Triggers/ToAccountContains.php rename to app/TransactionRules/Triggers/ToAccountContains.php index 96eeb960e8..70c98559a7 100644 --- a/app/Rules/Triggers/ToAccountContains.php +++ b/app/TransactionRules/Triggers/ToAccountContains.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\Account; use FireflyIII\Models\TransactionJournal; @@ -20,7 +20,7 @@ use Log; /** * Class ToAccountContains * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ final class ToAccountContains extends AbstractTrigger implements TriggerInterface { diff --git a/app/Rules/Triggers/ToAccountEnds.php b/app/TransactionRules/Triggers/ToAccountEnds.php similarity index 96% rename from app/Rules/Triggers/ToAccountEnds.php rename to app/TransactionRules/Triggers/ToAccountEnds.php index ff5f470618..056d7bd827 100644 --- a/app/Rules/Triggers/ToAccountEnds.php +++ b/app/TransactionRules/Triggers/ToAccountEnds.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\Account; use FireflyIII\Models\TransactionJournal; @@ -20,7 +20,7 @@ use Log; /** * Class ToAccountEnds * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ final class ToAccountEnds extends AbstractTrigger implements TriggerInterface { diff --git a/app/Rules/Triggers/ToAccountIs.php b/app/TransactionRules/Triggers/ToAccountIs.php similarity index 96% rename from app/Rules/Triggers/ToAccountIs.php rename to app/TransactionRules/Triggers/ToAccountIs.php index fffb334153..48df49fc03 100644 --- a/app/Rules/Triggers/ToAccountIs.php +++ b/app/TransactionRules/Triggers/ToAccountIs.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\Account; use FireflyIII\Models\TransactionJournal; @@ -20,7 +20,7 @@ use Log; /** * Class ToAccountIs * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ final class ToAccountIs extends AbstractTrigger implements TriggerInterface { diff --git a/app/Rules/Triggers/ToAccountStarts.php b/app/TransactionRules/Triggers/ToAccountStarts.php similarity index 96% rename from app/Rules/Triggers/ToAccountStarts.php rename to app/TransactionRules/Triggers/ToAccountStarts.php index 05eebbe028..90e36547a8 100644 --- a/app/Rules/Triggers/ToAccountStarts.php +++ b/app/TransactionRules/Triggers/ToAccountStarts.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\Account; use FireflyIII\Models\TransactionJournal; @@ -20,7 +20,7 @@ use Log; /** * Class ToAccountStarts * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ final class ToAccountStarts extends AbstractTrigger implements TriggerInterface { diff --git a/app/Rules/Triggers/TransactionType.php b/app/TransactionRules/Triggers/TransactionType.php similarity index 95% rename from app/Rules/Triggers/TransactionType.php rename to app/TransactionRules/Triggers/TransactionType.php index e6f220ffce..feff655a2d 100644 --- a/app/Rules/Triggers/TransactionType.php +++ b/app/TransactionRules/Triggers/TransactionType.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\TransactionJournal; use Log; @@ -19,7 +19,7 @@ use Log; /** * Class TransactionType * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ final class TransactionType extends AbstractTrigger implements TriggerInterface { diff --git a/app/Rules/Triggers/TriggerInterface.php b/app/TransactionRules/Triggers/TriggerInterface.php similarity index 93% rename from app/Rules/Triggers/TriggerInterface.php rename to app/TransactionRules/Triggers/TriggerInterface.php index ac58021ddc..cb327c4880 100644 --- a/app/Rules/Triggers/TriggerInterface.php +++ b/app/TransactionRules/Triggers/TriggerInterface.php @@ -11,14 +11,14 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\TransactionJournal; /** * Interface TriggerInterface * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ interface TriggerInterface { diff --git a/app/Rules/Triggers/UserAction.php b/app/TransactionRules/Triggers/UserAction.php similarity index 94% rename from app/Rules/Triggers/UserAction.php rename to app/TransactionRules/Triggers/UserAction.php index fb4d6508c6..cd7a189f13 100644 --- a/app/Rules/Triggers/UserAction.php +++ b/app/TransactionRules/Triggers/UserAction.php @@ -11,7 +11,7 @@ declare(strict_types=1); -namespace FireflyIII\Rules\Triggers; +namespace FireflyIII\TransactionRules\Triggers; use FireflyIII\Models\TransactionJournal; use Log; @@ -19,7 +19,7 @@ use Log; /** * Class UserAction * - * @package FireflyIII\Rules\Triggers + * @package FireflyIII\TransactionRules\Triggers */ final class UserAction extends AbstractTrigger implements TriggerInterface { diff --git a/app/User.php b/app/User.php index da5e565d38..562a7b2b6d 100644 --- a/app/User.php +++ b/app/User.php @@ -136,6 +136,16 @@ class User extends Authenticatable return $this->hasMany('FireflyIII\Models\ExportJob'); } + /** + * @return string + */ + public function generateAccessToken(): string + { + $bytes = random_bytes(16); + + return strval(bin2hex($bytes)); + } + /** * Checks if the user has a role by its name. * diff --git a/app/Validation/FireflyValidator.php b/app/Validation/FireflyValidator.php index ef16f8787b..c25bd003ae 100644 --- a/app/Validation/FireflyValidator.php +++ b/app/Validation/FireflyValidator.php @@ -23,8 +23,8 @@ use FireflyIII\Models\Budget; use FireflyIII\Models\PiggyBank; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; -use FireflyIII\Rules\Triggers\TriggerInterface; use FireflyIII\Services\Password\Verifier; +use FireflyIII\TransactionRules\Triggers\TriggerInterface; use FireflyIII\User; use Google2FA; use Illuminate\Contracts\Encryption\DecryptException; @@ -278,11 +278,10 @@ class FireflyValidator extends Validator /** * @param $attribute * @param $value - * @param $parameters * * @return bool */ - public function validateSecurePassword($attribute, $value, $parameters): bool + public function validateSecurePassword($attribute, $value): bool { $verify = false; if (isset($this->data['verify_password'])) { diff --git a/artisan b/artisan index df630d0d6d..5c23e2e24f 100755 --- a/artisan +++ b/artisan @@ -1,6 +1,8 @@ #!/usr/bin/env php handle( | Shutdown The Application |-------------------------------------------------------------------------- | -| Once Artisan has finished running. We will fire off the shutdown events +| Once Artisan has finished running, we will fire off the shutdown events | so that any final work may be done by the application before we shut | down the process. This is the last thing to happen to the request. | diff --git a/bootstrap/app.php b/bootstrap/app.php index b026728e73..33b7ac22aa 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -1,15 +1,5 @@ singleton( Illuminate\Contracts\Http\Kernel::class, FireflyIII\Http\Kernel::class diff --git a/bootstrap/autoload.php b/bootstrap/autoload.php deleted file mode 100644 index 984638501e..0000000000 --- a/bootstrap/autoload.php +++ /dev/null @@ -1,47 +0,0 @@ -= 5.5" + }, + "require-dev": { + "dominicsayers/isemail": "dev-master", + "phpunit/phpunit": "^4.8.0", + "satooshi/php-coveralls": "dev-master" + }, + "suggest": { + "ext-intl": "PHP Internationalization Libraries are required to use the SpoofChecking validation" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Egulias\\EmailValidator\\": "EmailValidator" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Eduardo Gulias Davis" + } + ], + "description": "A library for validating emails against several RFCs", + "homepage": "https://github.com/egulias/EmailValidator", + "keywords": [ + "email", + "emailvalidation", + "emailvalidator", + "validation", + "validator" + ], + "time": "2017-01-30T22:07:36+00:00" + }, { "name": "erusev/parsedown", "version": "1.6.3", @@ -669,17 +726,74 @@ "time": "2017-05-14T14:47:48+00:00" }, { - "name": "laravel/framework", - "version": "v5.4.36", + "name": "fideloper/proxy", + "version": "3.3.4", "source": { "type": "git", - "url": "https://github.com/laravel/framework.git", - "reference": "1062a22232071c3e8636487c86ec1ae75681bbf9" + "url": "https://github.com/fideloper/TrustedProxy.git", + "reference": "9cdf6f118af58d89764249bbcc7bb260c132924f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/1062a22232071c3e8636487c86ec1ae75681bbf9", - "reference": "1062a22232071c3e8636487c86ec1ae75681bbf9", + "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/9cdf6f118af58d89764249bbcc7bb260c132924f", + "reference": "9cdf6f118af58d89764249bbcc7bb260c132924f", + "shasum": "" + }, + "require": { + "illuminate/contracts": "~5.0", + "php": ">=5.4.0" + }, + "require-dev": { + "illuminate/http": "~5.0", + "mockery/mockery": "~0.9.3", + "phpunit/phpunit": "^5.7" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3-dev" + }, + "laravel": { + "providers": [ + "Fideloper\\Proxy\\TrustedProxyServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Fideloper\\Proxy\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Chris Fidao", + "email": "fideloper@gmail.com" + } + ], + "description": "Set trusted proxies for Laravel", + "keywords": [ + "load balancing", + "proxy", + "trusted proxy" + ], + "time": "2017-06-15T17:19:42+00:00" + }, + { + "name": "laravel/framework", + "version": "v5.5.13", + "source": { + "type": "git", + "url": "https://github.com/laravel/framework.git", + "reference": "bfbe20d32ee9f98c89df852847827407a5127be4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/laravel/framework/zipball/bfbe20d32ee9f98c89df852847827407a5127be4", + "reference": "bfbe20d32ee9f98c89df852847827407a5127be4", "shasum": "" }, "require": { @@ -688,21 +802,22 @@ "ext-mbstring": "*", "ext-openssl": "*", "league/flysystem": "~1.0", - "monolog/monolog": "~1.11", + "monolog/monolog": "~1.12", "mtdowling/cron-expression": "~1.0", "nesbot/carbon": "~1.20", - "paragonie/random_compat": "~1.4|~2.0", - "php": ">=5.6.4", + "php": ">=7.0", + "psr/container": "~1.0", + "psr/simple-cache": "^1.0", "ramsey/uuid": "~3.0", - "swiftmailer/swiftmailer": "~5.4", - "symfony/console": "~3.2", - "symfony/debug": "~3.2", - "symfony/finder": "~3.2", - "symfony/http-foundation": "~3.2", - "symfony/http-kernel": "~3.2", - "symfony/process": "~3.2", - "symfony/routing": "~3.2", - "symfony/var-dumper": "~3.2", + "swiftmailer/swiftmailer": "~6.0", + "symfony/console": "~3.3", + "symfony/debug": "~3.3", + "symfony/finder": "~3.3", + "symfony/http-foundation": "~3.3", + "symfony/http-kernel": "~3.3", + "symfony/process": "~3.3", + "symfony/routing": "~3.3", + "symfony/var-dumper": "~3.3", "tijsverkoyen/css-to-inline-styles": "~2.2", "vlucas/phpdotenv": "~2.2" }, @@ -741,12 +856,14 @@ "require-dev": { "aws/aws-sdk-php": "~3.0", "doctrine/dbal": "~2.5", - "mockery/mockery": "~0.9.4", + "filp/whoops": "^2.1.4", + "mockery/mockery": "~1.0", + "orchestra/testbench-core": "3.5.*", "pda/pheanstalk": "~3.0", - "phpunit/phpunit": "~5.7", - "predis/predis": "~1.0", - "symfony/css-selector": "~3.2", - "symfony/dom-crawler": "~3.2" + "phpunit/phpunit": "~6.0", + "predis/predis": "^1.1.1", + "symfony/css-selector": "~3.3", + "symfony/dom-crawler": "~3.3" }, "suggest": { "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (~3.0).", @@ -760,14 +877,14 @@ "pda/pheanstalk": "Required to use the beanstalk queue driver (~3.0).", "predis/predis": "Required to use the redis cache and queue drivers (~1.0).", "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~2.0).", - "symfony/css-selector": "Required to use some of the crawler integration testing tools (~3.2).", - "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (~3.2).", - "symfony/psr-http-message-bridge": "Required to psr7 bridging features (0.2.*)." + "symfony/css-selector": "Required to use some of the crawler integration testing tools (~3.3).", + "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (~3.3).", + "symfony/psr-http-message-bridge": "Required to psr7 bridging features (~1.0)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.4-dev" + "dev-master": "5.5-dev" } }, "autoload": { @@ -795,36 +912,47 @@ "framework", "laravel" ], - "time": "2017-08-30T09:26:16+00:00" + "time": "2017-09-24T19:09:38+00:00" }, { "name": "laravelcollective/html", - "version": "v5.4.9", + "version": "v5.5.1", "source": { "type": "git", "url": "https://github.com/LaravelCollective/html.git", - "reference": "f04965dc688254f4c77f684ab0b42264f9eb9634" + "reference": "2f6dc39ab3655724a615fe8a652d8b7f04fc9ac6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/LaravelCollective/html/zipball/f04965dc688254f4c77f684ab0b42264f9eb9634", - "reference": "f04965dc688254f4c77f684ab0b42264f9eb9634", + "url": "https://api.github.com/repos/LaravelCollective/html/zipball/2f6dc39ab3655724a615fe8a652d8b7f04fc9ac6", + "reference": "2f6dc39ab3655724a615fe8a652d8b7f04fc9ac6", "shasum": "" }, "require": { - "illuminate/http": "5.4.*", - "illuminate/routing": "5.4.*", - "illuminate/session": "5.4.*", - "illuminate/support": "5.4.*", - "illuminate/view": "5.4.*", - "php": ">=5.6.4" + "illuminate/http": "5.5.*", + "illuminate/routing": "5.5.*", + "illuminate/session": "5.5.*", + "illuminate/support": "5.5.*", + "illuminate/view": "5.5.*", + "php": ">=7.0.0" }, "require-dev": { - "illuminate/database": "5.4.*", + "illuminate/database": "5.5.*", "mockery/mockery": "~0.9.4", "phpunit/phpunit": "~5.4" }, "type": "library", + "extra": { + "laravel": { + "providers": [ + "Collective\\Html\\HtmlServiceProvider" + ], + "aliases": { + "Form": "Collective\\Html\\FormFacade", + "Html": "Collective\\Html\\HtmlFacade" + } + } + }, "autoload": { "psr-4": { "Collective\\Html\\": "src/" @@ -849,7 +977,7 @@ ], "description": "HTML and Form Builders for the Laravel Framework", "homepage": "http://laravelcollective.com", - "time": "2017-08-12T15:52:38+00:00" + "time": "2017-08-31T14:46:03+00:00" }, { "name": "league/commonmark", @@ -1237,16 +1365,16 @@ }, { "name": "paragonie/random_compat", - "version": "v2.0.10", + "version": "v2.0.11", "source": { "type": "git", "url": "https://github.com/paragonie/random_compat.git", - "reference": "634bae8e911eefa89c1abfbf1b66da679ac8f54d" + "reference": "5da4d3c796c275c55f057af5a643ae297d96b4d8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/random_compat/zipball/634bae8e911eefa89c1abfbf1b66da679ac8f54d", - "reference": "634bae8e911eefa89c1abfbf1b66da679ac8f54d", + "url": "https://api.github.com/repos/paragonie/random_compat/zipball/5da4d3c796c275c55f057af5a643ae297d96b4d8", + "reference": "5da4d3c796c275c55f057af5a643ae297d96b4d8", "shasum": "" }, "require": { @@ -1281,7 +1409,7 @@ "pseudorandom", "random" ], - "time": "2017-03-13T16:27:32+00:00" + "time": "2017-09-27T21:40:39+00:00" }, { "name": "pragmarx/google2fa", @@ -1344,6 +1472,55 @@ ], "time": "2016-07-18T20:25:04+00:00" }, + { + "name": "psr/container", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2017-02-14T16:28:37+00:00" + }, { "name": "psr/log", "version": "1.0.2", @@ -1392,17 +1569,65 @@ "time": "2016-10-10T12:19:37+00:00" }, { - "name": "ramsey/uuid", - "version": "3.7.0", + "name": "psr/simple-cache", + "version": "1.0.0", "source": { "type": "git", - "url": "https://github.com/ramsey/uuid.git", - "reference": "0ef23d1b10cf1bc576e9d865a7e9c47982c5715e" + "url": "https://github.com/php-fig/simple-cache.git", + "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/0ef23d1b10cf1bc576e9d865a7e9c47982c5715e", - "reference": "0ef23d1b10cf1bc576e9d865a7e9c47982c5715e", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/753fa598e8f3b9966c886fe13f370baa45ef0e24", + "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\SimpleCache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for simple caching", + "keywords": [ + "cache", + "caching", + "psr", + "psr-16", + "simple-cache" + ], + "time": "2017-01-02T13:31:39+00:00" + }, + { + "name": "ramsey/uuid", + "version": "3.7.1", + "source": { + "type": "git", + "url": "https://github.com/ramsey/uuid.git", + "reference": "45cffe822057a09e05f7bd09ec5fb88eeecd2334" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/45cffe822057a09e05f7bd09ec5fb88eeecd2334", + "reference": "45cffe822057a09e05f7bd09ec5fb88eeecd2334", "shasum": "" }, "require": { @@ -1471,7 +1696,7 @@ "identifier", "uuid" ], - "time": "2017-08-04T13:39:04+00:00" + "time": "2017-09-22T20:46:04+00:00" }, { "name": "rcrowe/twigbridge", @@ -1588,29 +1813,30 @@ }, { "name": "swiftmailer/swiftmailer", - "version": "v5.4.8", + "version": "v6.0.1", "source": { "type": "git", "url": "https://github.com/swiftmailer/swiftmailer.git", - "reference": "9a06dc570a0367850280eefd3f1dc2da45aef517" + "reference": "008f088d535ed3333af5ad804dd4c0eaf97c2805" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/9a06dc570a0367850280eefd3f1dc2da45aef517", - "reference": "9a06dc570a0367850280eefd3f1dc2da45aef517", + "url": "https://api.github.com/repos/swiftmailer/swiftmailer/zipball/008f088d535ed3333af5ad804dd4c0eaf97c2805", + "reference": "008f088d535ed3333af5ad804dd4c0eaf97c2805", "shasum": "" }, "require": { - "php": ">=5.3.3" + "egulias/email-validator": "~2.0", + "php": ">=7.0.0" }, "require-dev": { "mockery/mockery": "~0.9.1", - "symfony/phpunit-bridge": "~3.2" + "symfony/phpunit-bridge": "~3.3@dev" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.4-dev" + "dev-master": "6.0-dev" } }, "autoload": { @@ -1638,20 +1864,20 @@ "mail", "mailer" ], - "time": "2017-05-01T15:54:03+00:00" + "time": "2017-05-20T06:20:27+00:00" }, { "name": "symfony/console", - "version": "v3.3.8", + "version": "v3.3.9", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "d6596cb5022b6a0bd940eae54a1de78646a5fda6" + "reference": "a1e1b01293a090cb9ae2ddd221a3251a4a7e4abf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/d6596cb5022b6a0bd940eae54a1de78646a5fda6", - "reference": "d6596cb5022b6a0bd940eae54a1de78646a5fda6", + "url": "https://api.github.com/repos/symfony/console/zipball/a1e1b01293a090cb9ae2ddd221a3251a4a7e4abf", + "reference": "a1e1b01293a090cb9ae2ddd221a3251a4a7e4abf", "shasum": "" }, "require": { @@ -1706,29 +1932,29 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2017-08-27T14:52:21+00:00" + "time": "2017-09-06T16:40:18+00:00" }, { "name": "symfony/css-selector", - "version": "v3.1.10", + "version": "v3.3.9", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "722a87478a72d95dc2a3bcf41dc9c2d13fd4cb2d" + "reference": "c5f5263ed231f164c58368efbce959137c7d9488" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/722a87478a72d95dc2a3bcf41dc9c2d13fd4cb2d", - "reference": "722a87478a72d95dc2a3bcf41dc9c2d13fd4cb2d", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/c5f5263ed231f164c58368efbce959137c7d9488", + "reference": "c5f5263ed231f164c58368efbce959137c7d9488", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": "^5.5.9|>=7.0.8" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1-dev" + "dev-master": "3.3-dev" } }, "autoload": { @@ -1759,20 +1985,20 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2017-01-02T20:31:54+00:00" + "time": "2017-07-29T21:54:42+00:00" }, { "name": "symfony/debug", - "version": "v3.3.8", + "version": "v3.3.9", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "084d804fe35808eb2ef596ec83d85d9768aa6c9d" + "reference": "8beb24eec70b345c313640962df933499373a944" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/084d804fe35808eb2ef596ec83d85d9768aa6c9d", - "reference": "084d804fe35808eb2ef596ec83d85d9768aa6c9d", + "url": "https://api.github.com/repos/symfony/debug/zipball/8beb24eec70b345c313640962df933499373a944", + "reference": "8beb24eec70b345c313640962df933499373a944", "shasum": "" }, "require": { @@ -1815,31 +2041,34 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2017-08-27T14:52:21+00:00" + "time": "2017-09-01T13:23:39+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v2.8.27", + "version": "v3.3.9", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "1377400fd641d7d1935981546aaef780ecd5bf6d" + "reference": "54ca9520a00386f83bca145819ad3b619aaa2485" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/1377400fd641d7d1935981546aaef780ecd5bf6d", - "reference": "1377400fd641d7d1935981546aaef780ecd5bf6d", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/54ca9520a00386f83bca145819ad3b619aaa2485", + "reference": "54ca9520a00386f83bca145819ad3b619aaa2485", "shasum": "" }, "require": { - "php": ">=5.3.9" + "php": "^5.5.9|>=7.0.8" + }, + "conflict": { + "symfony/dependency-injection": "<3.3" }, "require-dev": { "psr/log": "~1.0", - "symfony/config": "^2.0.5|~3.0.0", - "symfony/dependency-injection": "~2.6|~3.0.0", - "symfony/expression-language": "~2.6|~3.0.0", - "symfony/stopwatch": "~2.3|~3.0.0" + "symfony/config": "~2.8|~3.0", + "symfony/dependency-injection": "~3.3", + "symfony/expression-language": "~2.8|~3.0", + "symfony/stopwatch": "~2.8|~3.0" }, "suggest": { "symfony/dependency-injection": "", @@ -1848,7 +2077,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.8-dev" + "dev-master": "3.3-dev" } }, "autoload": { @@ -1875,11 +2104,11 @@ ], "description": "Symfony EventDispatcher Component", "homepage": "https://symfony.com", - "time": "2017-06-02T07:47:27+00:00" + "time": "2017-07-29T21:54:42+00:00" }, { "name": "symfony/finder", - "version": "v3.3.8", + "version": "v3.3.9", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", @@ -1928,16 +2157,16 @@ }, { "name": "symfony/http-foundation", - "version": "v3.3.8", + "version": "v3.3.9", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "14bacad23a4f075bfd3fd456755236cb261320e3" + "reference": "2cdc7de1921d1a1c805a13dc05e44a2cd58f5ad3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/14bacad23a4f075bfd3fd456755236cb261320e3", - "reference": "14bacad23a4f075bfd3fd456755236cb261320e3", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/2cdc7de1921d1a1c805a13dc05e44a2cd58f5ad3", + "reference": "2cdc7de1921d1a1c805a13dc05e44a2cd58f5ad3", "shasum": "" }, "require": { @@ -1977,7 +2206,7 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2017-08-10T07:07:06+00:00" + "time": "2017-09-06T17:07:39+00:00" }, { "name": "symfony/http-kernel", @@ -2233,7 +2462,7 @@ }, { "name": "symfony/process", - "version": "v3.3.8", + "version": "v3.3.9", "source": { "type": "git", "url": "https://github.com/symfony/process.git", @@ -2282,7 +2511,7 @@ }, { "name": "symfony/routing", - "version": "v3.3.8", + "version": "v3.3.9", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", @@ -2360,7 +2589,7 @@ }, { "name": "symfony/translation", - "version": "v3.3.8", + "version": "v3.3.9", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", @@ -2425,7 +2654,7 @@ }, { "name": "symfony/var-dumper", - "version": "v3.3.8", + "version": "v3.3.9", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", @@ -2926,6 +3155,67 @@ ], "time": "2017-07-22T11:58:36+00:00" }, + { + "name": "filp/whoops", + "version": "2.1.10", + "source": { + "type": "git", + "url": "https://github.com/filp/whoops.git", + "reference": "ffbbd2c06c64b08fb47974eed5dbce4ca2bb0eec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/filp/whoops/zipball/ffbbd2c06c64b08fb47974eed5dbce4ca2bb0eec", + "reference": "ffbbd2c06c64b08fb47974eed5dbce4ca2bb0eec", + "shasum": "" + }, + "require": { + "php": "^5.5.9 || ^7.0", + "psr/log": "^1.0.1" + }, + "require-dev": { + "mockery/mockery": "0.9.*", + "phpunit/phpunit": "^4.8 || ^5.0", + "symfony/var-dumper": "^2.6 || ^3.0" + }, + "suggest": { + "symfony/var-dumper": "Pretty print complex values better with var-dumper available", + "whoops/soap": "Formats errors as SOAP responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "psr-4": { + "Whoops\\": "src/Whoops/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Filipe Dobreira", + "homepage": "https://github.com/filp", + "role": "Developer" + } + ], + "description": "php error handling for cool kids", + "homepage": "https://filp.github.io/whoops/", + "keywords": [ + "error", + "exception", + "handling", + "library", + "whoops", + "zf2" + ], + "time": "2017-08-03T18:23:40+00:00" + }, { "name": "fzaninotto/faker", "version": "v1.7.1", @@ -2976,102 +3266,6 @@ ], "time": "2017-08-15T16:48:10+00:00" }, - { - "name": "guzzle/guzzle", - "version": "v3.9.3", - "source": { - "type": "git", - "url": "https://github.com/guzzle/guzzle3.git", - "reference": "0645b70d953bc1c067bbc8d5bc53194706b628d9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle3/zipball/0645b70d953bc1c067bbc8d5bc53194706b628d9", - "reference": "0645b70d953bc1c067bbc8d5bc53194706b628d9", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "php": ">=5.3.3", - "symfony/event-dispatcher": "~2.1" - }, - "replace": { - "guzzle/batch": "self.version", - "guzzle/cache": "self.version", - "guzzle/common": "self.version", - "guzzle/http": "self.version", - "guzzle/inflection": "self.version", - "guzzle/iterator": "self.version", - "guzzle/log": "self.version", - "guzzle/parser": "self.version", - "guzzle/plugin": "self.version", - "guzzle/plugin-async": "self.version", - "guzzle/plugin-backoff": "self.version", - "guzzle/plugin-cache": "self.version", - "guzzle/plugin-cookie": "self.version", - "guzzle/plugin-curlauth": "self.version", - "guzzle/plugin-error-response": "self.version", - "guzzle/plugin-history": "self.version", - "guzzle/plugin-log": "self.version", - "guzzle/plugin-md5": "self.version", - "guzzle/plugin-mock": "self.version", - "guzzle/plugin-oauth": "self.version", - "guzzle/service": "self.version", - "guzzle/stream": "self.version" - }, - "require-dev": { - "doctrine/cache": "~1.3", - "monolog/monolog": "~1.0", - "phpunit/phpunit": "3.7.*", - "psr/log": "~1.0", - "symfony/class-loader": "~2.1", - "zendframework/zend-cache": "2.*,<2.3", - "zendframework/zend-log": "2.*,<2.3" - }, - "suggest": { - "guzzlehttp/guzzle": "Guzzle 5 has moved to a new package name. The package you have installed, Guzzle 3, is deprecated." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.9-dev" - } - }, - "autoload": { - "psr-0": { - "Guzzle": "src/", - "Guzzle\\Tests": "tests/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - }, - { - "name": "Guzzle Community", - "homepage": "https://github.com/guzzle/guzzle/contributors" - } - ], - "description": "PHP HTTP client. This library is deprecated in favor of https://packagist.org/packages/guzzlehttp/guzzle", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "rest", - "web service" - ], - "abandoned": "guzzlehttp/guzzle", - "time": "2015-03-18T18:23:50+00:00" - }, { "name": "hamcrest/hamcrest-php", "version": "v1.2.2", @@ -3286,17 +3480,119 @@ "time": "2017-04-12T18:52:22+00:00" }, { - "name": "phpdocumentor/reflection-common", - "version": "1.0", + "name": "phar-io/manifest", + "version": "1.0.1", "source": { "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c" + "url": "https://github.com/phar-io/manifest.git", + "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c", - "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/2df402786ab5368a0169091f61a7c1e0eb6852d0", + "reference": "2df402786ab5368a0169091f61a7c1e0eb6852d0", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "phar-io/version": "^1.0.1", + "php": "^5.6 || ^7.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "time": "2017-03-05T18:14:27+00:00" + }, + { + "name": "phar-io/version", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/a70c0ced4be299a63d32fa96d9281d03e94041df", + "reference": "a70c0ced4be299a63d32fa96d9281d03e94041df", + "shasum": "" + }, + "require": { + "php": "^5.6 || ^7.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "time": "2017-03-05T17:38:23+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", + "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", "shasum": "" }, "require": { @@ -3337,7 +3633,7 @@ "reflection", "static analysis" ], - "time": "2015-12-27T11:43:31+00:00" + "time": "2017-09-11T18:02:19+00:00" }, { "name": "phpdocumentor/reflection-docblock", @@ -3496,40 +3792,41 @@ }, { "name": "phpunit/php-code-coverage", - "version": "4.0.8", + "version": "5.2.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d" + "reference": "8ed1902a57849e117b5651fc1a5c48110946c06b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d", - "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/8ed1902a57849e117b5651fc1a5c48110946c06b", + "reference": "8ed1902a57849e117b5651fc1a5c48110946c06b", "shasum": "" }, "require": { "ext-dom": "*", "ext-xmlwriter": "*", - "php": "^5.6 || ^7.0", - "phpunit/php-file-iterator": "^1.3", - "phpunit/php-text-template": "^1.2", - "phpunit/php-token-stream": "^1.4.2 || ^2.0", - "sebastian/code-unit-reverse-lookup": "^1.0", - "sebastian/environment": "^1.3.2 || ^2.0", - "sebastian/version": "^1.0 || ^2.0" + "php": "^7.0", + "phpunit/php-file-iterator": "^1.4.2", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-token-stream": "^1.4.11 || ^2.0", + "sebastian/code-unit-reverse-lookup": "^1.0.1", + "sebastian/environment": "^3.0", + "sebastian/version": "^2.0.1", + "theseer/tokenizer": "^1.1" }, "require-dev": { - "ext-xdebug": "^2.1.4", - "phpunit/phpunit": "^5.7" + "ext-xdebug": "^2.5", + "phpunit/phpunit": "^6.0" }, "suggest": { - "ext-xdebug": "^2.5.1" + "ext-xdebug": "^2.5.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0.x-dev" + "dev-master": "5.2.x-dev" } }, "autoload": { @@ -3555,7 +3852,7 @@ "testing", "xunit" ], - "time": "2017-04-02T07:44:40+00:00" + "time": "2017-08-03T12:40:43+00:00" }, { "name": "phpunit/php-file-iterator", @@ -3745,16 +4042,16 @@ }, { "name": "phpunit/phpunit", - "version": "5.7.21", + "version": "6.3.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "3b91adfb64264ddec5a2dee9851f354aa66327db" + "reference": "c0ff817b36a827e64bf5f57bc72278150cf30a77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3b91adfb64264ddec5a2dee9851f354aa66327db", - "reference": "3b91adfb64264ddec5a2dee9851f354aa66327db", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c0ff817b36a827e64bf5f57bc72278150cf30a77", + "reference": "c0ff817b36a827e64bf5f57bc72278150cf30a77", "shasum": "" }, "require": { @@ -3763,33 +4060,35 @@ "ext-libxml": "*", "ext-mbstring": "*", "ext-xml": "*", - "myclabs/deep-copy": "~1.3", - "php": "^5.6 || ^7.0", - "phpspec/prophecy": "^1.6.2", - "phpunit/php-code-coverage": "^4.0.4", - "phpunit/php-file-iterator": "~1.4", - "phpunit/php-text-template": "~1.2", - "phpunit/php-timer": "^1.0.6", - "phpunit/phpunit-mock-objects": "^3.2", - "sebastian/comparator": "^1.2.4", - "sebastian/diff": "^1.4.3", - "sebastian/environment": "^1.3.4 || ^2.0", - "sebastian/exporter": "~2.0", - "sebastian/global-state": "^1.1", - "sebastian/object-enumerator": "~2.0", - "sebastian/resource-operations": "~1.0", - "sebastian/version": "~1.0.3|~2.0", - "symfony/yaml": "~2.1|~3.0" + "myclabs/deep-copy": "^1.6.1", + "phar-io/manifest": "^1.0.1", + "phar-io/version": "^1.0", + "php": "^7.0", + "phpspec/prophecy": "^1.7", + "phpunit/php-code-coverage": "^5.2.2", + "phpunit/php-file-iterator": "^1.4.2", + "phpunit/php-text-template": "^1.2.1", + "phpunit/php-timer": "^1.0.9", + "phpunit/phpunit-mock-objects": "^4.0.3", + "sebastian/comparator": "^2.0.2", + "sebastian/diff": "^2.0", + "sebastian/environment": "^3.1", + "sebastian/exporter": "^3.1", + "sebastian/global-state": "^2.0", + "sebastian/object-enumerator": "^3.0.3", + "sebastian/resource-operations": "^1.0", + "sebastian/version": "^2.0.1" }, "conflict": { - "phpdocumentor/reflection-docblock": "3.0.2" + "phpdocumentor/reflection-docblock": "3.0.2", + "phpunit/dbunit": "<3.0" }, "require-dev": { "ext-pdo": "*" }, "suggest": { "ext-xdebug": "*", - "phpunit/php-invoker": "~1.1" + "phpunit/php-invoker": "^1.1" }, "bin": [ "phpunit" @@ -3797,7 +4096,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.7.x-dev" + "dev-master": "6.3.x-dev" } }, "autoload": { @@ -3823,33 +4122,33 @@ "testing", "xunit" ], - "time": "2017-06-21T08:11:54+00:00" + "time": "2017-09-24T07:25:54+00:00" }, { "name": "phpunit/phpunit-mock-objects", - "version": "3.4.4", + "version": "4.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "a23b761686d50a560cc56233b9ecf49597cc9118" + "reference": "2f789b59ab89669015ad984afa350c4ec577ade0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/a23b761686d50a560cc56233b9ecf49597cc9118", - "reference": "a23b761686d50a560cc56233b9ecf49597cc9118", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/2f789b59ab89669015ad984afa350c4ec577ade0", + "reference": "2f789b59ab89669015ad984afa350c4ec577ade0", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.0.2", - "php": "^5.6 || ^7.0", - "phpunit/php-text-template": "^1.2", - "sebastian/exporter": "^1.2 || ^2.0" + "doctrine/instantiator": "^1.0.5", + "php": "^7.0", + "phpunit/php-text-template": "^1.2.1", + "sebastian/exporter": "^3.0" }, "conflict": { - "phpunit/phpunit": "<5.4.0" + "phpunit/phpunit": "<6.0" }, "require-dev": { - "phpunit/phpunit": "^5.4" + "phpunit/phpunit": "^6.0" }, "suggest": { "ext-soap": "*" @@ -3857,7 +4156,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.2.x-dev" + "dev-master": "4.0.x-dev" } }, "autoload": { @@ -3882,65 +4181,7 @@ "mock", "xunit" ], - "time": "2017-06-30T09:13:00+00:00" - }, - { - "name": "satooshi/php-coveralls", - "version": "v1.0.1", - "source": { - "type": "git", - "url": "https://github.com/satooshi/php-coveralls.git", - "reference": "da51d304fe8622bf9a6da39a8446e7afd432115c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/satooshi/php-coveralls/zipball/da51d304fe8622bf9a6da39a8446e7afd432115c", - "reference": "da51d304fe8622bf9a6da39a8446e7afd432115c", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-simplexml": "*", - "guzzle/guzzle": "^2.8|^3.0", - "php": ">=5.3.3", - "psr/log": "^1.0", - "symfony/config": "^2.1|^3.0", - "symfony/console": "^2.1|^3.0", - "symfony/stopwatch": "^2.0|^3.0", - "symfony/yaml": "^2.0|^3.0" - }, - "suggest": { - "symfony/http-kernel": "Allows Symfony integration" - }, - "bin": [ - "bin/coveralls" - ], - "type": "library", - "autoload": { - "psr-4": { - "Satooshi\\": "src/Satooshi/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kitamura Satoshi", - "email": "with.no.parachute@gmail.com", - "homepage": "https://www.facebook.com/satooshi.jp" - } - ], - "description": "PHP client library for Coveralls API", - "homepage": "https://github.com/satooshi/php-coveralls", - "keywords": [ - "ci", - "coverage", - "github", - "test" - ], - "time": "2016-01-20T17:35:46+00:00" + "time": "2017-08-03T14:08:16+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -3989,30 +4230,30 @@ }, { "name": "sebastian/comparator", - "version": "1.2.4", + "version": "2.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be" + "reference": "ae068fede81d06e7bb9bb46a367210a3d3e1fe6a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", - "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/ae068fede81d06e7bb9bb46a367210a3d3e1fe6a", + "reference": "ae068fede81d06e7bb9bb46a367210a3d3e1fe6a", "shasum": "" }, "require": { - "php": ">=5.3.3", - "sebastian/diff": "~1.2", - "sebastian/exporter": "~1.2 || ~2.0" + "php": "^7.0", + "sebastian/diff": "^2.0", + "sebastian/exporter": "^3.0" }, "require-dev": { - "phpunit/phpunit": "~4.4" + "phpunit/phpunit": "^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2.x-dev" + "dev-master": "2.0.x-dev" } }, "autoload": { @@ -4049,32 +4290,32 @@ "compare", "equality" ], - "time": "2017-01-29T09:50:25+00:00" + "time": "2017-08-03T07:14:59+00:00" }, { "name": "sebastian/diff", - "version": "1.4.3", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4" + "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4", - "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", + "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0" + "php": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + "phpunit/phpunit": "^6.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -4101,32 +4342,32 @@ "keywords": [ "diff" ], - "time": "2017-05-22T07:24:03+00:00" + "time": "2017-08-03T08:09:46+00:00" }, { "name": "sebastian/environment", - "version": "2.0.0", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac" + "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac", - "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/cd0871b3975fb7fc44d11314fd1ee20925fce4f5", + "reference": "cd0871b3975fb7fc44d11314fd1ee20925fce4f5", "shasum": "" }, "require": { - "php": "^5.6 || ^7.0" + "php": "^7.0" }, "require-dev": { - "phpunit/phpunit": "^5.0" + "phpunit/phpunit": "^6.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "3.1.x-dev" } }, "autoload": { @@ -4151,34 +4392,34 @@ "environment", "hhvm" ], - "time": "2016-11-26T07:53:53+00:00" + "time": "2017-07-01T08:51:00+00:00" }, { "name": "sebastian/exporter", - "version": "2.0.0", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4" + "reference": "234199f4528de6d12aaa58b612e98f7d36adb937" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", - "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/234199f4528de6d12aaa58b612e98f7d36adb937", + "reference": "234199f4528de6d12aaa58b612e98f7d36adb937", "shasum": "" }, "require": { - "php": ">=5.3.3", - "sebastian/recursion-context": "~2.0" + "php": "^7.0", + "sebastian/recursion-context": "^3.0" }, "require-dev": { "ext-mbstring": "*", - "phpunit/phpunit": "~4.4" + "phpunit/phpunit": "^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "3.1.x-dev" } }, "autoload": { @@ -4218,27 +4459,27 @@ "export", "exporter" ], - "time": "2016-11-19T08:54:04+00:00" + "time": "2017-04-03T13:19:02+00:00" }, { "name": "sebastian/global-state", - "version": "1.1.1", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" + "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", + "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": "^7.0" }, "require-dev": { - "phpunit/phpunit": "~4.2" + "phpunit/phpunit": "^6.0" }, "suggest": { "ext-uopz": "*" @@ -4246,7 +4487,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -4269,33 +4510,34 @@ "keywords": [ "global state" ], - "time": "2015-10-12T03:26:01+00:00" + "time": "2017-04-27T15:39:26+00:00" }, { "name": "sebastian/object-enumerator", - "version": "2.0.1", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7" + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7", - "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", + "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", "shasum": "" }, "require": { - "php": ">=5.6", - "sebastian/recursion-context": "~2.0" + "php": "^7.0", + "sebastian/object-reflector": "^1.1.1", + "sebastian/recursion-context": "^3.0" }, "require-dev": { - "phpunit/phpunit": "~5" + "phpunit/phpunit": "^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "3.0.x-dev" } }, "autoload": { @@ -4315,32 +4557,77 @@ ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "time": "2017-02-18T15:18:39+00:00" + "time": "2017-08-03T12:35:26+00:00" }, { - "name": "sebastian/recursion-context", - "version": "2.0.0", + "name": "sebastian/object-reflector", + "version": "1.1.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a" + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "773f97c67f28de00d397be301821b06708fca0be" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a", - "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", + "reference": "773f97c67f28de00d397be301821b06708fca0be", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": "^7.0" }, "require-dev": { - "phpunit/phpunit": "~4.4" + "phpunit/phpunit": "^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "1.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "time": "2017-03-29T09:07:27+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", + "shasum": "" + }, + "require": { + "php": "^7.0" + }, + "require-dev": { + "phpunit/phpunit": "^6.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0.x-dev" } }, "autoload": { @@ -4368,7 +4655,7 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2016-11-19T07:33:16+00:00" + "time": "2017-03-03T06:23:57+00:00" }, { "name": "sebastian/resource-operations", @@ -4457,7 +4744,7 @@ }, { "name": "symfony/class-loader", - "version": "v3.3.8", + "version": "v3.3.9", "source": { "type": "git", "url": "https://github.com/symfony/class-loader.git", @@ -4512,275 +4799,44 @@ "time": "2017-07-29T21:54:42+00:00" }, { - "name": "symfony/config", - "version": "v3.3.8", + "name": "theseer/tokenizer", + "version": "1.1.0", "source": { "type": "git", - "url": "https://github.com/symfony/config.git", - "reference": "6ac0cc1f047c1dbc058fc25b7a4d91b068ed4488" + "url": "https://github.com/theseer/tokenizer.git", + "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/6ac0cc1f047c1dbc058fc25b7a4d91b068ed4488", - "reference": "6ac0cc1f047c1dbc058fc25b7a4d91b068ed4488", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/cb2f008f3f05af2893a87208fe6a6c4985483f8b", + "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/filesystem": "~2.8|~3.0" - }, - "conflict": { - "symfony/dependency-injection": "<3.3", - "symfony/finder": "<3.3" - }, - "require-dev": { - "symfony/dependency-injection": "~3.3", - "symfony/finder": "~3.3", - "symfony/yaml": "~3.0" - }, - "suggest": { - "symfony/yaml": "To use the yaml reference dumper" + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.0" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.3-dev" - } - }, "autoload": { - "psr-4": { - "Symfony\\Component\\Config\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" + "classmap": [ + "src/" ] }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" } ], - "description": "Symfony Config Component", - "homepage": "https://symfony.com", - "time": "2017-08-03T08:59:45+00:00" - }, - { - "name": "symfony/dom-crawler", - "version": "v3.1.10", - "source": { - "type": "git", - "url": "https://github.com/symfony/dom-crawler.git", - "reference": "7eede2a901a19928494194f7d1815a77b9a473a0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/7eede2a901a19928494194f7d1815a77b9a473a0", - "reference": "7eede2a901a19928494194f7d1815a77b9a473a0", - "shasum": "" - }, - "require": { - "php": ">=5.5.9", - "symfony/polyfill-mbstring": "~1.0" - }, - "require-dev": { - "symfony/css-selector": "~2.8|~3.0" - }, - "suggest": { - "symfony/css-selector": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.1-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\DomCrawler\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony DomCrawler Component", - "homepage": "https://symfony.com", - "time": "2017-01-21T17:13:55+00:00" - }, - { - "name": "symfony/filesystem", - "version": "v3.3.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/filesystem.git", - "reference": "b32a0e5f928d0fa3d1dd03c78d020777e50c10cb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/b32a0e5f928d0fa3d1dd03c78d020777e50c10cb", - "reference": "b32a0e5f928d0fa3d1dd03c78d020777e50c10cb", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.3-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Filesystem\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Filesystem Component", - "homepage": "https://symfony.com", - "time": "2017-07-29T21:54:42+00:00" - }, - { - "name": "symfony/stopwatch", - "version": "v3.3.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/stopwatch.git", - "reference": "9a5610a8d6a50985a7be485c0ba745c22607beeb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/9a5610a8d6a50985a7be485c0ba745c22607beeb", - "reference": "9a5610a8d6a50985a7be485c0ba745c22607beeb", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.3-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Stopwatch\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Stopwatch Component", - "homepage": "https://symfony.com", - "time": "2017-07-29T21:54:42+00:00" - }, - { - "name": "symfony/yaml", - "version": "v3.3.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "1d8c2a99c80862bdc3af94c1781bf70f86bccac0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/1d8c2a99c80862bdc3af94c1781bf70f86bccac0", - "reference": "1d8c2a99c80862bdc3af94c1781bf70f86bccac0", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "require-dev": { - "symfony/console": "~2.8|~3.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.3-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Yaml Component", - "homepage": "https://symfony.com", - "time": "2017-07-29T21:54:42+00:00" + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "time": "2017-04-07T12:08:54+00:00" }, { "name": "webmozart/assert", diff --git a/config/app.php b/config/app.php index 56b26276bb..171dc72edb 100644 --- a/config/app.php +++ b/config/app.php @@ -1,18 +1,9 @@ 'Firefly III', + 'name' => env('APP_NAME', 'Firefly III'), 'env' => env('APP_ENV', 'production'), 'debug' => env('APP_DEBUG', false), 'url' => env('APP_URL', 'http://localhost'), @@ -26,8 +17,8 @@ return [ 'providers' => [ /* - * Laravel Framework Service Providers... - */ + * Laravel Framework Service Providers... + */ Illuminate\Auth\AuthServiceProvider::class, Illuminate\Broadcasting\BroadcastServiceProvider::class, Illuminate\Bus\BusServiceProvider::class, @@ -46,24 +37,23 @@ return [ Illuminate\Queue\QueueServiceProvider::class, Illuminate\Redis\RedisServiceProvider::class, Illuminate\Auth\Passwords\PasswordResetServiceProvider::class, - FireflyIII\Providers\FireflySessionProvider::class, + Illuminate\Session\SessionServiceProvider::class, Illuminate\Translation\TranslationServiceProvider::class, Illuminate\Validation\ValidationServiceProvider::class, Illuminate\View\ViewServiceProvider::class, - Collective\Html\HtmlServiceProvider::class, + /* + * Package Service Providers... + */ /* * Application Service Providers... */ - FireflyIII\Providers\LogServiceProvider::class, FireflyIII\Providers\AppServiceProvider::class, FireflyIII\Providers\AuthServiceProvider::class, // FireflyIII\Providers\BroadcastServiceProvider::class, FireflyIII\Providers\EventServiceProvider::class, FireflyIII\Providers\RouteServiceProvider::class, - FireflyIII\Providers\FireflyServiceProvider::class, - // own stuff: //Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class, @@ -82,6 +72,7 @@ return [ FireflyIII\Providers\CategoryServiceProvider::class, FireflyIII\Providers\CurrencyServiceProvider::class, FireflyIII\Providers\ExportJobServiceProvider::class, + FireflyIII\Providers\FireflyServiceProvider::class, FireflyIII\Providers\JournalServiceProvider::class, FireflyIII\Providers\PiggyBankServiceProvider::class, FireflyIII\Providers\RuleServiceProvider::class, @@ -93,6 +84,7 @@ return [ ], 'aliases' => [ + 'App' => Illuminate\Support\Facades\App::class, 'Artisan' => Illuminate\Support\Facades\Artisan::class, 'Auth' => Illuminate\Support\Facades\Auth::class, @@ -129,15 +121,13 @@ return [ 'Twig' => TwigBridge\Facade\Twig::class, 'Form' => Collective\Html\FormFacade::class, 'Html' => Collective\Html\HtmlFacade::class, - 'Breadcrumbs' => 'DaveJamesMiller\Breadcrumbs\Facade', - 'Preferences' => 'FireflyIII\Support\Facades\Preferences', - 'FireflyConfig' => 'FireflyIII\Support\Facades\FireflyConfig', - 'Navigation' => 'FireflyIII\Support\Facades\Navigation', - 'Amount' => 'FireflyIII\Support\Facades\Amount', - 'Steam' => 'FireflyIII\Support\Facades\Steam', - 'ExpandedForm' => 'FireflyIII\Support\Facades\ExpandedForm', - 'Entrust' => 'Zizaco\Entrust\EntrustFacade', - 'Input' => 'Illuminate\Support\Facades\Input', + 'Breadcrumbs' => DaveJamesMiller\Breadcrumbs\Facade::class, + 'Preferences' => \FireflyIII\Support\Facades\Preferences::class, + 'FireflyConfig' => \FireflyIII\Support\Facades\FireflyConfig::class, + 'Navigation' => \FireflyIII\Support\Facades\Navigation::class, + 'Amount' => \FireflyIII\Support\Facades\Amount::class, + 'Steam' => \FireflyIII\Support\Facades\Steam::class, + 'ExpandedForm' => \FireflyIII\Support\Facades\ExpandedForm::class, 'Google2FA' => PragmaRX\Google2FA\Vendor\Laravel\Facade::class, ], diff --git a/config/auth.php b/config/auth.php index 52d3280350..61d879cfc1 100644 --- a/config/auth.php +++ b/config/auth.php @@ -1,43 +1,103 @@ [ - 'guard' => 'web', + + /* + |-------------------------------------------------------------------------- + | Authentication Defaults + |-------------------------------------------------------------------------- + | + | This option controls the default authentication "guard" and password + | reset options for your application. You may change these defaults + | as required, but they're a perfect start for most applications. + | + */ + + 'defaults' => [ + 'guard' => 'web', 'passwords' => 'users', ], - 'guards' => [ + + /* + |-------------------------------------------------------------------------- + | Authentication Guards + |-------------------------------------------------------------------------- + | + | Next, you may define every authentication guard for your application. + | Of course, a great default configuration has been defined for you + | here which uses session storage and the Eloquent user provider. + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | Supported: "session", "token" + | + */ + + 'guards' => [ 'web' => [ - 'driver' => 'session', + 'driver' => 'session', 'provider' => 'users', ], 'api' => [ - 'driver' => 'token', + 'driver' => 'token', 'provider' => 'users', ], ], + + /* + |-------------------------------------------------------------------------- + | User Providers + |-------------------------------------------------------------------------- + | + | All authentication drivers have a user provider. This defines how the + | users are actually retrieved out of your database or other storage + | mechanisms used by this application to persist your user's data. + | + | If you have multiple user tables or models you may configure multiple + | sources which represent each model / table. These sources may then + | be assigned to any extra authentication guards you have defined. + | + | Supported: "database", "eloquent" + | + */ + 'providers' => [ 'users' => [ 'driver' => 'eloquent', - 'model' => FireflyIII\User::class, + 'model' => FireflyIII\User::class, ], + + // 'users' => [ + // 'driver' => 'database', + // 'table' => 'users', + // ], ], + + /* + |-------------------------------------------------------------------------- + | Resetting Passwords + |-------------------------------------------------------------------------- + | + | You may specify multiple password reset configurations if you have more + | than one user table or model in the application and you want to have + | separate password reset settings based on the specific user types. + | + | The expire time is the number of minutes that the reset token should be + | considered valid. This security feature keeps tokens short-lived so + | they have less time to be guessed. You may change this as needed. + | + */ + 'passwords' => [ 'users' => [ 'provider' => 'users', - 'table' => 'password_resets', - 'expire' => 120, + 'table' => 'password_resets', + 'expire' => 60, ], ], diff --git a/config/broadcasting.php b/config/broadcasting.php index 3257e542d3..348ecba3ca 100644 --- a/config/broadcasting.php +++ b/config/broadcasting.php @@ -1,14 +1,4 @@ [ 'pusher' => [ - 'driver' => 'pusher', - 'key' => env('PUSHER_KEY'), - 'secret' => env('PUSHER_SECRET'), - 'app_id' => env('PUSHER_APP_ID'), + 'driver' => 'pusher', + 'key' => env('PUSHER_APP_KEY'), + 'secret' => env('PUSHER_APP_SECRET'), + 'app_id' => env('PUSHER_APP_ID'), 'options' => [ // ], ], 'redis' => [ - 'driver' => 'redis', + 'driver' => 'redis', 'connection' => 'default', ], diff --git a/config/cache.php b/config/cache.php index dd2dbe7a70..8257d89e0c 100644 --- a/config/cache.php +++ b/config/cache.php @@ -1,18 +1,7 @@ [ - 'driver' => 'database', - 'table' => 'cache', + 'driver' => 'database', + 'table' => 'cache', 'connection' => null, ], 'file' => [ 'driver' => 'file', - 'path' => storage_path('framework/cache'), + 'path' => storage_path('framework/cache/data'), ], 'memcached' => [ - 'driver' => 'memcached', + 'driver' => 'memcached', 'persistent_id' => env('MEMCACHED_PERSISTENT_ID'), - 'sasl' => [ + 'sasl' => [ env('MEMCACHED_USERNAME'), env('MEMCACHED_PASSWORD'), ], - 'options' => [ + 'options' => [ + // Memcached::OPT_CONNECT_TIMEOUT => 2000, ], - 'servers' => [ + 'servers' => [ [ - 'host' => env('MEMCACHED_HOST', '127.0.0.1'), - 'port' => env('MEMCACHED_PORT', 11211), + 'host' => env('MEMCACHED_HOST', '127.0.0.1'), + 'port' => env('MEMCACHED_PORT', 11211), 'weight' => 100, ], ], ], 'redis' => [ - 'driver' => 'redis', + 'driver' => 'redis', 'connection' => 'default', ], diff --git a/config/compile.php b/config/compile.php deleted file mode 100644 index f627a86b7a..0000000000 --- a/config/compile.php +++ /dev/null @@ -1,46 +0,0 @@ - [ - // - ], - - /* - |-------------------------------------------------------------------------- - | Compiled File Providers - |-------------------------------------------------------------------------- - | - | Here you may list service providers which define a "compiles" function - | that returns additional files that should be compiled, providing an - | easy way to get common files from any packages you are utilizing. - | - */ - - 'providers' => [ - // - ], - -]; diff --git a/config/database.php b/config/database.php index 272de2acdc..5693e57241 100644 --- a/config/database.php +++ b/config/database.php @@ -1,79 +1,64 @@ PDO::FETCH_OBJ, - 'default' => env('DB_CONNECTION', 'pgsql'), + 'default' => env('DB_CONNECTION', 'mysql'), 'connections' => [ 'sqlite' => [ 'driver' => 'sqlite', 'database' => env('DB_DATABASE', storage_path('database/database.sqlite')), 'prefix' => '', ], - - 'mysql' => [ - 'driver' => 'mysql', - 'host' => env('DB_HOST', 'localhost'), - 'port' => env('DB_PORT', '3306'), - 'database' => env('DB_DATABASE', 'forge'), - 'username' => env('DB_USERNAME', 'forge'), - 'password' => env('DB_PASSWORD', ''), - 'charset' => 'utf8', - 'collation' => 'utf8_unicode_ci', - 'prefix' => '', - 'strict' => true, - 'engine' => null, + 'mysql' => [ + 'driver' => 'mysql', + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET', ''), + 'charset' => 'utf8mb4', + 'collation' => 'utf8mb4_unicode_ci', + 'prefix' => '', + 'strict' => true, + 'engine' => null, ], - - 'pgsql' => [ + 'pgsql' => [ 'driver' => 'pgsql', - 'host' => env('DB_HOST', $host), + 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '5432'), - 'database' => env('DB_DATABASE', $database), - 'username' => env('DB_USERNAME', $username), - 'password' => env('DB_PASSWORD', $password), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'prefix' => '', 'schema' => 'public', 'sslmode' => 'prefer', ], + 'sqlsrv' => [ + 'driver' => 'sqlsrv', + 'host' => env('DB_HOST', 'localhost'), + 'port' => env('DB_PORT', '1433'), + 'database' => env('DB_DATABASE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'charset' => 'utf8', + 'prefix' => '', + ], ], 'migrations' => 'migrations', 'redis' => [ - 'cluster' => false, + 'client' => 'predis', 'default' => [ - 'host' => env('REDIS_HOST', 'localhost'), + 'host' => env('REDIS_HOST', '127.0.0.1'), 'password' => env('REDIS_PASSWORD', null), 'port' => env('REDIS_PORT', 6379), 'database' => 0, ], + ], + ]; diff --git a/config/filesystems.php b/config/filesystems.php index 0a64af6c68..f5ef5a67f6 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -1,14 +1,4 @@ 'local', + 'default' => env('FILESYSTEM_DRIVER', 'local'), /* |-------------------------------------------------------------------------- @@ -40,7 +28,7 @@ return [ | */ - 'cloud' => 's3', + 'cloud' => env('FILESYSTEM_CLOUD', 's3'), /* |-------------------------------------------------------------------------- @@ -51,6 +39,8 @@ return [ | may even configure multiple disks of the same driver. Defaults have | been setup for each driver as an example of the required options. | + | Supported Drivers: "local", "ftp", "s3", "rackspace" + | */ 'disks' => [ @@ -84,15 +74,16 @@ return [ 'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), + 'url' => env('APP_URL') . '/storage', 'visibility' => 'public', ], 's3' => [ 'driver' => 's3', - 'key' => 'your-key', - 'secret' => 'your-secret', - 'region' => 'your-region', - 'bucket' => 'your-bucket', + 'key' => env('AWS_KEY'), + 'secret' => env('AWS_SECRET'), + 'region' => env('AWS_REGION'), + 'bucket' => env('AWS_BUCKET'), ], ], diff --git a/config/firefly.php b/config/firefly.php index 308ecb3a19..a767443787 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -23,7 +23,7 @@ return [ 'is_demo_site' => false, ], 'encryption' => (is_null(env('USE_ENCRYPTION')) || env('USE_ENCRYPTION') === true), - 'version' => '4.6.5', + 'version' => '4.6.6', 'maxUploadSize' => 15242880, 'allowedMimes' => ['image/png', 'image/jpeg', 'application/pdf'], 'list_length' => 10, @@ -173,48 +173,48 @@ return [ 'date' => 'FireflyIII\Support\Binder\Date', ], 'rule-triggers' => [ - 'user_action' => 'FireflyIII\Rules\Triggers\UserAction', - 'from_account_starts' => 'FireflyIII\Rules\Triggers\FromAccountStarts', - 'from_account_ends' => 'FireflyIII\Rules\Triggers\FromAccountEnds', - 'from_account_is' => 'FireflyIII\Rules\Triggers\FromAccountIs', - 'from_account_contains' => 'FireflyIII\Rules\Triggers\FromAccountContains', - 'to_account_starts' => 'FireflyIII\Rules\Triggers\ToAccountStarts', - 'to_account_ends' => 'FireflyIII\Rules\Triggers\ToAccountEnds', - 'to_account_is' => 'FireflyIII\Rules\Triggers\ToAccountIs', - 'to_account_contains' => 'FireflyIII\Rules\Triggers\ToAccountContains', - 'amount_less' => 'FireflyIII\Rules\Triggers\AmountLess', - 'amount_exactly' => 'FireflyIII\Rules\Triggers\AmountExactly', - 'amount_more' => 'FireflyIII\Rules\Triggers\AmountMore', - 'description_starts' => 'FireflyIII\Rules\Triggers\DescriptionStarts', - 'description_ends' => 'FireflyIII\Rules\Triggers\DescriptionEnds', - 'description_contains' => 'FireflyIII\Rules\Triggers\DescriptionContains', - 'description_is' => 'FireflyIII\Rules\Triggers\DescriptionIs', - 'transaction_type' => 'FireflyIII\Rules\Triggers\TransactionType', - 'category_is' => 'FireflyIII\Rules\Triggers\CategoryIs', - 'budget_is' => 'FireflyIII\Rules\Triggers\BudgetIs', - 'tag_is' => 'FireflyIII\Rules\Triggers\TagIs', - 'has_attachments' => 'FireflyIII\Rules\Triggers\HasAttachment', - 'has_no_category' => 'FireflyIII\Rules\Triggers\HasNoCategory', - 'has_any_category' => 'FireflyIII\Rules\Triggers\HasAnyCategory', - 'has_no_budget' => 'FireflyIII\Rules\Triggers\HasNoBudget', - 'has_any_budget' => 'FireflyIII\Rules\Triggers\HasAnyBudget', - 'has_no_tag' => 'FireflyIII\Rules\Triggers\HasNoTag', - 'has_any_tag' => 'FireflyIII\Rules\Triggers\HasAnyTag', + 'user_action' => 'FireflyIII\TransactionRules\Triggers\UserAction', + 'from_account_starts' => 'FireflyIII\TransactionRules\Triggers\FromAccountStarts', + 'from_account_ends' => 'FireflyIII\TransactionRules\Triggers\FromAccountEnds', + 'from_account_is' => 'FireflyIII\TransactionRules\Triggers\FromAccountIs', + 'from_account_contains' => 'FireflyIII\TransactionRules\Triggers\FromAccountContains', + 'to_account_starts' => 'FireflyIII\TransactionRules\Triggers\ToAccountStarts', + 'to_account_ends' => 'FireflyIII\TransactionRules\Triggers\ToAccountEnds', + 'to_account_is' => 'FireflyIII\TransactionRules\Triggers\ToAccountIs', + 'to_account_contains' => 'FireflyIII\TransactionRules\Triggers\ToAccountContains', + 'amount_less' => 'FireflyIII\TransactionRules\Triggers\AmountLess', + 'amount_exactly' => 'FireflyIII\TransactionRules\Triggers\AmountExactly', + 'amount_more' => 'FireflyIII\TransactionRules\Triggers\AmountMore', + 'description_starts' => 'FireflyIII\TransactionRules\Triggers\DescriptionStarts', + 'description_ends' => 'FireflyIII\TransactionRules\Triggers\DescriptionEnds', + 'description_contains' => 'FireflyIII\TransactionRules\Triggers\DescriptionContains', + 'description_is' => 'FireflyIII\TransactionRules\Triggers\DescriptionIs', + 'transaction_type' => 'FireflyIII\TransactionRules\Triggers\TransactionType', + 'category_is' => 'FireflyIII\TransactionRules\Triggers\CategoryIs', + 'budget_is' => 'FireflyIII\TransactionRules\Triggers\BudgetIs', + 'tag_is' => 'FireflyIII\TransactionRules\Triggers\TagIs', + 'has_attachments' => 'FireflyIII\TransactionRules\Triggers\HasAttachment', + 'has_no_category' => 'FireflyIII\TransactionRules\Triggers\HasNoCategory', + 'has_any_category' => 'FireflyIII\TransactionRules\Triggers\HasAnyCategory', + 'has_no_budget' => 'FireflyIII\TransactionRules\Triggers\HasNoBudget', + 'has_any_budget' => 'FireflyIII\TransactionRules\Triggers\HasAnyBudget', + 'has_no_tag' => 'FireflyIII\TransactionRules\Triggers\HasNoTag', + 'has_any_tag' => 'FireflyIII\TransactionRules\Triggers\HasAnyTag', ], 'rule-actions' => [ - 'set_category' => 'FireflyIII\Rules\Actions\SetCategory', - 'clear_category' => 'FireflyIII\Rules\Actions\ClearCategory', - 'set_budget' => 'FireflyIII\Rules\Actions\SetBudget', - 'clear_budget' => 'FireflyIII\Rules\Actions\ClearBudget', - 'add_tag' => 'FireflyIII\Rules\Actions\AddTag', - 'remove_tag' => 'FireflyIII\Rules\Actions\RemoveTag', - 'remove_all_tags' => 'FireflyIII\Rules\Actions\RemoveAllTags', - 'set_description' => 'FireflyIII\Rules\Actions\SetDescription', - 'append_description' => 'FireflyIII\Rules\Actions\AppendDescription', - 'prepend_description' => 'FireflyIII\Rules\Actions\PrependDescription', + 'set_category' => 'FireflyIII\TransactionRules\Actions\SetCategory', + 'clear_category' => 'FireflyIII\TransactionRules\Actions\ClearCategory', + 'set_budget' => 'FireflyIII\TransactionRules\Actions\SetBudget', + 'clear_budget' => 'FireflyIII\TransactionRules\Actions\ClearBudget', + 'add_tag' => 'FireflyIII\TransactionRules\Actions\AddTag', + 'remove_tag' => 'FireflyIII\TransactionRules\Actions\RemoveTag', + 'remove_all_tags' => 'FireflyIII\TransactionRules\Actions\RemoveAllTags', + 'set_description' => 'FireflyIII\TransactionRules\Actions\SetDescription', + 'append_description' => 'FireflyIII\TransactionRules\Actions\AppendDescription', + 'prepend_description' => 'FireflyIII\TransactionRules\Actions\PrependDescription', - 'set_source_account' => 'FireflyIII\Rules\Actions\SetSourceAccount', - 'set_destination_account' => 'FireflyIII\Rules\Actions\SetDestinationAccount', + 'set_source_account' => 'FireflyIII\TransactionRules\Actions\SetSourceAccount', + 'set_destination_account' => 'FireflyIII\TransactionRules\Actions\SetDestinationAccount', ], 'rule-actions-text' => [ 'set_category', diff --git a/config/intro.php b/config/intro.php index 05c861e4d6..99205178b2 100644 --- a/config/intro.php +++ b/config/intro.php @@ -42,6 +42,7 @@ return [ 'navigate_periods' => ['element' => '#periodNavigator'], 'new_budget' => ['element' => '#createBudgetBox'], 'list_of_budgets' => ['element' => '#budgetList'], + 'outro' => [], ], // reports: index, default report, audit, budget, cat, tag diff --git a/config/mail.php b/config/mail.php index f5d33fd68e..ffd277fed7 100644 --- a/config/mail.php +++ b/config/mail.php @@ -1,14 +1,4 @@ ['address' => env('MAIL_FROM', 'noreply@example.com'), 'name' => 'Firefly III Mailer'], @@ -96,17 +85,6 @@ return [ 'username' => env('MAIL_USERNAME'), - /* - |-------------------------------------------------------------------------- - | SMTP Server Password - |-------------------------------------------------------------------------- - | - | Here you may set the password required by your SMTP server to send out - | messages from your application. This will be given to the server on - | connection so that the application will be able to send messages. - | - */ - 'password' => env('MAIL_PASSWORD'), /* @@ -122,4 +100,23 @@ return [ 'sendmail' => '/usr/sbin/sendmail -bs', + /* + |-------------------------------------------------------------------------- + | Markdown Mail Settings + |-------------------------------------------------------------------------- + | + | If you are using Markdown based email rendering, you may configure your + | theme and component paths here, allowing you to customize the design + | of the emails. Or, you may simply stick with the Laravel defaults! + | + */ + + 'markdown' => [ + 'theme' => 'default', + + 'paths' => [ + resource_path('views/vendor/mail'), + ], + ], + ]; diff --git a/config/queue.php b/config/queue.php index 592710d91d..ffcade798e 100644 --- a/config/queue.php +++ b/config/queue.php @@ -1,14 +1,4 @@ [ - 'driver' => 'database', - 'table' => 'jobs', - 'queue' => 'default', + 'driver' => 'database', + 'table' => 'jobs', + 'queue' => 'default', 'retry_after' => 90, ], 'beanstalkd' => [ - 'driver' => 'beanstalkd', - 'host' => 'localhost', - 'queue' => 'default', + 'driver' => 'beanstalkd', + 'host' => 'localhost', + 'queue' => 'default', 'retry_after' => 90, ], 'sqs' => [ 'driver' => 'sqs', - 'key' => 'your-public-key', + 'key' => 'your-public-key', 'secret' => 'your-secret-key', 'prefix' => 'https://sqs.us-east-1.amazonaws.com/your-account-id', - 'queue' => 'your-queue-name', + 'queue' => 'your-queue-name', 'region' => 'us-east-1', ], 'redis' => [ - 'driver' => 'redis', - 'connection' => 'default', - 'queue' => 'default', + 'driver' => 'redis', + 'connection' => 'default', + 'queue' => 'default', 'retry_after' => 90, ], @@ -91,7 +81,7 @@ return [ 'failed' => [ 'database' => env('DB_CONNECTION', 'mysql'), - 'table' => 'failed_jobs', + 'table' => 'failed_jobs', ], ]; diff --git a/config/services.php b/config/services.php index bad5a03d81..d42645ee8c 100644 --- a/config/services.php +++ b/config/services.php @@ -1,14 +1,4 @@ [ - 'key' => env('SES_KEY'), + 'key' => env('SES_KEY'), 'secret' => env('SES_SECRET'), 'region' => 'us-east-1', ], @@ -42,8 +32,8 @@ return [ ], 'stripe' => [ - 'model' => FireflyIII\User::class, - 'key' => env('STRIPE_KEY'), + 'model' => FireflyIII\User::class, + 'key' => env('STRIPE_KEY'), 'secret' => env('STRIPE_SECRET'), ], diff --git a/config/session.php b/config/session.php index 4a635d2321..5c91d7a687 100644 --- a/config/session.php +++ b/config/session.php @@ -1,14 +1,4 @@ env('COOKIE_DOMAIN', null), 'secure' => env('COOKIE_SECURE', false), 'http_only' => true, + 'same_site' => null, ]; diff --git a/gulpfile.js b/gulpfile.js deleted file mode 100755 index 5f7804554a..0000000000 --- a/gulpfile.js +++ /dev/null @@ -1,28 +0,0 @@ -/* - * gulpfile.js - * Copyright (c) 2017 thegrumpydictator@gmail.com - * This software may be modified and distributed under the terms of the - * Creative Commons Attribution-ShareAlike 4.0 International License. - * - * See the LICENSE file for details. - */ - -const elixir = require('laravel-elixir'); - -require('laravel-elixir-vue'); - -/* - |-------------------------------------------------------------------------- - | Elixir Asset Management - |-------------------------------------------------------------------------- - | - | Elixir provides a clean, fluent API for defining some basic Gulp tasks - | for your Laravel application. By default, we are compiling the Sass - | file for our application, as well as publishing vendor resources. - | - */ - -elixir(mix => { - mix.sass('app.scss') - .webpack('app.js'); -}); diff --git a/package.json b/package.json old mode 100755 new mode 100644 index d490671cdc..dedcbef712 --- a/package.json +++ b/package.json @@ -1,18 +1,21 @@ { - "private": true, - "scripts": { - "prod": "gulp --production", - "dev": "gulp watch" - }, - "devDependencies": { - "bootstrap-sass": "^3.3.7", - "gulp": "^3.9.1", - "jquery": "^3.1.0", - "laravel-elixir": "^6.0.0-9", - "laravel-elixir-vue": "^0.1.4", - "laravel-elixir-webpack-official": "^1.0.2", - "lodash": "^4.14.0", - "vue": "^1.0.26", - "vue-resource": "^0.9.3" - } + "private": true, + "scripts": { + "dev": "npm run development", + "development": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", + "watch": "cross-env NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js", + "watch-poll": "npm run watch -- --watch-poll", + "hot": "cross-env NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js", + "prod": "npm run production", + "production": "cross-env NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js" + }, + "devDependencies": { + "axios": "^0.16.2", + "bootstrap-sass": "^3.3.7", + "cross-env": "^5.0.1", + "jquery": "^3.1.1", + "laravel-mix": "^1.0", + "lodash": "^4.17.4", + "vue": "^2.1.10" + } } diff --git a/phpunit.coverage.specific.xml b/phpunit.coverage.specific.xml deleted file mode 100755 index 0a42b9d726..0000000000 --- a/phpunit.coverage.specific.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - ./tests/Feature - - - - ./tests/Unit - - - - - - - - - - ./app - - - vendor/ - - - - - - - - - - - - diff --git a/phpunit.coverage.xml b/phpunit.coverage.xml deleted file mode 100755 index b0b352d90a..0000000000 --- a/phpunit.coverage.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - ./tests/Feature - - - - ./tests/Unit - - - - - - - - - - ./app - - - vendor/ - - - - - - - - - - - - diff --git a/phpunit.xml b/phpunit.xml old mode 100755 new mode 100644 index 73d2797478..8ce1608fc8 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,39 +1,26 @@ - - - + ./tests/Feature - + ./tests/Unit - + ./app - - vendor/ - diff --git a/public/.htaccess b/public/.htaccess old mode 100755 new mode 100644 index 903f6392ca..09683488bd --- a/public/.htaccess +++ b/public/.htaccess @@ -7,7 +7,8 @@ # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d - RewriteRule ^(.*)/$ /$1 [L,R=301] + RewriteCond %{REQUEST_URI} (.+)/$ + RewriteRule ^ %1 [L,R=301] # Handle Front Controller... RewriteCond %{REQUEST_FILENAME} !-d diff --git a/public/index.php b/public/index.php index dbab349937..4584cbcd6a 100644 --- a/public/index.php +++ b/public/index.php @@ -1,15 +1,13 @@ */ -declare(strict_types=1); +define('LARAVEL_START', microtime(true)); /* |-------------------------------------------------------------------------- @@ -19,11 +17,11 @@ declare(strict_types=1); | Composer provides a convenient, automatically generated class loader for | our application. We just need to utilize it! We'll simply require it | into the script here so that we don't have to worry about manual -| loading any of our classes later on. It feels nice to relax. +| loading any of our classes later on. It feels great to relax. | */ -require __DIR__ . '/../bootstrap/autoload.php'; +require __DIR__.'/../vendor/autoload.php'; /* |-------------------------------------------------------------------------- @@ -37,7 +35,7 @@ require __DIR__ . '/../bootstrap/autoload.php'; | */ -$app = require_once __DIR__ . '/../bootstrap/app.php'; +$app = require_once __DIR__.'/../bootstrap/app.php'; /* |-------------------------------------------------------------------------- diff --git a/public/js/ff/budgets/index.js b/public/js/ff/budgets/index.js index df5c8f55e1..79cfd64722 100644 --- a/public/js/ff/budgets/index.js +++ b/public/js/ff/budgets/index.js @@ -8,7 +8,38 @@ * See the LICENSE file for details. */ -/** global: spent, budgeted, available, currencySymbol, budgetIndexURI, accounting */ +/** global: spent, budgeted, available, currencySymbol, budgetIndexUri, updateIncomeUri, periodStart, periodEnd, budgetAmountUri, accounting */ + +/** + * + */ +$(function () { + "use strict"; + + $('.updateIncome').on('click', updateIncome); + $('.infoIncome').on('click', infoIncome); + + /* + On start, fill the "spent"-bar using the content from the page. + */ + drawSpentBar(); + drawBudgetedBar(); + + /* + When the input changes, update the percentages for the budgeted bar: + */ + $('input[type="number"]').on('input', updateBudgetedAmounts); + + // + $('.selectPeriod').change(function (e) { + var sel = $(e.target).val(); + if (sel !== "x") { + var newUri = budgetIndexUri.replace("REPLACE", sel); + window.location.assign(newUri); + } + }); + +}); function drawSpentBar() { "use strict"; @@ -55,6 +86,10 @@ function drawBudgetedBar() { } } +/** + * + * @param e + */ function updateBudgetedAmounts(e) { "use strict"; var target = $(e.target); @@ -90,7 +125,7 @@ function updateBudgetedAmounts(e) { // send a post to Firefly to update the amount: var newUri = budgetAmountUri.replace("REPLACE", id); - $.post(newUri, {amount: value,start: periodStart, end: periodEnd}).done(function (data) { + $.post(newUri, {amount: value, start: periodStart, end: periodEnd}).done(function (data) { // update the link if relevant: if (data.repetition > 0) { $('.budget-link[data-id="' + id + '"]').attr('href', 'budgets/show/' + id + '/' + data.repetition); @@ -101,33 +136,10 @@ function updateBudgetedAmounts(e) { } } -$(function () { - "use strict"; - - $('.updateIncome').on('click', updateIncome); - - /* - On start, fill the "spent"-bar using the content from the page. - */ - drawSpentBar(); - drawBudgetedBar(); - - /* - When the input changes, update the percentages for the budgeted bar: - */ - $('input[type="number"]').on('input', updateBudgetedAmounts); - - // - $('.selectPeriod').change(function (e) { - var sel = $(e.target).val(); - if (sel !== "x") { - var newUri = budgetIndexUri.replace("REPLACE", sel); - window.location.assign(newUri); - } - }); - -}); - +/** + * + * @returns {boolean} + */ function updateIncome() { "use strict"; $('#defaultModal').empty().load(updateIncomeUri, function () { @@ -136,3 +148,11 @@ function updateIncome() { return false; } + +function infoIncome() { + $('#defaultModal').empty().load(infoIncomeUri, function () { + $('#defaultModal').modal('show'); + }); + + return false; +} diff --git a/public/js/ff/export/index.js b/public/js/ff/export/index.js index 4dd745a078..c44ad0c81e 100644 --- a/public/js/ff/export/index.js +++ b/public/js/ff/export/index.js @@ -58,7 +58,8 @@ function hideForm() { function showForm() { "use strict"; $('#form-body').show(); - $('#do-export-button').show(); + $('#do-export-button').show().prop('disabled', false); + // enable button again: } function showLoading() { @@ -88,7 +89,7 @@ function callExport() { // call status, keep calling it until response is "finished"? intervalId = window.setInterval(checkStatus, 500); - $.post('export/submit', data).done(function () { + $.post('export/submit', data, null, 'json').done(function () { // stop polling: window.clearTimeout(intervalId); @@ -103,18 +104,13 @@ function callExport() { // show download showDownload(); - }).fail(function (data) { + }).fail(function (jqXHR) { // show error. // show form again. - + var response = jqXHR.responseJSON; var errorText = 'The export failed. Please check the log files to find out why.'; - if (typeof data.responseJSON === 'object') { - errorText = ''; - for (var propt in data.responseJSON) { - if (data.responseJSON.hasOwnProperty(propt)) { - errorText += propt + ': ' + data.responseJSON[propt][0]; - } - } + if (typeof response === 'object') { + errorText =response.message; } showError(errorText); diff --git a/public/js/ff/index.js b/public/js/ff/index.js index 58005bac67..97ea192975 100644 --- a/public/js/ff/index.js +++ b/public/js/ff/index.js @@ -28,10 +28,62 @@ function drawChart() { columnChart(accountExpenseUri, 'expense-accounts-chart'); columnChart(accountRevenueUri, 'revenue-accounts-chart'); + // get balance box: + getBalanceBox(); + getBillsBox(); + getAvailableBox(); + getNetWorthBox(); - getBoxAmounts(); + //getBoxAmounts(); } +function getNetWorthBox() { + // box-net-worth + $.getJSON('json/box/net-worth').done(function(data) { + $('#box-net-worth').html(data.net_worth); + }); +} + +/** + * + */ +function getAvailableBox() { + // box-left-to-spend + // box-left-per-day + $.getJSON('json/box/available').done(function(data) { + $('#box-left-to-spend').html(data.left); + $('#box-left-per-day').html(data.perDay); + }); +} + +/** + * + */ +function getBillsBox() { + // box-bills-unpaid + // box-bills-paid + $.getJSON('json/box/bills').done(function(data) { + $('#box-bills-paid').html(data.paid); + $('#box-bills-unpaid').html(data.unpaid); + }); +} + +/** + * + */ +function getBalanceBox() { + // box-balance-total + // box-balance-out + // box-balance-in + $.getJSON('json/box/balance').done(function(data) { + $('#box-balance-total').html(data.combined); + $('#box-balance-in').html(data.income); + $('#box-balance-out').html(data.expense); + }); +} + + + function getBoxAmounts() { "use strict"; var boxes = ['in', 'out', 'bills-unpaid', 'bills-paid']; diff --git a/public/js/ff/rules/index.js b/public/js/ff/rules/index.js index e7cfeae014..df057ce7a7 100644 --- a/public/js/ff/rules/index.js +++ b/public/js/ff/rules/index.js @@ -44,12 +44,25 @@ $(function () { ); function testRuleTriggers(e) { + var obj = $(e.target); var ruleId = parseInt(obj.data('id')); + var icon = obj; + if(obj.prop("tagName") === 'A') { + icon = $('i', obj); + } + // change icon: + icon.addClass('fa-spinner fa-spin').removeClass('fa-flask'); + + var modal = $("#testTriggerModal"); + // respond to modal: + modal.on('hide.bs.modal', function (e) { + disableRuleSpinners(); + }); // Find a list of existing transactions that match these triggers $.get('rules/test-rule/' + ruleId).done(function (data) { - var modal = $("#testTriggerModal"); + // Set title and body modal.find(".transactions-list").html(data.html); @@ -66,11 +79,16 @@ function testRuleTriggers(e) { modal.modal(); }).fail(function () { alert('Cannot get transactions for given triggers.'); + disableRuleSpinners(); }); return false; } +function disableRuleSpinners() { + $('i.test_rule_triggers').removeClass('fa-spin fa-spinner').addClass('fa-flask'); +} + function sortStop(event, ui) { "use strict"; diff --git a/public/js/ff/rules/select-transactions.js b/public/js/ff/rules/select-transactions.js index 675a5fe730..32e5176bbf 100644 --- a/public/js/ff/rules/select-transactions.js +++ b/public/js/ff/rules/select-transactions.js @@ -6,7 +6,7 @@ * See the LICENSE file for details. */ -/** global: Modernizr */ +/** global: Modernizr, askReadWarning */ $(document).ready(function () { "use strict"; @@ -17,4 +17,7 @@ $(document).ready(function () { } ); } + $('form.form-horizontal').on('submit', function () { + return confirm(askReadWarning); + }); }); diff --git a/public/web.config b/public/web.config new file mode 100644 index 0000000000..624c1760fc --- /dev/null +++ b/public/web.config @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/lang/de_DE/bank.php b/resources/lang/de_DE/bank.php new file mode 100644 index 0000000000..11f05b3785 --- /dev/null +++ b/resources/lang/de_DE/bank.php @@ -0,0 +1,6 @@ + '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.', +]; \ No newline at end of file diff --git a/resources/lang/de_DE/firefly.php b/resources/lang/de_DE/firefly.php index 25a9468efb..dc33b9af86 100644 --- a/resources/lang/de_DE/firefly.php +++ b/resources/lang/de_DE/firefly.php @@ -83,11 +83,9 @@ return [ 'cannot_redirect_to_account' => 'Entschuldigung. Firefly III kann Sie nicht zur richtigen Seite weiterleiten.', 'sum_of_expenses' => 'Summe von Ausgaben', 'sum_of_income' => 'Summe von Einnahmen', - 'total_sum' => 'Gesamtsumme', 'spent_in_specific_budget' => 'Ausgegeben in Budget ":budget"', 'sum_of_expenses_in_budget' => 'Vollkommen ausgegeben in Budget ":budget"', 'left_in_budget_limit' => 'Übrig zum ausgeben aufgrund der Budgetierung', - 'cannot_reset_demo_user' => 'Sie können nicht das Kennwort des Demo-Kontos zurücksetzen', 'current_period' => 'Aktuelle Periode', 'show_the_current_period_and_overview' => 'Zeigen Sie die aktuelle Periode und die Übersicht', 'pref_languages_locale' => 'Damit eine andere Sprache als Englisch richtig funktioniert muss Ihr Betriebssystem mit den korrekten Gebietsschema-Informationen ausgestattet werden. Wenn diese nicht vorhanden sind, können die Währungsdaten, Terminen und Mengen falsch formatiert.', @@ -130,6 +128,8 @@ return [ 'exchange_rate_instructions' => 'Das Girokonto "@name" akzeptiert nur Transaktionen in @native_currency. Wenn Sie stattdessen @foreign_currency verwenden wollen, sollten Sie sicherstellen, dass der Betrag auch in @native_currency angegeben ist:', 'transfer_exchange_rate_instructions' => 'Das Quellkonto "@source_name" akzeptiert nur Transaktionen in @source_currency. Das Zielkonto "@dest_name" akzeptiert nur Transaktionen in @dest_currency. Sie müssen den Betrag in beiden Währungen korrekt angeben.', 'transaction_data' => 'Transaktionsdaten', + 'invalid_server_configuration' => 'Invalid server configuration', + 'invalid_locale_settings' => 'Firefly III is unable to format monetary amounts because your server is missing the required packages. There are instructions how to do this.', // search 'search' => 'Suche', @@ -139,6 +139,7 @@ return [ 'search_box_intro' => 'Willkommen zur Suchfunktion von Firefly III. Geben Sie Ihre Suchanfrage in das Feld ein. Stellen Sie sicher, dass Sie sich die Hilfedatei ansehen, da die Suche ziemlich fortgeschritten ist.', 'search_error' => 'Fehler beim Suchen', 'search_searching' => 'Suche ...', + 'search_results' => 'Search results', // repeat frequencies: 'repeat_freq_yearly' => 'Jährlich', @@ -151,11 +152,11 @@ return [ // export data: 'import_and_export' => 'Import und Export', 'export_data' => 'Daten exportieren', + 'export_and_backup_data' => 'Export and backup', 'export_data_intro' => 'Zum Backup, zum Migrieren auf ein anderes System oder zum Migrieren in eine andere Firefly III Installation.', 'export_format' => 'Export-Format', 'export_format_csv' => 'Durch Komma getrennte Werte (CSV-Datei)', 'export_format_mt940' => 'MT940 kompatibles Format', - 'export_included_accounts' => 'Exportiere die Überweisungen von diesem Konto', 'include_old_uploads_help' => 'Firefly III löscht nicht die originalen CSV-Dateien, welche zuvor importiert wurden. Sie können dem Export hinzugefügt werden.', 'do_export' => 'Export', 'export_status_never_started' => 'Der Export hat noch nicht begonnen', @@ -170,8 +171,6 @@ return [ 'export_status_collected_attachments' => 'Alle Anhänge gesammelt!', 'export_status_collecting_old_uploads' => 'Sammeln aller bisherigen Uploads...', 'export_status_collected_old_uploads' => 'Alle bisherigen Uploads gesammelt!', - 'export_status_creating_config_file' => 'Erstelle eine Konfigurationsdatei...', - 'export_status_created_config_file' => 'Konfigurationsdatei erstellt!', 'export_status_creating_zip_file' => 'Erstelle eine Zip-Datei...', 'export_status_created_zip_file' => 'Zip-Datei erstellt!', 'export_status_finished' => 'Export erfolgreich beendet! Yay!', @@ -317,6 +316,8 @@ return [ 'rule_action_set_source_account' => 'Lege Quellkonto als :action_value fest', 'rule_action_set_destination_account_choice' => 'Zielkonto festlegen...', 'rule_action_set_destination_account' => 'Lege Zielkonto als :action_value fest', + 'rules_have_read_warning' => 'Have you read the warning?', + 'apply_rule_warning' => 'Warning: running a rule(group) on a large selection of transactions could take ages, and it could time-out. If it does, the rule(group) will only be applied to an unknown subset of your transactions. This might leave your financial administration in tatters. Please be careful.', // tags 'store_new_tag' => 'Neuen Tag speichern', @@ -326,6 +327,7 @@ return [ 'location' => 'Standort', 'without_date' => 'Ohne Datum', 'result' => 'Ergebnis', + 'sums_apply_to_range' => 'All sums apply to the selected range', // preferences 'pref_home_screen_accounts' => 'Konten auf dem Startbildschirm', @@ -415,6 +417,15 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'secure_pw_should' => 'Should I check the box?', 'secure_pw_long_password' => 'Wenn du gerade ein langes, Single-Use-Passwort für Firefly III mit einem Kennwortgenerator generiert hast: Nein.', 'secure_pw_short' => 'Wenn Sie gerade das Passwort eingegeben haben, welches Sie immer verwenden: Bitte ja.', + 'personal_access_token' => 'Personal access token', + 'explain_access_token' => 'You need this token to perform command line options, such as importing or exporting data. Without it, such sensitive commands will not work. Do not share your access token. Nobody will ask you for this token, not even me. If you fear you lost this, or when you\'re paranoid, regenerate this token using the button.', + 'regenerate_access_token' => 'Regenerate access token', + 'token_regenerated' => 'A new token was generated', + 'change_your_email' => 'Change your email address', + 'email_verification' => 'An email message will be sent to your old AND new email address. For security purposes, you will not be able to login until you verify your new email address. If you are unsure if your Firefly III installation is capable of sending email, please do not use this feature. If you are an administrator, you can test this in the Administration.', + 'email_changed_logout' => 'Until you verify your email address, you cannot login.', + 'login_with_new_email' => 'You can now login with your new email address.', + 'login_with_old_email' => 'You can now login with your old email address again.', // attachments @@ -448,7 +459,6 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'convert_options_DepositWithdrawal' => 'Konvertieren Sie eine Einzahlung in eine Ausgabe', 'convert_options_TransferWithdrawal' => 'Konvertieren Sie eine Überweisung in eine Ausgabe', 'convert_options_TransferDeposit' => 'Konvertieren Sie eine Überweisung in eine Einzahlung', - 'transaction_journal_convert_options' => 'Diese Transaktion umwandeln', 'convert_Withdrawal_to_deposit' => 'Konvertieren Sie diese Ausgabe zu einer Einzahlung', 'convert_Withdrawal_to_transfer' => 'Konvertieren Sie diese Ausgabe zu einer Überweisung', 'convert_Deposit_to_withdrawal' => 'Konvertieren Sie diese Einzahlung zu einer Ausgabe', @@ -468,7 +478,7 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'converted_to_Withdrawal' => 'Die Transaktion wurde in eine Ausgabe konvertiert', 'converted_to_Deposit' => 'Die Transaktion wurde in eine Einzahlung konvertiert', 'converted_to_Transfer' => 'Die Transaktion wurde in eine Überweisung konvertiert', - + 'invalid_convert_selection' => 'The account you have selected is already used in this transaction or does not exist.', // create new stuff: 'create_new_withdrawal' => 'Erstelle eine neue Ausgabe', @@ -518,6 +528,11 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'update_budget' => 'Budget aktualisieren', 'update_budget_amount_range' => 'Aktualisiere (erwarteten) verfügbaren Betrag zwischen :start und :end', 'budget_period_navigator' => 'Zeitraum-navigator', + 'info_on_available_amount' => 'What do I have available?', + 'available_amount_indication' => 'Use these amounts to get an indication of what your total budget could be.', + 'suggested' => 'Suggested', + 'average_between' => 'Average between :start and :end', + // bills: 'matching_on' => 'Reagiert auf', @@ -648,10 +663,8 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'newWithdrawal' => 'Neue Ausgabe', 'newDeposit' => 'Neue Einnahme', 'newTransfer' => 'Neue Überweisung', - 'moneyIn' => 'Geldeingang', - 'moneyOut' => 'Geldausgang', - 'billsToPay' => 'Rechnungen zu bezahlen', - 'billsPaid' => 'Rechnungen bezahlt', + 'bills_to_pay' => 'Bills to pay', + 'per_day' => 'Per day', // menu and titles, should be recycled as often as possible: 'currency' => 'Währung', @@ -851,9 +864,6 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'removed_amount_from_piggy' => ':amount von ":name" entfernt', // tags - 'regular_tag' => 'Nur ein normaler Tag.', - 'balancing_act' => 'The tag takes at most two transactions; an expense and a transfer. They\'ll balance each other out.', - 'advance_payment' => 'The tag accepts one expense and any number of deposits aimed to repay the original expense.', 'delete_tag' => 'Tag ":tag" entfernen', 'deleted_tag' => 'Tag ":tag" entfernt', 'new_tag' => 'Neuen Tag erstellen', @@ -892,6 +902,17 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'block_code_bounced' => 'Email message(s) bounced', 'block_code_expired' => 'Demo-Konto abgelaufen', 'no_block_code' => 'Kein Grund für Block oder Benutzer nicht blockiert', + 'block_code_email_changed' => 'User has not yet confirmed new email address', + 'admin_update_email' => 'Contrary to the profile page, the user will NOT be notified their email address has changed!', + 'update_user' => 'Update user', + 'updated_user' => 'User data has been changed.', + 'delete_user' => 'Delete user :email', + 'user_deleted' => 'The user has been deleted', + 'send_test_email' => 'Send test email message', + 'send_test_email_text' => 'To see if your installation is capable of sending email, please press this button. You will not see an error here (if any), the log files will reflect any errors. You can press this button as many times as you like. There is no spam control. The message will be sent to :email and should arrive shortly.', + 'send_message' => 'Send message', + 'send_test_triggered' => 'Test was triggered. Check your inbox and the log files.', + // links 'journal_link_configuration' => 'Transaction links configuration', 'create_new_link_type' => 'Create new link type', @@ -915,7 +936,7 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'transaction' => 'Transaction', 'comments' => 'Comments', 'to_link_not_found' => 'If the transaction you want to link to is not listed, simply enter its ID.', - 'invalid_link_data' => 'Invalid link type selected. Cannot link transaction.', + 'invalid_link_selection' => 'Cannot link these transactions', 'journals_linked' => 'Transactions are linked.', 'journals_error_linked' => 'These transactions are already linked.', 'journal_links' => 'Transaction links', @@ -925,14 +946,16 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'overview_for_link' => 'Overview for link type ":name"', 'delete_journal_link' => 'Delete the link between :source and :destination', 'deleted_link' => 'Deleted link', - '1_outward' => 'relates to', - '2_outward' => '(partially) refunds', - '3_outward' => '(partially) pays for', - '4_outward' => '(partially) reimburses', - '1_inward' => 'relates to', - '2_inward' => 'is (partially) refunded by', - '3_inward' => 'is (partially) paid for by', - '4_inward' => 'is (partially) reimbursed by', + + // link translations: + 'relates to_inward' => 'relates to', + 'is (partially) refunded by_inward' => 'is (partially) refunded by', + 'is (partially) paid for by_inward' => 'is (partially) paid for by', + 'is (partially) reimbursed by_inward' => 'is (partially) reimbursed by', + 'relates to_outward' => 'relates to', + '(partially) refunds_outward' => '(partially) refunds', + '(partially) pays for_outward' => '(partially) pays for', + '(partially) reimburses_outward' => '(partially) reimburses', // split a transaction: @@ -947,6 +970,7 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'cannot_edit_multiple_dest' => 'You cannot edit splitted transaction #:id with description ":description" because it contains multiple destination accounts.', 'cannot_edit_opening_balance' => 'You cannot edit the opening balance of an account.', 'no_edit_multiple_left' => 'You have selected no valid transactions to edit.', + 'cannot_convert_split_journal' => 'Cannot convert a split transaction', // import bread crumbs and titles: 'import' => 'Import', @@ -961,6 +985,7 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'import_index_config' => 'If you have previously imported data into Firefly III, you may have a configuration file, which will pre-set configuration values for you. For some banks, other users have kindly provided their configuration file.', 'import_index_type' => 'Select the type of file you will upload', 'import_index_start' => 'Start importing', + 'import_file' => 'Import a file', // supported file types: 'import_file_type_csv' => 'CSV (Kommagetrennte Werte)', @@ -990,13 +1015,13 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'import_status_finished_title' => 'Import routine finished', 'import_status_finished_text' => 'The import routine has imported your file.', 'import_status_finished_job' => 'The transactions imported can be found in tag :tag.', + 'import_status_job_running' => 'The import is running...', 'import_with_key' => 'Import with key \':key\'', // sandstorm.io errors and messages: 'sandstorm_not_available' => 'This function is not available when you are using Firefly III within a Sandstorm.io environment.', // empty lists? no objects? instructions: - 'no_transactions_in_period' => 'There are no transactions in this period.', 'no_accounts_title_asset' => 'Let\'s create an asset account!', 'no_accounts_intro_asset' => 'You have no asset accounts yet. Asset accounts are your main accounts: your checking account, savings account, shared account or even your credit card.', 'no_accounts_imperative_asset' => 'To start using Firefly III you must create at least one asset account. Let\'s do so now:', diff --git a/resources/lang/de_DE/form.php b/resources/lang/de_DE/form.php index 3683f74ea6..184fadfce0 100644 --- a/resources/lang/de_DE/form.php +++ b/resources/lang/de_DE/form.php @@ -30,13 +30,10 @@ return [ 'currency_id' => 'Währung', 'attachments' => 'Anhänge', 'journal_amount' => 'Betrag', - 'journal_asset_source_account' => 'Girokonto (Quelle)', 'journal_source_account_name' => 'Kreditor (Quelle)', 'journal_source_account_id' => 'Girokonto (Quelle)', 'BIC' => 'BIC', 'verify_password' => 'Überprüfen Sie die Kennwortsicherheit', - 'account_from_id' => 'Vom Konto', - 'account_to_id' => 'Auf Konto', 'source_account' => 'Quellkonto', 'destination_account' => 'Zielkonto', 'journal_destination_account_id' => 'Girokonto (Ziel)', @@ -53,7 +50,6 @@ return [ 'tagMode' => 'Tag-Modus', 'tagPosition' => 'Ort des Tags', 'virtualBalance' => 'Virtueller Kontostand', - 'longitude_latitude' => 'Standort', 'targetamount' => 'Zielbetrag', 'accountRole' => 'Rolle des Kontos', 'openingBalanceDate' => 'Eröffnungsbilanzdatum', @@ -68,12 +64,13 @@ return [ 'revenue_account' => 'Kreditor (Einnahme)', 'decimal_places' => 'Nachkommastellen', 'exchange_rate_instruction' => 'Ausländische Währungen', - 'exchanged_amount' => 'Ausgetauschter Betrag', 'source_amount' => 'Betrag (Quelle)', 'destination_amount' => 'Betrag (Ziel)', 'native_amount' => 'Nativer Betrag', + 'new_email_address' => 'New email address', + 'verification' => 'Verification', + 'api_key' => 'API key', - 'revenue_account_source' => 'Ertragskonto (Quelle)', 'source_account_asset' => 'Quellkonto (Bestandskonto)', 'destination_account_expense' => 'Zielkonto (Unkostenkonto)', 'destination_account_asset' => 'Zielkonto (Bestandskonto)', @@ -111,7 +108,6 @@ return [ 'add_new_withdrawal' => 'Fügen Sie eine neue Ausgabe hinzu', 'add_new_deposit' => 'Fügen Sie eine neue Einnahme hinzu', 'add_new_transfer' => 'Fügen Sie eine neue Überweisung hinzu', - 'noPiggybank' => '(kein Sparschwein)', 'title' => 'Titel', 'notes' => 'Notizen', 'filename' => 'Dateiname', @@ -137,6 +133,8 @@ return [ 'delete_rule' => 'Lösche Regel ":title"', 'delete_rule_group' => 'Lösche Regelgruppe ":title"', 'delete_link_type' => 'Delete link type ":name"', + 'delete_user' => 'Delete user ":email"', + 'user_areYouSure' => 'If you delete user ":email", everything will be gone. There is no undo, undelete or anything. If you delete yourself, you will lose access to this instance of Firefly III.', 'attachment_areYouSure' => 'Sind Sie sicher, dass Sie den Anhang ":name" löschen möchten?', 'account_areYouSure' => 'Sind Sie sicher, dass Sie das Konto ":name" löschen möchten?', 'bill_areYouSure' => 'Sind Sie sicher, dass Sie die Rechnung ":name" löschen möchten?', @@ -174,7 +172,6 @@ return [ // admin 'domain' => 'Domain', 'single_user_mode' => 'Einzelnutzermodus', - 'must_confirm_account' => 'Erstanwender müssen ihr Konto aktivieren', 'is_demo_site' => 'Ist eine Demonstrationsseite', @@ -194,7 +191,7 @@ return [ 'payment_date' => 'Zahlungsdatum', 'invoice_date' => 'Rechnungsdatum', 'internal_reference' => 'Interner Verweis', - - 'inward' => 'Inward description', - 'outward' => 'Outward description', + 'inward' => 'Inward description', + 'outward' => 'Outward description', + 'rule_group_id' => 'Rule group', ]; diff --git a/resources/lang/de_DE/intro.php b/resources/lang/de_DE/intro.php index 02a0eead23..0fe735125b 100644 --- a/resources/lang/de_DE/intro.php +++ b/resources/lang/de_DE/intro.php @@ -31,6 +31,7 @@ return [ 'budgets_index_navigate_periods' => 'Navigate through periods to easily set budgets ahead of time.', 'budgets_index_new_budget' => 'Create new budgets as you see fit.', 'budgets_index_list_of_budgets' => 'Use this table to set the amounts for each budget and see how you are doing.', + 'budgets_index_outro' => 'To learn more about budgeting, checkout the help icon in the top right corner.', // reports (index) 'reports_index_intro' => 'Use these reports to get detailed insights in your finances.', diff --git a/resources/lang/de_DE/list.php b/resources/lang/de_DE/list.php index b3cd46d9b1..cc1862388f 100644 --- a/resources/lang/de_DE/list.php +++ b/resources/lang/de_DE/list.php @@ -12,78 +12,80 @@ declare(strict_types=1); */ return [ - 'buttons' => 'Schaltfläche', - 'icon' => 'Icon', - 'id' => 'Id', - 'create_date' => 'Erstellt am', - 'update_date' => 'Aktualisiert am', - 'balance_before' => 'Bilanz vor', - 'balance_after' => 'Bilanz nach', - 'name' => 'Name', - 'role' => 'Rolle', - 'currentBalance' => 'Aktueller Kontostand', - 'active' => 'Aktiv?', - 'lastActivity' => 'Letzte Aktivität', - 'balanceDiff' => 'Differenz des Kontostandes zwischen :start und :end', - 'matchedOn' => 'Übereinstimmung am', - 'matchesOn' => 'Übereinstimmung am', - 'account_type' => 'Art des Kontos', - 'created_at' => 'Erstellt am', - 'new_balance' => 'Neue Bilanz', - 'account' => 'Konto', - 'matchingAmount' => 'Betrag', - 'lastMatch' => 'Letzte Übereinstimmung', - 'split_number' => 'Geteilt #', - 'destination' => 'Empfänger', - 'source' => 'Quelle', - 'next_expected_match' => 'Nächste erwartete Übereinstimmung', - 'automatch' => 'Automatisch erkennen?', - 'repeat_freq' => 'Wiederholungen', - 'description' => 'Beschreibung', - 'amount' => 'Betrag', - 'internal_reference' => 'Interne Referenz', - 'date' => 'Datum', - 'interest_date' => 'Zinstermin', - 'book_date' => 'Buchungsdatum', - 'process_date' => 'Bearbeitungsdatum', - 'due_date' => 'Fälligkeitstermin', - 'payment_date' => 'Zahlungsdatum', - 'invoice_date' => 'Rechnungsdatum', - 'interal_reference' => 'Interner Verweis', - 'notes' => 'Notizen', - 'from' => 'Von', - 'piggy_bank' => 'Sparschwein', - 'to' => 'An', - 'budget' => 'Budget', - 'category' => 'Kategorie', - 'bill' => 'Rechnung', - 'withdrawal' => 'Ausgabe', - 'deposit' => 'Einlage', - 'transfer' => 'Überweisung', - 'type' => 'Typ', - 'completed' => 'Abgeschlossen', - 'iban' => 'IBAN', - 'paid_current_period' => 'Diese Periode bezahlt', - 'email' => 'E-Mail', - 'registered_at' => 'Registriert am', - 'is_activated' => 'Ist aktiviert', - 'is_blocked' => 'Ist blockiert', - 'is_admin' => 'Ist Admin', - 'has_two_factor' => 'Hat 2FA', - 'blocked_code' => 'Blockcode', - 'source_account' => 'Quellkonto', - 'destination_account' => 'Zielkonto', - 'accounts_count' => 'Anzahl Konten', - 'journals_count' => 'Anzahl der Zahlungsvorgänge', - 'attachments_count' => 'Anzahl Anhänge', - 'bills_count' => 'Anzahl Rechnungen', - 'categories_count' => 'Anzahl Kategorien', - 'export_jobs_count' => 'Anzahl exportierter Jobs', - 'import_jobs_count' => 'Anzahl importierter Jobs', - 'budget_count' => 'Anzahl Budgets', - 'rule_and_groups_count' => 'Anzahl Regeln und Regelgruppen', - 'tags_count' => 'Anzahl Tags', - 'inward' => 'Inward description', - 'outward' => 'Outward description', - 'number_of_transactions' => 'Anzahl der Zahlungsvorgänge', + 'buttons' => 'Schaltfläche', + 'icon' => 'Icon', + 'id' => 'Id', + 'create_date' => 'Erstellt am', + 'update_date' => 'Aktualisiert am', + 'balance_before' => 'Bilanz vor', + 'balance_after' => 'Bilanz nach', + 'name' => 'Name', + 'role' => 'Rolle', + 'currentBalance' => 'Aktueller Kontostand', + 'active' => 'Aktiv?', + 'lastActivity' => 'Letzte Aktivität', + 'balanceDiff' => 'Differenz des Kontostandes zwischen :start und :end', + 'matchesOn' => 'Übereinstimmung am', + 'account_type' => 'Art des Kontos', + 'created_at' => 'Erstellt am', + 'account' => 'Konto', + 'matchingAmount' => 'Betrag', + 'split_number' => 'Geteilt #', + 'destination' => 'Empfänger', + 'source' => 'Quelle', + 'next_expected_match' => 'Nächste erwartete Übereinstimmung', + 'automatch' => 'Automatisch erkennen?', + 'repeat_freq' => 'Wiederholungen', + 'description' => 'Beschreibung', + 'amount' => 'Betrag', + 'internal_reference' => 'Interne Referenz', + 'date' => 'Datum', + 'interest_date' => 'Zinstermin', + 'book_date' => 'Buchungsdatum', + 'process_date' => 'Bearbeitungsdatum', + 'due_date' => 'Fälligkeitstermin', + 'payment_date' => 'Zahlungsdatum', + 'invoice_date' => 'Rechnungsdatum', + 'interal_reference' => 'Interner Verweis', + 'notes' => 'Notizen', + 'from' => 'Von', + 'piggy_bank' => 'Sparschwein', + 'to' => 'An', + 'budget' => 'Budget', + 'category' => 'Kategorie', + 'bill' => 'Rechnung', + 'withdrawal' => 'Ausgabe', + 'deposit' => 'Einlage', + 'transfer' => 'Überweisung', + 'type' => 'Typ', + 'completed' => 'Abgeschlossen', + 'iban' => 'IBAN', + 'paid_current_period' => 'Diese Periode bezahlt', + 'email' => 'E-Mail', + 'registered_at' => 'Registriert am', + 'is_blocked' => 'Ist blockiert', + 'is_admin' => 'Ist Admin', + 'has_two_factor' => 'Hat 2FA', + 'blocked_code' => 'Blockcode', + 'source_account' => 'Quellkonto', + 'destination_account' => 'Zielkonto', + 'accounts_count' => 'Anzahl Konten', + 'journals_count' => 'Anzahl der Zahlungsvorgänge', + 'attachments_count' => 'Anzahl Anhänge', + 'bills_count' => 'Anzahl Rechnungen', + 'categories_count' => 'Anzahl Kategorien', + 'export_jobs_count' => 'Anzahl exportierter Jobs', + 'import_jobs_count' => 'Anzahl importierter Jobs', + 'budget_count' => 'Anzahl Budgets', + 'rule_and_groups_count' => 'Anzahl Regeln und Regelgruppen', + 'tags_count' => 'Anzahl Tags', + 'inward' => 'Inward description', + 'outward' => 'Outward description', + 'number_of_transactions' => 'Anzahl der Zahlungsvorgänge', + 'total_amount' => 'Total amount', + 'sum' => 'Sum', + 'sum_excluding_transfers' => 'Sum (excluding transfers)', + 'sum_withdrawals' => 'Sum of withdrawals', + 'sum_deposits' => 'Sum of deposits', + 'sum_transfers' => 'Sum of transfers', ]; diff --git a/resources/lang/en_US/bank.php b/resources/lang/en_US/bank.php new file mode 100644 index 0000000000..11f05b3785 --- /dev/null +++ b/resources/lang/en_US/bank.php @@ -0,0 +1,6 @@ + '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.', +]; \ No newline at end of file diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index 843d2aef10..6e4761571a 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -83,11 +83,9 @@ return [ 'cannot_redirect_to_account' => 'Firefly III cannot redirect you to the correct page. Apologies.', 'sum_of_expenses' => 'Sum of expenses', 'sum_of_income' => 'Sum of income', - 'total_sum' => 'Total sum', 'spent_in_specific_budget' => 'Spent in budget ":budget"', 'sum_of_expenses_in_budget' => 'Spent total in budget ":budget"', 'left_in_budget_limit' => 'Left to spend according to budgeting', - 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', 'current_period' => 'Current period', 'show_the_current_period_and_overview' => 'Show the current period and overview', 'pref_languages_locale' => 'For a language other than English to work properly, your operating system must be equipped with the correct locale-information. If these are not present, currency data, dates and amounts may be formatted wrong.', @@ -130,6 +128,8 @@ return [ 'exchange_rate_instructions' => 'Asset account "@name" only accepts transactions in @native_currency. If you wish to use @foreign_currency instead, make sure that the amount in @native_currency is known as well:', 'transfer_exchange_rate_instructions' => 'Source asset account "@source_name" only accepts transactions in @source_currency. Destination asset account "@dest_name" only accepts transactions in @dest_currency. You must provide the transferred amount correctly in both currencies.', 'transaction_data' => 'Transaction data', + 'invalid_server_configuration' => 'Invalid server configuration', + 'invalid_locale_settings' => 'Firefly III is unable to format monetary amounts because your server is missing the required packages. There are instructions how to do this.', // search 'search' => 'Search', @@ -139,6 +139,7 @@ return [ 'search_box_intro' => 'Welcome to the search function of Firefly III. Enter your search query in the box. Make sure you check out the help file because the search is pretty advanced.', 'search_error' => 'Error while searching', 'search_searching' => 'Searching ...', + 'search_results' => 'Search results', // repeat frequencies: 'repeat_freq_yearly' => 'yearly', @@ -151,11 +152,11 @@ return [ // export data: 'import_and_export' => 'Import and export', 'export_data' => 'Export data', + 'export_and_backup_data' => 'Export and backup', 'export_data_intro' => 'For backup purposes, when migrating to another system or when migrating to another Firefly III installation.', 'export_format' => 'Export format', 'export_format_csv' => 'Comma separated values (CSV file)', 'export_format_mt940' => 'MT940 compatible format', - 'export_included_accounts' => 'Export transactions from these accounts', 'include_old_uploads_help' => 'Firefly III does not throw away the original CSV files you have imported in the past. You can include them in your export.', 'do_export' => 'Export', 'export_status_never_started' => 'The export has not started yet', @@ -170,8 +171,6 @@ return [ 'export_status_collected_attachments' => 'Collected all your attachments!', 'export_status_collecting_old_uploads' => 'Collecting all your previous uploads...', 'export_status_collected_old_uploads' => 'Collected all your previous uploads!', - 'export_status_creating_config_file' => 'Creating a configuration file...', - 'export_status_created_config_file' => 'Created a configuration file!', 'export_status_creating_zip_file' => 'Creating a zip file...', 'export_status_created_zip_file' => 'Created a zip file!', 'export_status_finished' => 'Export has succesfully finished! Yay!', @@ -317,6 +316,8 @@ return [ 'rule_action_set_source_account' => 'Set source account to :action_value', 'rule_action_set_destination_account_choice' => 'Set destination account to...', 'rule_action_set_destination_account' => 'Set destination account to :action_value', + 'rules_have_read_warning' => 'Have you read the warning?', + 'apply_rule_warning' => 'Warning: running a rule(group) on a large selection of transactions could take ages, and it could time-out. If it does, the rule(group) will only be applied to an unknown subset of your transactions. This might leave your financial administration in tatters. Please be careful.', // tags 'store_new_tag' => 'Store new tag', @@ -326,6 +327,7 @@ return [ 'location' => 'Location', 'without_date' => 'Without date', 'result' => 'Result', + 'sums_apply_to_range' => 'All sums apply to the selected range', // preferences 'pref_home_screen_accounts' => 'Home screen accounts', @@ -414,6 +416,15 @@ return [ 'secure_pw_should' => 'Should I check the box?', 'secure_pw_long_password' => 'If you just generated a long, single-use password for Firefly III using some kind of password generator: no.', 'secure_pw_short' => 'If you just entered the password you always use: Please yes.', + 'personal_access_token' => 'Personal access token', + 'explain_access_token' => 'You need this token to perform command line options, such as importing or exporting data. Without it, such sensitive commands will not work. Do not share your access token. Nobody will ask you for this token, not even me. If you fear you lost this, or when you\'re paranoid, regenerate this token using the button.', + 'regenerate_access_token' => 'Regenerate access token', + 'token_regenerated' => 'A new token was generated', + 'change_your_email' => 'Change your email address', + 'email_verification' => 'An email message will be sent to your old AND new email address. For security purposes, you will not be able to login until you verify your new email address. If you are unsure if your Firefly III installation is capable of sending email, please do not use this feature. If you are an administrator, you can test this in the Administration.', + 'email_changed_logout' => 'Until you verify your email address, you cannot login.', + 'login_with_new_email' => 'You can now login with your new email address.', + 'login_with_old_email' => 'You can now login with your old email address again.', // attachments @@ -447,7 +458,6 @@ return [ 'convert_options_DepositWithdrawal' => 'Convert a deposit into a withdrawal', 'convert_options_TransferWithdrawal' => 'Convert a transfer into a withdrawal', 'convert_options_TransferDeposit' => 'Convert a transfer into a deposit', - 'transaction_journal_convert_options' => 'Convert this transaction', 'convert_Withdrawal_to_deposit' => 'Convert this withdrawal to a deposit', 'convert_Withdrawal_to_transfer' => 'Convert this withdrawal to a transfer', 'convert_Deposit_to_withdrawal' => 'Convert this deposit to a withdrawal', @@ -467,7 +477,7 @@ return [ 'converted_to_Withdrawal' => 'The transaction has been converted to a withdrawal', 'converted_to_Deposit' => 'The transaction has been converted to a deposit', 'converted_to_Transfer' => 'The transaction has been converted to a transfer', - + 'invalid_convert_selection' => 'The account you have selected is already used in this transaction or does not exist.', // create new stuff: 'create_new_withdrawal' => 'Create new withdrawal', @@ -517,6 +527,11 @@ return [ 'update_budget' => 'Update budget', 'update_budget_amount_range' => 'Update (expected) available amount between :start and :end', 'budget_period_navigator' => 'Period navigator', + 'info_on_available_amount' => 'What do I have available?', + 'available_amount_indication' => 'Use these amounts to get an indication of what your total budget could be.', + 'suggested' => 'Suggested', + 'average_between' => 'Average between :start and :end', + // bills: 'matching_on' => 'Matching on', @@ -647,10 +662,8 @@ return [ 'newWithdrawal' => 'New expense', 'newDeposit' => 'New deposit', 'newTransfer' => 'New transfer', - 'moneyIn' => 'Money in', - 'moneyOut' => 'Money out', - 'billsToPay' => 'Bills to pay', - 'billsPaid' => 'Bills paid', + 'bills_to_pay' => 'Bills to pay', + 'per_day' => 'Per day', // menu and titles, should be recycled as often as possible: 'currency' => 'Currency', @@ -850,9 +863,6 @@ return [ 'removed_amount_from_piggy' => 'Removed :amount from ":name"', // tags - 'regular_tag' => 'Just a regular tag.', - 'balancing_act' => 'The tag takes at most two transactions; an expense and a transfer. They\'ll balance each other out.', - 'advance_payment' => 'The tag accepts one expense and any number of deposits aimed to repay the original expense.', 'delete_tag' => 'Delete tag ":tag"', 'deleted_tag' => 'Deleted tag ":tag"', 'new_tag' => 'Make new tag', @@ -891,6 +901,17 @@ return [ 'block_code_bounced' => 'Email message(s) bounced', 'block_code_expired' => 'Demo account expired', 'no_block_code' => 'No reason for block or user not blocked', + 'block_code_email_changed' => 'User has not yet confirmed new email address', + 'admin_update_email' => 'Contrary to the profile page, the user will NOT be notified their email address has changed!', + 'update_user' => 'Update user', + 'updated_user' => 'User data has been changed.', + 'delete_user' => 'Delete user :email', + 'user_deleted' => 'The user has been deleted', + 'send_test_email' => 'Send test email message', + 'send_test_email_text' => 'To see if your installation is capable of sending email, please press this button. You will not see an error here (if any), the log files will reflect any errors. You can press this button as many times as you like. There is no spam control. The message will be sent to :email and should arrive shortly.', + 'send_message' => 'Send message', + 'send_test_triggered' => 'Test was triggered. Check your inbox and the log files.', + // links 'journal_link_configuration' => 'Transaction links configuration', 'create_new_link_type' => 'Create new link type', @@ -914,7 +935,7 @@ return [ 'transaction' => 'Transaction', 'comments' => 'Comments', 'to_link_not_found' => 'If the transaction you want to link to is not listed, simply enter its ID.', - 'invalid_link_data' => 'Invalid link type selected. Cannot link transaction.', + 'invalid_link_selection' => 'Cannot link these transactions', 'journals_linked' => 'Transactions are linked.', 'journals_error_linked' => 'These transactions are already linked.', 'journal_links' => 'Transaction links', @@ -924,14 +945,16 @@ return [ 'overview_for_link' => 'Overview for link type ":name"', 'delete_journal_link' => 'Delete the link between :source and :destination', 'deleted_link' => 'Deleted link', - '1_outward' => 'relates to', - '2_outward' => '(partially) refunds', - '3_outward' => '(partially) pays for', - '4_outward' => '(partially) reimburses', - '1_inward' => 'relates to', - '2_inward' => 'is (partially) refunded by', - '3_inward' => 'is (partially) paid for by', - '4_inward' => 'is (partially) reimbursed by', + + // link translations: + 'relates to_inward' => 'relates to', + 'is (partially) refunded by_inward' => 'is (partially) refunded by', + 'is (partially) paid for by_inward' => 'is (partially) paid for by', + 'is (partially) reimbursed by_inward' => 'is (partially) reimbursed by', + 'relates to_outward' => 'relates to', + '(partially) refunds_outward' => '(partially) refunds', + '(partially) pays for_outward' => '(partially) pays for', + '(partially) reimburses_outward' => '(partially) reimburses', // split a transaction: @@ -946,6 +969,7 @@ return [ 'cannot_edit_multiple_dest' => 'You cannot edit splitted transaction #:id with description ":description" because it contains multiple destination accounts.', 'cannot_edit_opening_balance' => 'You cannot edit the opening balance of an account.', 'no_edit_multiple_left' => 'You have selected no valid transactions to edit.', + 'cannot_convert_split_journal' => 'Cannot convert a split transaction', // import bread crumbs and titles: 'import' => 'Import', @@ -960,6 +984,7 @@ return [ 'import_index_config' => 'If you have previously imported data into Firefly III, you may have a configuration file, which will pre-set configuration values for you. For some banks, other users have kindly provided their configuration file.', 'import_index_type' => 'Select the type of file you will upload', 'import_index_start' => 'Start importing', + 'import_file' => 'Import a file', // supported file types: 'import_file_type_csv' => 'CSV (comma separated values)', @@ -989,13 +1014,13 @@ return [ 'import_status_finished_title' => 'Import routine finished', 'import_status_finished_text' => 'The import routine has imported your file.', 'import_status_finished_job' => 'The transactions imported can be found in tag :tag.', + 'import_status_job_running' => 'The import is running...', 'import_with_key' => 'Import with key \':key\'', // sandstorm.io errors and messages: 'sandstorm_not_available' => 'This function is not available when you are using Firefly III within a Sandstorm.io environment.', // empty lists? no objects? instructions: - 'no_transactions_in_period' => 'There are no transactions in this period.', 'no_accounts_title_asset' => 'Let\'s create an asset account!', 'no_accounts_intro_asset' => 'You have no asset accounts yet. Asset accounts are your main accounts: your checking account, savings account, shared account or even your credit card.', 'no_accounts_imperative_asset' => 'To start using Firefly III you must create at least one asset account. Let\'s do so now:', diff --git a/resources/lang/en_US/form.php b/resources/lang/en_US/form.php index 5c30300170..9f8562113c 100644 --- a/resources/lang/en_US/form.php +++ b/resources/lang/en_US/form.php @@ -30,13 +30,10 @@ return [ 'currency_id' => 'Currency', 'attachments' => 'Attachments', 'journal_amount' => 'Amount', - 'journal_asset_source_account' => 'Asset account (source)', 'journal_source_account_name' => 'Revenue account (source)', 'journal_source_account_id' => 'Asset account (source)', 'BIC' => 'BIC', 'verify_password' => 'Verify password security', - 'account_from_id' => 'From account', - 'account_to_id' => 'To account', 'source_account' => 'Source account', 'destination_account' => 'Destination account', 'journal_destination_account_id' => 'Asset account (destination)', @@ -53,7 +50,6 @@ return [ 'tagMode' => 'Tag mode', 'tagPosition' => 'Tag location', 'virtualBalance' => 'Virtual balance', - 'longitude_latitude' => 'Location', 'targetamount' => 'Target amount', 'accountRole' => 'Account role', 'openingBalanceDate' => 'Opening balance date', @@ -68,12 +64,13 @@ return [ 'revenue_account' => 'Revenue account', 'decimal_places' => 'Decimal places', 'exchange_rate_instruction' => 'Foreign currencies', - 'exchanged_amount' => 'Exchanged amount', 'source_amount' => 'Amount (source)', 'destination_amount' => 'Amount (destination)', 'native_amount' => 'Native amount', + 'new_email_address' => 'New email address', + 'verification' => 'Verification', + 'api_key' => 'API key', - 'revenue_account_source' => 'Revenue account (source)', 'source_account_asset' => 'Source account (asset account)', 'destination_account_expense' => 'Destination account (expense account)', 'destination_account_asset' => 'Destination account (asset account)', @@ -111,7 +108,6 @@ return [ 'add_new_withdrawal' => 'Add a new withdrawal', 'add_new_deposit' => 'Add a new deposit', 'add_new_transfer' => 'Add a new transfer', - 'noPiggybank' => '(no piggy bank)', 'title' => 'Title', 'notes' => 'Notes', 'filename' => 'File name', @@ -137,6 +133,8 @@ return [ 'delete_rule' => 'Delete rule ":title"', 'delete_rule_group' => 'Delete rule group ":title"', 'delete_link_type' => 'Delete link type ":name"', + 'delete_user' => 'Delete user ":email"', + 'user_areYouSure' => 'If you delete user ":email", everything will be gone. There is no undo, undelete or anything. If you delete yourself, you will lose access to this instance of Firefly III.', 'attachment_areYouSure' => 'Are you sure you want to delete the attachment named ":name"?', 'account_areYouSure' => 'Are you sure you want to delete the account named ":name"?', 'bill_areYouSure' => 'Are you sure you want to delete the bill named ":name"?', @@ -174,7 +172,6 @@ return [ // admin 'domain' => 'Domain', 'single_user_mode' => 'Single user mode', - 'must_confirm_account' => 'New users must activate account', 'is_demo_site' => 'Is demo site', @@ -194,7 +191,7 @@ return [ 'payment_date' => 'Payment date', 'invoice_date' => 'Invoice date', 'internal_reference' => 'Internal reference', - - 'inward' => 'Inward description', - 'outward' => 'Outward description', + 'inward' => 'Inward description', + 'outward' => 'Outward description', + 'rule_group_id' => 'Rule group', ]; diff --git a/resources/lang/en_US/help.php b/resources/lang/en_US/help.php deleted file mode 100644 index 6d1265778b..0000000000 --- a/resources/lang/en_US/help.php +++ /dev/null @@ -1,35 +0,0 @@ - 'Welcome to Firefly III', - 'main-content-text' => 'Do yourself a favor and follow this short guide to make sure you know your way around.', - 'sidebar-toggle-title' => 'Sidebar to create stuff', - 'sidebar-toggle-text' => 'Hidden under the plus icon are all the buttons to create new stuff. Accounts, transactions, everything!', - 'account-menu-title' => 'All your accounts', - 'account-menu-text' => 'Here you can find all the accounts you\'ve made.', - 'budget-menu-title' => 'Budgets', - 'budget-menu-text' => 'Use this page to organise your finances and limit spending.', - 'report-menu-title' => 'Reports', - 'report-menu-text' => 'Check this out when you want a solid overview of your finances.', - 'transaction-menu-title' => 'Transactions', - 'transaction-menu-text' => 'All transactions you\'ve created can be found here.', - 'option-menu-title' => 'Options', - 'option-menu-text' => 'This is pretty self-explanatory.', - 'main-content-end-title' => 'The end!', - 'main-content-end-text' => 'Remember that every page has a small question mark at the right top. Click it to get help about the page you\'re on.', - 'index' => 'index', - 'home' => 'home', -]; diff --git a/resources/lang/en_US/intro.php b/resources/lang/en_US/intro.php index 02a0eead23..0fe735125b 100644 --- a/resources/lang/en_US/intro.php +++ b/resources/lang/en_US/intro.php @@ -31,6 +31,7 @@ return [ 'budgets_index_navigate_periods' => 'Navigate through periods to easily set budgets ahead of time.', 'budgets_index_new_budget' => 'Create new budgets as you see fit.', 'budgets_index_list_of_budgets' => 'Use this table to set the amounts for each budget and see how you are doing.', + 'budgets_index_outro' => 'To learn more about budgeting, checkout the help icon in the top right corner.', // reports (index) 'reports_index_intro' => 'Use these reports to get detailed insights in your finances.', diff --git a/resources/lang/en_US/list.php b/resources/lang/en_US/list.php index 217b26ce20..e23dfbc609 100644 --- a/resources/lang/en_US/list.php +++ b/resources/lang/en_US/list.php @@ -12,78 +12,80 @@ declare(strict_types=1); */ return [ - 'buttons' => 'Buttons', - 'icon' => 'Icon', - 'id' => 'ID', - 'create_date' => 'Created at', - 'update_date' => 'Updated at', - 'balance_before' => 'Balance before', - 'balance_after' => 'Balance after', - 'name' => 'Name', - 'role' => 'Role', - 'currentBalance' => 'Current balance', - 'active' => 'Is active?', - 'lastActivity' => 'Last activity', - 'balanceDiff' => 'Balance difference between :start and :end', - 'matchedOn' => 'Matched on', - 'matchesOn' => 'Matched on', - 'account_type' => 'Account type', - 'created_at' => 'Created at', - 'new_balance' => 'New balance', - 'account' => 'Account', - 'matchingAmount' => 'Amount', - 'lastMatch' => 'Last match', - 'split_number' => 'Split #', - 'destination' => 'Destination', - 'source' => 'Source', - 'next_expected_match' => 'Next expected match', - 'automatch' => 'Auto match?', - 'repeat_freq' => 'Repeats', - 'description' => 'Description', - 'amount' => 'Amount', - 'internal_reference' => 'Internal reference', - 'date' => 'Date', - 'interest_date' => 'Interest date', - 'book_date' => 'Book date', - 'process_date' => 'Processing date', - 'due_date' => 'Due date', - 'payment_date' => 'Payment date', - 'invoice_date' => 'Invoice date', - 'interal_reference' => 'Internal reference', - 'notes' => 'Notes', - 'from' => 'From', - 'piggy_bank' => 'Piggy bank', - 'to' => 'To', - 'budget' => 'Budget', - 'category' => 'Category', - 'bill' => 'Bill', - 'withdrawal' => 'Withdrawal', - 'deposit' => 'Deposit', - 'transfer' => 'Transfer', - 'type' => 'Type', - 'completed' => 'Completed', - 'iban' => 'IBAN', - 'paid_current_period' => 'Paid this period', - 'email' => 'Email', - 'registered_at' => 'Registered at', - 'is_activated' => 'Is activated', - 'is_blocked' => 'Is blocked', - 'is_admin' => 'Is admin', - 'has_two_factor' => 'Has 2FA', - 'blocked_code' => 'Block code', - 'source_account' => 'Source account', - 'destination_account' => 'Destination account', - 'accounts_count' => 'Number of accounts', - 'journals_count' => 'Number of transactions', - 'attachments_count' => 'Number of attachments', - 'bills_count' => 'Number of bills', - 'categories_count' => 'Number of categories', - 'export_jobs_count' => 'Number of export jobs', - 'import_jobs_count' => 'Number of import jobs', - 'budget_count' => 'Number of budgets', - 'rule_and_groups_count' => 'Number of rules and rule groups', - 'tags_count' => 'Number of tags', - 'inward' => 'Inward description', - 'outward' => 'Outward description', - 'number_of_transactions' => 'Number of transactions', + 'buttons' => 'Buttons', + 'icon' => 'Icon', + 'id' => 'ID', + 'create_date' => 'Created at', + 'update_date' => 'Updated at', + 'balance_before' => 'Balance before', + 'balance_after' => 'Balance after', + 'name' => 'Name', + 'role' => 'Role', + 'currentBalance' => 'Current balance', + 'active' => 'Is active?', + 'lastActivity' => 'Last activity', + 'balanceDiff' => 'Balance difference between :start and :end', + 'matchesOn' => 'Matched on', + 'account_type' => 'Account type', + 'created_at' => 'Created at', + 'account' => 'Account', + 'matchingAmount' => 'Amount', + 'split_number' => 'Split #', + 'destination' => 'Destination', + 'source' => 'Source', + 'next_expected_match' => 'Next expected match', + 'automatch' => 'Auto match?', + 'repeat_freq' => 'Repeats', + 'description' => 'Description', + 'amount' => 'Amount', + 'internal_reference' => 'Internal reference', + 'date' => 'Date', + 'interest_date' => 'Interest date', + 'book_date' => 'Book date', + 'process_date' => 'Processing date', + 'due_date' => 'Due date', + 'payment_date' => 'Payment date', + 'invoice_date' => 'Invoice date', + 'interal_reference' => 'Internal reference', + 'notes' => 'Notes', + 'from' => 'From', + 'piggy_bank' => 'Piggy bank', + 'to' => 'To', + 'budget' => 'Budget', + 'category' => 'Category', + 'bill' => 'Bill', + 'withdrawal' => 'Withdrawal', + 'deposit' => 'Deposit', + 'transfer' => 'Transfer', + 'type' => 'Type', + 'completed' => 'Completed', + 'iban' => 'IBAN', + 'paid_current_period' => 'Paid this period', + 'email' => 'Email', + 'registered_at' => 'Registered at', + 'is_blocked' => 'Is blocked', + 'is_admin' => 'Is admin', + 'has_two_factor' => 'Has 2FA', + 'blocked_code' => 'Block code', + 'source_account' => 'Source account', + 'destination_account' => 'Destination account', + 'accounts_count' => 'Number of accounts', + 'journals_count' => 'Number of transactions', + 'attachments_count' => 'Number of attachments', + 'bills_count' => 'Number of bills', + 'categories_count' => 'Number of categories', + 'export_jobs_count' => 'Number of export jobs', + 'import_jobs_count' => 'Number of import jobs', + 'budget_count' => 'Number of budgets', + 'rule_and_groups_count' => 'Number of rules and rule groups', + 'tags_count' => 'Number of tags', + 'inward' => 'Inward description', + 'outward' => 'Outward description', + 'number_of_transactions' => 'Number of transactions', + 'total_amount' => 'Total amount', + 'sum' => 'Sum', + 'sum_excluding_transfers' => 'Sum (excluding transfers)', + 'sum_withdrawals' => 'Sum of withdrawals', + 'sum_deposits' => 'Sum of deposits', + 'sum_transfers' => 'Sum of transfers', ]; diff --git a/resources/lang/es_ES/bank.php b/resources/lang/es_ES/bank.php new file mode 100644 index 0000000000..11f05b3785 --- /dev/null +++ b/resources/lang/es_ES/bank.php @@ -0,0 +1,6 @@ + '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.', +]; \ No newline at end of file diff --git a/resources/lang/es_ES/firefly.php b/resources/lang/es_ES/firefly.php index 280b2a9c4a..959ad1bf1e 100644 --- a/resources/lang/es_ES/firefly.php +++ b/resources/lang/es_ES/firefly.php @@ -83,11 +83,9 @@ return [ 'cannot_redirect_to_account' => 'Firefly III cannot redirect you to the correct page. Apologies.', 'sum_of_expenses' => 'Total gastos', 'sum_of_income' => 'Total ingresos', - 'total_sum' => 'Suma total', 'spent_in_specific_budget' => 'Spent in budget ":budget"', 'sum_of_expenses_in_budget' => 'Spent total in budget ":budget"', 'left_in_budget_limit' => 'Left to spend according to budgeting', - 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', 'current_period' => 'Período actual', 'show_the_current_period_and_overview' => 'Mostrar el período actual y el resumen', 'pref_languages_locale' => 'Para que un idioma distinto al inglés funcione correctamente, su sistema operativo debe disponer de la información regional correcta. Si no está disponible, los datos de divisas, fechas y cantidades pueden tener un formato incorrecto.', @@ -130,6 +128,8 @@ return [ 'exchange_rate_instructions' => 'Asset account "@name" only accepts transactions in @native_currency. If you wish to use @foreign_currency instead, make sure that the amount in @native_currency is known as well:', 'transfer_exchange_rate_instructions' => 'Source asset account "@source_name" only accepts transactions in @source_currency. Destination asset account "@dest_name" only accepts transactions in @dest_currency. You must provide the transferred amount correctly in both currencies.', 'transaction_data' => 'Transaction data', + 'invalid_server_configuration' => 'Invalid server configuration', + 'invalid_locale_settings' => 'Firefly III is unable to format monetary amounts because your server is missing the required packages. There are instructions how to do this.', // search 'search' => 'Buscar', @@ -139,6 +139,7 @@ return [ 'search_box_intro' => 'Bienvenido a la función de búsqueda de Firefly III. Introduce tu consulta de búsqueda en el cuadro. Asegúrate de revisar el archivo de ayuda porque el buscador es bastante avanzado.', 'search_error' => 'Error durante la búsqueda', 'search_searching' => 'Buscando...', + 'search_results' => 'Search results', // repeat frequencies: 'repeat_freq_yearly' => 'yearly', @@ -151,11 +152,11 @@ return [ // export data: 'import_and_export' => 'Importar y exportar', 'export_data' => 'Exportar datos', + 'export_and_backup_data' => 'Export and backup', 'export_data_intro' => 'For backup purposes, when migrating to another system or when migrating to another Firefly III installation.', 'export_format' => 'Formato de exportación', 'export_format_csv' => 'Comma separated values (CSV file)', 'export_format_mt940' => 'MT940 compatible format', - 'export_included_accounts' => 'Exportar transacciones de estas cuentas', 'include_old_uploads_help' => 'Firefly III does not throw away the original CSV files you have imported in the past. You can include them in your export.', 'do_export' => 'Exportar', 'export_status_never_started' => 'The export has not started yet', @@ -170,8 +171,6 @@ return [ 'export_status_collected_attachments' => 'Collected all your attachments!', 'export_status_collecting_old_uploads' => 'Collecting all your previous uploads...', 'export_status_collected_old_uploads' => 'Collected all your previous uploads!', - 'export_status_creating_config_file' => 'Creating a configuration file...', - 'export_status_created_config_file' => 'Created a configuration file!', 'export_status_creating_zip_file' => 'Creating a zip file...', 'export_status_created_zip_file' => 'Created a zip file!', 'export_status_finished' => 'Export has succesfully finished! Yay!', @@ -317,6 +316,8 @@ return [ 'rule_action_set_source_account' => 'Set source account to :action_value', 'rule_action_set_destination_account_choice' => 'Set destination account to...', 'rule_action_set_destination_account' => 'Set destination account to :action_value', + 'rules_have_read_warning' => 'Have you read the warning?', + 'apply_rule_warning' => 'Warning: running a rule(group) on a large selection of transactions could take ages, and it could time-out. If it does, the rule(group) will only be applied to an unknown subset of your transactions. This might leave your financial administration in tatters. Please be careful.', // tags 'store_new_tag' => 'Store new tag', @@ -326,6 +327,7 @@ return [ 'location' => 'Location', 'without_date' => 'Without date', 'result' => 'Result', + 'sums_apply_to_range' => 'All sums apply to the selected range', // preferences 'pref_home_screen_accounts' => 'Cuentas de la pantalla de inicio', @@ -414,6 +416,15 @@ return [ 'secure_pw_should' => 'Should I check the box?', 'secure_pw_long_password' => 'If you just generated a long, single-use password for Firefly III using some kind of password generator: no.', 'secure_pw_short' => 'If you just entered the password you always use: Please yes.', + 'personal_access_token' => 'Personal access token', + 'explain_access_token' => 'You need this token to perform command line options, such as importing or exporting data. Without it, such sensitive commands will not work. Do not share your access token. Nobody will ask you for this token, not even me. If you fear you lost this, or when you\'re paranoid, regenerate this token using the button.', + 'regenerate_access_token' => 'Regenerate access token', + 'token_regenerated' => 'A new token was generated', + 'change_your_email' => 'Change your email address', + 'email_verification' => 'An email message will be sent to your old AND new email address. For security purposes, you will not be able to login until you verify your new email address. If you are unsure if your Firefly III installation is capable of sending email, please do not use this feature. If you are an administrator, you can test this in the Administration.', + 'email_changed_logout' => 'Until you verify your email address, you cannot login.', + 'login_with_new_email' => 'You can now login with your new email address.', + 'login_with_old_email' => 'You can now login with your old email address again.', // attachments @@ -447,7 +458,6 @@ return [ 'convert_options_DepositWithdrawal' => 'Convertir un depósito en una retirada de efectivo', 'convert_options_TransferWithdrawal' => 'Convertir una transferencia en una retirada de efectivo', 'convert_options_TransferDeposit' => 'Convertir una transferencia en un depósito', - 'transaction_journal_convert_options' => 'Convertir esta transacción', 'convert_Withdrawal_to_deposit' => 'Convert this withdrawal to a deposit', 'convert_Withdrawal_to_transfer' => 'Convert this withdrawal to a transfer', 'convert_Deposit_to_withdrawal' => 'Convert this deposit to a withdrawal', @@ -467,7 +477,7 @@ return [ 'converted_to_Withdrawal' => 'The transaction has been converted to a withdrawal', 'converted_to_Deposit' => 'The transaction has been converted to a deposit', 'converted_to_Transfer' => 'The transaction has been converted to a transfer', - + 'invalid_convert_selection' => 'The account you have selected is already used in this transaction or does not exist.', // create new stuff: 'create_new_withdrawal' => 'Create new withdrawal', @@ -517,6 +527,11 @@ return [ 'update_budget' => 'Update budget', 'update_budget_amount_range' => 'Update (expected) available amount between :start and :end', 'budget_period_navigator' => 'Period navigator', + 'info_on_available_amount' => 'What do I have available?', + 'available_amount_indication' => 'Use these amounts to get an indication of what your total budget could be.', + 'suggested' => 'Suggested', + 'average_between' => 'Average between :start and :end', + // bills: 'matching_on' => 'Matching on', @@ -647,10 +662,8 @@ return [ 'newWithdrawal' => 'New expense', 'newDeposit' => 'New deposit', 'newTransfer' => 'New transfer', - 'moneyIn' => 'Money in', - 'moneyOut' => 'Money out', - 'billsToPay' => 'Facturas a pagar', - 'billsPaid' => 'Facturas pagadas', + 'bills_to_pay' => 'Bills to pay', + 'per_day' => 'Per day', // menu and titles, should be recycled as often as possible: 'currency' => 'Currency', @@ -850,9 +863,6 @@ return [ 'removed_amount_from_piggy' => 'Removed :amount from ":name"', // tags - 'regular_tag' => 'Just a regular tag.', - 'balancing_act' => 'The tag takes at most two transactions; an expense and a transfer. They\'ll balance each other out.', - 'advance_payment' => 'The tag accepts one expense and any number of deposits aimed to repay the original expense.', 'delete_tag' => 'Delete tag ":tag"', 'deleted_tag' => 'Deleted tag ":tag"', 'new_tag' => 'Make new tag', @@ -891,6 +901,17 @@ return [ 'block_code_bounced' => 'Email message(s) bounced', 'block_code_expired' => 'Demo account expired', 'no_block_code' => 'No reason for block or user not blocked', + 'block_code_email_changed' => 'User has not yet confirmed new email address', + 'admin_update_email' => 'Contrary to the profile page, the user will NOT be notified their email address has changed!', + 'update_user' => 'Update user', + 'updated_user' => 'User data has been changed.', + 'delete_user' => 'Delete user :email', + 'user_deleted' => 'The user has been deleted', + 'send_test_email' => 'Send test email message', + 'send_test_email_text' => 'To see if your installation is capable of sending email, please press this button. You will not see an error here (if any), the log files will reflect any errors. You can press this button as many times as you like. There is no spam control. The message will be sent to :email and should arrive shortly.', + 'send_message' => 'Send message', + 'send_test_triggered' => 'Test was triggered. Check your inbox and the log files.', + // links 'journal_link_configuration' => 'Transaction links configuration', 'create_new_link_type' => 'Create new link type', @@ -914,7 +935,7 @@ return [ 'transaction' => 'Transaction', 'comments' => 'Comments', 'to_link_not_found' => 'If the transaction you want to link to is not listed, simply enter its ID.', - 'invalid_link_data' => 'Invalid link type selected. Cannot link transaction.', + 'invalid_link_selection' => 'Cannot link these transactions', 'journals_linked' => 'Transactions are linked.', 'journals_error_linked' => 'These transactions are already linked.', 'journal_links' => 'Transaction links', @@ -924,14 +945,16 @@ return [ 'overview_for_link' => 'Overview for link type ":name"', 'delete_journal_link' => 'Delete the link between :source and :destination', 'deleted_link' => 'Deleted link', - '1_outward' => 'relates to', - '2_outward' => '(partially) refunds', - '3_outward' => '(partially) pays for', - '4_outward' => '(partially) reimburses', - '1_inward' => 'relates to', - '2_inward' => 'is (partially) refunded by', - '3_inward' => 'is (partially) paid for by', - '4_inward' => 'is (partially) reimbursed by', + + // link translations: + 'relates to_inward' => 'relates to', + 'is (partially) refunded by_inward' => 'is (partially) refunded by', + 'is (partially) paid for by_inward' => 'is (partially) paid for by', + 'is (partially) reimbursed by_inward' => 'is (partially) reimbursed by', + 'relates to_outward' => 'relates to', + '(partially) refunds_outward' => '(partially) refunds', + '(partially) pays for_outward' => '(partially) pays for', + '(partially) reimburses_outward' => '(partially) reimburses', // split a transaction: @@ -946,6 +969,7 @@ return [ 'cannot_edit_multiple_dest' => 'You cannot edit splitted transaction #:id with description ":description" because it contains multiple destination accounts.', 'cannot_edit_opening_balance' => 'You cannot edit the opening balance of an account.', 'no_edit_multiple_left' => 'You have selected no valid transactions to edit.', + 'cannot_convert_split_journal' => 'Cannot convert a split transaction', // import bread crumbs and titles: 'import' => 'Importar', @@ -960,6 +984,7 @@ return [ 'import_index_config' => 'If you have previously imported data into Firefly III, you may have a configuration file, which will pre-set configuration values for you. For some banks, other users have kindly provided their configuration file.', 'import_index_type' => 'Select the type of file you will upload', 'import_index_start' => 'Iniciar importación', + 'import_file' => 'Import a file', // supported file types: 'import_file_type_csv' => 'CSV (comma separated values)', @@ -989,13 +1014,13 @@ return [ 'import_status_finished_title' => 'Import routine finished', 'import_status_finished_text' => 'The import routine has imported your file.', 'import_status_finished_job' => 'The transactions imported can be found in tag :tag.', + 'import_status_job_running' => 'The import is running...', 'import_with_key' => 'Import with key \':key\'', // sandstorm.io errors and messages: 'sandstorm_not_available' => 'This function is not available when you are using Firefly III within a Sandstorm.io environment.', // empty lists? no objects? instructions: - 'no_transactions_in_period' => 'There are no transactions in this period.', 'no_accounts_title_asset' => 'Let\'s create an asset account!', 'no_accounts_intro_asset' => 'You have no asset accounts yet. Asset accounts are your main accounts: your checking account, savings account, shared account or even your credit card.', 'no_accounts_imperative_asset' => 'To start using Firefly III you must create at least one asset account. Let\'s do so now:', diff --git a/resources/lang/es_ES/form.php b/resources/lang/es_ES/form.php index 3837e72573..dcd1ac31d5 100644 --- a/resources/lang/es_ES/form.php +++ b/resources/lang/es_ES/form.php @@ -30,13 +30,10 @@ return [ 'currency_id' => 'Divisa', 'attachments' => 'Adjuntos', 'journal_amount' => 'Importe', - 'journal_asset_source_account' => 'Asset account (source)', 'journal_source_account_name' => 'Revenue account (source)', 'journal_source_account_id' => 'Asset account (source)', 'BIC' => 'BIC', 'verify_password' => 'Verificar la seguridad de contraseña', - 'account_from_id' => 'Cuenta origen', - 'account_to_id' => 'Cuenta destino', 'source_account' => 'Cuenta origen', 'destination_account' => 'Cuenta destino', 'journal_destination_account_id' => 'Asset account (destination)', @@ -53,7 +50,6 @@ return [ 'tagMode' => 'Modo de etiqueta', 'tagPosition' => 'Ubicación de la etiqueta', 'virtualBalance' => 'Saldo virtual', - 'longitude_latitude' => 'Ubicación', 'targetamount' => 'Cantidad objetivo', 'accountRole' => 'Tipo de cuenta', 'openingBalanceDate' => 'Fecha del saldo inicial', @@ -68,12 +64,13 @@ return [ 'revenue_account' => 'Cuenta de ingresos', 'decimal_places' => 'Lugares decimales', 'exchange_rate_instruction' => 'Monedas extranjeras', - 'exchanged_amount' => 'Exchanged amount', 'source_amount' => 'Importe (origen)', 'destination_amount' => 'Importe (destino)', 'native_amount' => 'Native amount', + 'new_email_address' => 'New email address', + 'verification' => 'Verification', + 'api_key' => 'API key', - 'revenue_account_source' => 'Revenue account (source)', 'source_account_asset' => 'Source account (asset account)', 'destination_account_expense' => 'Destination account (expense account)', 'destination_account_asset' => 'Destination account (asset account)', @@ -111,7 +108,6 @@ return [ 'add_new_withdrawal' => 'Añadir rueva retirada de efectivo', 'add_new_deposit' => 'Añadir nuevo depósito', 'add_new_transfer' => 'Añadir nueva transferencia', - 'noPiggybank' => '(sin hucha)', 'title' => 'Título', 'notes' => 'Notas', 'filename' => 'Nombre de fichero', @@ -137,6 +133,8 @@ return [ 'delete_rule' => 'Eliminar regla ":title"', 'delete_rule_group' => 'Eliminar grupo de reglas ":title"', 'delete_link_type' => 'Eliminar tipo de enlace ":name"', + 'delete_user' => 'Delete user ":email"', + 'user_areYouSure' => 'If you delete user ":email", everything will be gone. There is no undo, undelete or anything. If you delete yourself, you will lose access to this instance of Firefly III.', 'attachment_areYouSure' => 'Are you sure you want to delete the attachment named ":name"?', 'account_areYouSure' => 'Are you sure you want to delete the account named ":name"?', 'bill_areYouSure' => 'Are you sure you want to delete the bill named ":name"?', @@ -174,7 +172,6 @@ return [ // admin 'domain' => 'Dominio', 'single_user_mode' => 'Modo de un solo usuario', - 'must_confirm_account' => 'Los nuevos usuarios deben activar su cuenta', 'is_demo_site' => 'Está en modo demostración', @@ -194,7 +191,7 @@ return [ 'payment_date' => 'Payment date', 'invoice_date' => 'Invoice date', 'internal_reference' => 'Internal reference', - - 'inward' => 'Inward description', - 'outward' => 'Outward description', + 'inward' => 'Inward description', + 'outward' => 'Outward description', + 'rule_group_id' => 'Rule group', ]; diff --git a/resources/lang/es_ES/intro.php b/resources/lang/es_ES/intro.php index dc1c7ed940..dad9854174 100644 --- a/resources/lang/es_ES/intro.php +++ b/resources/lang/es_ES/intro.php @@ -31,6 +31,7 @@ return [ 'budgets_index_navigate_periods' => 'Navega a través de períodos para configurar fácilmente presupuestos con anticipación.', 'budgets_index_new_budget' => 'Crea nuevos presupuestos como mejor te parezca.', 'budgets_index_list_of_budgets' => 'Use this table to set the amounts for each budget and see how you are doing.', + 'budgets_index_outro' => 'To learn more about budgeting, checkout the help icon in the top right corner.', // reports (index) 'reports_index_intro' => 'Use these reports to get detailed insights in your finances.', diff --git a/resources/lang/es_ES/list.php b/resources/lang/es_ES/list.php index 8e2b50c0f9..c94e804c7b 100644 --- a/resources/lang/es_ES/list.php +++ b/resources/lang/es_ES/list.php @@ -12,78 +12,80 @@ declare(strict_types=1); */ return [ - 'buttons' => 'Botones', - 'icon' => 'Icono', - 'id' => 'ID', - 'create_date' => 'Fecha de creación', - 'update_date' => 'Fecha de modificación', - 'balance_before' => 'Balance antes de ', - 'balance_after' => 'Balance después de la', - 'name' => 'Nombre', - 'role' => 'Rol', - 'currentBalance' => 'Balance actual', - 'active' => '¿Está Activo?', - 'lastActivity' => 'Actividad más reciente', - 'balanceDiff' => 'Diferencia de saldo entre :start y :end', - 'matchedOn' => 'Encontrado en', - 'matchesOn' => 'Encontrado en', - 'account_type' => 'Tipo de cuenta', - 'created_at' => 'Fecha de creación', - 'new_balance' => 'Nuevo balance', - 'account' => 'Cuenta', - 'matchingAmount' => 'Monto', - 'lastMatch' => 'Última coincidencia', - 'split_number' => 'División #', - 'destination' => 'Destino', - 'source' => 'Origen', - 'next_expected_match' => 'Próxima coincidencia esperada', - 'automatch' => '¿Buscar coincidencia automaticamente?', - 'repeat_freq' => 'Repetición:', - 'description' => 'Descripción', - 'amount' => 'Monto', - 'internal_reference' => 'Referencia interna', - 'date' => 'Fecha', - 'interest_date' => 'Tasa de interés', - 'book_date' => 'Libro fecha', - 'process_date' => 'Fecha de procesamiento', - 'due_date' => 'Fecha de vencimiento', - 'payment_date' => 'Fecha de pago', - 'invoice_date' => 'Fecha de facturación', - 'interal_reference' => 'Referencia interna', - 'notes' => 'Notas', - 'from' => 'Desde', - 'piggy_bank' => 'Alcancilla', - 'to' => 'Hasta', - 'budget' => 'Presupuesto', - 'category' => 'Categoría', - 'bill' => 'Factura', - 'withdrawal' => 'Retiro', - 'deposit' => 'Depósito', - 'transfer' => 'Trasferencia', - 'type' => 'Tipo', - 'completed' => 'Completado', - 'iban' => 'IBAN', - 'paid_current_period' => 'Pagado este período', - 'email' => 'Email', - 'registered_at' => 'Registrado el', - 'is_activated' => 'Está activado', - 'is_blocked' => 'Está bloqueado', - 'is_admin' => '¿Es el administrador?', - 'has_two_factor' => 'Tiene 2FA', - 'blocked_code' => 'Bloque de código', - 'source_account' => 'Cuenta origen', - 'destination_account' => 'Cuenta destino', - 'accounts_count' => 'Número de cuentas', - 'journals_count' => 'Número de transacciones', - 'attachments_count' => 'Núm. de datos adjuntos', - 'bills_count' => 'Número de facturas', - 'categories_count' => 'Número de categorías', - 'export_jobs_count' => 'Número de operaciones de exportación', - 'import_jobs_count' => 'Número de operaciones de importación', - 'budget_count' => 'Número de presupuestos', - 'rule_and_groups_count' => 'Número de reglas y grupos de reglas', - 'tags_count' => 'Número de etiquetas', - 'inward' => 'Descripción interna', - 'outward' => 'Descripción externa', - 'number_of_transactions' => 'Número de transacciones', + 'buttons' => 'Botones', + 'icon' => 'Icono', + 'id' => 'ID', + 'create_date' => 'Fecha de creación', + 'update_date' => 'Fecha de modificación', + 'balance_before' => 'Balance antes de ', + 'balance_after' => 'Balance después de la', + 'name' => 'Nombre', + 'role' => 'Rol', + 'currentBalance' => 'Balance actual', + 'active' => '¿Está Activo?', + 'lastActivity' => 'Actividad más reciente', + 'balanceDiff' => 'Diferencia de saldo entre :start y :end', + 'matchesOn' => 'Encontrado en', + 'account_type' => 'Tipo de cuenta', + 'created_at' => 'Fecha de creación', + 'account' => 'Cuenta', + 'matchingAmount' => 'Monto', + 'split_number' => 'División #', + 'destination' => 'Destino', + 'source' => 'Origen', + 'next_expected_match' => 'Próxima coincidencia esperada', + 'automatch' => '¿Buscar coincidencia automaticamente?', + 'repeat_freq' => 'Repetición:', + 'description' => 'Descripción', + 'amount' => 'Monto', + 'internal_reference' => 'Referencia interna', + 'date' => 'Fecha', + 'interest_date' => 'Tasa de interés', + 'book_date' => 'Libro fecha', + 'process_date' => 'Fecha de procesamiento', + 'due_date' => 'Fecha de vencimiento', + 'payment_date' => 'Fecha de pago', + 'invoice_date' => 'Fecha de facturación', + 'interal_reference' => 'Referencia interna', + 'notes' => 'Notas', + 'from' => 'Desde', + 'piggy_bank' => 'Alcancilla', + 'to' => 'Hasta', + 'budget' => 'Presupuesto', + 'category' => 'Categoría', + 'bill' => 'Factura', + 'withdrawal' => 'Retiro', + 'deposit' => 'Depósito', + 'transfer' => 'Trasferencia', + 'type' => 'Tipo', + 'completed' => 'Completado', + 'iban' => 'IBAN', + 'paid_current_period' => 'Pagado este período', + 'email' => 'Email', + 'registered_at' => 'Registrado el', + 'is_blocked' => 'Está bloqueado', + 'is_admin' => '¿Es el administrador?', + 'has_two_factor' => 'Tiene 2FA', + 'blocked_code' => 'Bloque de código', + 'source_account' => 'Cuenta origen', + 'destination_account' => 'Cuenta destino', + 'accounts_count' => 'Número de cuentas', + 'journals_count' => 'Número de transacciones', + 'attachments_count' => 'Núm. de datos adjuntos', + 'bills_count' => 'Número de facturas', + 'categories_count' => 'Número de categorías', + 'export_jobs_count' => 'Número de operaciones de exportación', + 'import_jobs_count' => 'Número de operaciones de importación', + 'budget_count' => 'Número de presupuestos', + 'rule_and_groups_count' => 'Número de reglas y grupos de reglas', + 'tags_count' => 'Número de etiquetas', + 'inward' => 'Descripción interna', + 'outward' => 'Descripción externa', + 'number_of_transactions' => 'Número de transacciones', + 'total_amount' => 'Total amount', + 'sum' => 'Sum', + 'sum_excluding_transfers' => 'Sum (excluding transfers)', + 'sum_withdrawals' => 'Sum of withdrawals', + 'sum_deposits' => 'Sum of deposits', + 'sum_transfers' => 'Sum of transfers', ]; diff --git a/resources/lang/fr_FR/bank.php b/resources/lang/fr_FR/bank.php new file mode 100644 index 0000000000..11f05b3785 --- /dev/null +++ b/resources/lang/fr_FR/bank.php @@ -0,0 +1,6 @@ + '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.', +]; \ No newline at end of file diff --git a/resources/lang/fr_FR/firefly.php b/resources/lang/fr_FR/firefly.php index 3add5d33fb..986297b683 100644 --- a/resources/lang/fr_FR/firefly.php +++ b/resources/lang/fr_FR/firefly.php @@ -83,11 +83,9 @@ return [ 'cannot_redirect_to_account' => 'Firefly III n\'est pas en mesure de vous rediriger vers la bonne page. Veuillez nous en excuser.', 'sum_of_expenses' => 'Montant des dépenses', 'sum_of_income' => 'Montant des revenus', - 'total_sum' => 'Montant total ', 'spent_in_specific_budget' => 'Dépensé dans le budget ":budget"', 'sum_of_expenses_in_budget' => 'Total dépensé dans le budget ":budget"', 'left_in_budget_limit' => 'Reste à dépenser selon budget', - 'cannot_reset_demo_user' => 'Vous ne pouvez pas réinitialiser le mot de passe du compte démonstration', 'current_period' => 'Période en cours', 'show_the_current_period_and_overview' => 'Afficher l’exercice en cours et sa vue d’ensemble', 'pref_languages_locale' => 'Pour une langue autre que l’anglais pour fonctionner correctement, votre système d’exploitation doit être équipé avec les paramètres régionaux correctes. Si ils ne sont pas présents, les données de devises, les dates et les montants peuvent être mal formatés.', @@ -130,6 +128,8 @@ return [ 'exchange_rate_instructions' => 'Compte d’actif "@name" n’accepte que les transactions en @native_currency. Si vous souhaitez utiliser @foreign_currency à la place, assurez-vous que le montant en @native_currency est aussi bien connu :', 'transfer_exchange_rate_instructions' => 'Compte d’actif source "@source_name" n’accepte que les transactions en @source_currency. Compte d’actif "@dest_name" de destination n’accepte que les transactions en @dest_currency. Vous devez fournir le montant transféré correctement dans les deux monnaies.', 'transaction_data' => 'Données de transaction', + 'invalid_server_configuration' => 'Invalid server configuration', + 'invalid_locale_settings' => 'Firefly III is unable to format monetary amounts because your server is missing the required packages. There are instructions how to do this.', // search 'search' => 'Rechercher', @@ -139,6 +139,7 @@ return [ 'search_box_intro' => 'Bienvenue à la fonction de recherche de Firefly III. Entrez votre requête de recherche dans la zone. Assurez-vous de consulter le fichier d’aide parce que la recherche est assez avancée.', 'search_error' => 'Erreur lors de la recherche', 'search_searching' => 'Recherche ...', + 'search_results' => 'Search results', // repeat frequencies: 'repeat_freq_yearly' => 'annuellement', @@ -151,11 +152,11 @@ return [ // export data: 'import_and_export' => 'Importer et Exporter', 'export_data' => 'Exporter les données', + 'export_and_backup_data' => 'Export and backup', 'export_data_intro' => 'À des fins de sauvegarde, lors de la migration vers un autre système ou lors de la migration sur une autre installation de Firefly III.', 'export_format' => 'Format d\'export', 'export_format_csv' => 'Valeurs séparées par des virgules (fichier CSV)', 'export_format_mt940' => 'Format compatible MT940', - 'export_included_accounts' => 'Exporter les opérations depuis ces comptes', 'include_old_uploads_help' => 'Firefly III ne détruit pas les fichier CSV originaux que vous avez déjà importé dans le passé. Vous pouvez les inclure dans votre exportation.', 'do_export' => 'Exporter', 'export_status_never_started' => 'L’exportation n’a pas encore commencé', @@ -170,8 +171,6 @@ return [ 'export_status_collected_attachments' => 'Toutes vos pièces jointes sont collectées !', 'export_status_collecting_old_uploads' => 'Tous vos précédent upload sont en cours de collecte...', 'export_status_collected_old_uploads' => 'Tous vos précédent upload sont collectés !', - 'export_status_creating_config_file' => 'Création d’un fichier de configuration...', - 'export_status_created_config_file' => 'Fichier de configuration créé !', 'export_status_creating_zip_file' => 'Création d’un fichier zip...', 'export_status_created_zip_file' => 'Fichier zip créé!', 'export_status_finished' => 'L\'export s\'est terminé avec succès ! Yay !', @@ -274,9 +273,9 @@ return [ 'rule_trigger_description_is_choice' => 'La description est..', 'rule_trigger_description_is' => 'La description est ":trigger_value"', 'rule_trigger_budget_is_choice' => 'Le budget est..', - 'rule_trigger_budget_is' => 'Budget is ":trigger_value"', + 'rule_trigger_budget_is' => 'Le budget est ":trigger_value"', 'rule_trigger_tag_is_choice' => '(A) le tag est..', - 'rule_trigger_tag_is' => 'A tag is ":trigger_value"', + 'rule_trigger_tag_is' => 'Un tag est ":trigger_value"', 'rule_trigger_has_attachments_choice' => 'À au moins autant de pièces jointes', 'rule_trigger_has_attachments' => 'À au moins :trigger_value pièce(s) jointe(s)', 'rule_trigger_store_journal' => 'Lorsqu’une transaction est créée', @@ -287,12 +286,12 @@ return [ 'rule_trigger_has_any_category' => 'La transaction comporte une catégorie', 'rule_trigger_has_no_budget_choice' => 'N\'a pas de budget', 'rule_trigger_has_no_budget' => 'La transaction n\'a pas de budget', - 'rule_trigger_has_any_budget_choice' => 'Has a (any) budget', - 'rule_trigger_has_any_budget' => 'Transaction has a (any) budget', + 'rule_trigger_has_any_budget_choice' => 'A un (des) budget', + 'rule_trigger_has_any_budget' => 'La transaction a un (des) budget', 'rule_trigger_has_no_tag_choice' => 'N\'a pas de tag(s)', 'rule_trigger_has_no_tag' => 'La transaction n\'a pas de tag(s)', - 'rule_trigger_has_any_tag_choice' => 'Has one or more (any) tags', - 'rule_trigger_has_any_tag' => 'Transaction has one or more (any) tags', + 'rule_trigger_has_any_tag_choice' => 'Dispose d\'un ou de plusieurs tags', + 'rule_trigger_has_any_tag' => 'La transaction comporte un ou plusieurs tags', 'rule_action_set_category' => 'Définir la catégorie à ":action_value"', 'rule_action_clear_category' => 'Supprimer la catégorie', 'rule_action_set_budget' => 'Définir le budget à ":action_value"', @@ -317,6 +316,8 @@ return [ 'rule_action_set_source_account' => 'Définir le compte source à :action_value', 'rule_action_set_destination_account_choice' => 'Définissez le compte de destination pour...', 'rule_action_set_destination_account' => 'Définissez le compte de destination pour :action_value', + 'rules_have_read_warning' => 'Have you read the warning?', + 'apply_rule_warning' => 'Warning: running a rule(group) on a large selection of transactions could take ages, and it could time-out. If it does, the rule(group) will only be applied to an unknown subset of your transactions. This might leave your financial administration in tatters. Please be careful.', // tags 'store_new_tag' => 'Créer un nouveau tag', @@ -326,6 +327,7 @@ return [ 'location' => 'Emplacement', 'without_date' => 'Sans date', 'result' => 'Résultat', + 'sums_apply_to_range' => 'All sums apply to the selected range', // preferences 'pref_home_screen_accounts' => 'Comptes de l’écran d’accueil', @@ -414,6 +416,15 @@ return [ '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 : no.', 'secure_pw_short' => 'Si vous venez d\'entrer le mot de passe que vous utilisez toujours : S\'il vous plaît, oui.', + 'personal_access_token' => 'Personal access token', + 'explain_access_token' => 'You need this token to perform command line options, such as importing or exporting data. Without it, such sensitive commands will not work. Do not share your access token. Nobody will ask you for this token, not even me. If you fear you lost this, or when you\'re paranoid, regenerate this token using the button.', + 'regenerate_access_token' => 'Regenerate access token', + 'token_regenerated' => 'A new token was generated', + 'change_your_email' => 'Change your email address', + 'email_verification' => 'An email message will be sent to your old AND new email address. For security purposes, you will not be able to login until you verify your new email address. If you are unsure if your Firefly III installation is capable of sending email, please do not use this feature. If you are an administrator, you can test this in the Administration.', + 'email_changed_logout' => 'Until you verify your email address, you cannot login.', + 'login_with_new_email' => 'You can now login with your new email address.', + 'login_with_old_email' => 'You can now login with your old email address again.', // attachments @@ -447,7 +458,6 @@ return [ 'convert_options_DepositWithdrawal' => 'Convertir un dépôt en retrait', 'convert_options_TransferWithdrawal' => 'Convertir un transfert en retrait', 'convert_options_TransferDeposit' => 'Convertir un transfert en dépôt', - 'transaction_journal_convert_options' => 'Convertir cette transaction', 'convert_Withdrawal_to_deposit' => 'Convertir ce retrait en dépôt', 'convert_Withdrawal_to_transfer' => 'Convertir ce retrait en transfert', 'convert_Deposit_to_withdrawal' => 'Convertir ce dépôt en retrait', @@ -467,7 +477,7 @@ return [ 'converted_to_Withdrawal' => 'La transaction a été convertie en retrait', 'converted_to_Deposit' => 'La transaction a été convertie en dépôt', 'converted_to_Transfer' => 'La transaction a été convertie en transfert', - + 'invalid_convert_selection' => 'The account you have selected is already used in this transaction or does not exist.', // create new stuff: 'create_new_withdrawal' => 'Creer un nouveau retrait', @@ -517,6 +527,11 @@ return [ 'update_budget' => 'Mettre à jour le budget', 'update_budget_amount_range' => 'Mettre à jour le montant disponible (prévu) entre le :start et le :end', 'budget_period_navigator' => 'Navigateur d\'époque', + 'info_on_available_amount' => 'What do I have available?', + 'available_amount_indication' => 'Use these amounts to get an indication of what your total budget could be.', + 'suggested' => 'Suggested', + 'average_between' => 'Average between :start and :end', + // bills: 'matching_on' => 'Correspond à', @@ -625,7 +640,7 @@ return [ 'mass_deleted_transactions_success' => 'Montant des opérations supprimées : :amount.', 'mass_edited_transactions_success' => 'Montant des opérations mises à jour : :amount', 'opt_group_no_account_type' => '(aucun type de compte)', - 'opt_group_defaultAsset' => 'Default asset accounts', + 'opt_group_defaultAsset' => 'Comptes d\'actifs par défaut', 'opt_group_savingAsset' => 'Comptes d\'épargne', 'opt_group_sharedAsset' => 'Comptes d\'actifs partagés', 'opt_group_ccAsset' => 'Cartes de crédit', @@ -647,10 +662,8 @@ return [ 'newWithdrawal' => 'Nouvelle dépense', 'newDeposit' => 'Nouveau dépôt', 'newTransfer' => 'Nouveau transfert', - 'moneyIn' => 'Argent entrant', - 'moneyOut' => 'Argent sortant', - 'billsToPay' => 'Factures à payer', - 'billsPaid' => 'Factures payées', + 'bills_to_pay' => 'Bills to pay', + 'per_day' => 'Per day', // menu and titles, should be recycled as often as possible: 'currency' => 'Devise', @@ -827,7 +840,7 @@ return [ 'add_money_to_piggy_title' => 'Ajouter de l’argent à la tirelire ":name"', 'remove_money_from_piggy_title' => 'Retirer l’argent de la tirelire ":name"', 'add' => 'Ajouter', - 'no_money_for_piggy' => 'You have no money to put in this piggy bank.', + 'no_money_for_piggy' => 'Vous n\'avez pas d\'argent à placer dans cette tirelire.', 'remove' => 'Enlever', 'max_amount_add' => 'Le montant maximum que vous pouvez ajouter est', @@ -850,9 +863,6 @@ return [ 'removed_amount_from_piggy' => 'Supprimé :amount du ":name"', // tags - 'regular_tag' => 'Juste une balise ordinaire.', - 'balancing_act' => 'Un tag prend au maximum deux opérations : une dépense et un transfert. Ils s\'équilibreront mutuellement.', - 'advance_payment' => 'Un tag accepte une dépense et un nombre quelconque de dépôts visant à rembourser la dépense originale.', 'delete_tag' => 'Supprimer le tag ":tag"', 'deleted_tag' => 'Tag ":tag" supprimé', 'new_tag' => 'Créer un nouveau tag', @@ -891,61 +901,75 @@ return [ 'block_code_bounced' => 'Rebond des messages emails', 'block_code_expired' => 'Compte démo expiré', 'no_block_code' => 'Aucune raison pour le blocage ou utilisateur non bloqué', + 'block_code_email_changed' => 'User has not yet confirmed new email address', + 'admin_update_email' => 'Contrary to the profile page, the user will NOT be notified their email address has changed!', + 'update_user' => 'Update user', + 'updated_user' => 'User data has been changed.', + 'delete_user' => 'Delete user :email', + 'user_deleted' => 'The user has been deleted', + 'send_test_email' => 'Send test email message', + 'send_test_email_text' => 'To see if your installation is capable of sending email, please press this button. You will not see an error here (if any), the log files will reflect any errors. You can press this button as many times as you like. There is no spam control. The message will be sent to :email and should arrive shortly.', + 'send_message' => 'Send message', + 'send_test_triggered' => 'Test was triggered. Check your inbox and the log files.', + // links 'journal_link_configuration' => 'Configuration des liens de transaction', 'create_new_link_type' => 'Créer un nouveau type de lien', - 'store_new_link_type' => 'Store new link type', - 'update_link_type' => 'Update link type', - 'edit_link_type' => 'Edit link type ":name"', - 'updated_link_type' => 'Updated link type ":name"', - 'delete_link_type' => 'Delete link type ":name"', - 'deleted_link_type' => 'Deleted link type ":name"', - 'stored_new_link_type' => 'Store new link type ":name"', - 'cannot_edit_link_type' => 'Cannot edit link type ":name"', - 'link_type_help_name' => 'Ie. "Duplicates"', - 'link_type_help_inward' => 'Ie. "duplicates"', - 'link_type_help_outward' => 'Ie. "is duplicated by"', - 'save_connections_by_moving' => 'Save the link between these transaction(s) by moving them to another link type:', - 'do_not_save_connection' => '(do not save connection)', - 'link_transaction' => 'Link transaction', - 'link_to_other_transaction' => 'Link this transaction to another transaction', - 'select_transaction_to_link' => 'Select a transaction to link this transaction to', + 'store_new_link_type' => 'Enregistrer un nouveau type de lien', + 'update_link_type' => 'Mettre à jour le type de lien', + 'edit_link_type' => 'Modifier le type de lien ":name"', + 'updated_link_type' => 'Type de lien mis à jour ":name"', + 'delete_link_type' => 'Supprimer le type de lien ":name"', + 'deleted_link_type' => 'Type de lien supprimé ":name"', + 'stored_new_link_type' => 'Enregistrer le nouveau type de lien ":name"', + 'cannot_edit_link_type' => 'Impossible d\'éditer le type de lien ":name"', + 'link_type_help_name' => 'C\'est à dire "Doublons"', + 'link_type_help_inward' => 'C\'est à dire "doublons"', + 'link_type_help_outward' => 'C\'est à dire "est dupliqué par"', + 'save_connections_by_moving' => 'Enregistrez le lien entre ces transaction(s) en les déplaçant vers un autre type de lien :', + 'do_not_save_connection' => '(ne pas enregistrer la connexion)', + 'link_transaction' => 'Lien transaction', + 'link_to_other_transaction' => 'Lier cette transaction à une autre transaction', + 'select_transaction_to_link' => 'Sélectionnez une transaction pour lier cette transaction à', 'this_transaction' => 'Cette transaction', 'transaction' => 'Transaction', 'comments' => 'Commentaires', - 'to_link_not_found' => 'If the transaction you want to link to is not listed, simply enter its ID.', - 'invalid_link_data' => 'Invalid link type selected. Cannot link transaction.', + 'to_link_not_found' => 'Si la transaction que vous souhaitez lier n\'est pas listée, entrez simplement son identifiant.', + 'invalid_link_selection' => 'Impossible de lier ces transactions', 'journals_linked' => 'Ces transactions sont liées.', 'journals_error_linked' => 'Ces transactions sont déjà liées.', - 'journal_links' => 'Transaction links', - 'this_withdrawal' => 'This withdrawal', - 'this_deposit' => 'This deposit', - 'this_transfer' => 'This transfer', - 'overview_for_link' => 'Overview for link type ":name"', - 'delete_journal_link' => 'Delete the link between :source and :destination', - 'deleted_link' => 'Deleted link', - '1_outward' => 'lié à', - '2_outward' => 'remboursements (partiellement)', - '3_outward' => '(partially) pays for', - '4_outward' => '(partially) reimburses', - '1_inward' => 'relates to', - '2_inward' => 'is (partially) refunded by', - '3_inward' => 'is (partially) paid for by', - '4_inward' => 'is (partially) reimbursed by', + 'journal_links' => 'Liens de transaction', + 'this_withdrawal' => 'Ce retrait', + 'this_deposit' => 'Ce dépôt', + 'this_transfer' => 'Ce transfert', + 'overview_for_link' => 'Aperçu pour le type de lien ":name"', + 'delete_journal_link' => 'Supprimez le lien entre :source et :destination', + 'deleted_link' => 'Lien supprimé', + + // link translations: + 'relates to_inward' => 'relates to', + 'is (partially) refunded by_inward' => 'is (partially) refunded by', + 'is (partially) paid for by_inward' => 'is (partially) paid for by', + 'is (partially) reimbursed by_inward' => 'is (partially) reimbursed by', + 'relates to_outward' => 'relates to', + '(partially) refunds_outward' => '(partially) refunds', + '(partially) pays for_outward' => '(partially) pays for', + '(partially) reimburses_outward' => '(partially) reimburses', // split a transaction: - 'splits' => 'Splits', - 'add_another_split' => 'Add another split', - 'split-transactions' => 'Split transactions', - 'do_split' => 'Do a split', - 'split_this_withdrawal' => 'Split this withdrawal', - 'split_this_deposit' => 'Split this deposit', - 'split_this_transfer' => 'Split this transfer', - 'cannot_edit_multiple_source' => 'You cannot edit splitted transaction #:id with description ":description" because it contains multiple source accounts.', - 'cannot_edit_multiple_dest' => 'You cannot edit splitted transaction #:id with description ":description" because it contains multiple destination accounts.', - 'cannot_edit_opening_balance' => 'You cannot edit the opening balance of an account.', - 'no_edit_multiple_left' => 'You have selected no valid transactions to edit.', + 'splits' => 'Scinder', + 'add_another_split' => 'Ajouter une autre fraction', + 'split-transactions' => 'Opérations scindées', + 'do_split' => 'Faire une fraction', + 'split_this_withdrawal' => 'Scinder ce retrait', + 'split_this_deposit' => 'Scinder ce dépôt', + '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_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' => 'Cannot convert a split transaction', // import bread crumbs and titles: 'import' => 'Import', @@ -954,92 +978,93 @@ return [ // import index page: 'import_index_title' => 'Importer des données dans Firefly III', 'import_index_sub_title' => 'Index', - 'import_general_index_intro' => 'Welcome to Firefly\'s import routine. There are a few ways of importing data into Firefly III, displayed here as buttons.', - 'import_index_intro' => 'This routine will help you import files from your bank into Firefly III. Please check out the help pages in the top right corner.', + 'import_general_index_intro' => 'Bienvenue dans la routine d\'importation de Firefly. Il existe différentes façons d\'importer des données dans Firefly III, affichées ici sous forme de boutons.', + 'import_index_intro' => 'Cette routine vous aidera à importer des fichiers de votre banque dans Firefly III. Consultez les pages d\'aide en haut à droite.', 'import_index_file' => 'Sélectionnez votre fichier', - 'import_index_config' => 'If you have previously imported data into Firefly III, you may have a configuration file, which will pre-set configuration values for you. For some banks, other users have kindly provided their configuration file.', - 'import_index_type' => 'Select the type of file you will upload', - 'import_index_start' => 'Start importing', + 'import_index_config' => 'Si vous avez précédemment importé des données dans Firefly III, vous pouvez avoir un fichier de configuration qui définira les valeurs de configuration. Pour certaines banques, les autres utilisateurs ont bien voulu fournir leur fichier configuration.', + 'import_index_type' => 'Sélectionnez le type de fichier que vous allez télécharger', + 'import_index_start' => 'Démarrer l\'importation', + 'import_file' => 'Import a file', // supported file types: - 'import_file_type_csv' => 'CSV (comma separated values)', + 'import_file_type_csv' => 'CSV (valeurs séparées par des virgules)', // import configuration routine: - 'import_config_sub_title' => 'Set up your import file', - 'import_config_bread_crumb' => 'Set up your import file', + 'import_config_sub_title' => 'Configurez votre fichier d\'importation', + 'import_config_bread_crumb' => 'Configurez votre fichier d\'importation', // import status page: - 'import_status_bread_crumb' => 'Import status', - 'import_status_sub_title' => 'Import status', - 'import_status_wait_title' => 'Please hold...', - 'import_status_wait_text' => 'This box will disappear in a moment.', - 'import_status_ready_title' => 'Import is ready to start', - 'import_status_ready_text' => 'The import is ready to start. All the configuration you needed to do has been done. Please download the configuration file. It will help you with the import should it not go as planned. To actually run the import, you can either execute the following command in your console, or run the web-based import. Depending on your configuration, the console import will give you more feedback.', - 'import_status_ready_config' => 'Download configuration', - 'import_status_ready_start' => 'Start the import', - 'import_status_ready_share' => 'Please consider downloading your configuration and sharing it at the import configuration center. This will allow other users of Firefly III to import their files more easily.', - 'import_status_running_title' => 'The import is running', - 'import_status_running_placeholder' => 'Please hold for an update...', - 'import_status_errors_title' => 'Errors during the import', - 'import_status_errors_single' => 'An error has occured during the import. It does not appear to be fatal.', - 'import_status_errors_multi' => 'Some errors occured during the import. These do not appear to be fatal.', - 'import_status_fatal_title' => 'A fatal error occurred', - 'import_status_fatal_text' => 'A fatal error occurred, which the import-routine cannot recover from. Please see the explanation in red below.', - 'import_status_fatal_more' => 'If the error is a time-out, the import will have stopped half-way. For some server configurations, it is merely the server that stopped while the import keeps running in the background. To verify this, check out the log files. If the problem persists, consider importing over the command line instead.', - 'import_status_finished_title' => 'Import routine finished', - 'import_status_finished_text' => 'The import routine has imported your file.', - 'import_status_finished_job' => 'The transactions imported can be found in tag :tag.', - 'import_with_key' => 'Import with key \':key\'', + 'import_status_bread_crumb' => 'Statut d\'importation', + 'import_status_sub_title' => 'Statut d\'importation', + 'import_status_wait_title' => 'Veuillez patienter...', + 'import_status_wait_text' => 'Cette boîte disparaîtra dans un instant.', + 'import_status_ready_title' => 'L\'importation est prête à démarrer', + 'import_status_ready_text' => 'L\'importation est prête à démarrer. Toute la configuration que vous aviez à faire a été effectuée. Téléchargez le fichier de configuration. Cela vous aidera avec l\'importation si cela ne fonctionnait pas comme prévu. Pour exécuter l\'importation, vous pouvez soit exécuter la commande suivante dans votre console, soit exécuter l\'importation basée sur le Web. Selon votre configuration, l\'importation de la console vous donnera plus de détails.', + 'import_status_ready_config' => 'Télécharger la configuration', + 'import_status_ready_start' => 'Démarrer l\'importation', + 'import_status_ready_share' => 'Veuillez envisager de télécharger votre configuration et de la partager au centre de configuration d\'import. Cela permettra à d\'autres utilisateurs de Firefly III d\'importer leurs fichiers plus facilement.', + 'import_status_running_title' => 'L\'importation est en cours d\'exécution', + 'import_status_running_placeholder' => 'Attendez pour une mise à jour ...', + 'import_status_errors_title' => 'Erreurs lors de l\'importation', + 'import_status_errors_single' => 'Une erreur est survenue lors de l\'importation. Cela ne semble pas être fatal.', + 'import_status_errors_multi' => 'Certaines erreurs sont survenues lors de l\'importation. Ceux-ci ne semblent pas être fatal.', + 'import_status_fatal_title' => 'Une erreur fatale est survenue', + 'import_status_fatal_text' => 'Une erreur fatale est survenue, que l\'importation-routine ne peut pas récupérer. Voir l\'explication en rouge ci-dessous.', + 'import_status_fatal_more' => 'Si l\'erreur est un time-out, l\'importation sera arrêtée à mi-chemin. Pour certaines configurations de serveur, ce n\'est que le serveur qui s\'est arrêté alors que l\'importation continue de fonctionner en arrière-plan. Pour vérifier cela, consultez les fichiers journaux. Si le problème persiste, envisagez d\'importer plutôt par la ligne de commande.', + 'import_status_finished_title' => 'La routine d\'importation est terminée', + 'import_status_finished_text' => 'La routine d\'importation a importé votre fichier.', + 'import_status_finished_job' => 'Les transactions importées se trouvent dans la balise :tag.', + 'import_status_job_running' => 'The import is running...', + 'import_with_key' => 'Importer avec la touche \':key\'', // sandstorm.io errors and messages: - 'sandstorm_not_available' => 'This function is not available when you are using Firefly III within a Sandstorm.io environment.', + 'sandstorm_not_available' => 'Cette fonction n\'est pas disponible lorsque vous utilisez Firefly III dans un environnement Sandstorm.io.', // empty lists? no objects? instructions: - 'no_transactions_in_period' => 'There are no transactions in this period.', - 'no_accounts_title_asset' => 'Let\'s create an asset account!', - 'no_accounts_intro_asset' => 'You have no asset accounts yet. Asset accounts are your main accounts: your checking account, savings account, shared account or even your credit card.', - 'no_accounts_imperative_asset' => 'To start using Firefly III you must create at least one asset account. Let\'s do so now:', - 'no_accounts_create_asset' => 'Create an asset account', - 'no_accounts_title_expense' => 'Let\'s create an expense account!', - 'no_accounts_intro_expense' => 'You have no expense accounts yet. Expense accounts are the places where you spend money, such as shops and supermarkets.', - 'no_accounts_imperative_expense' => 'Expense accounts are created automatically when you create transactions, but you can create one manually too, if you want. Let\'s create one now:', - 'no_accounts_create_expense' => 'Create an expense account', - 'no_accounts_title_revenue' => 'Let\'s create a revenue account!', - 'no_accounts_intro_revenue' => 'You have no revenue accounts yet. Revenue accounts are the places where you receive money from, such as your employer.', - 'no_accounts_imperative_revenue' => 'Revenue accounts are created automatically when you create transactions, but you can create one manually too, if you want. Let\'s create one now:', - 'no_accounts_create_revenue' => 'Create a revenue account', - 'no_budgets_title_default' => 'Let\'s create a budget', - 'no_budgets_intro_default' => 'You have no budgets yet. Budgets are used to organise your expenses into logical groups, which you can give a soft-cap to limit your expenses.', - 'no_budgets_imperative_default' => 'Budgets are the basic tools of financial management. Let\'s create one now:', - 'no_budgets_create_default' => 'Create a budget', - 'no_categories_title_default' => 'Let\'s create a category!', - 'no_categories_intro_default' => 'You have no categories yet. Categories are used to fine tune your transactions and label them with their designated category.', - 'no_categories_imperative_default' => 'Categories are created automatically when you create transactions, but you can create one manually too. Let\'s create one now:', - 'no_categories_create_default' => 'Create a category', - 'no_tags_title_default' => 'Let\'s create a tag!', - 'no_tags_intro_default' => 'You have no tags yet. Tags are used to fine tune your transactions and label them with specific keywords.', - 'no_tags_imperative_default' => 'Tags are created automatically when you create transactions, but you can create one manually too. Let\'s create one now:', + 'no_accounts_title_asset' => 'Nous allons créer un compte d’actif !', + 'no_accounts_intro_asset' => 'Vous n\'avez pas encore de compte d\'actif. Les comptes d\'actifs sont vos comptes principaux : votre compte courant, votre compte d\'épargne, votre compte partagé ou même votre carte de crédit.', + 'no_accounts_imperative_asset' => 'Pour commencer à utiliser Firefly III, vous devez créer au moins un compte d\'actif. Faisons-le maintenant :', + 'no_accounts_create_asset' => 'Créer un compte d\'actif', + 'no_accounts_title_expense' => 'Nous allons créer un compte de dépenses !', + 'no_accounts_intro_expense' => 'Vous n\'avez pas encore de compte de dépenses. Les comptes de dépenses sont les endroits où vous dépensez, comme les magasins et les supermarchés.', + 'no_accounts_imperative_expense' => 'Les comptes de dépenses sont créés automatiquement lorsque vous créez des transactions, mais vous pouvez en créer une manuellement, si vous le souhaitez. Nous allons en créer un maintenant :', + 'no_accounts_create_expense' => 'Créer un compte de dépenses', + 'no_accounts_title_revenue' => 'Nous allons créer un compte de recettes !', + 'no_accounts_intro_revenue' => 'Vous n\'avez pas encore de compte de revenus. Les comptes de revenus sont les endroits où vous recevez de l\'argent, comme votre employeur.', + 'no_accounts_imperative_revenue' => 'Les comptes de revenus sont créés automatiquement lorsque vous créez des transactions, mais vous pouvez en créer une manuellement, si vous le souhaitez. Nous allons en créer un maintenant :', + 'no_accounts_create_revenue' => 'Créer un compte de revenus', + 'no_budgets_title_default' => 'Nous allons créer un budget', + 'no_budgets_intro_default' => 'Vous n\'avez pas encore de budget. Les budgets sont utilisés pour organiser vos dépenses dans des groupes logiques, auxquelles vous pouvez donner des plafonds pour limiter vos dépenses.', + 'no_budgets_imperative_default' => 'Les budgets sont les outils de base de la gestion financière. Nous allons en créer un maintenant :', + 'no_budgets_create_default' => 'Créer un budget', + 'no_categories_title_default' => 'Nous allons créer une catégorie !', + 'no_categories_intro_default' => 'Vous n\'avez pas encore de catégories. Les catégories sont utilisées pour affiner vos transactions et les étiqueter avec leur catégorie désignée.', + 'no_categories_imperative_default' => 'Les catégories sont créées automatiquement lorsque vous créez des transactions, mais vous pouvez en créer une manuellement. Nous allons en créer une maintenant :', + 'no_categories_create_default' => 'Créer une catégorie', + 'no_tags_title_default' => 'Nous allons créer un tag !', + 'no_tags_intro_default' => 'Vous n\'avez pas encore de tags. Les tags sont utilisées pour affiner vos transactions et les étiqueter avec des mots-clés spécifiques.', + 'no_tags_imperative_default' => 'Les tags sont créés automatiquement lorsque vous créez des transactions, mais vous pouvez créer un manuellement trop. Nous allons en créer un maintenant :', 'no_tags_create_default' => 'Créer une étiquette', - 'no_transactions_title_withdrawal' => 'Let\'s create an expense!', - 'no_transactions_intro_withdrawal' => 'You have no expenses yet. You should create expenses to start managing your finances.', - 'no_transactions_imperative_withdrawal' => 'Have you spent some money? Then you should write it down:', - 'no_transactions_create_withdrawal' => 'Create an expense', - 'no_transactions_title_deposit' => 'Let\'s create some income!', - 'no_transactions_intro_deposit' => 'You have no recorded income yet. You should create income entries to start managing your finances.', - 'no_transactions_imperative_deposit' => 'Have you received some money? Then you should write it down:', - 'no_transactions_create_deposit' => 'Create a deposit', - 'no_transactions_title_transfers' => 'Let\'s create a transfer!', - 'no_transactions_intro_transfers' => 'You have no transfers yet. When you move money between asset accounts, it is recorded as a transfer.', - 'no_transactions_imperative_transfers' => 'Have you moved some money around? Then you should write it down:', - 'no_transactions_create_transfers' => 'Create a transfer', - 'no_piggies_title_default' => 'Let\'s create a piggy bank!', - 'no_piggies_intro_default' => 'You have no piggy banks yet. You can create piggy banks to divide your savings and keep track of what you\'re saving up for.', - 'no_piggies_imperative_default' => 'Do you have things you\'re saving money for? Create a piggy bank and keep track:', - 'no_piggies_create_default' => 'Create a new piggy bank', - 'no_bills_title_default' => 'Let\'s create a bill!', - 'no_bills_intro_default' => 'You have no bills yet. You can create bills to keep track of regular expenses, like your rent of insurance.', - 'no_bills_imperative_default' => 'Do you have such regular bills? Create a bill and keep track of your payments:', - 'no_bills_create_default' => 'Create a bill', + 'no_transactions_title_withdrawal' => 'Nous allons créer une dépense !', + 'no_transactions_intro_withdrawal' => 'Vous n\'avez pas encore de dépenses. Vous devriez créer des dépenses pour commencer à gérer vos finances.', + 'no_transactions_imperative_withdrawal' => 'Avez-vous passé de l’argent ? Alors vous devriez l’écrire :', + 'no_transactions_create_withdrawal' => 'Créer une dépense', + 'no_transactions_title_deposit' => 'Nous allons créer un revenu !', + 'no_transactions_intro_deposit' => 'Vous n\'avez pas encore enregistré de revenus. Vous devriez créer des entrées de revenus pour commencer à gérer vos finances.', + 'no_transactions_imperative_deposit' => 'Est-ce que vous avez reçu de l’argent ? Alors vous devriez l’écrire :', + 'no_transactions_create_deposit' => 'Créer un dépôt', + 'no_transactions_title_transfers' => 'Nous allons créer un transfert !', + 'no_transactions_intro_transfers' => 'Vous n\'avez pas encore de transferts. Lorsque vous transférez de l\'argent entre les comptes d\'actifs, c\'est enregistré comme un transfert.', + 'no_transactions_imperative_transfers' => 'Avez vous déplacée de l’argent ? Alors vous devriez l’écrire :', + 'no_transactions_create_transfers' => 'Créer un transfert', + 'no_piggies_title_default' => 'Nous allons créer une tirelire !', + 'no_piggies_intro_default' => 'Vous n\'avez encore pas de tirelire. Vous pouvez créer des tirelires pour diviser vos économies et garder une trace de ce que vous économisez.', + 'no_piggies_imperative_default' => 'Avez-vous des choses pour lesquelles vous économisez de l\'argent ? Créer une tirelire et suivez-là :', + 'no_piggies_create_default' => 'Créer une nouvelle tirelire', + 'no_bills_title_default' => 'Nous allons créer une facture !', + 'no_bills_intro_default' => 'Vous n\'avez pas encore de factures. Vous pouvez créer des factures pour suivre les dépenses ordinaires, comme votre loyer d\'assurance.', + 'no_bills_imperative_default' => 'Avez-vous des factures régulières ? Créez une facture et suivez vos paiements :', + 'no_bills_create_default' => 'Créer une facture', ]; diff --git a/resources/lang/fr_FR/form.php b/resources/lang/fr_FR/form.php index 8fbad6245f..9397f238af 100644 --- a/resources/lang/fr_FR/form.php +++ b/resources/lang/fr_FR/form.php @@ -30,13 +30,10 @@ return [ 'currency_id' => 'Devise', 'attachments' => 'Documents joints', 'journal_amount' => 'Montant', - 'journal_asset_source_account' => 'Compte d’actif (source)', 'journal_source_account_name' => 'Compte de recettes (source)', 'journal_source_account_id' => 'Compte d’actif (source)', 'BIC' => 'Code BIC', 'verify_password' => 'Vérifiez la sécurité du mot de passe', - 'account_from_id' => 'Compte d\'origine', - 'account_to_id' => 'Compte de destination', 'source_account' => 'Compte d\'origine', 'destination_account' => 'Compte destinataire', 'journal_destination_account_id' => 'Compte d’actif (destination)', @@ -53,7 +50,6 @@ return [ 'tagMode' => 'Mode tag', 'tagPosition' => 'Emplacement du tag', 'virtualBalance' => 'Solde virtuel', - 'longitude_latitude' => 'Emplacement', 'targetamount' => 'Montant cible', 'accountRole' => 'Rôle du compte', 'openingBalanceDate' => 'Date du solde initial', @@ -68,12 +64,13 @@ return [ 'revenue_account' => 'Compte de recettes', 'decimal_places' => 'Chiffres après la virgule', 'exchange_rate_instruction' => 'Devises étrangères', - 'exchanged_amount' => 'Montant échangé', 'source_amount' => 'Montant (source)', 'destination_amount' => 'Montant (destination)', 'native_amount' => 'Montant natif', + 'new_email_address' => 'New email address', + 'verification' => 'Verification', + 'api_key' => 'API key', - 'revenue_account_source' => 'Compte de recettes (source)', 'source_account_asset' => 'Compte source (compte d\'actif)', 'destination_account_expense' => 'Compte de destination (compte de dépenses)', 'destination_account_asset' => 'Compte de destination (compte d’actif)', @@ -100,7 +97,7 @@ return [ 'code' => 'Code', 'iban' => 'Numéro IBAN', 'accountNumber' => 'N° de compte', - 'creditCardNumber' => 'Credit card number', + 'creditCardNumber' => 'Numéro de carte de crédit', 'has_headers' => 'Entêtes ', 'date_format' => 'Format de la date', 'specifix' => 'Banque - ou déposer des corrections spécifiques', @@ -111,7 +108,6 @@ return [ 'add_new_withdrawal' => 'Ajouter un nouveau retrait', 'add_new_deposit' => 'Ajouter un nouveau dépôt', 'add_new_transfer' => 'Ajouter un nouveau transfert', - 'noPiggybank' => '(aucun tirelire)', 'title' => 'Titre', 'notes' => 'Notes', 'filename' => 'Nom du fichier', @@ -137,6 +133,8 @@ return [ 'delete_rule' => 'Supprimer la règle ":title"', 'delete_rule_group' => 'Supprimer le groupe de filtres ":title"', 'delete_link_type' => 'Supprimer le type de lien ":name"', + 'delete_user' => 'Delete user ":email"', + 'user_areYouSure' => 'If you delete user ":email", everything will be gone. There is no undo, undelete or anything. If you delete yourself, you will lose access to this instance of 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" ?', 'bill_areYouSure' => 'Êtes-vous sûr de vouloir supprimer la facture nommée ":name" ?', @@ -174,7 +172,6 @@ return [ // admin 'domain' => 'Domaine', 'single_user_mode' => 'Mode utilisateur unique', - 'must_confirm_account' => 'Les nouveaux utilisateurs doivent activer le compte', 'is_demo_site' => 'Est un site de démonstration', @@ -194,7 +191,7 @@ return [ 'payment_date' => 'Date de paiement', 'invoice_date' => 'Date de facturation', 'internal_reference' => 'Référence interne', - - 'inward' => 'Description vers l’intérieur', - 'outward' => 'Description de l’extérieur', + 'inward' => 'Description vers l’intérieur', + 'outward' => 'Description de l’extérieur', + 'rule_group_id' => 'Rule group', ]; diff --git a/resources/lang/fr_FR/intro.php b/resources/lang/fr_FR/intro.php index 0999619431..938a6b7cbf 100644 --- a/resources/lang/fr_FR/intro.php +++ b/resources/lang/fr_FR/intro.php @@ -31,6 +31,7 @@ return [ 'budgets_index_navigate_periods' => 'Navigate through periods to easily set budgets ahead of time.', 'budgets_index_new_budget' => 'Create new budgets as you see fit.', 'budgets_index_list_of_budgets' => 'Use this table to set the amounts for each budget and see how you are doing.', + 'budgets_index_outro' => 'To learn more about budgeting, checkout the help icon in the top right corner.', // reports (index) 'reports_index_intro' => 'Use these reports to get detailed insights in your finances.', diff --git a/resources/lang/fr_FR/list.php b/resources/lang/fr_FR/list.php index 4df06cea40..f79c9fd948 100644 --- a/resources/lang/fr_FR/list.php +++ b/resources/lang/fr_FR/list.php @@ -12,78 +12,80 @@ declare(strict_types=1); */ return [ - 'buttons' => 'Boutons', - 'icon' => 'Icône', - 'id' => 'Identifiant', - 'create_date' => 'Créé le', - 'update_date' => 'Mis à jour le', - 'balance_before' => 'Solde avant', - 'balance_after' => 'Solde après', - 'name' => 'Nom', - 'role' => 'Rôle', - 'currentBalance' => 'Solde courant', - 'active' => 'Actif ?', - 'lastActivity' => 'Activité récente', - 'balanceDiff' => 'Difference solde entre :start et :end', - 'matchedOn' => 'Correspond à', - 'matchesOn' => 'Correspond à', - 'account_type' => 'Type de compte', - 'created_at' => 'Créé le', - 'new_balance' => 'Nouveau solde', - 'account' => 'Compte', - 'matchingAmount' => 'Montant', - 'lastMatch' => 'Dernière correspondance', - 'split_number' => 'Segmenter en', - 'destination' => 'Destination', - 'source' => 'Source', - 'next_expected_match' => 'Prochaine association attendue', - 'automatch' => 'Correspondance automatique ?', - 'repeat_freq' => 'Répétitions', - 'description' => 'Description', - 'amount' => 'Montant', - 'internal_reference' => 'Référence interne', - 'date' => 'Date', - 'interest_date' => 'Date des intérêts', - 'book_date' => 'Date de réservation', - 'process_date' => 'Date de traitement', - 'due_date' => 'Échéance', - 'payment_date' => 'Date de paiement', - 'invoice_date' => 'Date de facturation', - 'interal_reference' => 'Référence interne', - 'notes' => 'Notes', - 'from' => 'Depuis', - 'piggy_bank' => 'Tirelire', - 'to' => 'À', - 'budget' => 'Budget', - 'category' => 'Catégorie', - 'bill' => 'Facture', - 'withdrawal' => 'Retrait', - 'deposit' => 'Dépôt', - 'transfer' => 'Transfert', - 'type' => 'Type', - 'completed' => 'Terminé', - 'iban' => 'Numéro IBAN', - 'paid_current_period' => 'Payé cette période', - 'email' => 'E-mail', - 'registered_at' => 'Enregistré le', - 'is_activated' => 'Est activé', - 'is_blocked' => 'Est bloqué', - 'is_admin' => 'Est admin', - 'has_two_factor' => 'A 2FA', - 'blocked_code' => 'Code de blocage', - 'source_account' => 'Compte d\'origine', - 'destination_account' => 'Compte destinataire', - 'accounts_count' => 'Nombre de comptes', - 'journals_count' => 'Nombre d\'opérations', - 'attachments_count' => 'Nombre de pièces jointes', - 'bills_count' => 'Nombre de factures', - 'categories_count' => 'Nombre de catégories', - 'export_jobs_count' => 'Nombre de travaux exportés', - 'import_jobs_count' => 'Nombre de travaux importés', - 'budget_count' => 'Nombre de budgets', - 'rule_and_groups_count' => 'Nombre de règles et de groupes de règles', - 'tags_count' => 'Nombre d’étiquettes', - 'inward' => 'Description vers l’intérieur', - 'outward' => 'Description de l’extérieur', - 'number_of_transactions' => 'Nombre de transactions', + 'buttons' => 'Boutons', + 'icon' => 'Icône', + 'id' => 'Identifiant', + 'create_date' => 'Créé le', + 'update_date' => 'Mis à jour le', + 'balance_before' => 'Solde avant', + 'balance_after' => 'Solde après', + 'name' => 'Nom', + 'role' => 'Rôle', + 'currentBalance' => 'Solde courant', + 'active' => 'Actif ?', + 'lastActivity' => 'Activité récente', + 'balanceDiff' => 'Difference solde entre :start et :end', + 'matchesOn' => 'Correspond à', + 'account_type' => 'Type de compte', + 'created_at' => 'Créé le', + 'account' => 'Compte', + 'matchingAmount' => 'Montant', + 'split_number' => 'Segmenter en', + 'destination' => 'Destination', + 'source' => 'Source', + 'next_expected_match' => 'Prochaine association attendue', + 'automatch' => 'Correspondance automatique ?', + 'repeat_freq' => 'Répétitions', + 'description' => 'Description', + 'amount' => 'Montant', + 'internal_reference' => 'Référence interne', + 'date' => 'Date', + 'interest_date' => 'Date des intérêts', + 'book_date' => 'Date de réservation', + 'process_date' => 'Date de traitement', + 'due_date' => 'Échéance', + 'payment_date' => 'Date de paiement', + 'invoice_date' => 'Date de facturation', + 'interal_reference' => 'Référence interne', + 'notes' => 'Notes', + 'from' => 'Depuis', + 'piggy_bank' => 'Tirelire', + 'to' => 'À', + 'budget' => 'Budget', + 'category' => 'Catégorie', + 'bill' => 'Facture', + 'withdrawal' => 'Retrait', + 'deposit' => 'Dépôt', + 'transfer' => 'Transfert', + 'type' => 'Type', + 'completed' => 'Terminé', + 'iban' => 'Numéro IBAN', + 'paid_current_period' => 'Payé cette période', + 'email' => 'E-mail', + 'registered_at' => 'Enregistré le', + 'is_blocked' => 'Est bloqué', + 'is_admin' => 'Est admin', + 'has_two_factor' => 'A 2FA', + 'blocked_code' => 'Code de blocage', + 'source_account' => 'Compte d\'origine', + 'destination_account' => 'Compte destinataire', + 'accounts_count' => 'Nombre de comptes', + 'journals_count' => 'Nombre d\'opérations', + 'attachments_count' => 'Nombre de pièces jointes', + 'bills_count' => 'Nombre de factures', + 'categories_count' => 'Nombre de catégories', + 'export_jobs_count' => 'Nombre de travaux exportés', + 'import_jobs_count' => 'Nombre de travaux importés', + 'budget_count' => 'Nombre de budgets', + 'rule_and_groups_count' => 'Nombre de règles et de groupes de règles', + 'tags_count' => 'Nombre d’étiquettes', + 'inward' => 'Description vers l’intérieur', + 'outward' => 'Description de l’extérieur', + 'number_of_transactions' => 'Nombre de transactions', + 'total_amount' => 'Total amount', + 'sum' => 'Sum', + 'sum_excluding_transfers' => 'Sum (excluding transfers)', + 'sum_withdrawals' => 'Sum of withdrawals', + 'sum_deposits' => 'Sum of deposits', + 'sum_transfers' => 'Sum of transfers', ]; diff --git a/resources/lang/nl_NL/bank.php b/resources/lang/nl_NL/bank.php new file mode 100644 index 0000000000..ae18c976ad --- /dev/null +++ b/resources/lang/nl_NL/bank.php @@ -0,0 +1,6 @@ + '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.', +]; \ No newline at end of file diff --git a/resources/lang/nl_NL/firefly.php b/resources/lang/nl_NL/firefly.php index 40ad56db52..20cefcc943 100644 --- a/resources/lang/nl_NL/firefly.php +++ b/resources/lang/nl_NL/firefly.php @@ -83,11 +83,9 @@ return [ 'cannot_redirect_to_account' => 'Firefly III kan je niet naar de goede pagina doorsturen. Sorry!', 'sum_of_expenses' => 'Som van uitgaven', 'sum_of_income' => 'Som van inkomsten', - 'total_sum' => 'Totaalbedrag', 'spent_in_specific_budget' => 'Uitgegeven in budget ":budget"', 'sum_of_expenses_in_budget' => 'Totaal uitgegeven in budget ":budget"', 'left_in_budget_limit' => 'Nog uit te geven volgens budgettering', - 'cannot_reset_demo_user' => 'Je kan het wachtwoord van de demonstratie-account niet resetten', 'current_period' => 'Huidige periode', 'show_the_current_period_and_overview' => 'Bekijk de huidige periode en overzicht', 'pref_languages_locale' => 'Als je hier een andere taal dan Engels hebt geselecteerd, zorg er dan voor dat je besturingssysteem ook in staat is om valuta, data en bedragen in die taal weer te geven.', @@ -130,6 +128,8 @@ return [ '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.', '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.', // search 'search' => 'Zoeken', @@ -139,6 +139,7 @@ return [ 'search_box_intro' => 'Welkom bij de zoekfunctie van Firefly III. Voer je zoekopdracht in het vak. Bekijk zeker de help-pagina, want de zoekfunctie is behoorlijk geadvanceerd.', 'search_error' => 'Fout tijdens het zoeken', 'search_searching' => 'Bezig met zoeken ...', + 'search_results' => 'Zoekresultaten', // repeat frequencies: 'repeat_freq_yearly' => 'jaarlijks', @@ -151,11 +152,11 @@ return [ // export data: 'import_and_export' => 'Import en export', 'export_data' => 'Exporteren', + 'export_and_backup_data' => 'Exporteren en backup', 'export_data_intro' => 'Om te backuppen, of wanneer je naar een ander systeem verhuist.', 'export_format' => 'Exporteerformaat', 'export_format_csv' => 'Komma-gescheiden bestand (CSV)', 'export_format_mt940' => 'MT940 bestand', - 'export_included_accounts' => 'Exporteer transacties van deze rekeningen', 'include_old_uploads_help' => 'Firefly III gooit je oude geïmporteerde CSV bestanden niet weg. Je kan ze meenemen in je exportbestand.', 'do_export' => 'Exporteren', 'export_status_never_started' => 'Het exporteren is nog niet begonnen', @@ -170,8 +171,6 @@ return [ 'export_status_collected_attachments' => 'Bijlagen verzameld!', 'export_status_collecting_old_uploads' => 'Oude uploads verzamelen...', 'export_status_collected_old_uploads' => 'Oude uploads verzameld!', - 'export_status_creating_config_file' => 'Configuratiebestand maken...', - 'export_status_created_config_file' => 'Configuratiebestand gemaakt!', 'export_status_creating_zip_file' => 'Zipbestand maken...', 'export_status_created_zip_file' => 'Zipbestand gemaakt!', 'export_status_finished' => 'Klaar met exportbestand! Hoera!', @@ -317,6 +316,8 @@ return [ 'rule_action_set_source_account' => 'Verander bronrekening naar ":action_value"', 'rule_action_set_destination_account_choice' => 'Verander doelrekening naar...', 'rule_action_set_destination_account' => 'Verander doelrekening naar ":action_value"', + 'rules_have_read_warning' => 'Heb je de waarschuwing gelezen?', + 'apply_rule_warning' => 'Let op! Het kan heel lang duren voor een regel(groep) is toegepast op een grote selectie transacties. Er kan een time-out optreden. Als dat gebeurt is de regel(groep) niet toegepast op alle transacties, en dat kan je administratie behoorlijk verprutsen. Wees dus voorzichtig.', // tags 'store_new_tag' => 'Sla tag op', @@ -326,6 +327,7 @@ return [ 'location' => 'Plaats', 'without_date' => 'Zonder datum', 'result' => 'Resultaat', + 'sums_apply_to_range' => 'Alle sommen gelden voor het geselecteerde bereik', // preferences 'pref_home_screen_accounts' => 'Voorpaginarekeningen', @@ -414,6 +416,15 @@ return [ 'secure_pw_should' => 'Vinkje zetten of niet?', 'secure_pw_long_password' => 'Als je net een lang wachtwoord hebt gegenereerd met een password generator tool: nee.', 'secure_pw_short' => 'Gebruik je het wachtwoord dat je altijd gebruikt? Ja, doen!', + 'personal_access_token' => 'Persoonlijk toegangstoken', + 'explain_access_token' => 'Je hebt dit token nodig als je commando\'s op de commandline draait, zoals het invoeren of uitvoeren van data. Zonder dit token werken zulke gevoelige opdrachten niet. Deel je toegangstoken niet. Niemand zal hier naar vragen, zelfs ik niet. Als je bang bent dat-ie op straat ligt, genereer dan een nieuw token.', + 'regenerate_access_token' => 'Genereer nieuw token', + 'token_regenerated' => 'Er is een nieuw token gegenereerd', + 'change_your_email' => 'Verander je emailadres', + 'email_verification' => 'Het systeem verstuurt een mailtje naar je oude EN nieuwe emailadres. Uit veiligheidsoverwegingen ben je zometeen uitgelogd en kan je pas weer inloggen als je je emailadres hebt bevestigd. Doe dit niet als je niet zeker weet of je Firefly III installatie wel mail kan versturen. Als je een admin bent, test dit dan eerst in de administratie.', + 'email_changed_logout' => 'Je kan niet inloggen tot je je emailadres bevestigd.', + 'login_with_new_email' => 'Je kan nu inloggen met je nieuwe emailadres.', + 'login_with_old_email' => 'Je kan nu weer inloggen met je oude emailadres.', // attachments @@ -447,7 +458,6 @@ return [ 'convert_options_DepositWithdrawal' => 'Verander inkomsten in een uitgave', 'convert_options_TransferWithdrawal' => 'Verander een overschrijving in een uitgave', 'convert_options_TransferDeposit' => 'Verander een overschrijving in inkomsten', - 'transaction_journal_convert_options' => 'Verander deze transactie', 'convert_Withdrawal_to_deposit' => 'Verander deze uitgave in inkomsten', 'convert_Withdrawal_to_transfer' => 'Verander deze uitgave in een overschrijving', 'convert_Deposit_to_withdrawal' => 'Verander deze inkomsten in een uitgave', @@ -467,7 +477,7 @@ return [ 'converted_to_Withdrawal' => 'De transactie is veranderd in een uitgave', 'converted_to_Deposit' => 'De transactie is veranderd in inkomsten', 'converted_to_Transfer' => 'De transactie is veranderd in een overschrijving', - + 'invalid_convert_selection' => 'De rekening die je hebt geselecteerd wordt al gebruikt in deze transactie, of bestaat niet.', // create new stuff: 'create_new_withdrawal' => 'Nieuwe uitgave', @@ -517,6 +527,11 @@ return [ 'update_budget' => 'Budget bijwerken', 'update_budget_amount_range' => 'Update het verwacht beschikbare bedrag tussen :start en :end', 'budget_period_navigator' => 'Periodenavigator', + 'info_on_available_amount' => 'Wat heb ik beschikbaar?', + 'available_amount_indication' => 'Gebruik deze bedragen om een indruk te krijgen van wat je totale budget zou kunnen zijn.', + 'suggested' => 'Gesuggereerd', + 'average_between' => 'Gemiddelde tussen :start en :end', + // bills: 'matching_on' => 'Wordt herkend', @@ -647,10 +662,8 @@ return [ 'newWithdrawal' => 'Nieuwe uitgave', 'newDeposit' => 'Nieuwe inkomsten', 'newTransfer' => 'Nieuwe overschrijving', - 'moneyIn' => 'Inkomsten', - 'moneyOut' => 'Uitgaven', - 'billsToPay' => 'Openstaande contracten', - 'billsPaid' => 'Betaalde contracten', + 'bills_to_pay' => 'Openstaande contracten', + 'per_day' => 'Per dag', // menu and titles, should be recycled as often as possible: 'currency' => 'Valuta', @@ -850,9 +863,6 @@ return [ 'removed_amount_from_piggy' => ':amount uit ":name" gehaald', // tags - 'regular_tag' => 'Een gewone tag.', - 'balancing_act' => 'Er kunnen maar twee transacties worden getagged; een uitgaven en inkomsten. Ze balanceren elkaar.', - 'advance_payment' => 'Je kan een uitgave taggen en zoveel inkomsten om de uitgave (helemaal) te compenseren.', 'delete_tag' => 'Verwijder tag ":tag"', 'deleted_tag' => 'Tag ":tag" verwijderd', 'new_tag' => 'Maak nieuwe tag', @@ -891,6 +901,17 @@ return [ 'block_code_bounced' => 'Email kwam niet aan', 'block_code_expired' => 'Demo-account verlopen', 'no_block_code' => 'Geen reden of gebruiker niet geblokkeerd', + 'block_code_email_changed' => 'De gebruiker heeft zijn nieuwe emailadres nog niet bevestigd', + 'admin_update_email' => 'Integendeel tot de profielpagina krijgt de gebruiker hier geen notificatie van!', + 'update_user' => 'Gebruiker bijwerken', + 'updated_user' => 'Gebruikersgegevens zijn gewijzigd.', + 'delete_user' => 'Verwijder gebruiker :email', + 'user_deleted' => 'De gebruiker is verwijderd', + 'send_test_email' => 'Stuur testmail', + 'send_test_email_text' => 'Druk op deze knop om te zien of je installatie mail kan versturen. Je ziet hier geen foutmeldingen (als ze er zijn), deze vind je in de logboeken. Je kan deze knop zo vaak indrukken als je wilt. Er is geen optie die spam voorkomt. Het testbericht wordt verstuurd naar :email en zou vrij vlot aan moeten komen.', + 'send_message' => 'Verstuur bericht', + 'send_test_triggered' => 'Testmail verstuurd. Check je inbox en de logboeken.', + // links 'journal_link_configuration' => 'Instellingen voor transactiekoppelingen', 'create_new_link_type' => 'Maak nieuw koppeltype', @@ -914,7 +935,7 @@ return [ 'transaction' => 'Transactie', 'comments' => 'Opmerkingen', 'to_link_not_found' => 'Als de transactie die je wilt koppelen niet gevonden wordt, voer dan het ID in.', - 'invalid_link_data' => 'Ongeldige informatie, de transactie kan niet gekoppeld worden.', + 'invalid_link_selection' => 'Deze transacties kunnen niet worden gekoppeld', 'journals_linked' => 'De transacties zijn gekoppeld.', 'journals_error_linked' => 'Deze transacties zijn al gekoppeld.', 'journal_links' => 'Transactiekoppelingen', @@ -924,14 +945,16 @@ return [ 'overview_for_link' => 'Overzicht voor koppeltype ":name"', 'delete_journal_link' => 'Verwijder de koppeling tussen :source en :destination', 'deleted_link' => 'Koppeling verwijderd', - '1_outward' => 'is gerelateerd aan', - '2_outward' => 'is een (gedeeltelijke) terugbetaling voor', - '3_outward' => 'betaalt (deels voor)', - '4_outward' => 'vergoedt (deels)', - '1_inward' => 'is gerelateerd aan', - '2_inward' => 'wordt (deels) terugbetaald door', - '3_inward' => 'wordt (deels) betaald door', - '4_inward' => 'wordt (deels) vergoed door', + + // link translations: + 'relates to_inward' => 'gerelateerd aan', + 'is (partially) refunded by_inward' => 'wordt (deels) terugbetaald door', + 'is (partially) paid for by_inward' => 'wordt (deels) betaald door', + 'is (partially) reimbursed by_inward' => 'wordt (deels) vergoed door', + 'relates to_outward' => 'gerelateerd aan', + '(partially) refunds_outward' => 'is een (gedeeltelijke) terugbetaling voor', + '(partially) pays for_outward' => 'betaalt (deels) voor', + '(partially) reimburses_outward' => 'vergoedt (deels)', // split a transaction: @@ -946,6 +969,7 @@ return [ 'cannot_edit_multiple_dest' => 'Je kan transactie #:id met omschrijving ":description" niet wijzigen, want deze bevat meerdere doelrekeningen.', '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', // import bread crumbs and titles: 'import' => 'Import', @@ -960,6 +984,7 @@ return [ 'import_index_config' => 'Als je eerder gegevens hebt geïmporteerd in Firefly III, heb je wellicht een configuratiebestand, dat een aantal zaken alvast voor je kan instellen. Voor bepaalde banken hebben andere gebruikers uit de liefde van hun hart het benodigde configuratiebestand gedeeld.', 'import_index_type' => 'Selecteer het type bestand dat je zal uploaden', 'import_index_start' => 'Start met importeren', + 'import_file' => 'Importeer een bestand', // supported file types: 'import_file_type_csv' => 'CSV (kommagescheiden waardes)', @@ -989,13 +1014,13 @@ return [ 'import_status_finished_title' => 'Importeren is klaar', 'import_status_finished_text' => 'Je gegevensbestand is geïmporteerd.', 'import_status_finished_job' => 'De geimporteerde transacties kan je vinden onder tag :tag.', + 'import_status_job_running' => 'De import is bezig...', 'import_with_key' => 'Import met code \':key\'', // sandstorm.io errors and messages: 'sandstorm_not_available' => 'Deze functie werkt niet als je Firefly III gebruikt in combinatie met Sandstorm.IO.', // empty lists? no objects? instructions: - 'no_transactions_in_period' => 'Er zijn geen transacties in deze periode.', 'no_accounts_title_asset' => 'Je hebt een betaalrekening nodig!', 'no_accounts_intro_asset' => 'Je hebt nog geen betaalrekeningen. Betaalrekeningen zijn je meest belangrijke rekeningen: je bankrekening, spaarrekening, gedeelde rekening of zelfs je creditcard.', 'no_accounts_imperative_asset' => 'Om Firefly III te gebruiken moet je minstens één betaalrekening hebben. Die kan je nu maken:', diff --git a/resources/lang/nl_NL/form.php b/resources/lang/nl_NL/form.php index 5c0a9b962c..02f7cad93e 100644 --- a/resources/lang/nl_NL/form.php +++ b/resources/lang/nl_NL/form.php @@ -30,13 +30,10 @@ return [ 'currency_id' => 'Valuta', 'attachments' => 'Bijlagen', 'journal_amount' => 'Bedrag', - 'journal_asset_source_account' => 'Betaalrekening (bron)', 'journal_source_account_name' => 'Debiteur (bron)', 'journal_source_account_id' => 'Betaalrekening (bron)', 'BIC' => 'BIC', 'verify_password' => 'Bevestig wachtwoordsterkte', - 'account_from_id' => 'Van account', - 'account_to_id' => 'Naar account', 'source_account' => 'Bronrekening', 'destination_account' => 'Doelrekening', 'journal_destination_account_id' => 'Betaalrekening (doel)', @@ -53,7 +50,6 @@ return [ 'tagMode' => 'Tag modus', 'tagPosition' => 'Tag locatie', 'virtualBalance' => 'Virtuele saldo', - 'longitude_latitude' => 'Locatie', 'targetamount' => 'Doelbedrag', 'accountRole' => 'Rol van rekening', 'openingBalanceDate' => 'Startsaldodatum', @@ -68,12 +64,13 @@ return [ 'revenue_account' => 'Debiteur', 'decimal_places' => 'Aantal decimalen', 'exchange_rate_instruction' => 'Vreemde valuta', - 'exchanged_amount' => 'Uitgewisseld bedrag', 'source_amount' => 'Bronbedrag', 'destination_amount' => 'Doelbedrag', 'native_amount' => 'Origineel bedrag', + 'new_email_address' => 'Nieuw emailadres', + 'verification' => 'Verificatie', + 'api_key' => 'API sleutel', - 'revenue_account_source' => 'Debiteur (bron)', 'source_account_asset' => 'Bronrekening (betaalrekening)', 'destination_account_expense' => 'Doelrekening (crediteur)', 'destination_account_asset' => 'Doelrekening (betaalrekening)', @@ -111,7 +108,6 @@ return [ 'add_new_withdrawal' => 'Maak nieuwe uitgave', 'add_new_deposit' => 'Maak nieuwe inkomsten', 'add_new_transfer' => 'Maak nieuwe overschrijving', - 'noPiggybank' => '(geen spaarpotje)', 'title' => 'Titel', 'notes' => 'Notities', 'filename' => 'Bestandsnaam', @@ -137,6 +133,8 @@ return [ 'delete_rule' => 'Verwijder regel ":title"', 'delete_rule_group' => 'Verwijder regelgroep ":title"', 'delete_link_type' => 'Verwijder linktype ":name"', + 'delete_user' => 'Verwijder gebruiker ":email"', + 'user_areYouSure' => 'Als je gebruiker ":email" verwijdert is alles weg. Je kan dit niet ongedaan maken of ont-verwijderen of wat dan ook. Als je jezelf verwijdert ben je ook je toegang tot deze installatie van Firefly III kwijt.', 'attachment_areYouSure' => 'Weet je zeker dat je de bijlage met naam ":name" wilt verwijderen?', 'account_areYouSure' => 'Weet je zeker dat je de rekening met naam ":name" wilt verwijderen?', 'bill_areYouSure' => 'Weet je zeker dat je het contract met naam ":name" wilt verwijderen?', @@ -174,7 +172,6 @@ return [ // admin 'domain' => 'Domein', 'single_user_mode' => 'Enkele gebruiker-modus', - 'must_confirm_account' => 'Nieuwe gebruikers moeten hun account activeren', 'is_demo_site' => 'Is demo website', @@ -187,14 +184,12 @@ return [ 'csv_tab' => 'Een tab (onzichtbaar)', 'csv_delimiter' => 'CSV scheidingsteken', 'csv_import_account' => 'Standaard rekening voor importeren', - 'csv_config' => 'Configuratiebestand', - 'due_date' => 'Vervaldatum', 'payment_date' => 'Betalingsdatum', 'invoice_date' => 'Factuurdatum', 'internal_reference' => 'Interne verwijzing', - - 'inward' => 'Binnenwaartse beschrijving', - 'outward' => 'Buitenwaartse beschrijving', + 'inward' => 'Binnenwaartse beschrijving', + 'outward' => 'Buitenwaartse beschrijving', + 'rule_group_id' => 'Regelgroep', ]; diff --git a/resources/lang/nl_NL/intro.php b/resources/lang/nl_NL/intro.php index 34c26c0755..b175eac5be 100644 --- a/resources/lang/nl_NL/intro.php +++ b/resources/lang/nl_NL/intro.php @@ -31,6 +31,7 @@ return [ 'budgets_index_navigate_periods' => 'Navigeer door periodes heen om je budget vooraf te bepalen.', 'budgets_index_new_budget' => 'Maak nieuwe budgetten naar wens.', 'budgets_index_list_of_budgets' => 'Gebruik deze tabel om de bedragen voor elk budget vast te stellen en te zien hoe je er voor staat.', + 'budgets_index_outro' => 'Om meer te leren over budgetteren, klik dan op het help-icoontje rechtsboven.', // reports (index) 'reports_index_intro' => 'Gebruik deze rapporten om gedetailleerde inzicht in je financiën te krijgen.', diff --git a/resources/lang/nl_NL/list.php b/resources/lang/nl_NL/list.php index 6c5ced7dfe..912b1c05c8 100644 --- a/resources/lang/nl_NL/list.php +++ b/resources/lang/nl_NL/list.php @@ -12,78 +12,80 @@ declare(strict_types=1); */ return [ - 'buttons' => 'Knoppen', - 'icon' => 'Icoon', - 'id' => 'ID', - 'create_date' => 'Aangemaakt op', - 'update_date' => 'Bijgewerkt op', - 'balance_before' => 'Saldo voor', - 'balance_after' => 'Saldo na', - 'name' => 'Naam', - 'role' => 'Rol', - 'currentBalance' => 'Huidig saldo', - 'active' => 'Actief?', - 'lastActivity' => 'Laatste activiteit', - 'balanceDiff' => 'Saldoverschil tussen :start en :end', - 'matchedOn' => 'Wordt herkend', - 'matchesOn' => 'Wordt herkend', - 'account_type' => 'Accounttype', - 'created_at' => 'Gemaakt op', - 'new_balance' => 'Nieuw saldo', - 'account' => 'Rekening', - 'matchingAmount' => 'Bedrag', - 'lastMatch' => 'Laatste keer gezien', - 'split_number' => 'Split #', - 'destination' => 'Doel', - 'source' => 'Bron', - 'next_expected_match' => 'Volgende verwachte match', - 'automatch' => 'Automatisch herkennen?', - 'repeat_freq' => 'Herhaling', - 'description' => 'Omschrijving', - 'amount' => 'Bedrag', - 'internal_reference' => 'Interne referentie', - 'date' => 'Datum', - 'interest_date' => 'Rentedatum', - 'book_date' => 'Boekdatum', - 'process_date' => 'Verwerkingsdatum', - 'due_date' => 'Vervaldatum', - 'payment_date' => 'Betalingsdatum', - 'invoice_date' => 'Factuurdatum', - 'interal_reference' => 'Interne verwijzing', - 'notes' => 'Notities', - 'from' => 'Van', - 'piggy_bank' => 'Spaarpotje', - 'to' => 'Naar', - 'budget' => 'Budget', - 'category' => 'Categorie', - 'bill' => 'Contract', - 'withdrawal' => 'Uitgave', - 'deposit' => 'Inkomsten', - 'transfer' => 'Overschrijving', - 'type' => 'Type', - 'completed' => 'Opgeslagen', - 'iban' => 'IBAN', - 'paid_current_period' => 'Betaald deze periode', - 'email' => 'E-mail', - 'registered_at' => 'Geregistreerd op', - 'is_activated' => 'Is geactiveerd', - 'is_blocked' => 'Is geblokkeerd', - 'is_admin' => 'Is beheerder', - 'has_two_factor' => 'Heeft 2FA', - 'blocked_code' => 'Reden voor blokkade', - 'source_account' => 'Bronrekening', - 'destination_account' => 'Doelrekening', - 'accounts_count' => 'Aantal rekeningen', - 'journals_count' => 'Aantal transacties', - 'attachments_count' => 'Aantal bijlagen', - 'bills_count' => 'Aantal contracten', - 'categories_count' => 'Aantal categorieën', - 'export_jobs_count' => 'Aantal export-jobs', - 'import_jobs_count' => 'Aantal import-jobs', - 'budget_count' => 'Aantal budgetten', - 'rule_and_groups_count' => 'Aantal regels en regelgroepen', - 'tags_count' => 'Aantal tags', - 'inward' => 'Binnenwaartse beschrijving', - 'outward' => 'Buitenwaartse beschrijving', - 'number_of_transactions' => 'Aantal transacties', + 'buttons' => 'Knoppen', + 'icon' => 'Icoon', + 'id' => 'ID', + 'create_date' => 'Aangemaakt op', + 'update_date' => 'Bijgewerkt op', + 'balance_before' => 'Saldo voor', + 'balance_after' => 'Saldo na', + 'name' => 'Naam', + 'role' => 'Rol', + 'currentBalance' => 'Huidig saldo', + 'active' => 'Actief?', + 'lastActivity' => 'Laatste activiteit', + 'balanceDiff' => 'Saldoverschil tussen :start en :end', + 'matchesOn' => 'Wordt herkend', + 'account_type' => 'Accounttype', + 'created_at' => 'Gemaakt op', + 'account' => 'Rekening', + 'matchingAmount' => 'Bedrag', + 'split_number' => 'Split #', + 'destination' => 'Doel', + 'source' => 'Bron', + 'next_expected_match' => 'Volgende verwachte match', + 'automatch' => 'Automatisch herkennen?', + 'repeat_freq' => 'Herhaling', + 'description' => 'Omschrijving', + 'amount' => 'Bedrag', + 'internal_reference' => 'Interne referentie', + 'date' => 'Datum', + 'interest_date' => 'Rentedatum', + 'book_date' => 'Boekdatum', + 'process_date' => 'Verwerkingsdatum', + 'due_date' => 'Vervaldatum', + 'payment_date' => 'Betalingsdatum', + 'invoice_date' => 'Factuurdatum', + 'interal_reference' => 'Interne verwijzing', + 'notes' => 'Notities', + 'from' => 'Van', + 'piggy_bank' => 'Spaarpotje', + 'to' => 'Naar', + 'budget' => 'Budget', + 'category' => 'Categorie', + 'bill' => 'Contract', + 'withdrawal' => 'Uitgave', + 'deposit' => 'Inkomsten', + 'transfer' => 'Overschrijving', + 'type' => 'Type', + 'completed' => 'Opgeslagen', + 'iban' => 'IBAN', + 'paid_current_period' => 'Betaald deze periode', + 'email' => 'E-mail', + 'registered_at' => 'Geregistreerd op', + 'is_blocked' => 'Is geblokkeerd', + 'is_admin' => 'Is beheerder', + 'has_two_factor' => 'Heeft 2FA', + 'blocked_code' => 'Reden voor blokkade', + 'source_account' => 'Bronrekening', + 'destination_account' => 'Doelrekening', + 'accounts_count' => 'Aantal rekeningen', + 'journals_count' => 'Aantal transacties', + 'attachments_count' => 'Aantal bijlagen', + 'bills_count' => 'Aantal contracten', + 'categories_count' => 'Aantal categorieën', + 'export_jobs_count' => 'Aantal export-jobs', + 'import_jobs_count' => 'Aantal import-jobs', + 'budget_count' => 'Aantal budgetten', + 'rule_and_groups_count' => 'Aantal regels en regelgroepen', + 'tags_count' => 'Aantal tags', + 'inward' => 'Binnenwaartse beschrijving', + 'outward' => 'Buitenwaartse beschrijving', + 'number_of_transactions' => 'Aantal transacties', + 'total_amount' => 'Totaalbedrag', + 'sum' => 'Som', + 'sum_excluding_transfers' => 'Som (zonder overschrijvingen)', + 'sum_withdrawals' => 'Som van uitgaven', + 'sum_deposits' => 'Som van inkomsten', + 'sum_transfers' => 'Som van overschrijvingen', ]; diff --git a/resources/lang/pl_PL/bank.php b/resources/lang/pl_PL/bank.php new file mode 100644 index 0000000000..11f05b3785 --- /dev/null +++ b/resources/lang/pl_PL/bank.php @@ -0,0 +1,6 @@ + '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.', +]; \ No newline at end of file diff --git a/resources/lang/pl_PL/firefly.php b/resources/lang/pl_PL/firefly.php index 432e2ab1ec..54e6afdad4 100644 --- a/resources/lang/pl_PL/firefly.php +++ b/resources/lang/pl_PL/firefly.php @@ -83,11 +83,9 @@ return [ 'cannot_redirect_to_account' => 'Firefly III nie może Cię przekierować na właściwą stronę. Przepraszamy.', 'sum_of_expenses' => 'Suma wydatków', 'sum_of_income' => 'Suma dochodów', - 'total_sum' => 'Suma ogółem', 'spent_in_specific_budget' => 'Wydatki w budżecie ":budget"', 'sum_of_expenses_in_budget' => 'Wydano łącznie w budżecie ":budget"', 'left_in_budget_limit' => 'Możliwe do wydania wg budżetu', - 'cannot_reset_demo_user' => 'Nie można zresetować hasła do konta demonstracyjnego', 'current_period' => 'Bieżący okres', 'show_the_current_period_and_overview' => 'Pokaż bieżący okres oraz przegląd', 'pref_languages_locale' => 'For a language other than English to work properly, your operating system must be equipped with the correct locale-information. If these are not present, currency data, dates and amounts may be formatted wrong.', @@ -130,6 +128,8 @@ return [ 'exchange_rate_instructions' => 'Konto aktywów "@name" obsługuje tylko transakcje w walucie @native_currency. Jeśli chcesz użyć waluty @foreign_currency, upewnij się, że kwota w @native_currency jest również znana:', 'transfer_exchange_rate_instructions' => 'Konto źródłowe "@source_name" obsługuje tylko transakcje w walucie @source_currency. Konto docelowe "@dest_name" obsługuje tylko transakcje w walucie @dest_currency. Musisz podać przelewaną kwotę w obu walutach.', 'transaction_data' => 'Dane transakcji', + 'invalid_server_configuration' => 'Invalid server configuration', + 'invalid_locale_settings' => 'Firefly III is unable to format monetary amounts because your server is missing the required packages. There are instructions how to do this.', // search 'search' => 'Szukaj', @@ -139,6 +139,7 @@ return [ 'search_box_intro' => 'Witamy w funkcji wyszukiwania Firefly III. Wpisz zapytanie w polu. Upewnij się, że sprawdziłeś plik pomocy, ponieważ wyszukiwanie jest dość zaawansowane.', 'search_error' => 'Błąd podczas wyszukiwania', 'search_searching' => 'Wyszukiwanie...', + 'search_results' => 'Search results', // repeat frequencies: 'repeat_freq_yearly' => 'rocznie', @@ -151,11 +152,11 @@ return [ // export data: 'import_and_export' => 'Import / eksport', 'export_data' => 'Eksportuj dane', + 'export_and_backup_data' => 'Export and backup', 'export_data_intro' => 'For backup purposes, when migrating to another system or when migrating to another Firefly III installation.', 'export_format' => 'Format eksportu', 'export_format_csv' => 'Wartości oddzielone przecinkami (plik CSV)', 'export_format_mt940' => 'Format kompatybilny z MT940', - 'export_included_accounts' => 'Eksportuj transakcje z tych kont', 'include_old_uploads_help' => 'Firefly III does not throw away the original CSV files you have imported in the past. You can include them in your export.', 'do_export' => 'Eksportuj', 'export_status_never_started' => 'Eksport nie został jeszcze rozpoczęty', @@ -170,8 +171,6 @@ return [ 'export_status_collected_attachments' => 'Zebrano wszystkie twoje załączniki!', 'export_status_collecting_old_uploads' => 'Collecting all your previous uploads...', 'export_status_collected_old_uploads' => 'Collected all your previous uploads!', - 'export_status_creating_config_file' => 'Tworzenie pliku konfiguracji...', - 'export_status_created_config_file' => 'Utworzono plik konfiguracyjny!', 'export_status_creating_zip_file' => 'Tworzenie pliku zip...', 'export_status_created_zip_file' => 'Utworzono plik zip!', 'export_status_finished' => 'Eksport został pomyślnie zakończony! Yay!', @@ -317,6 +316,8 @@ return [ 'rule_action_set_source_account' => 'Ustaw konto źródłowe na :action_value', 'rule_action_set_destination_account_choice' => 'Ustaw konto docelowe na...', 'rule_action_set_destination_account' => 'Ustaw konto docelowe na :action_value', + 'rules_have_read_warning' => 'Have you read the warning?', + 'apply_rule_warning' => 'Warning: running a rule(group) on a large selection of transactions could take ages, and it could time-out. If it does, the rule(group) will only be applied to an unknown subset of your transactions. This might leave your financial administration in tatters. Please be careful.', // tags 'store_new_tag' => 'Zachowaj nowy tag', @@ -326,6 +327,7 @@ return [ 'location' => 'Lokalizacja', 'without_date' => 'Bez daty', 'result' => 'Wynik', + 'sums_apply_to_range' => 'All sums apply to the selected range', // preferences 'pref_home_screen_accounts' => 'Konta na stronie domowej', @@ -414,6 +416,15 @@ return [ 'secure_pw_should' => 'Czy powinienem zaznaczyć to pole?', 'secure_pw_long_password' => 'Jeśli wygenerowałeś długie, jednorazowe hasło dla Firefly III, używając pewnego rodzaju generatora haseł: no.', 'secure_pw_short' => 'Jeśli wpisałeś hasło, którego zawsze używasz: tak, proszę.', + 'personal_access_token' => 'Personal access token', + 'explain_access_token' => 'You need this token to perform command line options, such as importing or exporting data. Without it, such sensitive commands will not work. Do not share your access token. Nobody will ask you for this token, not even me. If you fear you lost this, or when you\'re paranoid, regenerate this token using the button.', + 'regenerate_access_token' => 'Regenerate access token', + 'token_regenerated' => 'A new token was generated', + 'change_your_email' => 'Change your email address', + 'email_verification' => 'An email message will be sent to your old AND new email address. For security purposes, you will not be able to login until you verify your new email address. If you are unsure if your Firefly III installation is capable of sending email, please do not use this feature. If you are an administrator, you can test this in the Administration.', + 'email_changed_logout' => 'Until you verify your email address, you cannot login.', + 'login_with_new_email' => 'You can now login with your new email address.', + 'login_with_old_email' => 'You can now login with your old email address again.', // attachments @@ -447,7 +458,6 @@ return [ 'convert_options_DepositWithdrawal' => 'Konwertuj wpłatę na wypłatę', 'convert_options_TransferWithdrawal' => 'Konwertuj transfer na wypłatę', 'convert_options_TransferDeposit' => 'Konwertuj transfer na wpłatę', - 'transaction_journal_convert_options' => 'Konwertuj tę transakcję', 'convert_Withdrawal_to_deposit' => 'Konwertuj tę wypłatę na wpłatę', 'convert_Withdrawal_to_transfer' => 'Konwertuj tę wypłatę na transfer', 'convert_Deposit_to_withdrawal' => 'Konwertuj tę wpłatę na wypłatę', @@ -467,7 +477,7 @@ return [ 'converted_to_Withdrawal' => 'Transakcja została przekonwertowana do wypłaty', 'converted_to_Deposit' => 'Transakcja została przekonwertowana do wpłaty', 'converted_to_Transfer' => 'Transakcja została przekonwertowana do transferu', - + 'invalid_convert_selection' => 'The account you have selected is already used in this transaction or does not exist.', // create new stuff: 'create_new_withdrawal' => 'Utwórz nową wypłatę', @@ -517,6 +527,11 @@ return [ 'update_budget' => 'Aktualizuj budżet', 'update_budget_amount_range' => 'Update (expected) available amount between :start and :end', 'budget_period_navigator' => 'Period navigator', + 'info_on_available_amount' => 'What do I have available?', + 'available_amount_indication' => 'Use these amounts to get an indication of what your total budget could be.', + 'suggested' => 'Suggested', + 'average_between' => 'Average between :start and :end', + // bills: 'matching_on' => 'Pasuje do', @@ -647,10 +662,8 @@ return [ 'newWithdrawal' => 'Nowy wydatek', 'newDeposit' => 'Nowa wpłata', 'newTransfer' => 'Nowy transfer', - 'moneyIn' => 'Uznania', - 'moneyOut' => 'Obciążenia', - 'billsToPay' => 'Rachunki do zapłacenia', - 'billsPaid' => 'Zapłacone rachunki', + 'bills_to_pay' => 'Bills to pay', + 'per_day' => 'Per day', // menu and titles, should be recycled as often as possible: 'currency' => 'Waluta', @@ -850,9 +863,6 @@ return [ 'removed_amount_from_piggy' => 'Usunięto :amount z ":name"', // tags - 'regular_tag' => 'Po prostu zwykły tag.', - 'balancing_act' => 'The tag takes at most two transactions; an expense and a transfer. They\'ll balance each other out.', - 'advance_payment' => 'The tag accepts one expense and any number of deposits aimed to repay the original expense.', 'delete_tag' => 'Usuń tag ":tag"', 'deleted_tag' => 'Usunięto tag ":tag"', 'new_tag' => 'Utwórz nowy tag', @@ -891,6 +901,17 @@ return [ 'block_code_bounced' => 'Odrzucony e-mail potwierdzający', 'block_code_expired' => 'Demonstracyjne konto wygasło', 'no_block_code' => 'Brak powody blokady lub użytkownik niezablokowany', + 'block_code_email_changed' => 'User has not yet confirmed new email address', + 'admin_update_email' => 'Contrary to the profile page, the user will NOT be notified their email address has changed!', + 'update_user' => 'Update user', + 'updated_user' => 'User data has been changed.', + 'delete_user' => 'Delete user :email', + 'user_deleted' => 'The user has been deleted', + 'send_test_email' => 'Send test email message', + 'send_test_email_text' => 'To see if your installation is capable of sending email, please press this button. You will not see an error here (if any), the log files will reflect any errors. You can press this button as many times as you like. There is no spam control. The message will be sent to :email and should arrive shortly.', + 'send_message' => 'Send message', + 'send_test_triggered' => 'Test was triggered. Check your inbox and the log files.', + // links 'journal_link_configuration' => 'Transaction links configuration', 'create_new_link_type' => 'Create new link type', @@ -914,8 +935,8 @@ return [ 'transaction' => 'Transakcja', 'comments' => 'Komentarze', 'to_link_not_found' => 'Jeśli nie widzisz transakcji, którą chcesz powiązać, po prostu wpisz jej identyfikator.', - 'invalid_link_data' => 'Wybrano błędny typ powiązania. Nie można powiązać transakcji.', - 'journals_linked' => 'Transakcje są powiązane.', + 'invalid_link_selection' => 'Nie można powiązać tych transakcji', + 'journals_linked' => 'Transakcje zostały powiązane.', 'journals_error_linked' => 'Wybrane transakcje są już powiązane.', 'journal_links' => 'Powiązane transakcje', 'this_withdrawal' => 'Ta wypłata', @@ -924,14 +945,16 @@ return [ 'overview_for_link' => 'Overview for link type ":name"', 'delete_journal_link' => 'Usuń powiązanie między :source a :destination', 'deleted_link' => 'Usunięto powiązanie', - '1_outward' => 'relates to', - '2_outward' => '(partially) refunds', - '3_outward' => '(partially) pays for', - '4_outward' => '(partially) reimburses', - '1_inward' => 'relates to', - '2_inward' => 'is (partially) refunded by', - '3_inward' => 'is (partially) paid for by', - '4_inward' => 'is (partially) reimbursed by', + + // link translations: + 'relates to_inward' => 'relates to', + 'is (partially) refunded by_inward' => 'is (partially) refunded by', + 'is (partially) paid for by_inward' => 'is (partially) paid for by', + 'is (partially) reimbursed by_inward' => 'is (partially) reimbursed by', + 'relates to_outward' => 'relates to', + '(partially) refunds_outward' => '(partially) refunds', + '(partially) pays for_outward' => '(partially) pays for', + '(partially) reimburses_outward' => '(partially) reimburses', // split a transaction: @@ -946,6 +969,7 @@ return [ 'cannot_edit_multiple_dest' => 'You cannot edit splitted transaction #:id with description ":description" because it contains multiple destination accounts.', 'cannot_edit_opening_balance' => 'You cannot edit the opening balance of an account.', 'no_edit_multiple_left' => 'Nie wybrałeś żadnych poprawnych transakcji do edycji.', + 'cannot_convert_split_journal' => 'Nie można przekonwertować podzielonej transakcji', // import bread crumbs and titles: 'import' => 'Importuj', @@ -960,6 +984,7 @@ return [ 'import_index_config' => 'Jeśli wcześniej importowałeś dane do Firefly III, może posiadać plik konfiguracji, który wstępnie ustawi wartości parametrów konfiguracyjnych dla Ciebie. Dla niektórych banków, inni użytkownicy uprzejmie dostarczyli swoje pliki konfiguracji.', 'import_index_type' => 'Wybierz typ pliku, który będziesz przesyłać', 'import_index_start' => 'Rozpocznij import', + 'import_file' => 'Import a file', // supported file types: 'import_file_type_csv' => 'CSV (wartości oddzielone przecinkami)', @@ -989,13 +1014,13 @@ return [ 'import_status_finished_title' => 'Importowanie zakończone', 'import_status_finished_text' => 'Procedura importu pomyślnie zaimportowała Twój plik.', 'import_status_finished_job' => 'Zaimportowane transakcje znajdują się w tagu :tag.', + 'import_status_job_running' => 'The import is running...', 'import_with_key' => 'Import z kluczem \':key\'', // sandstorm.io errors and messages: 'sandstorm_not_available' => 'Ta funkcja nie jest dostępna, gdy używasz Firefly III w środowisku Sandstorm.io.', // empty lists? no objects? instructions: - 'no_transactions_in_period' => 'Nie ma żadnych transakcji w tym okresie.', 'no_accounts_title_asset' => 'Stwórzmy konto aktywów!', 'no_accounts_intro_asset' => 'Nie masz jeszcze konta nie aktywów. Konta aktywów są twoimi głównymi kontami: konto czekowe, konto oszczędnościowe, wspólne konto lub nawet karta kredytowa.', 'no_accounts_imperative_asset' => 'Aby rozpocząć korzystanie z Firefly III należy utworzyć co najmniej jedno konto aktywów. Zróbmy je więc teraz:', diff --git a/resources/lang/pl_PL/form.php b/resources/lang/pl_PL/form.php index 08f14827ea..24abfeea89 100644 --- a/resources/lang/pl_PL/form.php +++ b/resources/lang/pl_PL/form.php @@ -30,13 +30,10 @@ return [ 'currency_id' => 'Waluta', 'attachments' => 'Załączniki', 'journal_amount' => 'Kwota', - 'journal_asset_source_account' => 'Konto aktywów (źródło)', 'journal_source_account_name' => 'Konto przychodów (źródło)', 'journal_source_account_id' => 'Konto aktywów (źródło)', 'BIC' => 'BIC', 'verify_password' => 'Sprawdź bezpieczeństwo hasła', - 'account_from_id' => 'Z konta', - 'account_to_id' => 'Na konto', 'source_account' => 'Konto źródłowe', 'destination_account' => 'Konto docelowe', 'journal_destination_account_id' => 'Konto aktywów (przeznaczenie)', @@ -53,7 +50,6 @@ return [ 'tagMode' => 'Tag mode', 'tagPosition' => 'Lokalizacja taga', 'virtualBalance' => 'Wirtualne saldo', - 'longitude_latitude' => 'Lokalizacja', 'targetamount' => 'Kwota docelowa', 'accountRole' => 'Rola konta', 'openingBalanceDate' => 'Data salda otwarcia', @@ -68,12 +64,13 @@ return [ 'revenue_account' => 'Konto przychodów', 'decimal_places' => 'Miejsca dziesiętne', 'exchange_rate_instruction' => 'Zagraniczne waluty', - 'exchanged_amount' => 'Wymieniona kwota', 'source_amount' => 'Kwota (źródło)', 'destination_amount' => 'Kwota (przeznaczenie)', 'native_amount' => 'Źródłowa kwota', + 'new_email_address' => 'New email address', + 'verification' => 'Verification', + 'api_key' => 'API key', - 'revenue_account_source' => 'Konto przychodów (źródło)', 'source_account_asset' => 'Konto źródłowe (konto aktywów)', 'destination_account_expense' => 'Konto docelowe (konto wydatków)', 'destination_account_asset' => 'Konto docelowe (konto aktywów)', @@ -111,7 +108,6 @@ return [ 'add_new_withdrawal' => 'Dodaj nową wypłatę', 'add_new_deposit' => 'Dodaj nową wpłatę', 'add_new_transfer' => 'Dodaj nowy transfer', - 'noPiggybank' => '(brak skarbonek)', 'title' => 'Tytuł', 'notes' => 'Notatki', 'filename' => 'Nazwa pliku', @@ -137,6 +133,8 @@ return [ 'delete_rule' => 'Usuń regułę ":title"', 'delete_rule_group' => 'Usuń grupę reguł ":title"', 'delete_link_type' => 'Delete link type ":name"', + 'delete_user' => 'Delete user ":email"', + 'user_areYouSure' => 'If you delete user ":email", everything will be gone. There is no undo, undelete or anything. If you delete yourself, you will lose access to this instance of Firefly III.', 'attachment_areYouSure' => 'Czy na pewno chcesz usunąć załącznik o nazwie ":name"?', 'account_areYouSure' => 'Czy na pewno chcesz usunąć konto o nazwie ":name"?', 'bill_areYouSure' => 'Czy na pewno chcesz usunąć rachunek o nazwie ":name"?', @@ -174,7 +172,6 @@ return [ // admin 'domain' => 'Domena', 'single_user_mode' => 'Tryb pojedynczego użytkownika', - 'must_confirm_account' => 'Nowi użytkownicy muszą aktywować konto', 'is_demo_site' => 'Is demo site', @@ -194,7 +191,7 @@ return [ 'payment_date' => 'Data płatności', 'invoice_date' => 'Data faktury', 'internal_reference' => 'Wewnętrzny numer', - - 'inward' => 'Inward description', - 'outward' => 'Outward description', + 'inward' => 'Inward description', + 'outward' => 'Outward description', + 'rule_group_id' => 'Rule group', ]; diff --git a/resources/lang/pl_PL/intro.php b/resources/lang/pl_PL/intro.php index 02a0eead23..0fe735125b 100644 --- a/resources/lang/pl_PL/intro.php +++ b/resources/lang/pl_PL/intro.php @@ -31,6 +31,7 @@ return [ 'budgets_index_navigate_periods' => 'Navigate through periods to easily set budgets ahead of time.', 'budgets_index_new_budget' => 'Create new budgets as you see fit.', 'budgets_index_list_of_budgets' => 'Use this table to set the amounts for each budget and see how you are doing.', + 'budgets_index_outro' => 'To learn more about budgeting, checkout the help icon in the top right corner.', // reports (index) 'reports_index_intro' => 'Use these reports to get detailed insights in your finances.', diff --git a/resources/lang/pl_PL/list.php b/resources/lang/pl_PL/list.php index f4604f245d..1467cf6227 100644 --- a/resources/lang/pl_PL/list.php +++ b/resources/lang/pl_PL/list.php @@ -12,78 +12,80 @@ declare(strict_types=1); */ return [ - 'buttons' => 'Przyciski', - 'icon' => 'Ikona', - 'id' => 'ID', - 'create_date' => 'Utworzono', - 'update_date' => 'Zaktualizowano', - 'balance_before' => 'Saldo przed', - 'balance_after' => 'Saldo po', - 'name' => 'Nazwa', - 'role' => 'Rola', - 'currentBalance' => 'Bieżące saldo', - 'active' => 'Jest aktywny?', - 'lastActivity' => 'Ostatnia aktywność', - 'balanceDiff' => 'Różnica salda między :start oraz :end', - 'matchedOn' => 'Dopasowanie', - 'matchesOn' => 'Dopasowanie', - 'account_type' => 'Typ konta', - 'created_at' => 'Utworzono', - 'new_balance' => 'Nowe saldo', - 'account' => 'Konto', - 'matchingAmount' => 'Kwota', - 'lastMatch' => 'Ostatnie dopasowanie', - 'split_number' => '# podziału', - 'destination' => 'Cel', - 'source' => 'Źródło', - 'next_expected_match' => 'Następne oczekiwane dopasowanie', - 'automatch' => 'Auto dopasowanie?', - 'repeat_freq' => 'Powtarza się', - 'description' => 'Opis', - 'amount' => 'Kwota', - 'internal_reference' => 'Wewnętrzny numer', - 'date' => 'Data', - 'interest_date' => 'Stopa procentowa', - 'book_date' => 'Data księgowania', - 'process_date' => 'Przetworzono', - 'due_date' => 'Termin realizacji', - 'payment_date' => 'Data płatności', - 'invoice_date' => 'Data faktury', - 'interal_reference' => 'Wewnętrzny numer', - 'notes' => 'Notatki', - 'from' => 'Z', - 'piggy_bank' => 'Skarbonka', - 'to' => 'Do', - 'budget' => 'Budżet', - 'category' => 'Kategoria', - 'bill' => 'Rachunek', - 'withdrawal' => 'Wypłata', - 'deposit' => 'Wpłata', - 'transfer' => 'Transfer', - 'type' => 'Typ', - 'completed' => 'Zakończone', - 'iban' => 'IBAN', - 'paid_current_period' => 'Zapłacono w tym okresie', - 'email' => 'Adres E-Mail', - 'registered_at' => 'Zarejestrowano', - 'is_activated' => 'Jest aktywny', - 'is_blocked' => 'Jest zablokowany', - 'is_admin' => 'Jest administratorem', - 'has_two_factor' => 'Ma dwustopniową autoryzację', - 'blocked_code' => 'Kod blokady', - 'source_account' => 'Konto źródłowe', - 'destination_account' => 'Konto docelowe', - 'accounts_count' => 'Liczba kont', - 'journals_count' => 'Liczba transakcji', - 'attachments_count' => 'Liczba załączników', - 'bills_count' => 'Liczba rachunków', - 'categories_count' => 'Liczba kategorii', - 'export_jobs_count' => 'Liczba zadań eksportu', - 'import_jobs_count' => 'Liczba zadań importu', - 'budget_count' => 'Liczba budżetów', - 'rule_and_groups_count' => 'Liczba reguł i grup reguł', - 'tags_count' => 'Liczba tagów', - 'inward' => 'Inward description', - 'outward' => 'Outward description', - 'number_of_transactions' => 'Liczba transakcji', + 'buttons' => 'Przyciski', + 'icon' => 'Ikona', + 'id' => 'ID', + 'create_date' => 'Utworzono', + 'update_date' => 'Zaktualizowano', + 'balance_before' => 'Saldo przed', + 'balance_after' => 'Saldo po', + 'name' => 'Nazwa', + 'role' => 'Rola', + 'currentBalance' => 'Bieżące saldo', + 'active' => 'Jest aktywny?', + 'lastActivity' => 'Ostatnia aktywność', + 'balanceDiff' => 'Różnica salda między :start oraz :end', + 'matchesOn' => 'Dopasowanie', + 'account_type' => 'Typ konta', + 'created_at' => 'Utworzono', + 'account' => 'Konto', + 'matchingAmount' => 'Kwota', + 'split_number' => '# podziału', + 'destination' => 'Cel', + 'source' => 'Źródło', + 'next_expected_match' => 'Następne oczekiwane dopasowanie', + 'automatch' => 'Auto dopasowanie?', + 'repeat_freq' => 'Powtarza się', + 'description' => 'Opis', + 'amount' => 'Kwota', + 'internal_reference' => 'Wewnętrzny numer', + 'date' => 'Data', + 'interest_date' => 'Stopa procentowa', + 'book_date' => 'Data księgowania', + 'process_date' => 'Przetworzono', + 'due_date' => 'Termin realizacji', + 'payment_date' => 'Data płatności', + 'invoice_date' => 'Data faktury', + 'interal_reference' => 'Wewnętrzny numer', + 'notes' => 'Notatki', + 'from' => 'Z', + 'piggy_bank' => 'Skarbonka', + 'to' => 'Do', + 'budget' => 'Budżet', + 'category' => 'Kategoria', + 'bill' => 'Rachunek', + 'withdrawal' => 'Wypłata', + 'deposit' => 'Wpłata', + 'transfer' => 'Transfer', + 'type' => 'Typ', + 'completed' => 'Zakończone', + 'iban' => 'IBAN', + 'paid_current_period' => 'Zapłacono w tym okresie', + 'email' => 'Adres E-Mail', + 'registered_at' => 'Zarejestrowano', + 'is_blocked' => 'Jest zablokowany', + 'is_admin' => 'Jest administratorem', + 'has_two_factor' => 'Ma dwustopniową autoryzację', + 'blocked_code' => 'Kod blokady', + 'source_account' => 'Konto źródłowe', + 'destination_account' => 'Konto docelowe', + 'accounts_count' => 'Liczba kont', + 'journals_count' => 'Liczba transakcji', + 'attachments_count' => 'Liczba załączników', + 'bills_count' => 'Liczba rachunków', + 'categories_count' => 'Liczba kategorii', + 'export_jobs_count' => 'Liczba zadań eksportu', + 'import_jobs_count' => 'Liczba zadań importu', + 'budget_count' => 'Liczba budżetów', + 'rule_and_groups_count' => 'Liczba reguł i grup reguł', + 'tags_count' => 'Liczba tagów', + 'inward' => 'Inward description', + 'outward' => 'Outward description', + 'number_of_transactions' => 'Liczba transakcji', + 'total_amount' => 'Total amount', + 'sum' => 'Sum', + 'sum_excluding_transfers' => 'Sum (excluding transfers)', + 'sum_withdrawals' => 'Sum of withdrawals', + 'sum_deposits' => 'Sum of deposits', + 'sum_transfers' => 'Sum of transfers', ]; diff --git a/resources/lang/pt_BR/bank.php b/resources/lang/pt_BR/bank.php new file mode 100644 index 0000000000..11f05b3785 --- /dev/null +++ b/resources/lang/pt_BR/bank.php @@ -0,0 +1,6 @@ + '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.', +]; \ No newline at end of file diff --git a/resources/lang/pt_BR/firefly.php b/resources/lang/pt_BR/firefly.php index 12bf305bd5..5d42c45b0d 100644 --- a/resources/lang/pt_BR/firefly.php +++ b/resources/lang/pt_BR/firefly.php @@ -83,11 +83,9 @@ return [ 'cannot_redirect_to_account' => 'Firefly III não pode redirecioná-lo para a página correta. Minhas desculpas.', 'sum_of_expenses' => 'Sum of expenses', 'sum_of_income' => 'Sum of income', - 'total_sum' => 'Total sum', 'spent_in_specific_budget' => 'Spent in budget ":budget"', 'sum_of_expenses_in_budget' => 'Spent total in budget ":budget"', 'left_in_budget_limit' => 'Left to spend according to budgeting', - 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', 'current_period' => 'Current period', 'show_the_current_period_and_overview' => 'Show the current period and overview', 'pref_languages_locale' => 'For a language other than English to work properly, your operating system must be equipped with the correct locale-information. If these are not present, currency data, dates and amounts may be formatted wrong.', @@ -130,6 +128,8 @@ return [ 'exchange_rate_instructions' => 'Asset account "@name" only accepts transactions in @native_currency. If you wish to use @foreign_currency instead, make sure that the amount in @native_currency is known as well:', 'transfer_exchange_rate_instructions' => 'Source asset account "@source_name" only accepts transactions in @source_currency. Destination asset account "@dest_name" only accepts transactions in @dest_currency. You must provide the transferred amount correctly in both currencies.', 'transaction_data' => 'Transaction data', + 'invalid_server_configuration' => 'Invalid server configuration', + 'invalid_locale_settings' => 'Firefly III is unable to format monetary amounts because your server is missing the required packages. There are instructions how to do this.', // search 'search' => 'Pesquisa', @@ -139,6 +139,7 @@ return [ 'search_box_intro' => 'Welcome to the search function of Firefly III. Enter your search query in the box. Make sure you check out the help file because the search is pretty advanced.', 'search_error' => 'Error while searching', 'search_searching' => 'Searching ...', + 'search_results' => 'Search results', // repeat frequencies: 'repeat_freq_yearly' => 'anual', @@ -151,11 +152,11 @@ return [ // export data: 'import_and_export' => 'Importar / Exportar', 'export_data' => 'Exportar dados', + 'export_and_backup_data' => 'Export and backup', 'export_data_intro' => 'Para fins de backup, ao migrar para outro sistema ou ao migrar para outra instalação de Firefly III.', 'export_format' => 'Formato de exportação', 'export_format_csv' => 'Valores separados por vírgula (arquivo CSV)', 'export_format_mt940' => 'Compatível com formato MT940', - 'export_included_accounts' => 'Operações de exportação destas contas', 'include_old_uploads_help' => 'O Firefly III não joga fora os arquivos CSV originais que você importou no passado. Você pode incluí-los em sua exportação.', 'do_export' => 'Exportar', 'export_status_never_started' => 'A exportação ainda não foi iniciada', @@ -170,8 +171,6 @@ return [ 'export_status_collected_attachments' => 'Recolhidos todos os seus anexos!', 'export_status_collecting_old_uploads' => 'Recolher todos os seus envios anteriores...', 'export_status_collected_old_uploads' => 'Recolhidos todos os seus envios anteriores!', - 'export_status_creating_config_file' => 'Criando um arquivo de configuração...', - 'export_status_created_config_file' => 'Criado um arquivo de configuração!', 'export_status_creating_zip_file' => 'Criando um arquivo zip...', 'export_status_created_zip_file' => 'Criado um arquivo zip!', 'export_status_finished' => 'Exportação terminou com sucesso! Yay!', @@ -317,6 +316,8 @@ return [ 'rule_action_set_source_account' => 'Definir a conta de origem para :action_value', 'rule_action_set_destination_account_choice' => 'Definir a conta de destino...', 'rule_action_set_destination_account' => 'Definir a conta de destino :action_value', + 'rules_have_read_warning' => 'Have you read the warning?', + 'apply_rule_warning' => 'Warning: running a rule(group) on a large selection of transactions could take ages, and it could time-out. If it does, the rule(group) will only be applied to an unknown subset of your transactions. This might leave your financial administration in tatters. Please be careful.', // tags 'store_new_tag' => 'Armazenar nova tag', @@ -326,6 +327,7 @@ return [ 'location' => 'Localização', 'without_date' => 'Without date', 'result' => 'Result', + 'sums_apply_to_range' => 'All sums apply to the selected range', // preferences 'pref_home_screen_accounts' => 'Conta da tela inicial', @@ -414,6 +416,15 @@ return [ 'secure_pw_should' => 'Should I check the box?', 'secure_pw_long_password' => 'If you just generated a long, single-use password for Firefly III using some kind of password generator: no.', 'secure_pw_short' => 'If you just entered the password you always use: Please yes.', + 'personal_access_token' => 'Personal access token', + 'explain_access_token' => 'You need this token to perform command line options, such as importing or exporting data. Without it, such sensitive commands will not work. Do not share your access token. Nobody will ask you for this token, not even me. If you fear you lost this, or when you\'re paranoid, regenerate this token using the button.', + 'regenerate_access_token' => 'Regenerate access token', + 'token_regenerated' => 'A new token was generated', + 'change_your_email' => 'Change your email address', + 'email_verification' => 'An email message will be sent to your old AND new email address. For security purposes, you will not be able to login until you verify your new email address. If you are unsure if your Firefly III installation is capable of sending email, please do not use this feature. If you are an administrator, you can test this in the Administration.', + 'email_changed_logout' => 'Until you verify your email address, you cannot login.', + 'login_with_new_email' => 'You can now login with your new email address.', + 'login_with_old_email' => 'You can now login with your old email address again.', // attachments @@ -447,7 +458,6 @@ return [ 'convert_options_DepositWithdrawal' => 'Converter um depósito em uma retirada', 'convert_options_TransferWithdrawal' => 'Converter uma transferência em uma retirada', 'convert_options_TransferDeposit' => 'Converter uma transferência em um depósito', - 'transaction_journal_convert_options' => 'Converter esta transação', 'convert_Withdrawal_to_deposit' => 'Converter esta retirada de um depósito', 'convert_Withdrawal_to_transfer' => 'Converter esta retirada para uma transferência', 'convert_Deposit_to_withdrawal' => 'Converter este depósito para uma retirada', @@ -467,7 +477,7 @@ return [ 'converted_to_Withdrawal' => 'The transaction has been converted to a withdrawal', 'converted_to_Deposit' => 'The transaction has been converted to a deposit', 'converted_to_Transfer' => 'The transaction has been converted to a transfer', - + 'invalid_convert_selection' => 'The account you have selected is already used in this transaction or does not exist.', // create new stuff: 'create_new_withdrawal' => 'Criar nova retirada', @@ -517,6 +527,11 @@ return [ 'update_budget' => 'Atualizar Orçamento', 'update_budget_amount_range' => 'Atualizar quantia disponível (esperada) entre :start e :end', 'budget_period_navigator' => 'Period navigator', + 'info_on_available_amount' => 'What do I have available?', + 'available_amount_indication' => 'Use these amounts to get an indication of what your total budget could be.', + 'suggested' => 'Suggested', + 'average_between' => 'Average between :start and :end', + // bills: 'matching_on' => 'Corresponde em', @@ -647,10 +662,8 @@ return [ 'newWithdrawal' => 'Nova despesa', 'newDeposit' => 'Novo depósito', 'newTransfer' => 'Nova transferência', - 'moneyIn' => 'Dinheiro entra', - 'moneyOut' => 'Dinheiro sai', - 'billsToPay' => 'Faturas a pagar', - 'billsPaid' => 'Faturas pagas', + 'bills_to_pay' => 'Bills to pay', + 'per_day' => 'Per day', // menu and titles, should be recycled as often as possible: 'currency' => 'Moeda', @@ -850,9 +863,6 @@ return [ 'removed_amount_from_piggy' => 'Removido :amount de ":name"', // tags - 'regular_tag' => 'Apenas uma tag regular.', - 'balancing_act' => 'A tag leva no máximo duas transações; um gasto e uma transferência. Eles vão equilibrar um ao outro.', - 'advance_payment' => 'A tag aceita uma despesa e qualquer número de depósitos destinados para pagar a despesa original.', 'delete_tag' => 'Apagar tag ":tag"', 'deleted_tag' => 'Apagar tag ":tag"', 'new_tag' => 'Fazer nova tag', @@ -891,6 +901,17 @@ return [ 'block_code_bounced' => 'Email message(s) bounced', 'block_code_expired' => 'Demo account expired', 'no_block_code' => 'No reason for block or user not blocked', + 'block_code_email_changed' => 'User has not yet confirmed new email address', + 'admin_update_email' => 'Contrary to the profile page, the user will NOT be notified their email address has changed!', + 'update_user' => 'Update user', + 'updated_user' => 'User data has been changed.', + 'delete_user' => 'Delete user :email', + 'user_deleted' => 'The user has been deleted', + 'send_test_email' => 'Send test email message', + 'send_test_email_text' => 'To see if your installation is capable of sending email, please press this button. You will not see an error here (if any), the log files will reflect any errors. You can press this button as many times as you like. There is no spam control. The message will be sent to :email and should arrive shortly.', + 'send_message' => 'Send message', + 'send_test_triggered' => 'Test was triggered. Check your inbox and the log files.', + // links 'journal_link_configuration' => 'Transaction links configuration', 'create_new_link_type' => 'Create new link type', @@ -914,7 +935,7 @@ return [ 'transaction' => 'Transaction', 'comments' => 'Comments', 'to_link_not_found' => 'If the transaction you want to link to is not listed, simply enter its ID.', - 'invalid_link_data' => 'Invalid link type selected. Cannot link transaction.', + 'invalid_link_selection' => 'Cannot link these transactions', 'journals_linked' => 'Transactions are linked.', 'journals_error_linked' => 'These transactions are already linked.', 'journal_links' => 'Transaction links', @@ -924,14 +945,16 @@ return [ 'overview_for_link' => 'Overview for link type ":name"', 'delete_journal_link' => 'Delete the link between :source and :destination', 'deleted_link' => 'Deleted link', - '1_outward' => 'relates to', - '2_outward' => '(partially) refunds', - '3_outward' => '(partially) pays for', - '4_outward' => '(partially) reimburses', - '1_inward' => 'relates to', - '2_inward' => 'is (partially) refunded by', - '3_inward' => 'is (partially) paid for by', - '4_inward' => 'is (partially) reimbursed by', + + // link translations: + 'relates to_inward' => 'relates to', + 'is (partially) refunded by_inward' => 'is (partially) refunded by', + 'is (partially) paid for by_inward' => 'is (partially) paid for by', + 'is (partially) reimbursed by_inward' => 'is (partially) reimbursed by', + 'relates to_outward' => 'relates to', + '(partially) refunds_outward' => '(partially) refunds', + '(partially) pays for_outward' => '(partially) pays for', + '(partially) reimburses_outward' => '(partially) reimburses', // split a transaction: @@ -946,6 +969,7 @@ return [ 'cannot_edit_multiple_dest' => 'Você não pode editar transações parceladas #:id com a descrição ":description" porque ele contém várias contas de destino.', 'cannot_edit_opening_balance' => 'You cannot edit the opening balance of an account.', 'no_edit_multiple_left' => 'Você não selecionou nenhuma transação válida para editar.', + 'cannot_convert_split_journal' => 'Cannot convert a split transaction', // import bread crumbs and titles: 'import' => 'Importar', @@ -960,6 +984,7 @@ return [ 'import_index_config' => 'If you have previously imported data into Firefly III, you may have a configuration file, which will pre-set configuration values for you. For some banks, other users have kindly provided their configuration file.', 'import_index_type' => 'Select the type of file you will upload', 'import_index_start' => 'Start importing', + 'import_file' => 'Import a file', // supported file types: 'import_file_type_csv' => 'CSV (valores separados por vírgula)', @@ -989,13 +1014,13 @@ return [ 'import_status_finished_title' => 'Import routine finished', 'import_status_finished_text' => 'The import routine has imported your file.', 'import_status_finished_job' => 'The transactions imported can be found in tag :tag.', + 'import_status_job_running' => 'The import is running...', 'import_with_key' => 'Importação com chave \':key\'', // sandstorm.io errors and messages: 'sandstorm_not_available' => 'This function is not available when you are using Firefly III within a Sandstorm.io environment.', // empty lists? no objects? instructions: - 'no_transactions_in_period' => 'There are no transactions in this period.', 'no_accounts_title_asset' => 'Let\'s create an asset account!', 'no_accounts_intro_asset' => 'You have no asset accounts yet. Asset accounts are your main accounts: your checking account, savings account, shared account or even your credit card.', 'no_accounts_imperative_asset' => 'To start using Firefly III you must create at least one asset account. Let\'s do so now:', diff --git a/resources/lang/pt_BR/form.php b/resources/lang/pt_BR/form.php index f2e1a12925..d7522bcf9d 100644 --- a/resources/lang/pt_BR/form.php +++ b/resources/lang/pt_BR/form.php @@ -30,13 +30,10 @@ return [ 'currency_id' => 'Moeda', 'attachments' => 'Anexos', 'journal_amount' => 'Quantia', - 'journal_asset_source_account' => 'Conta de ativo (fonte)', 'journal_source_account_name' => 'Conta de receita (fonte)', 'journal_source_account_id' => 'Conta de ativo (fonte)', 'BIC' => 'BIC', 'verify_password' => 'Verify password security', - 'account_from_id' => 'da conta', - 'account_to_id' => 'para conta', 'source_account' => 'Conta de origem', 'destination_account' => 'Conta de destino', 'journal_destination_account_id' => 'Conta de ativo (destino)', @@ -53,7 +50,6 @@ return [ 'tagMode' => 'Modo de tag', 'tagPosition' => 'Localização de tag', 'virtualBalance' => 'Saldo virtual', - 'longitude_latitude' => 'Localização', 'targetamount' => 'Valor alvo', 'accountRole' => 'Tipo de conta', 'openingBalanceDate' => 'Data do Saldo inicial', @@ -68,12 +64,13 @@ return [ 'revenue_account' => 'Conta de Receita', 'decimal_places' => 'Casas décimais', 'exchange_rate_instruction' => 'Moedas estrangeiras', - 'exchanged_amount' => 'Exchanged amount', 'source_amount' => 'Amount (source)', 'destination_amount' => 'Amount (destination)', 'native_amount' => 'Native amount', + 'new_email_address' => 'New email address', + 'verification' => 'Verification', + 'api_key' => 'API key', - 'revenue_account_source' => 'Conta de receita (fonte)', 'source_account_asset' => 'Conta de origem (conta de ativo)', 'destination_account_expense' => 'Conta de destino (conta de despesa)', 'destination_account_asset' => 'Conta de destino (conta de ativo)', @@ -111,7 +108,6 @@ return [ 'add_new_withdrawal' => 'Adicionar uma nova retirada', 'add_new_deposit' => 'Adicionar um novo depósito', 'add_new_transfer' => 'Adicionar uma nova transferência', - 'noPiggybank' => '(nenhum cofrinho)', 'title' => 'Título', 'notes' => 'Notas', 'filename' => 'Nome do arquivo', @@ -137,6 +133,8 @@ return [ 'delete_rule' => 'Excluir regra ":title"', 'delete_rule_group' => 'Exclua o grupo de regras ":title"', 'delete_link_type' => 'Delete link type ":name"', + 'delete_user' => 'Delete user ":email"', + 'user_areYouSure' => 'If you delete user ":email", everything will be gone. There is no undo, undelete or anything. If you delete yourself, you will lose access to this instance of Firefly III.', 'attachment_areYouSure' => 'Tem certeza que deseja excluir o anexo denominado ":name"?', 'account_areYouSure' => 'Tem certeza que deseja excluir a conta denominada ":name"?', 'bill_areYouSure' => 'Você tem certeza que quer apagar a fatura ":name"?', @@ -174,7 +172,6 @@ return [ // admin 'domain' => 'Domínio', 'single_user_mode' => 'Modo de usuário único', - 'must_confirm_account' => 'Novos usuários devem ativar a conta', 'is_demo_site' => 'É o site de demonstração', @@ -194,7 +191,7 @@ return [ 'payment_date' => 'Data de pagamento', 'invoice_date' => 'Data da Fatura', 'internal_reference' => 'Referência interna', - - 'inward' => 'Inward description', - 'outward' => 'Outward description', + 'inward' => 'Inward description', + 'outward' => 'Outward description', + 'rule_group_id' => 'Rule group', ]; diff --git a/resources/lang/pt_BR/intro.php b/resources/lang/pt_BR/intro.php index 02a0eead23..0fe735125b 100644 --- a/resources/lang/pt_BR/intro.php +++ b/resources/lang/pt_BR/intro.php @@ -31,6 +31,7 @@ return [ 'budgets_index_navigate_periods' => 'Navigate through periods to easily set budgets ahead of time.', 'budgets_index_new_budget' => 'Create new budgets as you see fit.', 'budgets_index_list_of_budgets' => 'Use this table to set the amounts for each budget and see how you are doing.', + 'budgets_index_outro' => 'To learn more about budgeting, checkout the help icon in the top right corner.', // reports (index) 'reports_index_intro' => 'Use these reports to get detailed insights in your finances.', diff --git a/resources/lang/pt_BR/list.php b/resources/lang/pt_BR/list.php index a0cf6f88fb..fe4e1bf44f 100644 --- a/resources/lang/pt_BR/list.php +++ b/resources/lang/pt_BR/list.php @@ -12,78 +12,80 @@ declare(strict_types=1); */ return [ - 'buttons' => 'Botões', - 'icon' => 'Ícone', - 'id' => 'ID', - 'create_date' => 'Criado em', - 'update_date' => 'Atualizado em', - 'balance_before' => 'Saldo Antes', - 'balance_after' => 'Saldo depois', - 'name' => 'Nome', - 'role' => 'Papel', - 'currentBalance' => 'Saldo atual', - 'active' => 'Está ativo?', - 'lastActivity' => 'Última atividade', - 'balanceDiff' => 'Saldo diferente entre :start e :end', - 'matchedOn' => 'Coincide', - 'matchesOn' => 'Correspondido em', - 'account_type' => 'Tipo de conta', - 'created_at' => 'Criado em', - 'new_balance' => 'Novo saldo', - 'account' => 'Conta', - 'matchingAmount' => 'Total', - 'lastMatch' => 'Último equivalente', - 'split_number' => 'Dividir #', - 'destination' => 'Destino', - 'source' => 'Fonte', - 'next_expected_match' => 'Próximo correspondente esperado', - 'automatch' => 'Auto match?', - 'repeat_freq' => 'Repetições', - 'description' => 'Descrição', - 'amount' => 'Total', - 'internal_reference' => 'Referência interna', - 'date' => 'Data', - 'interest_date' => 'Data de interesse', - 'book_date' => 'Data reserva', - 'process_date' => 'Data de processamento', - 'due_date' => 'Prazo', - 'payment_date' => 'Data de pagamento', - 'invoice_date' => 'Data da Fatura', - 'interal_reference' => 'Referência interna', - 'notes' => 'Notas', - 'from' => 'De', - 'piggy_bank' => 'Cofrinho', - 'to' => 'Até', - 'budget' => 'Orçamento', - 'category' => 'Categoria', - 'bill' => 'Fatura', - 'withdrawal' => 'Retirada', - 'deposit' => 'Depósito', - 'transfer' => 'Transferência', - 'type' => 'Tipo', - 'completed' => 'Completo', - 'iban' => 'IBAN', - 'paid_current_period' => 'Pago este período', - 'email' => 'Email', - 'registered_at' => 'Registrado em', - 'is_activated' => 'Está ativo', - 'is_blocked' => 'Está bloqueado', - 'is_admin' => 'É admin', - 'has_two_factor' => 'Tem 2FA', - 'blocked_code' => 'Bloco de código', - 'source_account' => 'Conta de origem', - 'destination_account' => 'Conta de destino', - 'accounts_count' => 'Número de Contas', - 'journals_count' => 'Number of transactions', - 'attachments_count' => 'Número de anexos', - 'bills_count' => 'Número de contas', - 'categories_count' => 'Número de categorias', - 'export_jobs_count' => 'Número de jobs de exportação', - 'import_jobs_count' => 'Número de jobs de importação', - 'budget_count' => 'Número de orçamentos', - 'rule_and_groups_count' => 'Número de regras e grupos de regras', - 'tags_count' => 'Número de tags', - 'inward' => 'Inward description', - 'outward' => 'Outward description', - 'number_of_transactions' => 'Number of transactions', + 'buttons' => 'Botões', + 'icon' => 'Ícone', + 'id' => 'ID', + 'create_date' => 'Criado em', + 'update_date' => 'Atualizado em', + 'balance_before' => 'Saldo Antes', + 'balance_after' => 'Saldo depois', + 'name' => 'Nome', + 'role' => 'Papel', + 'currentBalance' => 'Saldo atual', + 'active' => 'Está ativo?', + 'lastActivity' => 'Última atividade', + 'balanceDiff' => 'Saldo diferente entre :start e :end', + 'matchesOn' => 'Correspondido em', + 'account_type' => 'Tipo de conta', + 'created_at' => 'Criado em', + 'account' => 'Conta', + 'matchingAmount' => 'Total', + 'split_number' => 'Dividir #', + 'destination' => 'Destino', + 'source' => 'Fonte', + 'next_expected_match' => 'Próximo correspondente esperado', + 'automatch' => 'Auto match?', + 'repeat_freq' => 'Repetições', + 'description' => 'Descrição', + 'amount' => 'Total', + 'internal_reference' => 'Referência interna', + 'date' => 'Data', + 'interest_date' => 'Data de interesse', + 'book_date' => 'Data reserva', + 'process_date' => 'Data de processamento', + 'due_date' => 'Prazo', + 'payment_date' => 'Data de pagamento', + 'invoice_date' => 'Data da Fatura', + 'interal_reference' => 'Referência interna', + 'notes' => 'Notas', + 'from' => 'De', + 'piggy_bank' => 'Cofrinho', + 'to' => 'Até', + 'budget' => 'Orçamento', + 'category' => 'Categoria', + 'bill' => 'Fatura', + 'withdrawal' => 'Retirada', + 'deposit' => 'Depósito', + 'transfer' => 'Transferência', + 'type' => 'Tipo', + 'completed' => 'Completo', + 'iban' => 'IBAN', + 'paid_current_period' => 'Pago este período', + 'email' => 'Email', + 'registered_at' => 'Registrado em', + 'is_blocked' => 'Está bloqueado', + 'is_admin' => 'É admin', + 'has_two_factor' => 'Tem 2FA', + 'blocked_code' => 'Bloco de código', + 'source_account' => 'Conta de origem', + 'destination_account' => 'Conta de destino', + 'accounts_count' => 'Número de Contas', + 'journals_count' => 'Number of transactions', + 'attachments_count' => 'Número de anexos', + 'bills_count' => 'Número de contas', + 'categories_count' => 'Número de categorias', + 'export_jobs_count' => 'Número de jobs de exportação', + 'import_jobs_count' => 'Número de jobs de importação', + 'budget_count' => 'Número de orçamentos', + 'rule_and_groups_count' => 'Número de regras e grupos de regras', + 'tags_count' => 'Número de tags', + 'inward' => 'Inward description', + 'outward' => 'Outward description', + 'number_of_transactions' => 'Number of transactions', + 'total_amount' => 'Total amount', + 'sum' => 'Sum', + 'sum_excluding_transfers' => 'Sum (excluding transfers)', + 'sum_withdrawals' => 'Sum of withdrawals', + 'sum_deposits' => 'Sum of deposits', + 'sum_transfers' => 'Sum of transfers', ]; diff --git a/resources/lang/ru_RU/bank.php b/resources/lang/ru_RU/bank.php new file mode 100644 index 0000000000..11f05b3785 --- /dev/null +++ b/resources/lang/ru_RU/bank.php @@ -0,0 +1,6 @@ + '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.', +]; \ No newline at end of file diff --git a/resources/lang/ru_RU/firefly.php b/resources/lang/ru_RU/firefly.php index 0deba64ef5..84da1ac279 100644 --- a/resources/lang/ru_RU/firefly.php +++ b/resources/lang/ru_RU/firefly.php @@ -83,11 +83,9 @@ return [ 'cannot_redirect_to_account' => 'Firefly III cannot redirect you to the correct page. Apologies.', 'sum_of_expenses' => 'Сумма расходов', 'sum_of_income' => 'Сумма дохода', - 'total_sum' => 'Итого', 'spent_in_specific_budget' => 'Spent in budget ":budget"', 'sum_of_expenses_in_budget' => 'Spent total in budget ":budget"', 'left_in_budget_limit' => 'Left to spend according to budgeting', - 'cannot_reset_demo_user' => 'Невозможно сбросить пароль демонстрационной учетной записи', 'current_period' => 'Текущий период', 'show_the_current_period_and_overview' => 'Показать текущий период и обзор', 'pref_languages_locale' => 'Для корректной работы с языками, отличными от английского, ваша операционная система должна отдавать корректную информацию о локали. Если это не так, валюты, даты и суммы могут отображаться некорректно.', @@ -130,6 +128,8 @@ return [ 'exchange_rate_instructions' => 'Asset account "@name" only accepts transactions in @native_currency. If you wish to use @foreign_currency instead, make sure that the amount in @native_currency is known as well:', 'transfer_exchange_rate_instructions' => 'Source asset account "@source_name" only accepts transactions in @source_currency. Destination asset account "@dest_name" only accepts transactions in @dest_currency. You must provide the transferred amount correctly in both currencies.', 'transaction_data' => 'Данные транзакции', + 'invalid_server_configuration' => 'Invalid server configuration', + 'invalid_locale_settings' => 'Firefly III is unable to format monetary amounts because your server is missing the required packages. There are instructions how to do this.', // search 'search' => 'Поиск', @@ -139,6 +139,7 @@ return [ 'search_box_intro' => 'Welcome to the search function of Firefly III. Enter your search query in the box. Make sure you check out the help file because the search is pretty advanced.', 'search_error' => 'Error while searching', 'search_searching' => 'Searching ...', + 'search_results' => 'Search results', // repeat frequencies: 'repeat_freq_yearly' => 'ежегодно', @@ -151,11 +152,11 @@ return [ // export data: 'import_and_export' => 'Импорт и экспорт', 'export_data' => 'Экспорт данных', + 'export_and_backup_data' => 'Export and backup', 'export_data_intro' => 'For backup purposes, when migrating to another system or when migrating to another Firefly III installation.', 'export_format' => 'Формат для экспорта', 'export_format_csv' => 'Comma separated values (CSV file)', 'export_format_mt940' => 'MT940 compatible format', - 'export_included_accounts' => 'Export transactions from these accounts', 'include_old_uploads_help' => 'Firefly III does not throw away the original CSV files you have imported in the past. You can include them in your export.', 'do_export' => 'Экспорт', 'export_status_never_started' => 'The export has not started yet', @@ -170,8 +171,6 @@ return [ 'export_status_collected_attachments' => 'Collected all your attachments!', 'export_status_collecting_old_uploads' => 'Collecting all your previous uploads...', 'export_status_collected_old_uploads' => 'Collected all your previous uploads!', - 'export_status_creating_config_file' => 'Creating a configuration file...', - 'export_status_created_config_file' => 'Created a configuration file!', 'export_status_creating_zip_file' => 'Creating a zip file...', 'export_status_created_zip_file' => 'Created a zip file!', 'export_status_finished' => 'Export has succesfully finished! Yay!', @@ -317,6 +316,8 @@ return [ 'rule_action_set_source_account' => 'Set source account to :action_value', 'rule_action_set_destination_account_choice' => 'Set destination account to...', 'rule_action_set_destination_account' => 'Set destination account to :action_value', + 'rules_have_read_warning' => 'Have you read the warning?', + 'apply_rule_warning' => 'Warning: running a rule(group) on a large selection of transactions could take ages, and it could time-out. If it does, the rule(group) will only be applied to an unknown subset of your transactions. This might leave your financial administration in tatters. Please be careful.', // tags 'store_new_tag' => 'Store new tag', @@ -326,6 +327,7 @@ return [ 'location' => 'Location', 'without_date' => 'Without date', 'result' => 'Result', + 'sums_apply_to_range' => 'All sums apply to the selected range', // preferences 'pref_home_screen_accounts' => 'Счета, отображаемые в сводке', @@ -414,6 +416,15 @@ return [ 'secure_pw_should' => 'Should I check the box?', 'secure_pw_long_password' => 'If you just generated a long, single-use password for Firefly III using some kind of password generator: no.', 'secure_pw_short' => 'If you just entered the password you always use: Please yes.', + 'personal_access_token' => 'Personal access token', + 'explain_access_token' => 'You need this token to perform command line options, such as importing or exporting data. Without it, such sensitive commands will not work. Do not share your access token. Nobody will ask you for this token, not even me. If you fear you lost this, or when you\'re paranoid, regenerate this token using the button.', + 'regenerate_access_token' => 'Regenerate access token', + 'token_regenerated' => 'A new token was generated', + 'change_your_email' => 'Change your email address', + 'email_verification' => 'An email message will be sent to your old AND new email address. For security purposes, you will not be able to login until you verify your new email address. If you are unsure if your Firefly III installation is capable of sending email, please do not use this feature. If you are an administrator, you can test this in the Administration.', + 'email_changed_logout' => 'Until you verify your email address, you cannot login.', + 'login_with_new_email' => 'You can now login with your new email address.', + 'login_with_old_email' => 'You can now login with your old email address again.', // attachments @@ -447,7 +458,6 @@ return [ 'convert_options_DepositWithdrawal' => 'Convert a deposit into a withdrawal', 'convert_options_TransferWithdrawal' => 'Convert a transfer into a withdrawal', 'convert_options_TransferDeposit' => 'Convert a transfer into a deposit', - 'transaction_journal_convert_options' => 'Convert this transaction', 'convert_Withdrawal_to_deposit' => 'Convert this withdrawal to a deposit', 'convert_Withdrawal_to_transfer' => 'Convert this withdrawal to a transfer', 'convert_Deposit_to_withdrawal' => 'Convert this deposit to a withdrawal', @@ -467,7 +477,7 @@ return [ 'converted_to_Withdrawal' => 'The transaction has been converted to a withdrawal', 'converted_to_Deposit' => 'The transaction has been converted to a deposit', 'converted_to_Transfer' => 'The transaction has been converted to a transfer', - + 'invalid_convert_selection' => 'The account you have selected is already used in this transaction or does not exist.', // create new stuff: 'create_new_withdrawal' => 'Создать новый расход', @@ -517,6 +527,11 @@ return [ 'update_budget' => 'Update budget', 'update_budget_amount_range' => 'Update (expected) available amount between :start and :end', 'budget_period_navigator' => 'Period navigator', + 'info_on_available_amount' => 'What do I have available?', + 'available_amount_indication' => 'Use these amounts to get an indication of what your total budget could be.', + 'suggested' => 'Suggested', + 'average_between' => 'Average between :start and :end', + // bills: 'matching_on' => 'Matching on', @@ -647,10 +662,8 @@ return [ 'newWithdrawal' => 'Новый расход', 'newDeposit' => 'Новый доход', 'newTransfer' => 'Новый перевод', - 'moneyIn' => 'Доходы', - 'moneyOut' => 'Расходы', - 'billsToPay' => 'Счета к оплате', - 'billsPaid' => 'Оплаченные счета', + 'bills_to_pay' => 'Bills to pay', + 'per_day' => 'Per day', // menu and titles, should be recycled as often as possible: 'currency' => 'Валюта', @@ -850,9 +863,6 @@ return [ 'removed_amount_from_piggy' => 'Removed :amount from ":name"', // tags - 'regular_tag' => 'Just a regular tag.', - 'balancing_act' => 'The tag takes at most two transactions; an expense and a transfer. They\'ll balance each other out.', - 'advance_payment' => 'The tag accepts one expense and any number of deposits aimed to repay the original expense.', 'delete_tag' => 'Delete tag ":tag"', 'deleted_tag' => 'Deleted tag ":tag"', 'new_tag' => 'Make new tag', @@ -891,6 +901,17 @@ return [ 'block_code_bounced' => 'Email message(s) bounced', 'block_code_expired' => 'Demo account expired', 'no_block_code' => 'No reason for block or user not blocked', + 'block_code_email_changed' => 'User has not yet confirmed new email address', + 'admin_update_email' => 'Contrary to the profile page, the user will NOT be notified their email address has changed!', + 'update_user' => 'Update user', + 'updated_user' => 'User data has been changed.', + 'delete_user' => 'Delete user :email', + 'user_deleted' => 'The user has been deleted', + 'send_test_email' => 'Send test email message', + 'send_test_email_text' => 'To see if your installation is capable of sending email, please press this button. You will not see an error here (if any), the log files will reflect any errors. You can press this button as many times as you like. There is no spam control. The message will be sent to :email and should arrive shortly.', + 'send_message' => 'Send message', + 'send_test_triggered' => 'Test was triggered. Check your inbox and the log files.', + // links 'journal_link_configuration' => 'Transaction links configuration', 'create_new_link_type' => 'Create new link type', @@ -914,7 +935,7 @@ return [ 'transaction' => 'Transaction', 'comments' => 'Comments', 'to_link_not_found' => 'If the transaction you want to link to is not listed, simply enter its ID.', - 'invalid_link_data' => 'Invalid link type selected. Cannot link transaction.', + 'invalid_link_selection' => 'Cannot link these transactions', 'journals_linked' => 'Transactions are linked.', 'journals_error_linked' => 'These transactions are already linked.', 'journal_links' => 'Transaction links', @@ -924,14 +945,16 @@ return [ 'overview_for_link' => 'Overview for link type ":name"', 'delete_journal_link' => 'Delete the link between :source and :destination', 'deleted_link' => 'Deleted link', - '1_outward' => 'relates to', - '2_outward' => '(partially) refunds', - '3_outward' => '(partially) pays for', - '4_outward' => '(partially) reimburses', - '1_inward' => 'relates to', - '2_inward' => 'is (partially) refunded by', - '3_inward' => 'is (partially) paid for by', - '4_inward' => 'is (partially) reimbursed by', + + // link translations: + 'relates to_inward' => 'relates to', + 'is (partially) refunded by_inward' => 'is (partially) refunded by', + 'is (partially) paid for by_inward' => 'is (partially) paid for by', + 'is (partially) reimbursed by_inward' => 'is (partially) reimbursed by', + 'relates to_outward' => 'relates to', + '(partially) refunds_outward' => '(partially) refunds', + '(partially) pays for_outward' => '(partially) pays for', + '(partially) reimburses_outward' => '(partially) reimburses', // split a transaction: @@ -946,6 +969,7 @@ return [ 'cannot_edit_multiple_dest' => 'You cannot edit splitted transaction #:id with description ":description" because it contains multiple destination accounts.', 'cannot_edit_opening_balance' => 'You cannot edit the opening balance of an account.', 'no_edit_multiple_left' => 'You have selected no valid transactions to edit.', + 'cannot_convert_split_journal' => 'Cannot convert a split transaction', // import bread crumbs and titles: 'import' => 'Импорт', @@ -960,6 +984,7 @@ return [ 'import_index_config' => 'If you have previously imported data into Firefly III, you may have a configuration file, which will pre-set configuration values for you. For some banks, other users have kindly provided their configuration file.', 'import_index_type' => 'Select the type of file you will upload', 'import_index_start' => 'Start importing', + 'import_file' => 'Import a file', // supported file types: 'import_file_type_csv' => 'CSV (comma separated values)', @@ -989,13 +1014,13 @@ return [ 'import_status_finished_title' => 'Import routine finished', 'import_status_finished_text' => 'The import routine has imported your file.', 'import_status_finished_job' => 'The transactions imported can be found in tag :tag.', + 'import_status_job_running' => 'The import is running...', 'import_with_key' => 'Import with key \':key\'', // sandstorm.io errors and messages: 'sandstorm_not_available' => 'This function is not available when you are using Firefly III within a Sandstorm.io environment.', // empty lists? no objects? instructions: - 'no_transactions_in_period' => 'There are no transactions in this period.', 'no_accounts_title_asset' => 'Let\'s create an asset account!', 'no_accounts_intro_asset' => 'You have no asset accounts yet. Asset accounts are your main accounts: your checking account, savings account, shared account or even your credit card.', 'no_accounts_imperative_asset' => 'To start using Firefly III you must create at least one asset account. Let\'s do so now:', diff --git a/resources/lang/ru_RU/form.php b/resources/lang/ru_RU/form.php index ef6703a722..076ee6a02c 100644 --- a/resources/lang/ru_RU/form.php +++ b/resources/lang/ru_RU/form.php @@ -30,13 +30,10 @@ return [ 'currency_id' => 'Currency', 'attachments' => 'Attachments', 'journal_amount' => 'Amount', - 'journal_asset_source_account' => 'Asset account (source)', 'journal_source_account_name' => 'Revenue account (source)', 'journal_source_account_id' => 'Asset account (source)', 'BIC' => 'BIC', 'verify_password' => 'Verify password security', - 'account_from_id' => 'From account', - 'account_to_id' => 'To account', 'source_account' => 'Source account', 'destination_account' => 'Destination account', 'journal_destination_account_id' => 'Asset account (destination)', @@ -53,7 +50,6 @@ return [ 'tagMode' => 'Tag mode', 'tagPosition' => 'Tag location', 'virtualBalance' => 'Virtual balance', - 'longitude_latitude' => 'Location', 'targetamount' => 'Target amount', 'accountRole' => 'Account role', 'openingBalanceDate' => 'Opening balance date', @@ -68,12 +64,13 @@ return [ 'revenue_account' => 'Доходный счет', 'decimal_places' => 'Количество цифр после точки', 'exchange_rate_instruction' => 'Иностранные валюты', - 'exchanged_amount' => 'Сумма обмена', 'source_amount' => 'Сумма (источник)', 'destination_amount' => 'Сумма (назначение)', 'native_amount' => 'Native amount', + 'new_email_address' => 'New email address', + 'verification' => 'Verification', + 'api_key' => 'API key', - 'revenue_account_source' => 'Доходный счет (источник)', 'source_account_asset' => 'Source account (asset account)', 'destination_account_expense' => 'Destination account (expense account)', 'destination_account_asset' => 'Destination account (asset account)', @@ -111,7 +108,6 @@ return [ 'add_new_withdrawal' => 'Add a new withdrawal', 'add_new_deposit' => 'Add a new deposit', 'add_new_transfer' => 'Add a new transfer', - 'noPiggybank' => '(no piggy bank)', 'title' => 'Заголовок', 'notes' => 'Заметки', 'filename' => 'Имя файла', @@ -137,6 +133,8 @@ return [ 'delete_rule' => 'Delete rule ":title"', 'delete_rule_group' => 'Delete rule group ":title"', 'delete_link_type' => 'Delete link type ":name"', + 'delete_user' => 'Delete user ":email"', + 'user_areYouSure' => 'If you delete user ":email", everything will be gone. There is no undo, undelete or anything. If you delete yourself, you will lose access to this instance of Firefly III.', 'attachment_areYouSure' => 'Are you sure you want to delete the attachment named ":name"?', 'account_areYouSure' => 'Are you sure you want to delete the account named ":name"?', 'bill_areYouSure' => 'Are you sure you want to delete the bill named ":name"?', @@ -174,7 +172,6 @@ return [ // admin 'domain' => 'Domain', 'single_user_mode' => 'Single user mode', - 'must_confirm_account' => 'New users must activate account', 'is_demo_site' => 'Is demo site', @@ -194,7 +191,7 @@ return [ 'payment_date' => 'Payment date', 'invoice_date' => 'Invoice date', 'internal_reference' => 'Internal reference', - - 'inward' => 'Inward description', - 'outward' => 'Outward description', + 'inward' => 'Inward description', + 'outward' => 'Outward description', + 'rule_group_id' => 'Rule group', ]; diff --git a/resources/lang/ru_RU/intro.php b/resources/lang/ru_RU/intro.php index 02a0eead23..0fe735125b 100644 --- a/resources/lang/ru_RU/intro.php +++ b/resources/lang/ru_RU/intro.php @@ -31,6 +31,7 @@ return [ 'budgets_index_navigate_periods' => 'Navigate through periods to easily set budgets ahead of time.', 'budgets_index_new_budget' => 'Create new budgets as you see fit.', 'budgets_index_list_of_budgets' => 'Use this table to set the amounts for each budget and see how you are doing.', + 'budgets_index_outro' => 'To learn more about budgeting, checkout the help icon in the top right corner.', // reports (index) 'reports_index_intro' => 'Use these reports to get detailed insights in your finances.', diff --git a/resources/lang/ru_RU/list.php b/resources/lang/ru_RU/list.php index 5df2d54bf5..424e6304ea 100644 --- a/resources/lang/ru_RU/list.php +++ b/resources/lang/ru_RU/list.php @@ -12,78 +12,80 @@ declare(strict_types=1); */ return [ - 'buttons' => 'Кнопки', - 'icon' => 'Значок', - 'id' => 'ID', - 'create_date' => 'Создан', - 'update_date' => 'Обновлён', - 'balance_before' => 'Баланс до', - 'balance_after' => 'Баланс после', - 'name' => 'Имя', - 'role' => 'Роль', - 'currentBalance' => 'Текущий баланс', - 'active' => 'Активен?', - 'lastActivity' => 'Последняя активность', - 'balanceDiff' => 'Разница баланса между :start и :end', - 'matchedOn' => 'Matched on', - 'matchesOn' => 'Matched on', - 'account_type' => 'Тип профиля', - 'created_at' => 'Created at', - 'new_balance' => 'New balance', - 'account' => 'Account', - 'matchingAmount' => 'Amount', - 'lastMatch' => 'Last match', - 'split_number' => 'Split #', - 'destination' => 'Destination', - 'source' => 'Source', - 'next_expected_match' => 'Next expected match', - 'automatch' => 'Auto match?', - 'repeat_freq' => 'Repeats', - 'description' => 'Описание', - 'amount' => 'Сумма', - 'internal_reference' => 'Internal reference', - 'date' => 'Дата', - 'interest_date' => 'Interest date', - 'book_date' => 'Book date', - 'process_date' => 'Processing date', - 'due_date' => 'Due date', - 'payment_date' => 'Payment date', - 'invoice_date' => 'Invoice date', - 'interal_reference' => 'Internal reference', - 'notes' => 'Заметки', - 'from' => 'Откуда', - 'piggy_bank' => 'Копилка', - 'to' => 'Куда', - 'budget' => 'Бюджет', - 'category' => 'Категория', - 'bill' => 'Счет к оплате', - 'withdrawal' => 'Расход', - 'deposit' => 'Доход', - 'transfer' => 'Перевод', - 'type' => 'Type', - 'completed' => 'Completed', - 'iban' => 'IBAN', - 'paid_current_period' => 'Paid this period', - 'email' => 'E-mail', - 'registered_at' => 'Дата регистрации', - 'is_activated' => 'Активен?', - 'is_blocked' => 'Заблокирован?', - 'is_admin' => 'Администратор?', - 'has_two_factor' => 'Защита (2FA)?', - 'blocked_code' => 'Block code', - 'source_account' => 'Source account', - 'destination_account' => 'Destination account', - 'accounts_count' => 'Всего счетов', - 'journals_count' => 'Всего транзакций', - 'attachments_count' => 'Всего вложений', - 'bills_count' => 'Всего счетов к оплате', - 'categories_count' => 'Всего категорий', - 'export_jobs_count' => 'Задачи по экспорту', - 'import_jobs_count' => 'Задачи по импорту', - 'budget_count' => 'Всего категорий бюджета', - 'rule_and_groups_count' => 'Всего правил и групп правил', - 'tags_count' => 'Всего меток', - 'inward' => 'Inward description', - 'outward' => 'Outward description', - 'number_of_transactions' => 'Number of transactions', + 'buttons' => 'Кнопки', + 'icon' => 'Значок', + 'id' => 'ID', + 'create_date' => 'Создан', + 'update_date' => 'Обновлён', + 'balance_before' => 'Баланс до', + 'balance_after' => 'Баланс после', + 'name' => 'Имя', + 'role' => 'Роль', + 'currentBalance' => 'Текущий баланс', + 'active' => 'Активен?', + 'lastActivity' => 'Последняя активность', + 'balanceDiff' => 'Разница баланса между :start и :end', + 'matchesOn' => 'Matched on', + 'account_type' => 'Тип профиля', + 'created_at' => 'Created at', + 'account' => 'Account', + 'matchingAmount' => 'Amount', + 'split_number' => 'Split #', + 'destination' => 'Destination', + 'source' => 'Source', + 'next_expected_match' => 'Next expected match', + 'automatch' => 'Auto match?', + 'repeat_freq' => 'Repeats', + 'description' => 'Описание', + 'amount' => 'Сумма', + 'internal_reference' => 'Internal reference', + 'date' => 'Дата', + 'interest_date' => 'Interest date', + 'book_date' => 'Book date', + 'process_date' => 'Processing date', + 'due_date' => 'Due date', + 'payment_date' => 'Payment date', + 'invoice_date' => 'Invoice date', + 'interal_reference' => 'Internal reference', + 'notes' => 'Заметки', + 'from' => 'Откуда', + 'piggy_bank' => 'Копилка', + 'to' => 'Куда', + 'budget' => 'Бюджет', + 'category' => 'Категория', + 'bill' => 'Счет к оплате', + 'withdrawal' => 'Расход', + 'deposit' => 'Доход', + 'transfer' => 'Перевод', + 'type' => 'Type', + 'completed' => 'Completed', + 'iban' => 'IBAN', + 'paid_current_period' => 'Paid this period', + 'email' => 'E-mail', + 'registered_at' => 'Дата регистрации', + 'is_blocked' => 'Заблокирован?', + 'is_admin' => 'Администратор?', + 'has_two_factor' => 'Защита (2FA)?', + 'blocked_code' => 'Block code', + 'source_account' => 'Source account', + 'destination_account' => 'Destination account', + 'accounts_count' => 'Всего счетов', + 'journals_count' => 'Всего транзакций', + 'attachments_count' => 'Всего вложений', + 'bills_count' => 'Всего счетов к оплате', + 'categories_count' => 'Всего категорий', + 'export_jobs_count' => 'Задачи по экспорту', + 'import_jobs_count' => 'Задачи по импорту', + 'budget_count' => 'Всего категорий бюджета', + 'rule_and_groups_count' => 'Всего правил и групп правил', + 'tags_count' => 'Всего меток', + 'inward' => 'Inward description', + 'outward' => 'Outward description', + 'number_of_transactions' => 'Number of transactions', + 'total_amount' => 'Total amount', + 'sum' => 'Sum', + 'sum_excluding_transfers' => 'Sum (excluding transfers)', + 'sum_withdrawals' => 'Sum of withdrawals', + 'sum_deposits' => 'Sum of deposits', + 'sum_transfers' => 'Sum of transfers', ]; diff --git a/resources/lang/sl_SI/bank.php b/resources/lang/sl_SI/bank.php new file mode 100644 index 0000000000..11f05b3785 --- /dev/null +++ b/resources/lang/sl_SI/bank.php @@ -0,0 +1,6 @@ + '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.', +]; \ No newline at end of file diff --git a/resources/lang/sl_SI/firefly.php b/resources/lang/sl_SI/firefly.php index 43311d999c..bca6482104 100644 --- a/resources/lang/sl_SI/firefly.php +++ b/resources/lang/sl_SI/firefly.php @@ -83,11 +83,9 @@ return [ 'cannot_redirect_to_account' => 'Firefly III cannot redirect you to the correct page. Apologies.', 'sum_of_expenses' => 'vsota stroškov', 'sum_of_income' => 'Sum of income', - 'total_sum' => 'Total sum', 'spent_in_specific_budget' => 'Spent in budget ":budget"', 'sum_of_expenses_in_budget' => 'Spent total in budget ":budget"', 'left_in_budget_limit' => 'Left to spend according to budgeting', - 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', 'current_period' => 'Current period', 'show_the_current_period_and_overview' => 'Show the current period and overview', 'pref_languages_locale' => 'For a language other than English to work properly, your operating system must be equipped with the correct locale-information. If these are not present, currency data, dates and amounts may be formatted wrong.', @@ -130,6 +128,8 @@ return [ 'exchange_rate_instructions' => 'Premoženjski račun "@name" sprejema samo transakcije v @native_currency. Če želite namesto tega uporabiti @foreign_currency, morate podati tudi znesek v @native_currency:', 'transfer_exchange_rate_instructions' => 'Izvorni premoženjski račun "@source_name" sprejema samo transakcije v @source_currency. Ciljni premoženjski račun "@dest_name" sprejema samo transakcije v @dest_currency. Podati morate znesek v obeh valutah.', 'transaction_data' => 'Transaction data', + 'invalid_server_configuration' => 'Invalid server configuration', + 'invalid_locale_settings' => 'Firefly III is unable to format monetary amounts because your server is missing the required packages. There are instructions how to do this.', // search 'search' => 'Search', @@ -139,6 +139,7 @@ return [ 'search_box_intro' => 'Welcome to the search function of Firefly III. Enter your search query in the box. Make sure you check out the help file because the search is pretty advanced.', 'search_error' => 'Error while searching', 'search_searching' => 'Searching ...', + 'search_results' => 'Search results', // repeat frequencies: 'repeat_freq_yearly' => 'yearly', @@ -151,11 +152,11 @@ return [ // export data: 'import_and_export' => 'Import and export', 'export_data' => 'Export data', + 'export_and_backup_data' => 'Export and backup', 'export_data_intro' => 'For backup purposes, when migrating to another system or when migrating to another Firefly III installation.', 'export_format' => 'Export format', 'export_format_csv' => 'Comma separated values (CSV file)', 'export_format_mt940' => 'MT940 compatible format', - 'export_included_accounts' => 'Export transactions from these accounts', 'include_old_uploads_help' => 'Firefly III does not throw away the original CSV files you have imported in the past. You can include them in your export.', 'do_export' => 'Export', 'export_status_never_started' => 'The export has not started yet', @@ -170,8 +171,6 @@ return [ 'export_status_collected_attachments' => 'Collected all your attachments!', 'export_status_collecting_old_uploads' => 'Collecting all your previous uploads...', 'export_status_collected_old_uploads' => 'Collected all your previous uploads!', - 'export_status_creating_config_file' => 'Creating a configuration file...', - 'export_status_created_config_file' => 'Created a configuration file!', 'export_status_creating_zip_file' => 'Creating a zip file...', 'export_status_created_zip_file' => 'Created a zip file!', 'export_status_finished' => 'Export has succesfully finished! Yay!', @@ -317,6 +316,8 @@ return [ 'rule_action_set_source_account' => 'Set source account to :action_value', 'rule_action_set_destination_account_choice' => 'Set destination account to...', 'rule_action_set_destination_account' => 'Set destination account to :action_value', + 'rules_have_read_warning' => 'Have you read the warning?', + 'apply_rule_warning' => 'Warning: running a rule(group) on a large selection of transactions could take ages, and it could time-out. If it does, the rule(group) will only be applied to an unknown subset of your transactions. This might leave your financial administration in tatters. Please be careful.', // tags 'store_new_tag' => 'Store new tag', @@ -326,6 +327,7 @@ return [ 'location' => 'Location', 'without_date' => 'Without date', 'result' => 'Result', + 'sums_apply_to_range' => 'All sums apply to the selected range', // preferences 'pref_home_screen_accounts' => 'Home screen accounts', @@ -414,6 +416,15 @@ return [ 'secure_pw_should' => 'Should I check the box?', 'secure_pw_long_password' => 'If you just generated a long, single-use password for Firefly III using some kind of password generator: no.', 'secure_pw_short' => 'If you just entered the password you always use: Please yes.', + 'personal_access_token' => 'Personal access token', + 'explain_access_token' => 'You need this token to perform command line options, such as importing or exporting data. Without it, such sensitive commands will not work. Do not share your access token. Nobody will ask you for this token, not even me. If you fear you lost this, or when you\'re paranoid, regenerate this token using the button.', + 'regenerate_access_token' => 'Regenerate access token', + 'token_regenerated' => 'A new token was generated', + 'change_your_email' => 'Change your email address', + 'email_verification' => 'An email message will be sent to your old AND new email address. For security purposes, you will not be able to login until you verify your new email address. If you are unsure if your Firefly III installation is capable of sending email, please do not use this feature. If you are an administrator, you can test this in the Administration.', + 'email_changed_logout' => 'Until you verify your email address, you cannot login.', + 'login_with_new_email' => 'You can now login with your new email address.', + 'login_with_old_email' => 'You can now login with your old email address again.', // attachments @@ -447,7 +458,6 @@ return [ 'convert_options_DepositWithdrawal' => 'Convert a deposit into a withdrawal', 'convert_options_TransferWithdrawal' => 'Convert a transfer into a withdrawal', 'convert_options_TransferDeposit' => 'Convert a transfer into a deposit', - 'transaction_journal_convert_options' => 'Convert this transaction', 'convert_Withdrawal_to_deposit' => 'Convert this withdrawal to a deposit', 'convert_Withdrawal_to_transfer' => 'Convert this withdrawal to a transfer', 'convert_Deposit_to_withdrawal' => 'Convert this deposit to a withdrawal', @@ -467,7 +477,7 @@ return [ 'converted_to_Withdrawal' => 'The transaction has been converted to a withdrawal', 'converted_to_Deposit' => 'The transaction has been converted to a deposit', 'converted_to_Transfer' => 'The transaction has been converted to a transfer', - + 'invalid_convert_selection' => 'The account you have selected is already used in this transaction or does not exist.', // create new stuff: 'create_new_withdrawal' => 'Create new withdrawal', @@ -517,6 +527,11 @@ return [ 'update_budget' => 'Update budget', 'update_budget_amount_range' => 'Update (expected) available amount between :start and :end', 'budget_period_navigator' => 'Period navigator', + 'info_on_available_amount' => 'What do I have available?', + 'available_amount_indication' => 'Use these amounts to get an indication of what your total budget could be.', + 'suggested' => 'Suggested', + 'average_between' => 'Average between :start and :end', + // bills: 'matching_on' => 'Matching on', @@ -647,10 +662,8 @@ return [ 'newWithdrawal' => 'New expense', 'newDeposit' => 'New deposit', 'newTransfer' => 'New transfer', - 'moneyIn' => 'Money in', - 'moneyOut' => 'Money out', - 'billsToPay' => 'Bills to pay', - 'billsPaid' => 'Bills paid', + 'bills_to_pay' => 'Bills to pay', + 'per_day' => 'Per day', // menu and titles, should be recycled as often as possible: 'currency' => 'Currency', @@ -850,9 +863,6 @@ return [ 'removed_amount_from_piggy' => 'Removed :amount from ":name"', // tags - 'regular_tag' => 'Just a regular tag.', - 'balancing_act' => 'The tag takes at most two transactions; an expense and a transfer. They\'ll balance each other out.', - 'advance_payment' => 'The tag accepts one expense and any number of deposits aimed to repay the original expense.', 'delete_tag' => 'Delete tag ":tag"', 'deleted_tag' => 'Deleted tag ":tag"', 'new_tag' => 'Make new tag', @@ -891,6 +901,17 @@ return [ 'block_code_bounced' => 'Email message(s) bounced', 'block_code_expired' => 'Demo account expired', 'no_block_code' => 'No reason for block or user not blocked', + 'block_code_email_changed' => 'User has not yet confirmed new email address', + 'admin_update_email' => 'Contrary to the profile page, the user will NOT be notified their email address has changed!', + 'update_user' => 'Update user', + 'updated_user' => 'User data has been changed.', + 'delete_user' => 'Delete user :email', + 'user_deleted' => 'The user has been deleted', + 'send_test_email' => 'Send test email message', + 'send_test_email_text' => 'To see if your installation is capable of sending email, please press this button. You will not see an error here (if any), the log files will reflect any errors. You can press this button as many times as you like. There is no spam control. The message will be sent to :email and should arrive shortly.', + 'send_message' => 'Send message', + 'send_test_triggered' => 'Test was triggered. Check your inbox and the log files.', + // links 'journal_link_configuration' => 'Transaction links configuration', 'create_new_link_type' => 'Create new link type', @@ -914,7 +935,7 @@ return [ 'transaction' => 'Transaction', 'comments' => 'Comments', 'to_link_not_found' => 'If the transaction you want to link to is not listed, simply enter its ID.', - 'invalid_link_data' => 'Invalid link type selected. Cannot link transaction.', + 'invalid_link_selection' => 'Cannot link these transactions', 'journals_linked' => 'Transactions are linked.', 'journals_error_linked' => 'These transactions are already linked.', 'journal_links' => 'Transaction links', @@ -924,14 +945,16 @@ return [ 'overview_for_link' => 'Overview for link type ":name"', 'delete_journal_link' => 'Delete the link between :source and :destination', 'deleted_link' => 'Deleted link', - '1_outward' => 'relates to', - '2_outward' => '(partially) refunds', - '3_outward' => '(partially) pays for', - '4_outward' => '(partially) reimburses', - '1_inward' => 'relates to', - '2_inward' => 'is (partially) refunded by', - '3_inward' => 'is (partially) paid for by', - '4_inward' => 'is (partially) reimbursed by', + + // link translations: + 'relates to_inward' => 'relates to', + 'is (partially) refunded by_inward' => 'is (partially) refunded by', + 'is (partially) paid for by_inward' => 'is (partially) paid for by', + 'is (partially) reimbursed by_inward' => 'is (partially) reimbursed by', + 'relates to_outward' => 'relates to', + '(partially) refunds_outward' => '(partially) refunds', + '(partially) pays for_outward' => '(partially) pays for', + '(partially) reimburses_outward' => '(partially) reimburses', // split a transaction: @@ -946,6 +969,7 @@ return [ 'cannot_edit_multiple_dest' => 'You cannot edit splitted transaction #:id with description ":description" because it contains multiple destination accounts.', 'cannot_edit_opening_balance' => 'You cannot edit the opening balance of an account.', 'no_edit_multiple_left' => 'You have selected no valid transactions to edit.', + 'cannot_convert_split_journal' => 'Cannot convert a split transaction', // import bread crumbs and titles: 'import' => 'Import', @@ -960,6 +984,7 @@ return [ 'import_index_config' => 'If you have previously imported data into Firefly III, you may have a configuration file, which will pre-set configuration values for you. For some banks, other users have kindly provided their configuration file.', 'import_index_type' => 'Select the type of file you will upload', 'import_index_start' => 'Start importing', + 'import_file' => 'Import a file', // supported file types: 'import_file_type_csv' => 'CSV (comma separated values)', @@ -989,13 +1014,13 @@ return [ 'import_status_finished_title' => 'Import routine finished', 'import_status_finished_text' => 'The import routine has imported your file.', 'import_status_finished_job' => 'The transactions imported can be found in tag :tag.', + 'import_status_job_running' => 'The import is running...', 'import_with_key' => 'Import with key \':key\'', // sandstorm.io errors and messages: 'sandstorm_not_available' => 'This function is not available when you are using Firefly III within a Sandstorm.io environment.', // empty lists? no objects? instructions: - 'no_transactions_in_period' => 'There are no transactions in this period.', 'no_accounts_title_asset' => 'Ustvarite premoženjski račun!', 'no_accounts_intro_asset' => 'Še nobenega premoženjskega računa nimate. Premoženjski računi so vaši glavni računi sredstev: tekoči računi, skupni računi, varčevalni računi in celo računi kreditnih kartic.', 'no_accounts_imperative_asset' => 'Da začnete uporabljati Firefly III, morate ustvariti vsaj en premoženjski račun:', diff --git a/resources/lang/sl_SI/form.php b/resources/lang/sl_SI/form.php index c3930e8f0a..29500b6af4 100644 --- a/resources/lang/sl_SI/form.php +++ b/resources/lang/sl_SI/form.php @@ -30,13 +30,10 @@ return [ 'currency_id' => 'Currency', 'attachments' => 'Attachments', 'journal_amount' => 'Amount', - 'journal_asset_source_account' => 'premoženjski račun (vir)', 'journal_source_account_name' => 'Revenue account (source)', 'journal_source_account_id' => 'premoženjski račun (vir)', 'BIC' => 'BIC', 'verify_password' => 'Verify password security', - 'account_from_id' => 'From account', - 'account_to_id' => 'To account', 'source_account' => 'Source account', 'destination_account' => 'Destination account', 'journal_destination_account_id' => 'premoženjski račun (cilj)', @@ -53,7 +50,6 @@ return [ 'tagMode' => 'Tag mode', 'tagPosition' => 'Tag location', 'virtualBalance' => 'Virtual balance', - 'longitude_latitude' => 'Location', 'targetamount' => 'Target amount', 'accountRole' => 'Account role', 'openingBalanceDate' => 'Opening balance date', @@ -68,12 +64,13 @@ return [ 'revenue_account' => 'Revenue account', 'decimal_places' => 'Decimal places', 'exchange_rate_instruction' => 'Foreign currencies', - 'exchanged_amount' => 'Exchanged amount', 'source_amount' => 'Amount (source)', 'destination_amount' => 'Amount (destination)', 'native_amount' => 'Native amount', + 'new_email_address' => 'New email address', + 'verification' => 'Verification', + 'api_key' => 'API key', - 'revenue_account_source' => 'Revenue account (source)', 'source_account_asset' => 'vir (premoženjski račun)', 'destination_account_expense' => 'ciljni konto (stroški)', 'destination_account_asset' => 'ciljni račun (premoženjski račun)', @@ -111,7 +108,6 @@ return [ 'add_new_withdrawal' => 'Add a new withdrawal', 'add_new_deposit' => 'Add a new deposit', 'add_new_transfer' => 'Add a new transfer', - 'noPiggybank' => '(no piggy bank)', 'title' => 'Title', 'notes' => 'Notes', 'filename' => 'File name', @@ -137,6 +133,8 @@ return [ 'delete_rule' => 'Delete rule ":title"', 'delete_rule_group' => 'Delete rule group ":title"', 'delete_link_type' => 'Delete link type ":name"', + 'delete_user' => 'Delete user ":email"', + 'user_areYouSure' => 'If you delete user ":email", everything will be gone. There is no undo, undelete or anything. If you delete yourself, you will lose access to this instance of Firefly III.', 'attachment_areYouSure' => 'Are you sure you want to delete the attachment named ":name"?', 'account_areYouSure' => 'Are you sure you want to delete the account named ":name"?', 'bill_areYouSure' => 'Are you sure you want to delete the bill named ":name"?', @@ -174,7 +172,6 @@ return [ // admin 'domain' => 'Domain', 'single_user_mode' => 'Single user mode', - 'must_confirm_account' => 'New users must activate account', 'is_demo_site' => 'Is demo site', @@ -194,7 +191,7 @@ return [ 'payment_date' => 'Payment date', 'invoice_date' => 'Invoice date', 'internal_reference' => 'Internal reference', - - 'inward' => 'Inward description', - 'outward' => 'Outward description', + 'inward' => 'Inward description', + 'outward' => 'Outward description', + 'rule_group_id' => 'Rule group', ]; diff --git a/resources/lang/sl_SI/intro.php b/resources/lang/sl_SI/intro.php index 02a0eead23..0fe735125b 100644 --- a/resources/lang/sl_SI/intro.php +++ b/resources/lang/sl_SI/intro.php @@ -31,6 +31,7 @@ return [ 'budgets_index_navigate_periods' => 'Navigate through periods to easily set budgets ahead of time.', 'budgets_index_new_budget' => 'Create new budgets as you see fit.', 'budgets_index_list_of_budgets' => 'Use this table to set the amounts for each budget and see how you are doing.', + 'budgets_index_outro' => 'To learn more about budgeting, checkout the help icon in the top right corner.', // reports (index) 'reports_index_intro' => 'Use these reports to get detailed insights in your finances.', diff --git a/resources/lang/sl_SI/list.php b/resources/lang/sl_SI/list.php index 264d55d72a..2b5db98f9b 100644 --- a/resources/lang/sl_SI/list.php +++ b/resources/lang/sl_SI/list.php @@ -12,78 +12,80 @@ declare(strict_types=1); */ return [ - 'buttons' => 'Gumbi', - 'icon' => 'Ikona', - 'id' => 'ID', - 'create_date' => 'Ustvarjeno', - 'update_date' => 'Posodobljeno', - 'balance_before' => 'Stanje prej', - 'balance_after' => 'Stanje potem', - 'name' => 'ime', - 'role' => 'vloga', - 'currentBalance' => 'trenutno stanje', - 'active' => 'Aktiviran?', - 'lastActivity' => 'zadnja aktivnost', - 'balanceDiff' => 'Razlika stanja med :start in :end', - 'matchedOn' => 'Povezano', - 'matchesOn' => 'Povezano', - 'account_type' => 'vrsta računa', - 'created_at' => 'ustvarjeno', - 'new_balance' => 'novo stanje', - 'account' => 'račun', - 'matchingAmount' => 'znesek', - 'lastMatch' => 'Nazadnje povezano', - 'split_number' => 'Delitev #', - 'destination' => 'Ciljni račun', - 'source' => 'Izvor', - 'next_expected_match' => 'Naslenje pričakovano ujemanje', - 'automatch' => 'Samodejno poveži?', - 'repeat_freq' => 'Ponovitev', - 'description' => 'Opis', - 'amount' => 'Znesek', - 'internal_reference' => 'Notranji sklic', - 'date' => 'datum', - 'interest_date' => 'datum obresti', - 'book_date' => 'datum knjiženja', - 'process_date' => 'datum izvedbe', - 'due_date' => 'rok plačila', - 'payment_date' => 'Datum plačila', - 'invoice_date' => 'datum računa', - 'interal_reference' => 'Notranji sklic', - 'notes' => 'Zabeležke', - 'from' => 'Pošiljatelj', - 'piggy_bank' => 'Pujsek', - 'to' => 'Prejemnik', - 'budget' => 'Budžet', - 'category' => 'Kategorija', - 'bill' => 'Trajnik', - 'withdrawal' => 'Odhodek', - 'deposit' => 'Prihodek', - 'transfer' => 'Prenos', - 'type' => 'Vrsta', - 'completed' => 'Dokončano', - 'iban' => 'IBAN', - 'paid_current_period' => 'Plačano v tem obdobju', - 'email' => 'E-pošta', - 'registered_at' => 'Registriran pri', - 'is_activated' => 'Je aktiviran', - 'is_blocked' => 'Je blokiran', - 'is_admin' => 'Je administrator', - 'has_two_factor' => 'Ima dvostopenjsko overovitev', - 'blocked_code' => 'Koda vzroka blokade', - 'source_account' => 'Izvorni račun', - 'destination_account' => 'Ciljni račun', - 'accounts_count' => 'Število računov', - 'journals_count' => 'Število transakcij', - 'attachments_count' => 'Število prilog', - 'bills_count' => 'Število trajnikov', - 'categories_count' => 'Število kategorij', - 'export_jobs_count' => 'Število izvozov', - 'import_jobs_count' => 'Število uvozov', - 'budget_count' => 'Število budžetov', - 'rule_and_groups_count' => 'Število pravil in skupin pravil', - 'tags_count' => 'Število značk', - 'inward' => 'Inward description', - 'outward' => 'Outward description', - 'number_of_transactions' => 'Number of transactions', + 'buttons' => 'Gumbi', + 'icon' => 'Ikona', + 'id' => 'ID', + 'create_date' => 'Ustvarjeno', + 'update_date' => 'Posodobljeno', + 'balance_before' => 'Stanje prej', + 'balance_after' => 'Stanje potem', + 'name' => 'ime', + 'role' => 'vloga', + 'currentBalance' => 'trenutno stanje', + 'active' => 'Aktiviran?', + 'lastActivity' => 'zadnja aktivnost', + 'balanceDiff' => 'Razlika stanja med :start in :end', + 'matchesOn' => 'Povezano', + 'account_type' => 'vrsta računa', + 'created_at' => 'ustvarjeno', + 'account' => 'račun', + 'matchingAmount' => 'znesek', + 'split_number' => 'Delitev #', + 'destination' => 'Ciljni račun', + 'source' => 'Izvor', + 'next_expected_match' => 'Naslenje pričakovano ujemanje', + 'automatch' => 'Samodejno poveži?', + 'repeat_freq' => 'Ponovitev', + 'description' => 'Opis', + 'amount' => 'Znesek', + 'internal_reference' => 'Notranji sklic', + 'date' => 'datum', + 'interest_date' => 'datum obresti', + 'book_date' => 'datum knjiženja', + 'process_date' => 'datum izvedbe', + 'due_date' => 'rok plačila', + 'payment_date' => 'Datum plačila', + 'invoice_date' => 'datum računa', + 'interal_reference' => 'Notranji sklic', + 'notes' => 'Zabeležke', + 'from' => 'Pošiljatelj', + 'piggy_bank' => 'Pujsek', + 'to' => 'Prejemnik', + 'budget' => 'Budžet', + 'category' => 'Kategorija', + 'bill' => 'Trajnik', + 'withdrawal' => 'Odhodek', + 'deposit' => 'Prihodek', + 'transfer' => 'Prenos', + 'type' => 'Vrsta', + 'completed' => 'Dokončano', + 'iban' => 'IBAN', + 'paid_current_period' => 'Plačano v tem obdobju', + 'email' => 'E-pošta', + 'registered_at' => 'Registriran pri', + 'is_blocked' => 'Je blokiran', + 'is_admin' => 'Je administrator', + 'has_two_factor' => 'Ima dvostopenjsko overovitev', + 'blocked_code' => 'Koda vzroka blokade', + 'source_account' => 'Izvorni račun', + 'destination_account' => 'Ciljni račun', + 'accounts_count' => 'Število računov', + 'journals_count' => 'Število transakcij', + 'attachments_count' => 'Število prilog', + 'bills_count' => 'Število trajnikov', + 'categories_count' => 'Število kategorij', + 'export_jobs_count' => 'Število izvozov', + 'import_jobs_count' => 'Število uvozov', + 'budget_count' => 'Število budžetov', + 'rule_and_groups_count' => 'Število pravil in skupin pravil', + 'tags_count' => 'Število značk', + 'inward' => 'Inward description', + 'outward' => 'Outward description', + 'number_of_transactions' => 'Number of transactions', + 'total_amount' => 'Total amount', + 'sum' => 'Sum', + 'sum_excluding_transfers' => 'Sum (excluding transfers)', + 'sum_withdrawals' => 'Sum of withdrawals', + 'sum_deposits' => 'Sum of deposits', + 'sum_transfers' => 'Sum of transfers', ]; diff --git a/resources/lang/zh_TW/auth.php b/resources/lang/zh_TW/auth.php deleted file mode 100644 index 31adf168b6..0000000000 --- a/resources/lang/zh_TW/auth.php +++ /dev/null @@ -1,30 +0,0 @@ - '帳號或密碼錯誤。', - 'throttle' => '登入失敗次數過多,請等待 :seconds 秒後再試。', - -]; \ No newline at end of file diff --git a/resources/lang/zh_TW/breadcrumbs.php b/resources/lang/zh_TW/breadcrumbs.php deleted file mode 100644 index a99899ab8a..0000000000 --- a/resources/lang/zh_TW/breadcrumbs.php +++ /dev/null @@ -1,44 +0,0 @@ - '首頁', - 'edit_currency' => '編輯貨幣 ":name"', - 'delete_currency' => '刪除貨幣 ":name"', - 'newPiggyBank' => '創建一個新的存錢筒', - 'edit_piggyBank' => '編輯存錢筒 ":name"', - 'preferences' => '設定', - 'profile' => '個人設定', - 'changePassword' => '更改密碼', - 'bills' => '賬單', - 'newBill' => '新增賬單', - 'edit_bill' => '編輯賬單 ":name"', - 'delete_bill' => '刪除賬單 ":name"', - 'reports' => '報表', - 'search_result' => 'Search results for ":query"', - 'withdrawal_list' => '支出', - 'deposit_list' => '收入、薪金與存款', - 'transfer_list' => '轉帳', - 'transfers_list' => '轉帳', - 'create_withdrawal' => '新增提款', - 'create_deposit' => '新增存款', - 'create_transfer' => '新增轉帳', - 'edit_journal' => '編緝交易 ":description"', - 'delete_journal' => '刪除交易 ":description"', - 'tags' => '標籤', - 'createTag' => '建立新標籤', - 'edit_tag' => '編輯標籤 ":tag"', - 'delete_tag' => '刪除標籤 ":tag"', - 'delete_journal_link' => 'Delete link between transactions', -]; \ No newline at end of file diff --git a/resources/lang/zh_TW/config.php b/resources/lang/zh_TW/config.php deleted file mode 100644 index a0f1890833..0000000000 --- a/resources/lang/zh_TW/config.php +++ /dev/null @@ -1,25 +0,0 @@ - 'en, English, en_US, en_US.utf8, en_US.UTF-8', - 'month' => '%B %Y', - 'month_and_day' => '%B %e, %Y', - 'date_time' => '%B %e, %Y, @ %T', - 'specific_day' => '%e %B %Y', - 'week_in_year' => 'Week %W, %Y', - 'quarter_of_year' => '%B %Y', - 'year' => '%Y', - 'half_year' => '%B %Y', - -]; \ No newline at end of file diff --git a/resources/lang/zh_TW/csv.php b/resources/lang/zh_TW/csv.php deleted file mode 100644 index 7d9cc46f46..0000000000 --- a/resources/lang/zh_TW/csv.php +++ /dev/null @@ -1,83 +0,0 @@ - 'Import setup (1/3) - Basic CSV import setup', - 'initial_text' => 'To be able to import your file correctly, please validate the options below.', - 'initial_box' => 'Basic CSV import setup', - 'initial_box_title' => 'Basic CSV import setup options', - 'initial_header_help' => 'Check this box if the first row of your CSV file are the column titles.', - 'initial_date_help' => 'Date time format in your CSV. Follow the format like this page indicates. The default value will parse dates that look like this: :dateExample.', - 'initial_delimiter_help' => 'Choose the field delimiter that is used in your input file. If not sure, comma is the safest option.', - '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.', - 'initial_submit' => 'Continue with step 2/3', - - // roles config - 'roles_title' => 'Import setup (2/3) - Define each column\'s role', - '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.', - 'roles_table' => 'Table', - 'roles_column_name' => 'Name of column', - 'roles_column_example' => 'Column example data', - 'roles_column_role' => 'Column data meaning', - 'roles_do_map_value' => 'Map these values', - 'roles_column' => 'Column', - 'roles_no_example_data' => 'No example data available', - 'roles_submit' => 'Continue with step 3/3', - '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.', - - // map data - 'map_title' => 'Import setup (3/3) - Connect import data to Firefly III data', - 'map_text' => '在下表中,左邊的是在你的CSV 檔中的資料。而你現在要把這些資料配對到資料庫中的資料(如有的話)。如果沒有資料能夠進行配對,或者你不想進行配對,請選擇不進行配對。', - 'map_field_value' => 'Field value', - 'map_field_mapped_to' => 'Mapped to', - 'map_do_not_map' => '(do not map)', - 'map_submit' => 'Start the import', - - // map things. - 'column__ignore' => '(忽略此欄)', - 'column_account-iban' => '資產帳戶 (IBAN)', - 'column_account-id' => '資產帳戶 ID (與 Firefly 匹配)', - 'column_account-name' => '資產帳戶 (名稱)', - 'column_amount' => '金額', - 'column_amount-comma-separated' => '金額 (逗號作為小數分隔符號)', - 'column_bill-id' => '帳單 ID (與 Firefly 匹配)', - 'column_bill-name' => '帳單名稱', - 'column_budget-id' => '預算 ID (與 Firefly 匹配)', - 'column_budget-name' => '預算名稱', - 'column_category-id' => '類別 ID (與 Firefly 匹配)', - 'column_category-name' => '類別名稱', - 'column_currency-code' => '貨幣代碼 (ISO 4217)', - 'column_currency-id' => '貨幣 ID (與 Firefly 匹配)', - 'column_currency-name' => '貨幣名稱(與 Firefly 匹配)', - 'column_currency-symbol' => '貨幣符號 (與 Firefly 匹配)', - 'column_date-interest' => '利息計算日', - 'column_date-book' => 'Transaction booking date', - 'column_date-process' => '交易處理日期', - 'column_date-transaction' => '日期', - 'column_description' => '描述', - 'column_opposing-iban' => '抵銷的帳戶 (IBAN)', - 'column_opposing-id' => '抵銷的帳戶 ID (與 Firefly 匹配)', - 'column_external-id' => '外部 ID', - 'column_opposing-name' => '抵銷的帳戶 (名稱)', - 'column_rabo-debet-credit' => '荷蘭合作銀行獨有的借記/貸記指標', - 'column_ing-debet-credit' => 'ING 集團獨有的借記/貸記指標', - 'column_sepa-ct-id' => 'SEPA Credit Transfer end-to-end ID', - 'column_sepa-ct-op' => 'SEPA 貸記劃撥抵銷的帳戶', - 'column_sepa-db' => 'SEPA 直接付款', - 'column_tags-comma' => '標籤 (逗號分隔)', - 'column_tags-space' => '標籤 (空格分隔)', - 'column_account-number' => '資產帳戶 (帳號號碼)', - 'column_opposing-number' => '抵銷的帳戶 (帳號號碼)', -]; \ No newline at end of file diff --git a/resources/lang/zh_TW/demo.php b/resources/lang/zh_TW/demo.php deleted file mode 100644 index 8b442add2d..0000000000 --- a/resources/lang/zh_TW/demo.php +++ /dev/null @@ -1,26 +0,0 @@ - 'Sorry, there is no extra demo-explanation text for this page.', - 'see_help_icon' => 'However, the -icon in the top right corner may tell you more.', - 'index' => 'Welcome to Firefly III! On this page you get a quick overview of your finances. For more information, check out Accounts → Asset Accounts and of course the Budgets and Reports pages. Or just take a look around and see where you end up.', - 'accounts-index' => 'Asset accounts are your personal bank accounts. Expense accounts are the accounts you spend money at, such as stores and friends. Revenue accounts are accounts you receive money from, such as your job, the government or other sources of income. On this page you can edit or remove them.', - 'budgets-index' => 'This page shows you an overview of your budgets. The top bar shows the amount that is available to be budgeted. This can be customized for any period by clicking the amount on the right. The amount you\'ve actually spent is shown in the bar below. Below that are the expenses per budget and what you\'ve budgeted for them.', - 'reports-index-start' => 'Firefly III supports four types of reports. Read about them by clicking on the -icon in the top right corner.', - 'reports-index-examples' => 'Be sure to check out these examples: a monthly financial overview, a yearly financial overview and a budget overview.', - 'currencies-index' => 'Firefly III supports multiple currencies. Although it defaults to the Euro it can be set to the US Dollar and many other currencies. As you can see a small selection of currencies has been included but you can add your own if you wish to. Changing the default currency will not change the currency of existing transactions however: Firefly III supports the use of multiple currencies at the same time.', - 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', - 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', - 'import-index' => 'Of course, any CSV file can be imported into Firefly III ', - 'import-configure-security' => 'Because of security concerns, your upload has been replaced with a local file.', - 'import-configure-configuration' => 'The configuration you see below is correct for the local file.', -]; \ No newline at end of file diff --git a/resources/lang/zh_TW/firefly.php b/resources/lang/zh_TW/firefly.php deleted file mode 100644 index 3ea696070e..0000000000 --- a/resources/lang/zh_TW/firefly.php +++ /dev/null @@ -1,1012 +0,0 @@ - '關閉', - 'actions' => '操作', - 'edit' => '編輯', - 'delete' => '刪除', - 'welcomeBack' => '情況如何?', - 'everything' => '顯示所有', - 'customRange' => '自訂範圍', - 'apply' => '套用', - 'select_date' => 'Select date..', - 'cancel' => '取消', - 'from' => '從', - 'to' => '到', - 'showEverything' => '全部顯示', - 'never' => '從來沒有', - 'no_results_for_empty_search' => 'Your search was empty, so nothing was found.', - 'removed_amount' => '移除了 :amount', - 'added_amount' => '添加了 :amount', - 'asset_account_role_help' => '你可以稍後再設置其他選項。', - 'Opening balance' => '開戶金額', - 'create_new_stuff' => '創建新的東西', - 'new_withdrawal' => '新提款', - 'new_deposit' => '新存款', - 'new_transfer' => '新的轉帳', - 'new_asset_account' => '新增資產帳戶', - 'new_expense_account' => '新的支出帳戶', - 'new_revenue_account' => '新的收入帳戶', - 'new_budget' => '新增預算', - 'new_bill' => '新增賬單', - 'block_account_logout' => '你已被登出。被封禁的帳戶不能使用本網站。你沒有以有效的電子郵件地址註冊嗎?', - 'flash_success' => '成功!', - 'flash_info' => '訊息', - 'flash_warning' => '警告!', - 'flash_error' => '錯誤!', - 'flash_info_multiple' => '有一個訊息|有 :count 個訊息', - 'flash_error_multiple' => '出現了一個錯誤|出現了 :count 個錯誤', - 'net_worth' => '淨值', - 'route_has_no_help' => '目前還沒有說明。', - 'two_factor_welcome' => '哈囉, :user !', - 'two_factor_enter_code' => '若要繼續,請輸入你的雙重身份驗證 (2FA) 應用程序內顯示的驗證代碼。', - 'two_factor_code_here' => '在此輸入代碼', - 'two_factor_title' => '雙重身份驗證', - 'authenticate' => '認證', - 'two_factor_forgot_title' => '丟失雙重身份驗證', - 'two_factor_forgot' => '我忘記了我的雙重身份驗證 (2FA) 。', - 'two_factor_lost_header' => '丟失了雙重身份驗證 (2FA) 嗎?', - 'two_factor_lost_intro' => '很不幸,這不可以從 web 介面中重置。你有兩個選擇。', - 'two_factor_lost_fix_self' => '如果你在自己的伺服器上運行 Firefly III,請檢查 storage/logs 中的日誌。', - 'two_factor_lost_fix_owner' => '否則,請電郵網站擁有者,:site_owner 並要求他們重置你的雙重身份驗證。', - 'warning_much_data' => ':days 天的資料需要一點時間載入。', - 'registered' => '您已成功註冊 !', - 'Default asset account' => 'Default asset account', - 'no_budget_pointer' => '你還沒有預算。你可以在預算頁來建立預算。預算可以幫助你跟蹤支出情況。', - 'Savings account' => 'Savings account', - 'Credit card' => 'Credit card', - 'source_accounts' => '來源帳戶', - 'destination_accounts' => '目標帳戶', - 'user_id_is' => 'Your user id is :user', - 'field_supports_markdown' => 'This field supports Markdown.', - 'need_more_help' => 'If you need more help using Firefly III, please open a ticket on Github.', - 'reenable_intro_text' => 'You can also reenable the introduction guidance.', - 'intro_boxes_after_refresh' => 'The introduction boxes will reappear when you refresh the page.', - 'show_all_no_filter' => 'Show all transactions without grouping them by date.', - 'expenses_by_category' => 'Expenses by category', - 'expenses_by_budget' => 'Expenses by budget', - 'income_by_category' => 'Income by category', - 'expenses_by_asset_account' => 'Expenses by asset account', - 'expenses_by_expense_account' => 'Expenses by expense account', - 'cannot_redirect_to_account' => 'Firefly III cannot redirect you to the correct page. Apologies.', - 'sum_of_expenses' => 'Sum of expenses', - 'sum_of_income' => 'Sum of income', - 'total_sum' => 'Total sum', - 'spent_in_specific_budget' => 'Spent in budget ":budget"', - 'sum_of_expenses_in_budget' => 'Spent total in budget ":budget"', - 'left_in_budget_limit' => 'Left to spend according to budgeting', - 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', - 'current_period' => 'Current period', - 'show_the_current_period_and_overview' => 'Show the current period and overview', - 'pref_languages_locale' => 'For a language other than English to work properly, your operating system must be equipped with the correct locale-information. If these are not present, currency data, dates and amounts may be formatted wrong.', - 'budget_in_period' => 'All transactions for budget ":name" between :start and :end', - 'chart_budget_in_period' => 'Chart for all transactions for budget ":name" between :start and :end', - 'chart_account_in_period' => 'Chart for all transactions for account ":name" between :start and :end', - 'chart_category_in_period' => 'Chart for all transactions for category ":name" between :start and :end', - 'chart_category_all' => 'Chart for all transactions for category ":name"', - 'clone_withdrawal' => 'Clone this withdrawal', - 'clone_deposit' => 'Clone this deposit', - 'clone_transfer' => 'Clone this transfer', - 'multi_select_no_selection' => 'None selected', - 'multi_select_all_selected' => 'All selected', - 'multi_select_filter_placeholder' => 'Find..', - 'between_dates_breadcrumb' => 'Between :start and :end', - 'all_journals_without_budget' => 'All transactions without a budget', - 'journals_without_budget' => 'Transactions without a budget', - 'all_journals_without_category' => 'All transactions without a category', - 'journals_without_category' => 'Transactions without a category', - 'all_journals_for_account' => 'All transactions for account :name', - 'chart_all_journals_for_account' => 'Chart of all transactions for account :name', - 'journals_in_period_for_account' => 'All transactions for account :name between :start and :end', - 'transferred' => 'Transferred', - 'all_withdrawal' => 'All expenses', - 'all_transactions' => 'All transactions', - 'title_withdrawal_between' => 'All expenses between :start and :end', - 'all_deposit' => 'All revenue', - 'title_deposit_between' => 'All revenue between :start and :end', - 'all_transfers' => 'All transfers', - 'title_transfers_between' => 'All transfers between :start and :end', - 'all_transfer' => 'All transfers', - 'all_journals_for_tag' => 'All transactions for tag ":tag"', - 'title_transfer_between' => 'All transfers between :start and :end', - 'all_journals_for_category' => 'All transactions for category :name', - 'all_journals_for_budget' => 'All transactions for budget :name', - 'chart_all_journals_for_budget' => 'Chart of all transactions for budget :name', - 'journals_in_period_for_category' => 'All transactions for category :name between :start and :end', - 'journals_in_period_for_tag' => 'All transactions for tag :tag between :start and :end', - 'not_available_demo_user' => 'The feature you try to access is not available to demo users.', - 'exchange_rate_instructions' => 'Asset account "@name" only accepts transactions in @native_currency. If you wish to use @foreign_currency instead, make sure that the amount in @native_currency is known as well:', - 'transfer_exchange_rate_instructions' => 'Source asset account "@source_name" only accepts transactions in @source_currency. Destination asset account "@dest_name" only accepts transactions in @dest_currency. You must provide the transferred amount correctly in both currencies.', - 'transaction_data' => 'Transaction data', - - // search - 'search' => '搜尋', - 'search_found_transactions' => 'Number of transactions found:', - 'general_search_error' => 'An error occured while searching. Please check the log files for more information.', - 'search_box' => 'Search', - 'search_box_intro' => 'Welcome to the search function of Firefly III. Enter your search query in the box. Make sure you check out the help file because the search is pretty advanced.', - 'search_error' => 'Error while searching', - 'search_searching' => 'Searching ...', - - // repeat frequencies: - 'repeat_freq_yearly' => 'yearly', - 'repeat_freq_monthly' => '每月', - 'weekly' => '每週', - 'quarterly' => '每季', - 'half-year' => '每半年', - 'yearly' => '每年', - - // export data: - 'import_and_export' => '匯入與匯出', - 'export_data' => 'Export data', - 'export_data_intro' => 'For backup purposes, when migrating to another system or when migrating to another Firefly III installation.', - 'export_format' => 'Export format', - 'export_format_csv' => 'Comma separated values (CSV file)', - 'export_format_mt940' => 'MT940 相容格式', - 'export_included_accounts' => '從這些帳戶匯出交易記錄', - 'include_old_uploads_help' => 'Firefly III 不會扔掉過去已導入的原始 CSV 檔。你可以將它們包含在匯出的檔案中。', - 'do_export' => '匯出', - 'export_status_never_started' => '匯出尚未開始', - 'export_status_make_exporter' => 'Creating exporter thing...', - 'export_status_collecting_journals' => '正在收集你的交易資料...', - 'export_status_collected_journals' => '你的交易資料已經收集成功!', - 'export_status_converting_to_export_format' => '正在轉換您的交易資料...', - 'export_status_converted_to_export_format' => 'Converted your transactions!', - 'export_status_creating_journal_file' => 'Creating the export file...', - 'export_status_created_journal_file' => 'Created the export file!', - 'export_status_collecting_attachments' => 'Collecting all your attachments...', - 'export_status_collected_attachments' => 'Collected all your attachments!', - 'export_status_collecting_old_uploads' => 'Collecting all your previous uploads...', - 'export_status_collected_old_uploads' => 'Collected all your previous uploads!', - 'export_status_creating_config_file' => 'Creating a configuration file...', - 'export_status_created_config_file' => 'Created a configuration file!', - 'export_status_creating_zip_file' => 'Creating a zip file...', - 'export_status_created_zip_file' => 'Created a zip file!', - 'export_status_finished' => 'Export has succesfully finished! Yay!', - 'export_data_please_wait' => 'Please wait...', - - // rules - 'rules' => 'Rules', - 'rule_name' => 'Name of rule', - 'rule_triggers' => 'Rule triggers when', - 'rule_actions' => 'Rule will', - 'new_rule' => 'New rule', - 'new_rule_group' => 'New rule group', - 'rule_priority_up' => 'Give rule more priority', - 'rule_priority_down' => 'Give rule less priority', - 'make_new_rule_group' => 'Make new rule group', - 'store_new_rule_group' => 'Store new rule group', - 'created_new_rule_group' => 'New rule group ":title" stored!', - 'updated_rule_group' => 'Successfully updated rule group ":title".', - 'edit_rule_group' => 'Edit rule group ":title"', - 'delete_rule_group' => 'Delete rule group ":title"', - 'deleted_rule_group' => 'Deleted rule group ":title"', - 'update_rule_group' => 'Update rule group', - 'no_rules_in_group' => 'There are no rules in this group', - 'move_rule_group_up' => 'Move rule group up', - 'move_rule_group_down' => 'Move rule group down', - 'save_rules_by_moving' => 'Save these rule(s) by moving them to another rule group:', - 'make_new_rule' => 'Make new rule in rule group ":title"', - 'rule_help_stop_processing' => 'When you check this box, later rules in this group will not be executed.', - 'rule_help_active' => 'Inactive rules will never fire.', - 'stored_new_rule' => 'Stored new rule with title ":title"', - 'deleted_rule' => 'Deleted rule with title ":title"', - 'store_new_rule' => 'Store new rule', - 'updated_rule' => 'Updated rule with title ":title"', - 'default_rule_group_name' => 'Default rules', - 'default_rule_group_description' => '所有不屬於任何組別的規則', - 'default_rule_name' => 'Your first default rule', - 'default_rule_description' => '這是一個例子。你可以把這個規則刪除。', - 'default_rule_trigger_description' => '賣世界的小男孩', - 'default_rule_trigger_from_account' => 'David Bowie', - 'default_rule_action_prepend' => '買下了整個世界。錢給了', - 'default_rule_action_set_category' => 'Large expenses', - 'trigger' => 'Trigger', - 'trigger_value' => 'Trigger on value', - 'stop_processing_other_triggers' => 'Stop processing other triggers', - 'add_rule_trigger' => 'Add new trigger', - 'action' => 'Action', - 'action_value' => 'Action value', - 'stop_executing_other_actions' => 'Stop executing other actions', - 'add_rule_action' => 'Add new action', - 'edit_rule' => 'Edit rule ":title"', - 'delete_rule' => 'Delete rule ":title"', - 'update_rule' => 'Update rule', - 'test_rule_triggers' => 'See matching transactions', - 'warning_transaction_subset' => 'For performance reasons this list is limited to :max_num_transactions and may only show a subset of matching transactions', - 'warning_no_matching_transactions' => 'No matching transactions found. Please note that for performance reasons, only the last :num_transactions transactions have been checked.', - 'warning_no_valid_triggers' => 'No valid triggers provided.', - 'apply_rule_selection' => 'Apply rule ":title" to a selection of your transactions', - 'apply_rule_selection_intro' => 'Rules like ":title" are normally only applied to new or updated transactions, but you can tell Firefly III to run it on a selection of your existing transactions. This can be useful when you have updated a rule and you need the changes to be applied to all of your other transactions.', - 'include_transactions_from_accounts' => 'Include transactions from these accounts', - 'applied_rule_selection' => 'Rule ":title" has been applied to your selection.', - 'execute' => 'Execute', - 'apply_rule_group_selection' => 'Apply rule group ":title" to a selection of your transactions', - 'apply_rule_group_selection_intro' => 'Rule groups like ":title" are normally only applied to new or updated transactions, but you can tell Firefly III to run all the rules in this group on a selection of your existing transactions. This can be useful when you have updated a group of rules and you need the changes to be applied to all of your other transactions.', - 'applied_rule_group_selection' => 'Rule group ":title" has been applied to your selection.', - - // actions and triggers - 'rule_trigger_user_action' => 'User action is ":trigger_value"', - 'rule_trigger_from_account_starts' => '以 ":trigger_value" 開頭的來源帳戶', - 'rule_trigger_from_account_ends' => '以 ":trigger_value" 為結尾的來源帳戶', - 'rule_trigger_from_account_is' => '來源帳戶是 ":trigger_value"', - 'rule_trigger_from_account_contains' => '含 ":trigger_value" 的來源帳戶', - 'rule_trigger_to_account_starts' => 'Destination account starts with ":trigger_value"', - 'rule_trigger_to_account_ends' => 'Destination account ends with ":trigger_value"', - 'rule_trigger_to_account_is' => 'Destination account is ":trigger_value"', - 'rule_trigger_to_account_contains' => 'Destination account contains ":trigger_value"', - 'rule_trigger_transaction_type' => 'Transaction is of type ":trigger_value"', - 'rule_trigger_category_is' => 'Category is ":trigger_value"', - 'rule_trigger_amount_less' => 'Amount is less than :trigger_value', - 'rule_trigger_amount_exactly' => 'Amount is :trigger_value', - 'rule_trigger_amount_more' => 'Amount is more than :trigger_value', - 'rule_trigger_description_starts' => '以 ":trigger_value" 開頭的描述', - 'rule_trigger_description_ends' => '以 ":trigger_value" 為結尾的描述', - 'rule_trigger_description_contains' => '含 ":trigger_value" 的描述', - 'rule_trigger_description_is' => '描述是 ":trigger_value"', - 'rule_trigger_from_account_starts_choice' => '來源帳戶以…開頭', - 'rule_trigger_from_account_ends_choice' => '來源帳戶以…結尾', - 'rule_trigger_from_account_is_choice' => '來源帳戶是…', - 'rule_trigger_from_account_contains_choice' => '來源帳戶含有…', - 'rule_trigger_to_account_starts_choice' => 'Destination account starts with..', - 'rule_trigger_to_account_ends_choice' => 'Destination account ends with..', - 'rule_trigger_to_account_is_choice' => 'Destination account is..', - 'rule_trigger_to_account_contains_choice' => 'Destination account contains..', - 'rule_trigger_transaction_type_choice' => 'Transaction is of type..', - 'rule_trigger_amount_less_choice' => 'Amount is less than..', - 'rule_trigger_amount_exactly_choice' => 'Amount is..', - 'rule_trigger_amount_more_choice' => 'Amount is more than..', - 'rule_trigger_description_starts_choice' => '描述以…開頭', - 'rule_trigger_description_ends_choice' => '描述以…結尾', - 'rule_trigger_description_contains_choice' => '描述包含…', - 'rule_trigger_description_is_choice' => '描述是…', - 'rule_trigger_category_is_choice' => 'Category is..', - 'rule_trigger_budget_is_choice' => 'Budget is..', - 'rule_trigger_tag_is_choice' => '(A) tag is..', - 'rule_trigger_has_attachments_choice' => 'Has at least this many attachments', - 'rule_trigger_has_attachments' => 'Has at least :trigger_value attachment(s)', - 'rule_trigger_store_journal' => 'When a transaction is created', - 'rule_trigger_update_journal' => 'When a transaction is updated', - 'rule_action_set_category' => 'Set category to ":action_value"', - 'rule_action_clear_category' => 'Clear category', - 'rule_action_set_budget' => 'Set budget to ":action_value"', - 'rule_action_clear_budget' => 'Clear budget', - 'rule_action_add_tag' => '新增標籤 ":action_value"', - 'rule_action_remove_tag' => '刪除標籤 ":action_value"', - 'rule_action_remove_all_tags' => '移除所有標籤', - 'rule_action_set_description' => '設置描述為 ":action_value"', - 'rule_action_append_description' => '描述後加上 ":action_value"', - 'rule_action_prepend_description' => '描述前加上 ":action_value"', - 'rule_action_set_category_choice' => 'Set category to..', - 'rule_action_clear_category_choice' => 'Clear any category', - 'rule_action_set_budget_choice' => 'Set budget to..', - 'rule_action_clear_budget_choice' => 'Clear any budget', - 'rule_action_add_tag_choice' => '新增標籤…', - 'rule_action_remove_tag_choice' => '移除標籤…', - 'rule_action_remove_all_tags_choice' => '移除所有標籤', - 'rule_action_set_description_choice' => '把描述設置為…', - 'rule_action_append_description_choice' => '描述後加上…', - 'rule_action_prepend_description_choice' => '描述前加上…', - 'rule_action_set_source_account_choice' => '把來源帳戶設置為...', - 'rule_action_set_source_account' => '將來源帳戶設置為 :action_value', - 'rule_action_set_destination_account_choice' => 'Set destination account to...', - 'rule_action_set_destination_account' => 'Set destination account to :action_value', - - // tags - 'store_new_tag' => '儲存新的標籤', - 'update_tag' => '更新標籤', - 'no_location_set' => 'No location set.', - 'meta_data' => 'Meta data', - 'location' => 'Location', - - // preferences - 'pref_home_screen_accounts' => 'Home screen accounts', - 'pref_home_screen_accounts_help' => 'Which accounts should be displayed on the home page?', - 'pref_view_range' => 'View range', - 'pref_view_range_help' => 'Some charts are automatically grouped in periods. What period would you prefer?', - 'pref_1D' => 'One day', - 'pref_1W' => 'One week', - 'pref_1M' => 'One month', - 'pref_3M' => 'Three months (quarter)', - 'pref_6M' => 'Six months', - 'pref_1Y' => 'One year', - 'pref_languages' => 'Languages', - 'pref_languages_help' => 'Firefly III supports several languages. Which one do you prefer?', - 'pref_custom_fiscal_year' => 'Fiscal year settings', - 'pref_custom_fiscal_year_label' => 'Enabled', - 'pref_custom_fiscal_year_help' => 'In countries that use a financial year other than January 1 to December 31, you can switch this on and specify start / end days of the fiscal year', - 'pref_fiscal_year_start_label' => 'Fiscal year start date', - 'pref_two_factor_auth' => '雙重身份驗證', - 'pref_two_factor_auth_help' => '當您啟用二步驗證 (也稱為雙重身份驗證) 時,你的帳戶安全性將會更上一層樓。你需要以您知道的東西(密碼)和你擁有的東西(驗證碼)來進行登錄。驗證碼是由您的手機上的應用程式生成的,如 Authy 或 Google Authenticator 。', - 'pref_enable_two_factor_auth' => '啟用雙重身份驗證', - 'pref_two_factor_auth_disabled' => '成功刪除和禁用雙重身份驗證', - 'pref_two_factor_auth_remove_it' => '別忘了從你的身份驗證程式(例如 Authy 或 Google Authenticator)中刪除帳戶 !', - 'pref_two_factor_auth_code' => '驗證代碼', - 'pref_two_factor_auth_code_help' => '請以你的手機上的身份驗證應用程式(例如 Authy 或 Google Authenticator)掃描 QR 代碼,然後輸入其所生成的代碼。', - 'pref_two_factor_auth_reset_code' => '重置驗證代碼', - 'pref_two_factor_auth_remove_code' => '刪除驗證代碼', - 'pref_two_factor_auth_remove_will_disable' => '(這也會禁用雙重身份驗證)', - 'pref_save_settings' => 'Save settings', - 'saved_preferences' => 'Preferences saved!', - 'preferences_general' => 'General', - 'preferences_frontpage' => 'Home screen', - 'preferences_security' => 'Security', - 'preferences_layout' => 'Layout', - 'pref_home_show_deposits' => 'Show deposits on the home screen', - 'pref_home_show_deposits_info' => 'The home screen already shows your expense accounts. Should it also show your revenue accounts?', - 'pref_home_do_show_deposits' => 'Yes, show them', - 'successful_count' => 'of which :count successful', - 'transaction_page_size_title' => 'Page size', - 'transaction_page_size_help' => 'Any list of transactions shows at most this many transactions', - 'transaction_page_size_label' => 'Page size', - 'between_dates' => '(:start and :end)', - 'pref_optional_fields_transaction' => 'Optional fields for transactions', - 'pref_optional_fields_transaction_help' => 'By default not all fields are enabled when creating a new transaction (because of the clutter). Below, you can enable these fields if you think they could be useful for you. Of course, any field that is disabled, but already filled in, will be visible regardless of the setting.', - 'optional_tj_date_fields' => 'Date fields', - 'optional_tj_business_fields' => 'Business fields', - 'optional_tj_attachment_fields' => 'Attachment fields', - 'pref_optional_tj_interest_date' => 'Interest date', - 'pref_optional_tj_book_date' => 'Book date', - 'pref_optional_tj_process_date' => 'Processing date', - 'pref_optional_tj_due_date' => '到期日', - 'pref_optional_tj_payment_date' => 'Payment date', - 'pref_optional_tj_invoice_date' => 'Invoice date', - 'pref_optional_tj_internal_reference' => 'Internal reference', - 'pref_optional_tj_notes' => 'Notes', - 'pref_optional_tj_attachments' => 'Attachments', - 'optional_field_meta_dates' => 'Dates', - 'optional_field_meta_business' => 'Business', - 'optional_field_attachments' => 'Attachments', - 'optional_field_meta_data' => 'Optional meta data', - - - // profile: - 'change_your_password' => 'Change your password', - 'delete_account' => 'Delete account', - 'current_password' => 'Current password', - 'new_password' => 'New password', - 'new_password_again' => 'New password (again)', - 'delete_your_account' => 'Delete your account', - 'delete_your_account_help' => 'Deleting your account will also delete any accounts, transactions, anything you might have saved into Firefly III. It\'ll be GONE.', - 'delete_your_account_password' => 'Enter your password to continue.', - 'password' => 'Password', - 'are_you_sure' => 'Are you sure? You cannot undo this.', - 'delete_account_button' => 'DELETE your account', - 'invalid_current_password' => 'Invalid current password!', - 'password_changed' => 'Password changed!', - 'should_change' => 'The idea is to change your password.', - 'invalid_password' => 'Invalid password!', - 'what_is_pw_security' => 'What is "verify password security"?', - 'secure_pw_title' => 'How to choose a secure password', - 'secure_pw_history' => 'In August 2017 well known security researcher Troy Hunt released a list of 306 million stolen passwords. These passwords were stolen during breakins at companies like LinkedIn, Adobe and NeoPets (and many more).', - 'secure_pw_check_box' => 'By checking the box, Firefly III will send the SHA1 hash of your password to the website of Troy Hunt to see if it is on the list. This will stop you from using unsafe passwords as is recommended in the latest NIST Special Publication on this subject.', - 'secure_pw_sha1' => 'But I thought SHA1 was broken?', - 'secure_pw_hash_speed' => 'Yes, but not in this context. As you can read on the website detailing how they broke SHA1, it is now slightly easier to find a "collision": another string that results in the same SHA1-hash. It now only takes 10,000 years using a single-GPU machine.', - 'secure_pw_hash_security' => 'This collision would not be equal to your password, nor would it be useful on (a site like) Firefly III. This application does not use SHA1 for password verification. So it is safe to check this box. Your password is hashed and sent over HTTPS.', - 'secure_pw_should' => 'Should I check the box?', - 'secure_pw_long_password' => 'If you just generated a long, single-use password for Firefly III using some kind of password generator: no.', - 'secure_pw_short' => 'If you just entered the password you always use: Please yes.', - - - // attachments - 'nr_of_attachments' => 'One attachment|:count attachments', - 'attachments' => 'Attachments', - 'edit_attachment' => 'Edit attachment ":name"', - 'update_attachment' => 'Update attachment', - 'delete_attachment' => 'Delete attachment ":name"', - 'attachment_deleted' => 'Deleted attachment ":name"', - 'attachment_updated' => 'Updated attachment ":name"', - 'upload_max_file_size' => 'Maximum file size: :size', - - // transaction index - 'title_expenses' => 'Expenses', - 'title_withdrawal' => 'Expenses', - 'title_revenue' => 'Revenue / income', - 'title_deposit' => 'Revenue / income', - 'title_transfer' => 'Transfers', - 'title_transfers' => 'Transfers', - - // convert stuff: - 'convert_is_already_type_Withdrawal' => 'This transaction is already a withdrawal', - 'convert_is_already_type_Deposit' => 'This transaction is already a deposit', - 'convert_is_already_type_Transfer' => 'This transaction is already a transfer', - 'convert_to_Withdrawal' => 'Convert ":description" to a withdrawal', - 'convert_to_Deposit' => 'Convert ":description" to a deposit', - 'convert_to_Transfer' => 'Convert ":description" to a transfer', - 'convert_options_WithdrawalDeposit' => 'Convert a withdrawal into a deposit', - 'convert_options_WithdrawalTransfer' => 'Convert a withdrawal into a transfer', - 'convert_options_DepositTransfer' => 'Convert a deposit into a transfer', - 'convert_options_DepositWithdrawal' => 'Convert a deposit into a withdrawal', - 'convert_options_TransferWithdrawal' => 'Convert a transfer into a withdrawal', - 'convert_options_TransferDeposit' => 'Convert a transfer into a deposit', - 'transaction_journal_convert_options' => 'Convert this transaction', - 'convert_Withdrawal_to_deposit' => 'Convert this withdrawal to a deposit', - 'convert_Withdrawal_to_transfer' => 'Convert this withdrawal to a transfer', - 'convert_Deposit_to_withdrawal' => 'Convert this deposit to a withdrawal', - 'convert_Deposit_to_transfer' => 'Convert this deposit to a transfer', - 'convert_Transfer_to_deposit' => 'Convert this transfer to a deposit', - 'convert_Transfer_to_withdrawal' => 'Convert this transfer to a withdrawal', - 'convert_please_set_revenue_source' => 'Please pick the revenue account where the money will come from.', - 'convert_please_set_asset_destination' => 'Please pick the asset account where the money will go to.', - 'convert_please_set_expense_destination' => 'Please pick the expense account where the money will go to.', - 'convert_please_set_asset_source' => 'Please pick the asset account where the money will come from.', - 'convert_explanation_withdrawal_deposit' => 'If you convert this withdrawal into a deposit, :amount will be deposited into :sourceName instead of taken from it.', - 'convert_explanation_withdrawal_transfer' => '如果你把這個提款(支出)轉換為轉帳, :amount 會從 :sourceName 轉帳到新的資產帳戶,而不會付款到 :destinationName 。', - 'convert_explanation_deposit_withdrawal' => 'If you convert this deposit into a withdrawal, :amount will be removed from :destinationName instead of added to it.', - 'convert_explanation_deposit_transfer' => 'If you convert this deposit into a transfer, :amount will be transferred from an asset account of your choice into :destinationName.', - 'convert_explanation_transfer_withdrawal' => 'If you convert this transfer into a withdrawal, :amount will go from :sourceName to a new destination as an expense, instead of to :destinationName as a transfer.', - 'convert_explanation_transfer_deposit' => 'If you convert this transfer into a deposit, :amount will be deposited into account :destinationName instead of being transferred there.', - 'converted_to_Withdrawal' => 'The transaction has been converted to a withdrawal', - 'converted_to_Deposit' => 'The transaction has been converted to a deposit', - 'converted_to_Transfer' => 'The transaction has been converted to a transfer', - - - // create new stuff: - 'create_new_withdrawal' => 'Create new withdrawal', - 'create_new_deposit' => 'Create new deposit', - 'create_new_transfer' => 'Create new transfer', - 'create_new_asset' => '建立新的資產帳戶', - 'create_new_expense' => 'Create new expense account', - 'create_new_revenue' => 'Create new revenue account', - 'create_new_piggy_bank' => 'Create new piggy bank', - 'create_new_bill' => '建立新賬單', - - // currencies: - 'create_currency' => 'Create a new currency', - 'store_currency' => 'Store new currency', - 'update_currency' => 'Update currency', - 'new_default_currency' => ':name is now the default currency.', - 'cannot_delete_currency' => 'Cannot delete :name because it is still in use.', - 'deleted_currency' => 'Currency :name deleted', - 'created_currency' => 'Currency :name created', - 'updated_currency' => 'Currency :name updated', - 'ask_site_owner' => 'Please ask :owner to add, remove or edit currencies.', - 'currencies_intro' => 'Firefly III supports various currencies which you can set and enable here.', - 'make_default_currency' => 'make default', - 'default_currency' => 'default', - - // forms: - 'mandatoryFields' => 'Mandatory fields', - 'optionalFields' => 'Optional fields', - 'options' => 'Options', - - // budgets: - 'create_new_budget' => 'Create a new budget', - 'store_new_budget' => 'Store new budget', - 'stored_new_budget' => 'Stored new budget ":name"', - 'available_between' => 'Available between :start and :end', - 'transactionsWithoutBudget' => 'Expenses without budget', - 'transactions_no_budget' => 'Expenses without budget between :start and :end', - 'spent_between' => 'Spent between :start and :end', - 'createBudget' => 'New budget', - 'inactiveBudgets' => 'Inactive budgets', - 'without_budget_between' => 'Transactions without a budget between :start and :end', - 'delete_budget' => 'Delete budget ":name"', - 'deleted_budget' => 'Deleted budget ":name"', - 'edit_budget' => 'Edit budget ":name"', - 'updated_budget' => 'Updated budget ":name"', - 'update_amount' => 'Update amount', - 'update_budget' => 'Update budget', - 'update_budget_amount_range' => 'Update (expected) available amount between :start and :end', - 'budget_period_navigator' => 'Period navigator', - - // bills: - 'matching_on' => 'Matching on', - 'between_amounts' => 'between :low and :high.', - 'repeats' => 'Repeats', - 'connected_journals' => 'Connected transactions', - 'auto_match_on' => 'Automatically matched by Firefly', - 'auto_match_off' => 'Not automatically matched by Firefly', - 'next_expected_match' => 'Next expected match', - 'delete_bill' => '刪除賬單 ":name"', - 'deleted_bill' => '成功刪除賬單 ":name"', - 'edit_bill' => '編輯賬單 ":name"', - 'more' => 'More', - 'rescan_old' => 'Rescan old transactions', - 'update_bill' => '更新賬單', - 'updated_bill' => '更新了帳單 ":name"', - 'store_new_bill' => '儲存新的賬單', - 'stored_new_bill' => '儲存了新的賬單 ":name"', - 'cannot_scan_inactive_bill' => 'Inactive bills cannot be scanned.', - 'rescanned_bill' => 'Rescanned everything.', - 'average_bill_amount_year' => '平均賬單金額 (:year)', - 'average_bill_amount_overall' => '平均賬單金額 (總計)', - 'not_or_not_yet' => 'Not (yet)', - 'not_expected_period' => 'Not expected this period', - 'bill_is_active' => 'Bill is active', - 'bill_will_automatch' => 'Bill will automatically linked to matching transactions', - // accounts: - 'details_for_asset' => '資產帳戶的詳細資訊 ":name"', - 'details_for_expense' => 'Details for expense account ":name"', - 'details_for_revenue' => 'Details for revenue account ":name"', - 'details_for_cash' => 'Details for cash account ":name"', - 'store_new_asset_account' => '儲存新的資產帳戶', - 'store_new_expense_account' => 'Store new expense account', - 'store_new_revenue_account' => 'Store new revenue account', - 'edit_asset_account' => '編輯資產帳戶 ":name"', - 'edit_expense_account' => 'Edit expense account ":name"', - 'edit_revenue_account' => 'Edit revenue account ":name"', - 'delete_asset_account' => '刪除資產帳戶 ":name"', - 'delete_expense_account' => 'Delete expense account ":name"', - 'delete_revenue_account' => 'Delete revenue account ":name"', - 'asset_deleted' => '成功刪除資產帳戶 ":name"', - 'expense_deleted' => 'Successfully deleted expense account ":name"', - 'revenue_deleted' => 'Successfully deleted revenue account ":name"', - 'update_asset_account' => '更新資產帳戶資訊', - 'update_expense_account' => 'Update expense account', - 'update_revenue_account' => 'Update revenue account', - 'make_new_asset_account' => '建立新的資產帳戶', - 'make_new_expense_account' => 'Create a new expense account', - 'make_new_revenue_account' => 'Create a new revenue account', - 'asset_accounts' => '資產帳戶', - 'expense_accounts' => 'Expense accounts', - 'revenue_accounts' => 'Revenue accounts', - 'cash_accounts' => 'Cash accounts', - 'Cash account' => 'Cash account', - 'account_type' => 'Account type', - 'save_transactions_by_moving' => 'Save these transaction(s) by moving them to another account:', - 'stored_new_account' => 'New account ":name" stored!', - 'updated_account' => 'Updated account ":name"', - 'credit_card_options' => 'Credit card options', - 'no_transactions_account' => 'There are no transactions (in this period) for asset account ":name".', - 'no_data_for_chart' => 'There is not enough information (yet) to generate this chart.', - 'select_more_than_one_account' => 'Please select more than one account', - 'select_more_than_one_category' => 'Please select more than one category', - 'select_more_than_one_budget' => 'Please select more than one budget', - 'select_more_than_one_tag' => 'Please select more than one tag', - 'account_default_currency' => 'If you select another currency, new transactions from this account will have this currency pre-selected.', - - // categories: - 'new_category' => 'New category', - 'create_new_category' => 'Create a new category', - 'without_category' => 'Without a category', - 'update_category' => 'Update category', - 'updated_category' => 'Updated category ":name"', - 'categories' => 'Categories', - 'edit_category' => 'Edit category ":name"', - 'no_category' => '(no category)', - 'category' => 'Category', - 'delete_category' => 'Delete category ":name"', - 'deleted_category' => 'Deleted category ":name"', - 'store_category' => 'Store new category', - 'stored_category' => 'Stored new category ":name"', - 'without_category_between' => 'Without category between :start and :end', - - // transactions: - 'update_withdrawal' => 'Update withdrawal', - 'update_deposit' => 'Update deposit', - 'update_transfer' => 'Update transfer', - 'updated_withdrawal' => '成功更新提款 ":description"', - 'updated_deposit' => '成功更新存款 ":description"', - 'updated_transfer' => '成功更新轉帳 ":description"', - 'delete_withdrawal' => '刪除提款 ":description"', - 'delete_deposit' => '刪除存款 ":description"', - 'delete_transfer' => '刪除轉帳 ":description"', - 'deleted_withdrawal' => '成功刪除提款 ":description"', - 'deleted_deposit' => '成功刪除存款 ":description"', - 'deleted_transfer' => '成功刪除轉帳 ":description"', - 'stored_journal' => '成功建立交易 ":description"', - 'select_transactions' => 'Select transactions', - 'stop_selection' => 'Stop selecting transactions', - 'edit_selected' => 'Edit selected', - 'delete_selected' => 'Delete selected', - 'mass_delete_journals' => 'Delete a number of transactions', - 'mass_edit_journals' => 'Edit a number of transactions', - 'cannot_edit_other_fields' => 'You cannot mass-edit other fields than the ones here, because there is no room to show them. Please follow the link and edit them by one-by-one, if you need to edit these fields.', - 'perm-delete-many' => 'Deleting many items in one go can be very disruptive. Please be cautious.', - 'mass_deleted_transactions_success' => 'Deleted :amount transaction(s).', - 'mass_edited_transactions_success' => 'Updated :amount transaction(s)', - - - // new user: - 'welcome' => 'Welcome to Firefly!', - 'submit' => 'Submit', - 'getting_started' => 'Getting started', - 'to_get_started' => 'It is good to see you have successfully installed Firefly III. To get started with this tool please enter your bank\'s name and the balance of your main checking account. Do not worry yet if you have multiple accounts. You can add those later. It\'s just that Firefly III needs something to start with.', - 'savings_balance_text' => 'Firefly III will automatically create a savings account for you. By default, there will be no money in your savings account, but if you tell Firefly III the balance it will be stored as such.', - 'finish_up_new_user' => 'That\'s it! You can continue by pressing Submit. You will be taken to the index of Firefly III.', - 'stored_new_accounts_new_user' => 'Yay! Your new accounts have been stored.', - - // home page: - 'yourAccounts' => 'Your accounts', - 'budgetsAndSpending' => 'Budgets and spending', - 'savings' => 'Savings', - 'newWithdrawal' => 'New expense', - 'newDeposit' => 'New deposit', - 'newTransfer' => 'New transfer', - 'moneyIn' => 'Money in', - 'moneyOut' => 'Money out', - 'billsToPay' => '待付賬單', - 'billsPaid' => '已付賬單', - - // menu and titles, should be recycled as often as possible: - 'currency' => 'Currency', - 'preferences' => 'Preferences', - 'logout' => 'Logout', - 'searchPlaceholder' => 'Search...', - 'dashboard' => 'Dashboard', - 'currencies' => 'Currencies', - 'accounts' => 'Accounts', - 'Asset account' => '資產帳戶', - 'Default account' => '資產帳戶', - 'Expense account' => 'Expense account', - 'Revenue account' => 'Revenue account', - 'Initial balance account' => '初始帳戶', - 'budgets' => 'Budgets', - 'tags' => '標籤', - 'reports' => 'Reports', - 'transactions' => 'Transactions', - 'expenses' => 'Expenses', - 'income' => 'Revenue / income', - 'transfers' => 'Transfers', - 'moneyManagement' => 'Money management', - 'piggyBanks' => 'Piggy banks', - 'bills' => '賬單', - 'withdrawal' => 'Withdrawal', - 'deposit' => 'Deposit', - 'account' => 'Account', - 'transfer' => 'Transfer', - 'Withdrawal' => 'Withdrawal', - 'Deposit' => 'Deposit', - 'Transfer' => 'Transfer', - 'bill' => '賬單', - 'yes' => 'Yes', - 'no' => 'No', - 'amount' => 'Amount', - 'overview' => 'Overview', - 'saveOnAccount' => 'Save on account', - 'unknown' => 'Unknown', - 'daily' => 'Daily', - 'monthly' => 'Monthly', - 'profile' => 'Profile', - 'errors' => 'Errors', - - // reports: - 'report_default' => 'Default financial report between :start and :end', - 'report_audit' => 'Transaction history overview between :start and :end', - 'report_category' => 'Category report between :start and :end', - 'report_budget' => 'Budget report between :start and :end', - 'report_tag' => 'Tag report between :start and :end', - 'quick_link_reports' => 'Quick links', - 'quick_link_default_report' => 'Default financial report', - 'quick_link_audit_report' => 'Transaction history overview', - 'report_this_month_quick' => 'Current month, all accounts', - 'report_this_year_quick' => 'Current year, all accounts', - 'report_this_fiscal_year_quick' => 'Current fiscal year, all accounts', - 'report_all_time_quick' => 'All-time, all accounts', - 'reports_can_bookmark' => 'Remember that reports can be bookmarked.', - 'incomeVsExpenses' => 'Income vs. expenses', - 'accountBalances' => '帳戶餘額', - 'balanceStart' => '期間之初的結餘', - 'balanceEnd' => '期間之未的結餘', - 'splitByAccount' => '以帳號來分割', - 'coveredWithTags' => 'Covered with tags', - 'leftUnbalanced' => 'Left unbalanced', - 'leftInBudget' => 'Left in budget', - 'sumOfSums' => 'Sum of sums', - 'noCategory' => '(no category)', - 'notCharged' => 'Not charged (yet)', - 'inactive' => 'Inactive', - 'active' => 'Active', - 'difference' => 'Difference', - 'in' => 'In', - 'out' => 'Out', - 'topX' => 'top :number', - 'show_full_list' => 'Show entire list', - 'show_only_top' => 'Show only top :number', - 'report_type' => 'Report type', - 'report_type_default' => 'Default financial report', - 'report_type_audit' => 'Transaction history overview (audit)', - 'report_type_category' => 'Category report', - 'report_type_budget' => 'Budget report', - 'report_type_tag' => 'Tag report', - 'more_info_help' => 'More information about these types of reports can be found in the help pages. Press the (?) icon in the top right corner.', - 'report_included_accounts' => 'Included accounts', - 'report_date_range' => 'Date range', - 'report_preset_ranges' => 'Pre-set ranges', - 'shared' => 'Shared', - 'fiscal_year' => 'Fiscal year', - 'income_entry' => 'Income from account ":name" between :start and :end', - 'expense_entry' => 'Expenses to account ":name" between :start and :end', - 'category_entry' => 'Expenses in category ":name" between :start and :end', - 'budget_spent_amount' => 'Expenses in budget ":budget" between :start and :end', - 'balance_amount' => '與 :start 和 :end 之間由帳號 ":account" 支付的預算 ":budget" 的支出', - 'no_audit_activity' => 'No activity was recorded on account :account_name between :start and :end.', - 'audit_end_balance' => ':account_name 在 :end 後的餘額是: :balance', - 'reports_extra_options' => 'Extra options', - 'report_has_no_extra_options' => 'This report has no extra options', - 'reports_submit' => 'View report', - 'end_after_start_date' => 'End date of report must be after start date.', - 'select_category' => 'Select category(ies)', - 'select_budget' => 'Select budget(s).', - 'select_tag' => 'Select tag(s).', - 'income_per_category' => 'Income per category', - 'expense_per_category' => 'Expense per category', - 'expense_per_budget' => 'Expense per budget', - 'income_per_account' => 'Income per account', - 'expense_per_account' => 'Expense per account', - 'expense_per_tag' => 'Expense per tag', - 'income_per_tag' => 'Income per tag', - 'include_expense_not_in_budget' => 'Included expenses not in the selected budget(s)', - 'include_expense_not_in_account' => 'Included expenses not in the selected account(s)', - 'include_expense_not_in_category' => 'Included expenses not in the selected category(ies)', - 'include_income_not_in_category' => 'Included income not in the selected category(ies)', - 'include_income_not_in_account' => 'Included income not in the selected account(s)', - 'include_income_not_in_tags' => 'Included income not in the selected tag(s)', - 'include_expense_not_in_tags' => 'Included expenses not in the selected tag(s)', - 'everything_else' => 'Everything else', - 'income_and_expenses' => 'Income and expenses', - 'spent_average' => 'Spent (average)', - 'income_average' => 'Income (average)', - 'transaction_count' => 'Transaction count', - 'average_spending_per_account' => 'Average spending per account', - 'average_income_per_account' => 'Average income per account', - 'total' => 'Total', - 'description' => 'Description', - 'sum_of_period' => 'Sum of period', - 'average_in_period' => 'Average in period', - 'account_role_defaultAsset' => 'Default asset account', - 'account_role_sharedAsset' => 'Shared asset account', - 'account_role_savingAsset' => 'Savings account', - 'account_role_ccAsset' => 'Credit card', - - // charts: - 'chart' => 'Chart', - 'month' => 'Month', - 'budget' => 'Budget', - 'spent' => 'Spent', - 'spent_in_budget' => 'Spent in budget', - 'left_to_spend' => 'Left to spend', - 'earned' => 'Earned', - 'overspent' => 'Overspent', - 'left' => 'Left', - 'no_budget' => '(no budget)', - 'max-amount' => 'Maximum amount', - 'min-amount' => 'Minumum amount', - 'journal-amount' => 'Current bill entry', - 'name' => 'Name', - 'date' => 'Date', - 'paid' => 'Paid', - 'unpaid' => 'Unpaid', - 'day' => 'Day', - 'budgeted' => 'Budgeted', - 'period' => 'Period', - 'balance' => '餘額', - 'sum' => 'Sum', - 'average' => 'Average', - 'balanceFor' => ':name 的餘額', - - // piggy banks: - 'add_money_to_piggy' => 'Add money to piggy bank ":name"', - 'piggy_bank' => 'Piggy bank', - 'new_piggy_bank' => 'New piggy bank', - 'store_piggy_bank' => 'Store new piggy bank', - 'stored_piggy_bank' => 'Store new piggy bank ":name"', - 'account_status' => 'Account status', - 'left_for_piggy_banks' => 'Left for piggy banks', - 'sum_of_piggy_banks' => 'Sum of piggy banks', - 'saved_so_far' => 'Saved so far', - 'left_to_save' => 'Left to save', - 'suggested_amount' => 'Suggested monthly amount to save', - 'add_money_to_piggy_title' => 'Add money to piggy bank ":name"', - 'remove_money_from_piggy_title' => 'Remove money from piggy bank ":name"', - 'add' => 'Add', - - 'remove' => 'Remove', - 'max_amount_add' => 'The maximum amount you can add is', - 'max_amount_remove' => 'The maximum amount you can remove is', - 'update_piggy_button' => 'Update piggy bank', - 'update_piggy_title' => 'Update piggy bank ":name"', - 'updated_piggy_bank' => 'Updated piggy bank ":name"', - 'details' => 'Details', - 'events' => 'Events', - 'target_amount' => 'Target amount', - 'start_date' => 'Start date', - 'target_date' => '儲蓄目標日期', - 'no_target_date' => '沒有儲蓄目標日期', - 'table' => 'Table', - 'delete_piggy_bank' => 'Delete piggy bank ":name"', - 'cannot_add_amount_piggy' => 'Could not add :amount to ":name".', - 'cannot_remove_from_piggy' => 'Could not remove :amount from ":name".', - 'deleted_piggy_bank' => 'Deleted piggy bank ":name"', - 'added_amount_to_piggy' => 'Added :amount to ":name"', - 'removed_amount_from_piggy' => 'Removed :amount from ":name"', - - // tags - 'regular_tag' => '只是一個普通的標籤。', - 'balancing_act' => '這標籤最多會有兩項交易:一個支出和一個轉帳,而他們會互相抵消。', - 'advance_payment' => '這種標籤容許一個支出和多個存款以抵銷原本的支出。', - 'delete_tag' => '刪除標籤 ":tag"', - 'deleted_tag' => '刪除了標籤 ":tag"', - 'new_tag' => '建立新標籤', - 'edit_tag' => '編輯標籤 ":tag"', - 'updated_tag' => '更新了標籤 ":tag"', - 'created_tag' => '成功創建標籤 ":tag" !', - - 'transaction_journal_information' => 'Transaction information', - 'transaction_journal_meta' => 'Meta information', - 'total_amount' => 'Total amount', - 'number_of_decimals' => 'Number of decimals', - - // administration - 'administration' => 'Administration', - 'user_administration' => 'User administration', - 'list_all_users' => 'All users', - 'all_users' => 'All users', - 'instance_configuration' => 'Configuration', - 'firefly_instance_configuration' => 'Configuration options for Firefly III', - 'setting_single_user_mode' => 'Single user mode', - 'setting_single_user_mode_explain' => 'By default, Firefly III only accepts one (1) registration: you. This is a security measure, preventing others from using your instance unless you allow them to. Future registrations are blocked. When you uncheck this box, others can use your instance as wel, assuming they can reach it (when it is connected to the internet).', - 'store_configuration' => 'Store configuration', - 'single_user_administration' => 'User administration for :email', - 'edit_user' => 'Edit user :email', - 'hidden_fields_preferences' => 'Not all fields are visible right now. You must enable them in your settings.', - 'user_data_information' => 'User data', - 'user_information' => 'User information', - 'total_size' => 'total size', - 'budget_or_budgets' => 'budget(s)', - 'budgets_with_limits' => 'budget(s) with configured amount', - 'rule_or_rules' => 'rule(s)', - 'rulegroup_or_groups' => 'rule group(s)', - 'configuration_updated' => 'The configuration has been updated', - 'setting_is_demo_site' => 'Demo site', - 'setting_is_demo_site_explain' => 'If you check this box, this installation will behave as if it is the demo site, which can have weird side effects.', - 'block_code_bounced' => 'Email message(s) bounced', - 'block_code_expired' => 'Demo account expired', - 'no_block_code' => 'No reason for block or user not blocked', - // links - 'journal_link_configuration' => 'Transaction links configuration', - 'create_new_link_type' => 'Create new link type', - 'store_new_link_type' => 'Store new link type', - 'update_link_type' => 'Update link type', - 'edit_link_type' => 'Edit link type ":name"', - 'updated_link_type' => 'Updated link type ":name"', - 'delete_link_type' => 'Delete link type ":name"', - 'deleted_link_type' => 'Deleted link type ":name"', - 'stored_new_link_type' => 'Store new link type ":name"', - 'cannot_edit_link_type' => 'Cannot edit link type ":name"', - 'link_type_help_name' => 'Ie. "Duplicates"', - 'link_type_help_inward' => 'Ie. "duplicates"', - 'link_type_help_outward' => 'Ie. "is duplicated by"', - 'save_connections_by_moving' => 'Save the link between these transaction(s) by moving them to another link type:', - 'do_not_save_connection' => '(do not save connection)', - 'link_transaction' => 'Link transaction', - 'link_to_other_transaction' => 'Link this transaction to another transaction', - 'select_transaction_to_link' => 'Select a transaction to link this transaction to', - 'this_transaction' => 'This transaction', - 'transaction' => 'Transaction', - 'comments' => 'Comments', - 'to_link_not_found' => 'If the transaction you want to link to is not listed, simply enter its ID.', - 'invalid_link_data' => 'Invalid link type selected. Cannot link transaction.', - 'journals_linked' => 'Transactions are linked.', - 'journals_error_linked' => 'These transactions are already linked.', - 'journal_links' => 'Transaction links', - 'this_withdrawal' => 'This withdrawal', - 'this_deposit' => 'This deposit', - 'this_transfer' => 'This transfer', - 'overview_for_link' => 'Overview for link type ":name"', - 'delete_journal_link' => 'Delete the link between :source and :destination', - 'deleted_link' => 'Deleted link', - - - // split a transaction: - 'splits' => '分割', - 'add_another_split' => 'Add another split', - 'split-transactions' => 'Split transactions', - 'do_split' => 'Do a split', - 'split_this_withdrawal' => 'Split this withdrawal', - 'split_this_deposit' => 'Split this deposit', - 'split_this_transfer' => 'Split this transfer', - 'cannot_edit_multiple_source' => '你不能修改描述為 ":description" 的分割交易 #:id 因為他有多個來源帳號。', - 'cannot_edit_multiple_dest' => '你不能修改描述為 ":description" 的分割交易 #:id 因為他有多個目標帳號。', - 'cannot_edit_opening_balance' => 'You cannot edit the opening balance of an account.', - 'no_edit_multiple_left' => 'You have selected no valid transactions to edit.', - - // import bread crumbs and titles: - 'import' => '匯入', - 'import_data' => '匯入資料', - - // import index page: - 'import_index_title' => 'Import data into Firefly III', - 'import_index_sub_title' => 'Index', - 'import_general_index_intro' => 'Welcome to Firefly\'s import routine. There are a few ways of importing data into Firefly III, displayed here as buttons.', - 'import_index_intro' => 'This routine will help you import files from your bank into Firefly III. Please check out the help pages in the top right corner.', - 'import_index_file' => 'Select your file', - 'import_index_config' => 'If you have previously imported data into Firefly III, you may have a configuration file, which will pre-set configuration values for you. For some banks, other users have kindly provided their configuration file.', - 'import_index_type' => 'Select the type of file you will upload', - 'import_index_start' => 'Start importing', - - // supported file types: - 'import_file_type_csv' => 'CSV (comma separated values)', - - // import configuration routine: - 'import_config_sub_title' => 'Set up your import file', - 'import_config_bread_crumb' => 'Set up your import file', - - // import status page: - 'import_status_bread_crumb' => 'Import status', - 'import_status_sub_title' => 'Import status', - 'import_status_wait_title' => 'Please hold...', - 'import_status_wait_text' => 'This box will disappear in a moment.', - 'import_status_ready_title' => 'Import is ready to start', - 'import_status_ready_text' => 'The import is ready to start. All the configuration you needed to do has been done. Please download the configuration file. It will help you with the import should it not go as planned. To actually run the import, you can either execute the following command in your console, or run the web-based import. Depending on your configuration, the console import will give you more feedback.', - 'import_status_ready_config' => 'Download configuration', - 'import_status_ready_start' => 'Start the import', - 'import_status_ready_share' => 'Please consider downloading your configuration and sharing it at the import configuration center. This will allow other users of Firefly III to import their files more easily.', - 'import_status_running_title' => 'The import is running', - 'import_status_running_placeholder' => 'Please hold for an update...', - 'import_status_errors_title' => 'Errors during the import', - 'import_status_errors_single' => 'An error has occured during the import. It does not appear to be fatal.', - 'import_status_errors_multi' => 'Some errors occured during the import. These do not appear to be fatal.', - 'import_status_fatal_title' => 'A fatal error occurred', - 'import_status_fatal_text' => 'A fatal error occurred, which the import-routine cannot recover from. Please see the explanation in red below.', - 'import_status_fatal_more' => 'If the error is a time-out, the import will have stopped half-way. For some server configurations, it is merely the server that stopped while the import keeps running in the background. To verify this, check out the log files. If the problem persists, consider importing over the command line instead.', - 'import_status_finished_title' => 'Import routine finished', - 'import_status_finished_text' => 'The import routine has imported your file.', - 'import_status_finished_job' => 'The transactions imported can be found in tag :tag.', - 'import_with_key' => '以鍵 \':key\' 作匯入', - - // sandstorm.io errors and messages: - 'sandstorm_not_available' => 'This function is not available when you are using Firefly III within a Sandstorm.io environment.', - - // empty lists? no objects? instructions: - 'no_transactions_in_period' => 'There are no transactions in this period.', - 'no_accounts_title_asset' => 'Let\'s create an asset account!', - 'no_accounts_intro_asset' => 'You have no asset accounts yet. Asset accounts are your main accounts: your checking account, savings account, shared account or even your credit card.', - 'no_accounts_imperative_asset' => 'To start using Firefly III you must create at least one asset account. Let\'s do so now:', - 'no_accounts_create_asset' => 'Create an asset account', - 'no_accounts_title_expense' => 'Let\'s create an expense account!', - 'no_accounts_intro_expense' => 'You have no expense accounts yet. Expense accounts are the places where you spend money, such as shops and supermarkets.', - 'no_accounts_imperative_expense' => 'Expense accounts are created automatically when you create transactions, but you can create one manually too, if you want. Let\'s create one now:', - 'no_accounts_create_expense' => 'Create an expense account', - 'no_accounts_title_revenue' => 'Let\'s create a revenue account!', - 'no_accounts_intro_revenue' => 'You have no revenue accounts yet. Revenue accounts are the places where you receive money from, such as your employer.', - 'no_accounts_imperative_revenue' => 'Revenue accounts are created automatically when you create transactions, but you can create one manually too, if you want. Let\'s create one now:', - 'no_accounts_create_revenue' => 'Create a revenue account', - 'no_budgets_title_default' => 'Let\'s create a budget', - 'no_budgets_intro_default' => 'You have no budgets yet. Budgets are used to organise your expenses into logical groups, which you can give a soft-cap to limit your expenses.', - 'no_budgets_imperative_default' => 'Budgets are the basic tools of financial management. Let\'s create one now:', - 'no_budgets_create_default' => 'Create a budget', - 'no_categories_title_default' => 'Let\'s create a category!', - 'no_categories_intro_default' => 'You have no categories yet. Categories are used to fine tune your transactions and label them with their designated category.', - 'no_categories_imperative_default' => 'Categories are created automatically when you create transactions, but you can create one manually too. Let\'s create one now:', - 'no_categories_create_default' => 'Create a category', - 'no_tags_title_default' => 'Let\'s create a tag!', - 'no_tags_intro_default' => 'You have no tags yet. Tags are used to fine tune your transactions and label them with specific keywords.', - 'no_tags_imperative_default' => 'Tags are created automatically when you create transactions, but you can create one manually too. Let\'s create one now:', - 'no_tags_create_default' => 'Create a tag', - 'no_transactions_title_withdrawal' => 'Let\'s create an expense!', - 'no_transactions_intro_withdrawal' => 'You have no expenses yet. You should create expenses to start managing your finances.', - 'no_transactions_imperative_withdrawal' => 'Have you spent some money? Then you should write it down:', - 'no_transactions_create_withdrawal' => 'Create an expense', - 'no_transactions_title_deposit' => 'Let\'s create some income!', - 'no_transactions_intro_deposit' => 'You have no recorded income yet. You should create income entries to start managing your finances.', - 'no_transactions_imperative_deposit' => 'Have you received some money? Then you should write it down:', - 'no_transactions_create_deposit' => 'Create a deposit', - 'no_transactions_title_transfers' => 'Let\'s create a transfer!', - 'no_transactions_intro_transfers' => 'You have no transfers yet. When you move money between asset accounts, it is recorded as a transfer.', - 'no_transactions_imperative_transfers' => 'Have you moved some money around? Then you should write it down:', - 'no_transactions_create_transfers' => 'Create a transfer', - 'no_piggies_title_default' => 'Let\'s create a piggy bank!', - 'no_piggies_intro_default' => 'You have no piggy banks yet. You can create piggy banks to divide your savings and keep track of what you\'re saving up for.', - 'no_piggies_imperative_default' => 'Do you have things you\'re saving money for? Create a piggy bank and keep track:', - 'no_piggies_create_default' => 'Create a new piggy bank', - 'no_bills_title_default' => 'Let\'s create a bill!', - 'no_bills_intro_default' => 'You have no bills yet. You can create bills to keep track of regular expenses, like your rent of insurance.', - 'no_bills_imperative_default' => 'Do you have such regular bills? Create a bill and keep track of your payments:', - 'no_bills_create_default' => 'Create a bill', - - -]; \ No newline at end of file diff --git a/resources/lang/zh_TW/form.php b/resources/lang/zh_TW/form.php deleted file mode 100644 index 2889759d75..0000000000 --- a/resources/lang/zh_TW/form.php +++ /dev/null @@ -1,199 +0,0 @@ - '銀行名稱', - 'bank_balance' => '餘額', - 'savings_balance' => '儲蓄帳戶的餘額', - 'credit_card_limit' => '信用卡額度', - 'automatch' => '自動匹配', - 'skip' => '略過', - 'name' => '名稱', - 'active' => '啟用', - 'amount_min' => '最小金額', - 'amount_max' => '最大值', - 'match' => '匹配於', - 'repeat_freq' => '循環週期', - 'journal_currency_id' => '貨幣', - 'currency_id' => 'Currency', - 'attachments' => 'Attachments', - 'journal_amount' => '金額', - 'journal_asset_source_account' => '資產帳戶 (源頭)', - 'journal_source_account_name' => '收入帳戶 (源頭)', - 'journal_source_account_id' => '資產帳戶 (源頭)', - 'BIC' => 'BIC', - 'verify_password' => 'Verify password security', - 'account_from_id' => '從帳戶', - 'account_to_id' => '到帳戶', - 'source_account' => '來源帳戶', - 'destination_account' => '目標帳戶', - 'journal_destination_account_id' => '資產帳戶 (目標)', - 'asset_destination_account' => '資產帳戶 (目標)', - 'asset_source_account' => '資產帳戶 (來源)', - 'journal_description' => '描述', - 'note' => '備註', - 'split_journal' => '分割此交易', - 'split_journal_explanation' => '分割這個交易為幾個部分', - 'currency' => '貨幣', - 'account_id' => '資產帳戶', - 'budget_id' => '預算', - 'openingBalance' => '開戶金額', - 'tagMode' => '標記模式', - 'tagPosition' => '標籤位置', - 'virtualBalance' => '虛擬金額', - 'longitude_latitude' => '位置', - 'targetamount' => '目標金額', - 'accountRole' => '帳戶角色', - 'openingBalanceDate' => '開戶日期', - 'ccType' => '信用卡付款計畫', - 'ccMonthlyPaymentDate' => '信用卡每月付款日期', - 'piggy_bank_id' => '存錢筒', - 'returnHere' => '回到這裡', - 'returnHereExplanation' => '儲存後,回到這裡創建另一個記錄。', - 'returnHereUpdateExplanation' => '更新後,回到這裡。', - 'description' => '描述', - 'expense_account' => '支出帳戶', - 'revenue_account' => '收入帳戶', - 'decimal_places' => 'Decimal places', - 'exchange_rate_instruction' => 'Foreign currencies', - 'exchanged_amount' => 'Exchanged amount', - 'source_amount' => 'Amount (source)', - 'destination_amount' => 'Amount (destination)', - 'native_amount' => 'Native amount', - - 'revenue_account_source' => '收入帳戶 (源頭)', - 'source_account_asset' => '來源帳戶 (資產帳戶)', - 'destination_account_expense' => 'Destination account (expense account)', - 'destination_account_asset' => 'Destination account (asset account)', - 'source_account_revenue' => '來源帳戶 (收入帳戶)', - 'type' => 'Type', - 'convert_Withdrawal' => 'Convert withdrawal', - 'convert_Deposit' => 'Convert deposit', - 'convert_Transfer' => 'Convert transfer', - - - 'amount' => '金額', - 'date' => '日期', - 'interest_date' => '付息日', - 'book_date' => 'Book date', - 'process_date' => '處理日期', - 'category' => '類別', - 'tags' => '標籤', - 'deletePermanently' => '永久刪除', - 'cancel' => '取消', - 'targetdate' => '儲蓄目標日期', - 'tag' => '標籤', - 'under' => '低於', - 'symbol' => 'Symbol', - 'code' => 'Code', - 'iban' => 'IBAN', - 'accountNumber' => '帳戶號碼', - 'has_headers' => '標頭', - 'date_format' => '日期格式', - 'specifix' => 'Bank- or file specific fixes', - 'attachments[]' => '附檔', - 'store_new_withdrawal' => '存儲新提款', - 'store_new_deposit' => '存儲新存款', - 'store_new_transfer' => '存儲新轉帳', - 'add_new_withdrawal' => '新增提款', - 'add_new_deposit' => '新增新存款', - 'add_new_transfer' => 'Add a new transfer', - 'noPiggybank' => '(no piggy bank)', - 'title' => '標題', - 'notes' => '備註', - 'filename' => '檔案名稱', - 'mime' => 'Mime type', - 'size' => 'Size', - 'trigger' => 'Trigger', - 'stop_processing' => 'Stop processing', - 'start_date' => 'Start of range', - 'end_date' => 'End of range', - 'export_start_range' => 'Start of export range', - 'export_end_range' => 'End of export range', - 'export_format' => '檔案格式', - 'include_attachments' => '包括上傳的附件', - 'include_old_uploads' => '包含導入的資料', - 'accounts' => '從這些帳戶匯出交易記錄', - 'delete_account' => '刪除帳號 ":name"', - 'delete_bill' => '刪除帳單 ":name"', - 'delete_budget' => '刪除預算 ":name"', - 'delete_category' => '刪除類別 ":name"', - 'delete_currency' => '刪除貨幣 ":name"', - 'delete_journal' => '刪除包含描述 ":description" 的交易', - 'delete_attachment' => 'Delete attachment ":name"', - 'delete_rule' => 'Delete rule ":title"', - 'delete_rule_group' => 'Delete rule group ":title"', - 'delete_link_type' => 'Delete link type ":name"', - 'attachment_areYouSure' => 'Are you sure you want to delete the attachment named ":name"?', - 'account_areYouSure' => 'Are you sure you want to delete the account named ":name"?', - 'bill_areYouSure' => '你確定要刪除賬單 ":name" 嗎?', - 'rule_areYouSure' => 'Are you sure you want to delete the rule titled ":title"?', - 'ruleGroup_areYouSure' => 'Are you sure you want to delete the rule group titled ":title"?', - 'budget_areYouSure' => 'Are you sure you want to delete the budget named ":name"?', - 'category_areYouSure' => 'Are you sure you want to delete the category named ":name"?', - 'currency_areYouSure' => 'Are you sure you want to delete the currency named ":name"?', - 'piggyBank_areYouSure' => 'Are you sure you want to delete the piggy bank named ":name"?', - 'journal_areYouSure' => '你真的要刪除這個描述為 ":description" 的交易嗎?', - 'mass_journal_are_you_sure' => 'Are you sure you want to delete these transactions?', - 'tag_areYouSure' => '你真的要要刪除標籤 ":tag" 嗎?', - 'journal_link_areYouSure' => 'Are you sure you want to delete the link between :source and :destination?', - 'linkType_areYouSure' => 'Are you sure you want to delete the link type ":name" (":inward" / ":outward")?', - 'permDeleteWarning' => 'Deleting stuff from Firely is permanent and cannot be undone.', - 'mass_make_selection' => 'You can still prevent items from being deleted by removing the checkbox.', - 'delete_all_permanently' => 'Delete selected permanently', - 'update_all_journals' => 'Update these transactions', - 'also_delete_transactions' => 'The only transaction connected to this account will be deleted as well.|All :count transactions connected to this account will be deleted as well.', - 'also_delete_connections' => 'The only transaction linked with this link type will lose this connection.|All :count transactions linked with this link type will lose their connection.', - 'also_delete_rules' => 'The only rule connected to this rule group will be deleted as well.|All :count rules connected to this rule group will be deleted as well.', - 'also_delete_piggyBanks' => 'The only piggy bank connected to this account will be deleted as well.|All :count piggy bank connected to this account will be deleted as well.', - 'bill_keep_transactions' => 'The only transaction connected to this bill will not be deleted.|All :count transactions connected to this bill will spared deletion.', - 'budget_keep_transactions' => 'The only transaction connected to this budget will not be deleted.|All :count transactions connected to this budget will spared deletion.', - 'category_keep_transactions' => 'The only transaction connected to this category will not be deleted.|All :count transactions connected to this category will spared deletion.', - 'tag_keep_transactions' => 'The only transaction connected to this tag will not be deleted.|All :count transactions connected to this tag will spared deletion.', - - 'email' => 'Email address', - 'password' => 'Password', - 'password_confirmation' => 'Password (again)', - 'blocked' => 'Is blocked?', - 'blocked_code' => 'Reason for block', - - - // admin - 'domain' => 'Domain', - 'single_user_mode' => 'Single user mode', - 'must_confirm_account' => 'New users must activate account', - 'is_demo_site' => 'Is demo site', - - - // import - 'import_file' => '匯入檔案', - 'configuration_file' => 'Configuration file', - 'import_file_type' => '匯入檔案類型', - 'csv_comma' => 'A comma (,)', - 'csv_semicolon' => 'A semicolon (;)', - 'csv_tab' => 'A tab (invisible)', - 'csv_delimiter' => 'CSV field delimiter', - 'csv_import_account' => 'Default import account', - 'csv_config' => 'CSV import configuration', - - - 'due_date' => '到期日', - 'payment_date' => 'Payment date', - 'invoice_date' => 'Invoice date', - 'internal_reference' => 'Internal reference', - - 'inward' => 'Inward description', - 'outward' => 'Outward description', -]; \ No newline at end of file diff --git a/resources/lang/zh_TW/help.php b/resources/lang/zh_TW/help.php deleted file mode 100644 index 71107cced6..0000000000 --- a/resources/lang/zh_TW/help.php +++ /dev/null @@ -1,35 +0,0 @@ - '歡迎來到 Firefly III', - 'main-content-text' => '來看看這個簡單的教學來學習使用 Firefly III 吧!', - 'sidebar-toggle-title' => '按側欄來建立新的東西', - 'sidebar-toggle-text' => '按一下加號圖案來創建新物件。帳號、交易、任何東西都可以!', - 'account-menu-title' => '所有帳戶', - 'account-menu-text' => '你能在這裡找到你所有的帳戶。', - 'budget-menu-title' => '預算', - 'budget-menu-text' => '本頁可以幫助你管理財產及降低支出。', - 'report-menu-title' => '報表', - 'report-menu-text' => '如果你需要一個財務狀況的簡報,來看看這個吧。', - 'transaction-menu-title' => '交易', - 'transaction-menu-text' => '你可以在這裡找到所有交易記錄。', - 'option-menu-title' => '設定', - 'option-menu-text' => '相當不言而喻吧。', - 'main-content-end-title' => '完', - 'main-content-end-text' => '每一頁在右上方有一個小問號。按一下它可以取得與頁面相關説明。', - 'index' => '首頁', - 'home' => '首頁', -]; \ No newline at end of file diff --git a/resources/lang/zh_TW/intro.php b/resources/lang/zh_TW/intro.php deleted file mode 100644 index c161cef362..0000000000 --- a/resources/lang/zh_TW/intro.php +++ /dev/null @@ -1,121 +0,0 @@ - 'Welcome to the index page of Firefly III. Please take the time to walk through this intro to get a feeling of how Firefly III works.', - 'index_accounts-chart' => 'This chart shows the current balance of your asset accounts. You can select the accounts visible here in your preferences.', - 'index_box_out_holder' => 'This little box and the boxes next to this one will give you a quick overview of your financial situation.', - 'index_help' => 'If you ever need help with a page or a form, press this button.', - 'index_outro' => 'Most pages of Firefly III will start with a little tour like this one. Please contact me when you have questions or comments. Enjoy!', - 'index_sidebar-toggle' => 'To create new transactions, accounts or other things, use the menu under this icon.', - - // create account: - 'accounts_create_iban' => 'Give your accounts a valid IBAN. This could make a data import very easy in the future.', - 'accounts_create_asset_opening_balance' => 'Assets accounts may have an "opening balance", indicating the start of this account\'s history in Firefly.', - 'accounts_create_asset_currency' => 'Firefly III supports multiple currencies. Asset accounts have one main currency, which you must set here.', - 'accounts_create_asset_virtual' => 'It can sometimes help to give your account a virtual balance: an extra amount always added to or removed from the actual balance.', - - // budgets index - 'budgets_index_intro' => 'Budgets are used to manage your finances and form one of the core functions of Firefly III.', - 'budgets_index_set_budget' => 'Set your total budget for every period so Firefly can tell you if you have budgeted all available money.', - 'budgets_index_see_expenses_bar' => 'Spending money will slowly fill this bar.', - 'budgets_index_navigate_periods' => 'Navigate through periods to easily set budgets ahead of time.', - 'budgets_index_new_budget' => 'Create new budgets as you see fit.', - 'budgets_index_list_of_budgets' => 'Use this table to set the amounts for each budget and see how you are doing.', - - // reports (index) - 'reports_index_intro' => 'Use these reports to get detailed insights in your finances.', - 'reports_index_inputReportType' => 'Pick a report type. Check out the help pages to see what each report shows you.', - 'reports_index_inputAccountsSelect' => 'You can exclude or include asset accounts as you see fit.', - 'reports_index_inputDateRange' => 'The selected date range is entirely up to you: from one day to 10 years.', - 'reports_index_extra-options-box' => 'Depending on the report you have selected, you can select extra filters and options here. Watch this box when you change report types.', - - // reports (reports) - 'reports_report_default_intro' => 'This report will give you a quick and comprehensive overview of your finances. If you wish to see anything else, please don\'t hestitate to contact me!', - 'reports_report_audit_intro' => 'This report will give you detailed insights in your asset accounts.', - 'reports_report_audit_optionsBox' => 'Use these check boxes to show or hide the columns you are interested in.', - - 'reports_report_category_intro' => 'This report will give you insight in one or multiple categories.', - 'reports_report_category_pieCharts' => 'These charts will give you insight in expenses and income per category or per account.', - 'reports_report_category_incomeAndExpensesChart' => 'This chart shows your expenses and income per category.', - - 'reports_report_tag_intro' => 'This report will give you insight in one or multiple tags.', - 'reports_report_tag_pieCharts' => 'These charts will give you insight in expenses and income per tag, account, category or budget.', - 'reports_report_tag_incomeAndExpensesChart' => 'This chart shows your expenses and income per tag.', - - 'reports_report_budget_intro' => 'This report will give you insight in one or multiple budgets.', - 'reports_report_budget_pieCharts' => 'These charts will give you insight in expenses per budget or per account.', - 'reports_report_budget_incomeAndExpensesChart' => 'This chart shows your expenses per budget.', - - // create transaction - 'transactions_create_switch_box' => 'Use these buttons to quickly switch the type of transaction you wish to save.', - 'transactions_create_ffInput_category' => 'You can freely type in this field. Previously created categories will be suggested.', - 'transactions_create_withdrawal_ffInput_budget' => 'Link your withdrawal to a budget for better financial control.', - 'transactions_create_withdrawal_currency_dropdown_amount' => 'Use this dropdown when your withdrawal is in another currency.', - 'transactions_create_deposit_currency_dropdown_amount' => 'Use this dropdown when your deposit is in another currency.', - 'transactions_create_transfer_ffInput_piggy_bank_id' => 'Select a piggy bank and link this transfer to your savings.', - - // piggy banks index: - 'piggy-banks_index_saved' => 'This field shows you how much you\'ve saved in each piggy bank.', - 'piggy-banks_index_button' => 'Next to this progress bar are two buttons (+ and -) to add or remove money from each piggy bank.', - 'piggy-banks_index_accountStatus' => 'For each asset account with at least one piggy bank the status is listed in this table.', - - // create piggy - 'piggy-banks_create_name' => 'What is your goal? A new couch, a camera, money for emergencies?', - 'piggy-banks_create_date' => 'You can set a target date or a deadline for your piggy bank.', - - // show piggy - 'piggy-banks_show_piggyChart' => 'This chart will show the history of this piggy bank.', - 'piggy-banks_show_piggyDetails' => 'Some details about your piggy bank', - 'piggy-banks_show_piggyEvents' => 'Any additions or removals are also listed here.', - - // bill index - 'bills_index_paid_in_period' => 'This field indicates when the bill was last paid.', - 'bills_index_expected_in_period' => 'This field indicates for each bill if and when the next bill is expected to hit.', - - // show bill - 'bills_show_billInfo' => 'This table shows some general information about this bill.', - 'bills_show_billButtons' => 'Use this button to re-scan old transactions so they will be matched to this bill.', - 'bills_show_billChart' => 'This chart shows the transactions linked to this bill.', - - // create bill - 'bills_create_name' => 'Use a descriptive name such as "Rent" or "Health insurance".', - 'bills_create_match' => 'To match transactions, use terms from those transactions or the expense account involved. All words must match.', - 'bills_create_amount_min_holder' => 'Select a minimum and maximum amount for this bill.', - 'bills_create_repeat_freq_holder' => 'Most bills repeat monthly, but you can set another frequency here.', - 'bills_create_skip_holder' => 'If a bill repeats every 2 weeks for example, the "skip"-field should be set to "1" to skip every other week.', - - // rules index - 'rules_index_intro' => 'Firefly III allows you to manage rules, that will automagically be applied to any transaction you create or edit.', - 'rules_index_new_rule_group' => 'You can combine rules in groups for easier management.', - 'rules_index_new_rule' => 'Create as many rules as you like.', - 'rules_index_prio_buttons' => 'Order them any way you see fit.', - 'rules_index_test_buttons' => 'You can test your rules or apply them to existing transactions.', - 'rules_index_rule-triggers' => 'Rules have "triggers" and "actions" that you can order by drag-and-drop.', - 'rules_index_outro' => 'Be sure to check out the help pages using the (?) icon in the top right!', - - // create rule: - 'rules_create_mandatory' => 'Choose a descriptive title, and set when the rule should be fired.', - 'rules_create_ruletriggerholder' => 'Add as many triggers as you like, but remember that ALL triggers must match before any actions are fired.', - 'rules_create_test_rule_triggers' => 'Use this button to see which transactions would match your rule.', - 'rules_create_actions' => 'Set as many actions as you like.', - - // preferences - 'preferences_index_tabs' => 'More options are available behind these tabs.', - - // currencies - 'currencies_index_intro' => 'Firefly III supports multiple currencies, which you can change on this page.', - 'currencies_index_default' => 'Firefly III has one default currency. You can always switch of course using these buttons.', - - // create currency - 'currencies_create_code' => 'This code should be ISO compliant (Google it for your new currency).', -]; \ No newline at end of file diff --git a/resources/lang/zh_TW/list.php b/resources/lang/zh_TW/list.php deleted file mode 100644 index 60c67ed53a..0000000000 --- a/resources/lang/zh_TW/list.php +++ /dev/null @@ -1,94 +0,0 @@ - '按鈕', - 'icon' => '圖標', - 'id' => 'ID', - 'create_date' => '建立於', - 'update_date' => '更新於', - 'balance_before' => '交易前餘額', - 'balance_after' => '交易後餘額', - 'name' => '名稱', - 'role' => '角色', - 'currentBalance' => '目前餘額', - 'active' => '是否有效?', - 'lastActivity' => '最後的活動', - 'balanceDiff' => ':start 和 :end 之間的餘額差', - 'matchedOn' => '匹配於', - 'matchesOn' => '匹配於', - 'account_type' => '帳戶類型', - 'created_at' => '建立於', - 'new_balance' => '新餘額', - 'account' => '帳戶', - 'matchingAmount' => '金額', - 'lastMatch' => '最後出現', - 'split_number' => '分割編號 #', - 'destination' => '到', - 'source' => '來源', - 'next_expected_match' => 'Next expected match', - 'automatch' => '自動匹配?', - 'repeat_freq' => '重複', - 'description' => '描述', - 'amount' => '金額', - 'internal_reference' => '內部參考', - 'date' => '日期', - 'interest_date' => '付息日', - 'book_date' => 'Book date', - 'process_date' => '處理日期', - 'due_date' => '到期日', - 'payment_date' => '付款日期', - 'invoice_date' => '發票日期', - 'interal_reference' => '內部參考', - 'notes' => '備註', - 'from' => '從', - 'piggy_bank' => '存錢筒', - 'to' => '至', - 'budget' => '預算', - 'category' => '類別', - 'bill' => '賬單', - 'withdrawal' => '取款', - 'deposit' => '存款', - 'transfer' => '轉帳', - 'type' => '類型', - 'completed' => '已完成', - 'iban' => '國際銀行賬戶號碼(IBAN)', - 'paid_current_period' => '在這期間已付', - 'email' => '電子郵件', - 'registered_at' => '註冊於', - 'is_activated' => '已經啟動', - 'is_blocked' => '被阻止', - 'is_admin' => '是管理員', - 'has_two_factor' => '有雙重身份驗證 (2FA)', - 'confirmed_from' => 'Confirmed from', - 'registered_from' => 'Registered from', - 'blocked_code' => 'Block code', - 'domain' => 'Domain', - 'registration_attempts' => 'Registration attempts', - 'source_account' => '來源帳戶', - 'destination_account' => 'Destination account', - - 'accounts_count' => 'Number of accounts', - 'journals_count' => 'Number of transactions', - 'attachments_count' => 'Number of attachments', - 'bills_count' => 'Number of bills', - 'categories_count' => 'Number of categories', - 'export_jobs_count' => 'Number of export jobs', - 'import_jobs_count' => 'Number of import jobs', - 'budget_count' => 'Number of budgets', - 'rule_and_groups_count' => 'Number of rules and rule groups', - 'tags_count' => 'Number of tags', - 'inward' => 'Inward description', - 'outward' => 'Outward description', - 'number_of_transactions' => 'Number of transactions', -]; \ No newline at end of file diff --git a/resources/lang/zh_TW/pagination.php b/resources/lang/zh_TW/pagination.php deleted file mode 100644 index 4f0750541e..0000000000 --- a/resources/lang/zh_TW/pagination.php +++ /dev/null @@ -1,19 +0,0 @@ - '« 上一頁', - 'next' => '下一頁 »', - -]; \ No newline at end of file diff --git a/resources/lang/zh_TW/passwords.php b/resources/lang/zh_TW/passwords.php deleted file mode 100644 index 44a451c955..0000000000 --- a/resources/lang/zh_TW/passwords.php +++ /dev/null @@ -1,21 +0,0 @@ - '密碼至少需要六個字元,並與確認欄中的密碼相同。', - 'user' => '我們找不到使用該電郵地址的用戶。', - 'token' => '該密碼重置碼已經失效。', - 'sent' => '我們已經將密碼重置連結發送至您的電郵!', - 'reset' => '你的密碼已經被重置!', - 'blocked' => '好一個嘗試。', -]; \ No newline at end of file diff --git a/resources/lang/zh_TW/validation.php b/resources/lang/zh_TW/validation.php deleted file mode 100644 index 0c42f0ff72..0000000000 --- a/resources/lang/zh_TW/validation.php +++ /dev/null @@ -1,94 +0,0 @@ - '這不是有效的 IBAN。', - 'unique_account_number_for_user' => '此帳號號碼已經存在。', - 'deleted_user' => 'Due to security constraints, you cannot register using this email address.', - 'rule_trigger_value' => '此值不能用於所選擇的事件。', - 'rule_action_value' => '此值不能用於所選擇的動作。', - 'invalid_domain' => '基於安全理由,你無法使用此域名註冊。', - 'file_already_attached' => '檔案 ":name" 已附加到該物件上。', - 'file_attached' => '已成功上傳檔案 ":name"。', - 'file_invalid_mime' => '檔案 ":name" 的類型為 ":mime",並不容許上載此類型的檔案。', - 'file_too_large' => '檔案 ":name" 過大。', - 'belongs_to_user' => ':attribute 的值是未知的。', - 'accepted' => ':attribute 必須被接受。', - 'bic' => 'This is not a valid BIC.', - 'more' => ':attribute must be larger than zero.', - 'active_url' => ':attribute 不是有效的URL。', - 'after' => ':attribute 必須是一個在 :date 之後的日期。', - 'alpha' => ':attribute 只允許包含字母。', - 'alpha_dash' => ':attribute 只允許數字,字母,和下劃線。', - 'alpha_num' => ':attribute 只允許包含數字和字母。', - 'array' => ':attribute 必須是一個陣列。', - 'unique_for_user' => ':attribute 已存在。', - 'before' => ':attribute 必須是一個在 :date 之前的日期。', - 'unique_object_for_user' => '這個名稱已被使用。', - 'unique_account_for_user' => '這個帳號名稱已被使用。', - 'between.numeric' => ':attribute 必須在 :min 和 :max 之間。', - 'between.file' => ':attribute 必須在 :min kB到 :max kB之間。', - 'between.string' => ':attribute 包含的字符數量必須在 :min 到 :max 之間。', - 'between.array' => ':attribute 的數目必須在 :min 到 :max 之間。', - 'boolean' => ':attribute 必須為 true 或 false。', - 'confirmed' => ':attribute 的屬性不相符', - 'date' => ':attribute 不是有效的日期。', - 'date_format' => ':attribute 不符合格式 :format 。', - 'different' => ':attribute 和 :other 不能相同。', - 'digits' => ':attribute 必須是 :digits 位數字。', - 'digits_between' => ':attribute 必須在 :min 位和 :max 位數字之間。', - 'email' => ':attribute 必須是一個有效的電子郵件地址。', - 'filled' => ':attribute 欄位是必填的。', - 'exists' => '所選的 :attribute 無效。', - 'image' => ':attribute 必須是圖片。', - 'in' => '所選的 :attribute 無效。', - 'integer' => ':attribute 必須是整數。', - 'ip' => ':attribute 必須是一個有效的 IP 地址。', - 'json' => ':attribute 必須是一個有效的 JSON 字符串。', - 'max.numeric' => ':attribute 不能大於 :max。', - 'max.file' => ':attribute 不能大於 :max kB。', - 'max.string' => ':attribute 不能大於 :max 字元。', - 'max.array' => ':attribute 的數量不能超過 :max 個。', - 'mimes' => ':attribute 的文件類型必須是 :values 。', - 'min.numeric' => ':attribute 至少需要 :min。', - 'min.file' => ':attribute 大小至少為 :min KB。', - 'min.string' => ':attribute 最少需要有 :min 個字符。', - 'min.array' => ':attribute 至少需要有 :min 項。', - 'not_in' => '所選的 :attribute 無效。', - 'numeric' => ':attribute 必須是數字。', - 'regex' => ':attribute 格式無效。', - 'required' => ':attribute 欄位是必填的。', - 'required_if' => ':attribute 欄位在 :other 是 :value 時是必填的。', - 'required_unless' => '除非 :other 是 :value ,否則 :attribute 是必填的。', - 'required_with' => '當 :values​​ 存在時, :attribute 是必填的。', - 'required_with_all' => '當 :values​​ 存在時, :attribute 是必填的。', - 'required_without' => '當 :values​​ 不存在時, :attribute 是必填的。', - 'required_without_all' => '當沒有任何 :values​​ 存在時, :attribute 為必填項。', - 'same' => ':attribute 和 :other 必須匹配。', - 'size.numeric' => ':attribute 必須是 :size 位。', - 'size.file' => ':attribute 必須為 :size KB。', - 'size.string' => ':attribute 必須包含 :size 個字符。', - 'size.array' => ':attribute 必須包含 :size 個項目。', - 'unique' => ':attribute 已經存在。', - 'string' => ':attribute 必須是一個字符串。', - 'url' => ':attribute 格式無效。', - 'timezone' => ':attribute 必須是有效的區域。', - '2fa_code' => ':attribute 格式無效。', - 'dimensions' => 'The :attribute has invalid image dimensions.', - 'distinct' => 'The :attribute field has a duplicate value.', - 'file' => 'The :attribute must be a file.', - 'in_array' => 'The :attribute field does not exist in :other.', - 'present' => 'The :attribute field must be present.', - 'amount_zero' => 'The total amount cannot be zero', - 'secure_password' => 'This is not a secure password. Please try again. For more information, visit https://goo.gl/NCh2tN', -]; \ No newline at end of file diff --git a/resources/views/accounts/create.twig b/resources/views/accounts/create.twig index 1747c1a20b..25c7c3b25c 100644 --- a/resources/views/accounts/create.twig +++ b/resources/views/accounts/create.twig @@ -68,8 +68,8 @@ {% endblock %} {% block scripts %} - - + + {# JS currency list for update thing #} - + {% endblock %} {% block styles %} - - + + {% endblock %} diff --git a/resources/views/accounts/edit.twig b/resources/views/accounts/edit.twig index e0b4ebf916..2384ee57fb 100644 --- a/resources/views/accounts/edit.twig +++ b/resources/views/accounts/edit.twig @@ -84,8 +84,8 @@ {{ Form.close|raw }} {% endblock %} {% block scripts %} - - + + {# JS currency list for update thing #} - + {% endblock %} {% block styles %} - - + + {% endblock %} diff --git a/resources/views/accounts/index.twig b/resources/views/accounts/index.twig index 230e3a3a59..1585fd39b2 100644 --- a/resources/views/accounts/index.twig +++ b/resources/views/accounts/index.twig @@ -38,12 +38,12 @@ {% endblock %} {% block styles %} - + {% endblock %} {% block scripts %} - + {% endblock %} diff --git a/resources/views/accounts/show.twig b/resources/views/accounts/show.twig index a176f0fcd6..43c219fc54 100644 --- a/resources/views/accounts/show.twig +++ b/resources/views/accounts/show.twig @@ -164,12 +164,12 @@ - - - + + + - - - - + + + + {% endblock %} diff --git a/resources/views/admin/index.twig b/resources/views/admin/index.twig index 1de89abcc3..a12c21d151 100644 --- a/resources/views/admin/index.twig +++ b/resources/views/admin/index.twig @@ -18,6 +18,28 @@ + +
+
+
+

{{ 'send_test_email'|_ }}

+
+
+
+

+ {{ trans('firefly.send_test_email_text', {email:Auth.user.email})|raw }} +

+ + +
+ +
+
+
diff --git a/resources/views/admin/link/index.twig b/resources/views/admin/link/index.twig index 2cc8338ef7..4ae665e1ad 100644 --- a/resources/views/admin/link/index.twig +++ b/resources/views/admin/link/index.twig @@ -58,9 +58,9 @@ {% endblock %} {% block scripts %} - + {% endblock %} {% block styles %} - + {% endblock %} diff --git a/resources/views/admin/link/show.twig b/resources/views/admin/link/show.twig index 813f53e534..d0ab5e920c 100644 --- a/resources/views/admin/link/show.twig +++ b/resources/views/admin/link/show.twig @@ -54,9 +54,9 @@ {% endblock %} {% block scripts %} - + {% endblock %} {% block styles %} - + {% endblock %} diff --git a/resources/views/admin/users/delete.twig b/resources/views/admin/users/delete.twig new file mode 100644 index 0000000000..17efd643a8 --- /dev/null +++ b/resources/views/admin/users/delete.twig @@ -0,0 +1,37 @@ +{% extends "./layout/default" %} + +{% block breadcrumbs %} + {{ Breadcrumbs.renderIfExists(Route.getCurrentRoute.getName, user) }} +{% endblock %} + +{% block content %} + +
+ + +
+
+
+
+

{{ trans('form.delete_user', {'email': user.email}) }}

+
+
+

+ {{ trans('form.permDeleteWarning') }} +

+ +

+ {{ trans('form.user_areYouSure', {'email': user.email}) }} +

+
+ + + +
+
+
+
+{% endblock %} diff --git a/resources/views/admin/users/edit.twig b/resources/views/admin/users/edit.twig index 0e7a531fc3..19a9cb0465 100644 --- a/resources/views/admin/users/edit.twig +++ b/resources/views/admin/users/edit.twig @@ -17,7 +17,7 @@

{{ 'mandatoryFields'|_ }}

- {{ ExpandedForm.text('email') }} + {{ ExpandedForm.text('email',null,{'helpText': trans('firefly.admin_update_email')}) }} {{ ExpandedForm.password('password') }} {{ ExpandedForm.password('password_confirmation') }} {{ ExpandedForm.checkbox('blocked') }} diff --git a/resources/views/admin/users/index.twig b/resources/views/admin/users/index.twig index a70b7cba77..03b1a255e9 100644 --- a/resources/views/admin/users/index.twig +++ b/resources/views/admin/users/index.twig @@ -30,6 +30,7 @@
+
#{{ user.id }} @@ -85,8 +86,8 @@
{% endblock %} {% block styles %} - + {% endblock %} {% block scripts %} - + {% endblock %} diff --git a/resources/views/auth/login.twig b/resources/views/auth/login.twig index 8e925d16ba..2db9351349 100644 --- a/resources/views/auth/login.twig +++ b/resources/views/auth/login.twig @@ -13,6 +13,16 @@ {% endif %} + {# SUCCESS MESSAGE (ALWAYS SINGULAR) #} + {% if Session.has('success') %} + + {% endif %} + {% if errors.has('email') %}
diff --git a/resources/views/auth/lost-two-factor.twig b/resources/views/auth/lost-two-factor.twig index c82ffddd6c..08455fc2b8 100644 --- a/resources/views/auth/lost-two-factor.twig +++ b/resources/views/auth/lost-two-factor.twig @@ -7,10 +7,10 @@ - - - - + + + + {# favicons #} {% include('partials.favicons') %} diff --git a/resources/views/bills/create.twig b/resources/views/bills/create.twig index c182cb2976..5ee65cf3c8 100644 --- a/resources/views/bills/create.twig +++ b/resources/views/bills/create.twig @@ -60,13 +60,13 @@ {% endblock %} {% block styles %} - - - + + + {% endblock %} {% block scripts %} - - - - + + + + {% endblock %} diff --git a/resources/views/bills/edit.twig b/resources/views/bills/edit.twig index ded9774dc8..ee48b4375b 100644 --- a/resources/views/bills/edit.twig +++ b/resources/views/bills/edit.twig @@ -59,13 +59,13 @@ {% endblock %} {% block styles %} - - - + + + {% endblock %} {% block scripts %} - - - - + + + + {% endblock %} diff --git a/resources/views/bills/index.twig b/resources/views/bills/index.twig index 2edd63fd82..ef136db47f 100644 --- a/resources/views/bills/index.twig +++ b/resources/views/bills/index.twig @@ -32,3 +32,11 @@
{% endif %} {% endblock %} + +{% block styles %} + +{% endblock %} + +{% block scripts %} + +{% endblock %} \ No newline at end of file diff --git a/resources/views/bills/show.twig b/resources/views/bills/show.twig index 6396a0948b..d233a6de8c 100644 --- a/resources/views/bills/show.twig +++ b/resources/views/bills/show.twig @@ -125,9 +125,9 @@ - - - - - + + + + + {% endblock %} diff --git a/resources/views/budgets/index.twig b/resources/views/budgets/index.twig index 030239feef..71ba5fd301 100644 --- a/resources/views/budgets/index.twig +++ b/resources/views/budgets/index.twig @@ -13,13 +13,14 @@
-
+
{{ 'budgeted'|_ }}: {{ budgeted|formatAmountPlain }}
-
- {{ trans('firefly.available_between',{start : periodStart, end: periodEnd }) }}: - {{ available|formatAmountPlain }} +
+ {{ trans('firefly.available_between',{start : periodStart, end: periodEnd }) }}: + {{ available|formatAmountPlain }} + +
@@ -217,7 +218,7 @@ {% endblock %} {% block styles %} - + {% endblock %} {% block scripts %} @@ -232,9 +233,10 @@ var budgetIndexUri = "{{ route('budgets.index','REPLACE') }}"; var budgetAmountUri = "{{ route('budgets.amount','REPLACE') }}"; var updateIncomeUri = "{{ route('budgets.income',[start.format('Y-m-d'),end.format('Y-m-d')]) }}"; + var infoIncomeUri = "{{ route('budgets.income.info',[start.format('Y-m-d'),end.format('Y-m-d')]) }}"; var periodStart = "{{ start.format('Y-m-d') }}"; var periodEnd = "{{ end.format('Y-m-d') }}"; - - + + {% endblock %} diff --git a/resources/views/budgets/info.twig b/resources/views/budgets/info.twig new file mode 100644 index 0000000000..25a8104b47 --- /dev/null +++ b/resources/views/budgets/info.twig @@ -0,0 +1,54 @@ + + diff --git a/resources/views/budgets/no-budget.twig b/resources/views/budgets/no-budget.twig index 8e10cda80d..cc0910f055 100644 --- a/resources/views/budgets/no-budget.twig +++ b/resources/views/budgets/no-budget.twig @@ -78,5 +78,5 @@ {% endblock %} {% block scripts %} - + {% endblock %} diff --git a/resources/views/budgets/show.twig b/resources/views/budgets/show.twig index 5e8e953794..753c432375 100644 --- a/resources/views/budgets/show.twig +++ b/resources/views/budgets/show.twig @@ -171,9 +171,9 @@ {% endif %} - - - - - + + + + + {% endblock %} diff --git a/resources/views/categories/index.twig b/resources/views/categories/index.twig index 19ee48a915..f23a7f3511 100644 --- a/resources/views/categories/index.twig +++ b/resources/views/categories/index.twig @@ -35,10 +35,10 @@ {% endblock %} {% block styles %} - + {% endblock %} {% block scripts %} - - + + {% endblock %} diff --git a/resources/views/categories/no-category.twig b/resources/views/categories/no-category.twig index 60f3cc79eb..6d71b3606e 100644 --- a/resources/views/categories/no-category.twig +++ b/resources/views/categories/no-category.twig @@ -92,5 +92,5 @@ {% endblock %} {% block scripts %} - + {% endblock %} diff --git a/resources/views/categories/show.twig b/resources/views/categories/show.twig index 72be5d3faf..d333c40a8c 100644 --- a/resources/views/categories/show.twig +++ b/resources/views/categories/show.twig @@ -135,9 +135,9 @@ var everything = '{{ route('chart.category.all', [category.id]) }}'; var specific = '{{ route('chart.category.specific', [category.id, start.format('Ymd')]) }}'; - - - - - + + + + + {% endblock %} diff --git a/resources/views/emails/admin-test-html.twig b/resources/views/emails/admin-test-html.twig new file mode 100644 index 0000000000..0862786993 --- /dev/null +++ b/resources/views/emails/admin-test-html.twig @@ -0,0 +1,5 @@ +{% include 'emails.header-html' %} +

+ This is a test message from your Firefly III instance. It was sent to {{ email }}. +

+{% include 'emails.footer-html' %} diff --git a/resources/views/emails/admin-test-text.twig b/resources/views/emails/admin-test-text.twig new file mode 100644 index 0000000000..23c246e694 --- /dev/null +++ b/resources/views/emails/admin-test-text.twig @@ -0,0 +1,3 @@ +{% include 'emails.header-text' %} + This is a test message from your Firefly III instance. It was sent to {{ email }}. +{% include 'emails.footer-text' %} diff --git a/resources/views/emails/confirm-email-change-html.twig b/resources/views/emails/confirm-email-change-html.twig new file mode 100644 index 0000000000..aa946b88ea --- /dev/null +++ b/resources/views/emails/confirm-email-change-html.twig @@ -0,0 +1,18 @@ +{% include 'emails.header-html' %} +

+ You or somebody with access to your Firefly III account has changed your email address. If you did not expect this message, please ignore and delete it. +

+

+ The old email addres was: {{ oldEmail }} +

+

+ The new email address is: {{ newEmail }} +

+

+ You cannot use Firefly III until you confirm this change. Please follow the link below to do so. +

+ +

+ {{ uri }} +

+{% include 'emails.footer-html' %} diff --git a/resources/views/emails/confirm-email-change-text.twig b/resources/views/emails/confirm-email-change-text.twig new file mode 100644 index 0000000000..cea4fd7c08 --- /dev/null +++ b/resources/views/emails/confirm-email-change-text.twig @@ -0,0 +1,9 @@ +{% include 'emails.header-text' %} +You or somebody with access to your Firefly III account has changed your email address. If you did not expect this message, please ignore and delete it. + +The old email addres was: {{ oldEmail }} + +The new email address is: {{ newEmail }} + +You cannot use Firefly III until you confirm this change. Please follow the link to do so: {{ uri }} +{% include 'emails.footer-text' %} diff --git a/resources/views/emails/undo-email-change-html.twig b/resources/views/emails/undo-email-change-html.twig new file mode 100644 index 0000000000..8d6021ee64 --- /dev/null +++ b/resources/views/emails/undo-email-change-html.twig @@ -0,0 +1,18 @@ +{% include 'emails.header-html' %} +

+ You or somebody with access to your Firefly III account has changed your email address. + If you did not expect this to happen, you must follow the "undo"-link below to protect your account! +

+

+ If you initiated this change, you may safely ignore this message. +

+

+ The old email addres was: {{ oldEmail }} +

+

+ The new email address is: {{ newEmail }} +

+

+ To undo the change, follow this link: {{ uri }} +

+{% include 'emails.footer-html' %} diff --git a/resources/views/emails/undo-email-change-text.twig b/resources/views/emails/undo-email-change-text.twig new file mode 100644 index 0000000000..8bf398ca95 --- /dev/null +++ b/resources/views/emails/undo-email-change-text.twig @@ -0,0 +1,12 @@ +{% include 'emails.header-text' %} +You or somebody with access to your Firefly III account has changed your email address. If you did not expect this to happen, +you must follow the "undo"-link below to protect your account! + +If you initiated this change, you may safely ignore this message. + +The old email addres was: {{ oldEmail }} + +The new email address is: {{ newEmail }} + +To undo the change, follow this link: {{ uri }} +{% include 'emails.footer-text' %} diff --git a/resources/views/errors/404.twig b/resources/views/errors/404.twig index 73b145622f..9fdb9ff8a0 100644 --- a/resources/views/errors/404.twig +++ b/resources/views/errors/404.twig @@ -7,10 +7,10 @@ - - - - + + + + {% include('partials.favicons') %} diff --git a/resources/views/errors/FireflyException.twig b/resources/views/errors/FireflyException.twig index 01028a7e9d..50e9e43419 100644 --- a/resources/views/errors/FireflyException.twig +++ b/resources/views/errors/FireflyException.twig @@ -7,10 +7,10 @@ - - - - + + + + {# favicons #} {% include('partials.favicons') %} diff --git a/resources/views/export/index.twig b/resources/views/export/index.twig index 6279fef14b..ecbd1f6247 100644 --- a/resources/views/export/index.twig +++ b/resources/views/export/index.twig @@ -5,9 +5,6 @@ {% endblock %} {% block content %} - - -
@@ -17,7 +14,7 @@
-

{{ 'export_data'|_ }}

+

{{ 'export_and_backup_data'|_ }}

{# OPTIONAL REVENUE ACCOUNTS #} - {% if showDepositsFrontpage %} + {% if showDeps %}

{{ 'revenue_accounts'|_ }}

@@ -138,10 +138,10 @@ var accountExpenseUri = '{{ route('chart.account.expense') }}'; - - - - + + + + {% endblock %} {% block styles %} {% endblock %} diff --git a/resources/views/layout/default.twig b/resources/views/layout/default.twig index ca3c255c10..051060ad85 100644 --- a/resources/views/layout/default.twig +++ b/resources/views/layout/default.twig @@ -18,20 +18,20 @@ - - - - - - + + + + + + {% if not shownDemo %} - + {% endif %} {% block styles %}{% endblock %} - - - - - - - - + + + + + + + + + {% if not shownDemo %} - - + + {% endif %} {% block scripts %}{% endblock %} diff --git a/resources/views/layout/empty.twig b/resources/views/layout/empty.twig index 09f97274bd..d5c7c75a5e 100644 --- a/resources/views/layout/empty.twig +++ b/resources/views/layout/empty.twig @@ -7,13 +7,13 @@ - - - + + + {# favicons #} @@ -28,8 +28,8 @@ {% block content %}{% endblock %}
- - + + {% if env('ANALYTICS_ID','') != '' %} - - + + + {% if env('ANALYTICS_ID','') != '' %} - - + + + {% endblock %} {% block styles %} - - + + {% endblock %} diff --git a/resources/views/piggy-banks/edit.twig b/resources/views/piggy-banks/edit.twig index 7da0efdb69..1aca53ee8e 100644 --- a/resources/views/piggy-banks/edit.twig +++ b/resources/views/piggy-banks/edit.twig @@ -57,12 +57,12 @@ {{ Form.close|raw }} {% endblock %} {% block scripts %} - - - + + + {% endblock %} {% block styles %} - - + + {% endblock %} diff --git a/resources/views/piggy-banks/index.twig b/resources/views/piggy-banks/index.twig index 4043c9267e..cfe76aee06 100644 --- a/resources/views/piggy-banks/index.twig +++ b/resources/views/piggy-banks/index.twig @@ -59,6 +59,6 @@ {% endif %} {% endblock %} {% block scripts %} - - + + {% endblock %} diff --git a/resources/views/piggy-banks/show.twig b/resources/views/piggy-banks/show.twig index b1ea8eae79..f85fa79d5f 100644 --- a/resources/views/piggy-banks/show.twig +++ b/resources/views/piggy-banks/show.twig @@ -114,8 +114,8 @@ var piggyBankID = {{ piggyBank.id }}; - - - - + + + + {% endblock %} diff --git a/resources/views/popup/list/journals.twig b/resources/views/popup/list/journals.twig index 1ab88a9f32..1829dfe1c5 100644 --- a/resources/views/popup/list/journals.twig +++ b/resources/views/popup/list/journals.twig @@ -81,7 +81,13 @@ {{ 'sum'|_ }}: - {{ sum|formatAmount }} + + {% if inverseAmount %} + {{ (sum*-1)|formatAmount }} + {% else %} + {{ sum|formatAmount }} + {% endif %} + diff --git a/resources/views/popup/report/expense-entry.twig b/resources/views/popup/report/expense-entry.twig index 0cbc7cfe90..e2d660dbe5 100644 --- a/resources/views/popup/report/expense-entry.twig +++ b/resources/views/popup/report/expense-entry.twig @@ -8,6 +8,7 @@