diff --git a/CHANGELOG.md b/CHANGELOG.md index 04dd13ba14..6849b2014b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,43 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## [4.6.5] - 2017-09-09 + +### Added +- #616, The ability to link transactions +- #763, as suggested by @tannie +- #770, as suggested by @skibbipl +- #780, as suggested by @skibbipl +- #784, as suggested by @SmilingWorlock +- Lots of code for future support of automated Bunq imports + +### Changed +- Rewrote the export routine +- #782, as suggested by @NiceGuyIT +- #800, as suggested by @jleeong + +### Fixed +- #724, reported by @skibbipl +- #738, reported by @skibbipl +- #760, reported by @leander091 +- #764, reported by @tannie +- #792, reported by @jleeong +- #793, reported by @nicoschreiner +- #797, reported by @leander091 +- #801, reported by @pkoziol +- #803, reported by @pkoziol +- #805, reported by @pkoziol +- #806, reported by @pkoziol +- #807, reported by @pkoziol +- #808, reported by @pkoziol +- #809, reported by @pkoziol +- #814, reported by @nicoschreiner +- #818, reported by @gavu +- #819, reported by @DieBauer +- #820, reported by @simonsmiley +- Various other fixes + + ## [4.6.4] - 2017-08-13 ### Added - PHP7.1 support diff --git a/Dockerfile b/Dockerfile index 794634fdb8..792f7b2c8d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -23,28 +23,18 @@ 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 # Enable apache mod rewrite.. RUN a2enmod rewrite # Setup the Composer installer -RUN curl -o /tmp/composer-setup.php https://getcomposer.org/installer && \ - curl -o /tmp/composer-setup.sig https://composer.github.io/installer.sig && \ - php -r "if (hash('SHA384', file_get_contents('/tmp/composer-setup.php')) !== trim(file_get_contents('/tmp/composer-setup.sig'))) { unlink('/tmp/composer-setup.php'); echo 'Invalid installer' . PHP_EOL; exit(1); }" && \ - chmod +x /tmp/composer-setup.php && \ - php /tmp/composer-setup.php && \ - mv composer.phar /usr/local/bin/composer && \ - rm -f /tmp/composer-setup.{php,sig} +run curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer -ADD . /var/www/firefly-iii -RUN chown -R www-data:www-data /var/www/ +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 - -USER www-data +RUN chown -R www-data:www-data /var/www && chmod -R 775 /var/www/firefly-iii/storage WORKDIR /var/www/firefly-iii - -RUN composer install --no-scripts --no-dev - -USER root - +EXPOSE 80 ENTRYPOINT ["/var/www/firefly-iii/docker/entrypoint.sh"] diff --git a/app/Console/Commands/CreateImport.php b/app/Console/Commands/CreateImport.php index f155d9add0..191f361582 100644 --- a/app/Console/Commands/CreateImport.php +++ b/app/Console/Commands/CreateImport.php @@ -54,6 +54,8 @@ class CreateImport extends Command } /** + * Run the command. + * * @SuppressWarnings(PHPMD.ExcessiveMethodLength) // cannot be helped * @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's five exactly. */ @@ -133,6 +135,8 @@ class CreateImport extends Command } /** + * Verify user inserts correct arguments. + * * @return bool * @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's five exactly. */ diff --git a/app/Console/Commands/Import.php b/app/Console/Commands/Import.php index f37203cc41..b77dddf0fc 100644 --- a/app/Console/Commands/Import.php +++ b/app/Console/Commands/Import.php @@ -51,7 +51,7 @@ class Import extends Command } /** - * + * Run the import routine. */ public function handle() { @@ -91,6 +91,8 @@ class Import extends Command } /** + * Check if job is valid to be imported. + * * @param ImportJob $job * * @return bool diff --git a/app/Console/Commands/UpgradeDatabase.php b/app/Console/Commands/UpgradeDatabase.php index 066e4496d3..27ab338d93 100644 --- a/app/Console/Commands/UpgradeDatabase.php +++ b/app/Console/Commands/UpgradeDatabase.php @@ -20,22 +20,21 @@ use FireflyIII\Models\AccountMeta; use FireflyIII\Models\AccountType; use FireflyIII\Models\BudgetLimit; use FireflyIII\Models\LimitRepetition; -use FireflyIII\Models\PiggyBankEvent; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use Illuminate\Console\Command; -use Illuminate\Database\Query\JoinClause; use Illuminate\Database\QueryException; +use Illuminate\Support\Collection; use Log; use Preferences; use Schema; -use Steam; /** * Class UpgradeDatabase + * * @SuppressWarnings(PHPMD.CouplingBetweenObjects) // it just touches a lot of things. * * @package FireflyIII\Console\Commands @@ -71,76 +70,26 @@ class UpgradeDatabase extends Command { $this->setTransactionIdentifier(); $this->migrateRepetitions(); - $this->repairPiggyBanks(); $this->updateAccountCurrencies(); - $this->updateJournalCurrencies(); - $this->currencyInfoToTransactions(); - $this->verifyCurrencyInfo(); + $this->line('Updating currency information..'); + $this->updateTransferCurrencies(); + $this->updateOtherCurrencies(); $this->info('Firefly III database is up to date.'); + + return; + + } /** - * Moves the currency id info to the transaction instead of the journal. - * - * @SuppressWarnings(PHPMD.CyclomaticComplexity) // cannot be helped. + * Migrate budget repetitions to new format where the end date is in the budget limit as well, + * making the limit_repetition table obsolete. */ - private function currencyInfoToTransactions() + public function migrateRepetitions(): void { - $count = 0; - $set = TransactionJournal::with('transactions')->get(); - /** @var TransactionJournal $journal */ - foreach ($set as $journal) { - /** @var Transaction $transaction */ - foreach ($journal->transactions as $transaction) { - if (is_null($transaction->transaction_currency_id)) { - $transaction->transaction_currency_id = $journal->transaction_currency_id; - $transaction->save(); - $count++; - } - } - - // read and use the foreign amounts when present. - if ($journal->hasMeta('foreign_amount')) { - $amount = Steam::positive($journal->getMeta('foreign_amount')); - - // update both transactions: - foreach ($journal->transactions as $transaction) { - $transaction->foreign_amount = $amount; - if (bccomp($transaction->amount, '0') === -1) { - // update with negative amount: - $transaction->foreign_amount = bcmul($amount, '-1'); - } - // set foreign currency id: - $transaction->foreign_currency_id = intval($journal->getMeta('foreign_currency_id')); - $transaction->save(); - } - $journal->deleteMeta('foreign_amount'); - $journal->deleteMeta('foreign_currency_id'); - } - - } - - $this->line(sprintf('Updated currency information for %d transactions', $count)); - } - - /** - * Migrate budget repetitions to new format. - * - * @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's 5. - */ - private function migrateRepetitions() - { - if (!Schema::hasTable('budget_limits')) { - return; - } - // get all budget limits with end_date NULL $set = BudgetLimit::whereNull('end_date')->get(); - if ($set->count() > 0) { - $this->line(sprintf('Found %d budget limit(s) to update', $set->count())); - } /** @var BudgetLimit $budgetLimit */ foreach ($set as $budgetLimit) { - // get limit repetition (should be just one): /** @var LimitRepetition $repetition */ $repetition = $budgetLimit->limitrepetitions()->first(); if (!is_null($repetition)) { @@ -150,59 +99,30 @@ class UpgradeDatabase extends Command $repetition->delete(); } } + + return; } /** - * Make sure there are only transfers linked to piggy bank events. + * This method gives all transactions which are part of a split journal (so more than 2) a sort of "order" so they are easier + * to easier to match to their counterpart. When a journal is split, it has two or three transactions: -3, -4 and -5 for example. * - * @SuppressWarnings(PHPMD.CyclomaticComplexity) // cannot be helped. + * In the database this is reflected as 6 transactions: -3/+3, -4/+4, -5/+5. + * + * When either of these are the same amount, FF3 can't keep them apart: +3/-3, +3/-3, +3/-3. This happens more often than you would + * think. So each set gets a number (1,2,3) to keep them apart. */ - private function repairPiggyBanks() - { - // if table does not exist, return false - if (!Schema::hasTable('piggy_bank_events')) { - return; - } - - $set = PiggyBankEvent::with(['PiggyBank', 'TransactionJournal', 'TransactionJournal.TransactionType'])->get(); - /** @var PiggyBankEvent $event */ - foreach ($set as $event) { - - if (is_null($event->transaction_journal_id)) { - continue; - } - /** @var TransactionJournal $journal */ - $journal = $event->transactionJournal()->first(); - if (is_null($journal)) { - continue; - } - - $type = $journal->transactionType->type; - if ($type !== TransactionType::TRANSFER) { - $event->transaction_journal_id = null; - $event->save(); - $this->line(sprintf('Piggy bank #%d was referenced by an invalid event. This has been fixed.', $event->piggy_bank_id)); - } - } - } - - /** - * This is strangely complex, because the HAVING modifier is a no-no. And subqueries in Laravel are weird. - */ - private function setTransactionIdentifier() + public function setTransactionIdentifier(): void { // if table does not exist, return false if (!Schema::hasTable('transaction_journals')) { return; } - - - $subQuery = TransactionJournal::leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id') - ->whereNull('transaction_journals.deleted_at') - ->whereNull('transactions.deleted_at') - ->groupBy(['transaction_journals.id']) - ->select(['transaction_journals.id', DB::raw('COUNT(transactions.id) AS t_count')]); - + $subQuery = TransactionJournal::leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id') + ->whereNull('transaction_journals.deleted_at') + ->whereNull('transactions.deleted_at') + ->groupBy(['transaction_journals.id']) + ->select(['transaction_journals.id', DB::raw('COUNT(transactions.id) AS t_count')]); $result = DB::table(DB::raw('(' . $subQuery->toSql() . ') AS derived')) ->mergeBindings($subQuery->getQuery()) ->where('t_count', '>', 2) @@ -210,55 +130,172 @@ class UpgradeDatabase extends Command $journalIds = array_unique($result->pluck('id')->toArray()); foreach ($journalIds as $journalId) { - $this->updateJournal(intval($journalId)); + $this->updateJournalidentifiers(intval($journalId)); } + + return; } /** - * Make sure all accounts have proper currency info. + * Each (asset) account must have a reference to a preferred currency. If the account does not have one, it's forced upon the account. */ - private function updateAccountCurrencies() + public function updateAccountCurrencies(): void { $accounts = Account::leftJoin('account_types', 'account_types.id', '=', 'accounts.account_type_id') ->whereIn('account_types.type', [AccountType::DEFAULT, AccountType::ASSET])->get(['accounts.*']); - /** @var Account $account */ - foreach ($accounts as $account) { - // get users preference, fall back to system pref. - $defaultCurrencyCode = Preferences::getForUser($account->user, 'currencyPreference', config('firefly.default_currency', 'EUR'))->data; - $defaultCurrency = TransactionCurrency::where('code', $defaultCurrencyCode)->first(); - $accountCurrency = intval($account->getMeta('currency_id')); - $openingBalance = $account->getOpeningBalance(); - $obCurrency = intval($openingBalance->transaction_currency_id); + $accounts->each( + function (Account $account) { + // get users preference, fall back to system pref. + $defaultCurrencyCode = Preferences::getForUser($account->user, 'currencyPreference', config('firefly.default_currency', 'EUR'))->data; + $defaultCurrency = TransactionCurrency::where('code', $defaultCurrencyCode)->first(); + $accountCurrency = intval($account->getMeta('currency_id')); + $openingBalance = $account->getOpeningBalance(); + $obCurrency = intval($openingBalance->transaction_currency_id); - // both 0? set to default currency: - if ($accountCurrency === 0 && $obCurrency === 0) { - AccountMeta::create(['account_id' => $account->id, 'name' => 'currency_id', 'data' => $defaultCurrency->id]); - $this->line(sprintf('Account #%d ("%s") now has a currency setting (%s).', $account->id, $account->name, $defaultCurrencyCode)); - continue; + // both 0? set to default currency: + if ($accountCurrency === 0 && $obCurrency === 0) { + AccountMeta::create(['account_id' => $account->id, 'name' => 'currency_id', 'data' => $defaultCurrency->id]); + $this->line(sprintf('Account #%d ("%s") now has a currency setting (%s).', $account->id, $account->name, $defaultCurrencyCode)); + + return true; + } + + // account is set to 0, opening balance is not? + if ($accountCurrency === 0 && $obCurrency > 0) { + AccountMeta::create(['account_id' => $account->id, 'name' => 'currency_id', 'data' => $obCurrency]); + $this->line(sprintf('Account #%d ("%s") now has a currency setting (%s).', $account->id, $account->name, $defaultCurrencyCode)); + + return true; + } + + // do not match and opening balance id is not null. + if ($accountCurrency !== $obCurrency && $openingBalance->id > 0) { + // update opening balance: + $openingBalance->transaction_currency_id = $accountCurrency; + $openingBalance->save(); + $this->line(sprintf('Account #%d ("%s") now has a correct currency for opening balance.', $account->id, $account->name)); + + return true; + } + + return true; } + ); - // account is set to 0, opening balance is not? - if ($accountCurrency === 0 && $obCurrency > 0) { - AccountMeta::create(['account_id' => $account->id, 'name' => 'currency_id', 'data' => $obCurrency]); - $this->line(sprintf('Account #%d ("%s") now has a currency setting (%s).', $account->id, $account->name, $defaultCurrencyCode)); - continue; + return; + } + + /** + * This routine verifies that withdrawals, deposits and opening balances have the correct currency settings for + * the accounts they are linked to. + * + * Both source and destination must match the respective currency preference of the related asset account. + * So FF3 must verify all transactions. + */ + public function updateOtherCurrencies(): void + { + /** @var CurrencyRepositoryInterface $repository */ + $repository = app(CurrencyRepositoryInterface::class); + $set = TransactionJournal + ::leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id') + ->whereIn('transaction_types.type', [TransactionType::WITHDRAWAL, TransactionType::DEPOSIT, TransactionType::OPENING_BALANCE]) + ->get(['transaction_journals.*']); + + $set->each( + function (TransactionJournal $journal) use ($repository) { + // get the transaction with the asset account in it: + /** @var Transaction $transaction */ + $transaction = $journal->transactions() + ->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.*']); + /** @var Account $account */ + $account = $transaction->account; + $currency = $repository->find(intval($account->getMeta('currency_id'))); + $transactions = $journal->transactions()->get(); + $transactions->each( + function (Transaction $transaction) use ($currency) { + if (is_null($transaction->transaction_currency_id)) { + $transaction->transaction_currency_id = $currency->id; + $transaction->save(); + } + + // when mismatch in transaction: + if ($transaction->transaction_currency_id !== $currency->id) { + $transaction->foreign_currency_id = $transaction->transaction_currency_id; + $transaction->foreign_amount = $transaction->amount; + $transaction->transaction_currency_id = $currency->id; + $transaction->save(); + } + } + ); + // also update the journal, of course: + $journal->transaction_currency_id = $currency->id; + $journal->save(); } + ); - // do not match: - if ($accountCurrency !== $obCurrency) { - // update opening balance: - $openingBalance->transaction_currency_id = $accountCurrency; - $openingBalance->save(); - $this->line(sprintf('Account #%d ("%s") now has a correct currency for opening balance.', $account->id, $account->name)); - continue; + return; + } + + /** + * This routine verifies that transfers have the correct currency settings for the accounts they are linked to. + * For transfers, this is can be a destructive routine since we FORCE them into a currency setting whether they + * like it or not. Previous routines MUST have set the currency setting for both accounts for this to work. + * + * A transfer always has the + * + * Both source and destination must match the respective currency preference. So FF3 must verify ALL + * transactions. + */ + public function updateTransferCurrencies() + { + $set = TransactionJournal + ::leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id') + ->where('transaction_types.type', TransactionType::TRANSFER) + ->get(['transaction_journals.*']); + + $set->each( + function (TransactionJournal $transfer) { + // select all "source" transactions: + /** @var Collection $transactions */ + $transactions = $transfer->transactions()->where('amount', '<', 0)->get(); + $transactions->each( + function (Transaction $transaction) { + $this->updateTransactionCurrency($transaction); + $this->updateJournalCurrency($transaction); + } + ); } + ); + } - // opening balance 0, account not zero? just continue: - // both are equal, just continue: + /** + * This method makes sure that the transaction journal uses the currency given in the transaction. + * + * @param Transaction $transaction + */ + private function updateJournalCurrency(Transaction $transaction): void + { + /** @var CurrencyRepositoryInterface $repository */ + $repository = app(CurrencyRepositoryInterface::class); + $currency = $repository->find(intval($transaction->account->getMeta('currency_id'))); + $journal = $transaction->transactionJournal; + + if (!(intval($currency->id) === intval($journal->transaction_currency_id))) { + $this->line( + sprintf( + 'Transfer #%d ("%s") has been updated to use %s instead of %s.', $journal->id, $journal->description, $currency->code, + $journal->transactionCurrency->code + ) + ); + $journal->transaction_currency_id = $currency->id; + $journal->save(); } + return; } /** @@ -267,7 +304,7 @@ class UpgradeDatabase extends Command * * @param int $journalId */ - private function updateJournal(int $journalId) + private function updateJournalidentifiers(int $journalId): void { $identifier = 0; $processed = []; @@ -295,121 +332,128 @@ class UpgradeDatabase extends Command if (!is_null($opposing)) { // give both a new identifier: $transaction->identifier = $identifier; + $opposing->identifier = $identifier; $transaction->save(); - $opposing->identifier = $identifier; $opposing->save(); $processed[] = $transaction->id; $processed[] = $opposing->id; } $identifier++; } + + return; } /** - * Makes sure that withdrawals, deposits and transfers have - * a currency setting matching their respective accounts - */ - private function updateJournalCurrencies() - { - $types = [ - TransactionType::WITHDRAWAL => '<', - TransactionType::DEPOSIT => '>', - ]; - $repository = app(CurrencyRepositoryInterface::class); - $notification = '%s #%d uses %s but should use %s. It has been updated. Please verify this in Firefly III.'; - $transfer = 'Transfer #%d has been updated to use the correct currencies. Please verify this in Firefly III.'; - $driver = DB::connection()->getDriverName(); - $pgsql = ['pgsql', 'postgresql']; - - foreach ($types as $type => $operator) { - $query = TransactionJournal - ::leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id')->leftJoin( - 'transactions', function (JoinClause $join) use ($operator) { - $join->on('transaction_journals.id', '=', 'transactions.transaction_journal_id')->where('transactions.amount', $operator, '0'); - } - ) - ->leftJoin('accounts', 'accounts.id', '=', 'transactions.account_id') - ->leftJoin('account_meta', 'account_meta.account_id', '=', 'accounts.id') - ->where('transaction_types.type', $type) - ->where('account_meta.name', 'currency_id'); - if (in_array($driver, $pgsql)) { - $query->where('transaction_journals.transaction_currency_id', '!=', DB::raw('cast(account_meta.data as int)')); - } - if (!in_array($driver, $pgsql)) { - $query->where('transaction_journals.transaction_currency_id', '!=', DB::raw('account_meta.data')); - } - - $set = $query->get(['transaction_journals.*', 'account_meta.data as expected_currency_id', 'transactions.amount as transaction_amount']); - /** @var TransactionJournal $journal */ - foreach ($set as $journal) { - $expectedCurrency = $repository->find(intval($journal->expected_currency_id)); - $line = sprintf($notification, $type, $journal->id, $journal->transactionCurrency->code, $expectedCurrency->code); - - $journal->setMeta('foreign_amount', $journal->transaction_amount); - $journal->setMeta('foreign_currency_id', $journal->transaction_currency_id); - $journal->transaction_currency_id = $expectedCurrency->id; - $journal->save(); - $this->line($line); - } - } - /* - * For transfers it's slightly different. Both source and destination - * must match the respective currency preference. So we must verify ALL - * transactions. - */ - $set = TransactionJournal - ::leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id') - ->where('transaction_types.type', TransactionType::TRANSFER) - ->get(['transaction_journals.*']); - /** @var TransactionJournal $journal */ - foreach ($set as $journal) { - $updated = false; - /** @var Transaction $sourceTransaction */ - $sourceTransaction = $journal->transactions()->where('amount', '<', 0)->first(); - $sourceCurrency = $repository->find(intval($sourceTransaction->account->getMeta('currency_id'))); - - if ($sourceCurrency->id !== $journal->transaction_currency_id) { - $updated = true; - $journal->transaction_currency_id = $sourceCurrency->id; - $journal->save(); - } - - // destination - $destinationTransaction = $journal->transactions()->where('amount', '>', 0)->first(); - $destinationCurrency = $repository->find(intval($destinationTransaction->account->getMeta('currency_id'))); - - if ($destinationCurrency->id !== $journal->transaction_currency_id) { - $updated = true; - $journal->deleteMeta('foreign_amount'); - $journal->deleteMeta('foreign_currency_id'); - $journal->setMeta('foreign_amount', $destinationTransaction->amount); - $journal->setMeta('foreign_currency_id', $destinationCurrency->id); - } - if ($updated) { - $line = sprintf($transfer, $journal->id); - $this->line($line); - } - } - } - - /** + * This method makes sure that the tranaction uses the same currency as the source account does. + * If not, the currency is updated to include a reference to its original currency as the "foreign" currency. * + * The transaction that is sent to this function MUST be the source transaction (amount negative). + * + * @param Transaction $transaction */ - private function verifyCurrencyInfo() + private function updateTransactionCurrency(Transaction $transaction): void { - $count = 0; - $transactions = Transaction::get(); - /** @var Transaction $transaction */ - foreach ($transactions as $transaction) { - $currencyId = intval($transaction->transaction_currency_id); - $foreignId = intval($transaction->foreign_currency_id); - if ($currencyId === $foreignId) { - $transaction->foreign_currency_id = null; - $transaction->foreign_amount = null; - $transaction->save(); - $count++; - } + /** @var CurrencyRepositoryInterface $repository */ + $repository = app(CurrencyRepositoryInterface::class); + $currency = $repository->find(intval($transaction->account->getMeta('currency_id'))); + + // has no currency ID? Must have, so fill in using account preference: + if (is_null($transaction->transaction_currency_id)) { + $transaction->transaction_currency_id = $currency->id; + Log::debug(sprintf('Transaction #%d has no currency setting, now set to %s', $transaction->id, $currency->code)); + $transaction->save(); } - $this->line(sprintf('Updated currency information for %d transactions', $count)); + + // does not match the source account (see above)? Can be fixed + // when mismatch in transaction and NO foreign amount is set: + if ($transaction->transaction_currency_id !== $currency->id && is_null($transaction->foreign_amount)) { + Log::debug( + sprintf( + 'Transaction #%d has a currency setting (#%d) that should be #%d. Amount remains %s, currency is changed.', $transaction->id, + $transaction->transaction_currency_id, $currency->id, $transaction->amount + ) + ); + $transaction->transaction_currency_id = $currency->id; + $transaction->save(); + } + + // grab opposing transaction: + /** @var TransactionJournal $journal */ + $journal = $transaction->transactionJournal; + /** @var Transaction $opposing */ + $opposing = $journal->transactions()->where('amount', '>', 0)->where('identifier', $transaction->identifier)->first(); + $opposingCurrency = $repository->find(intval($opposing->account->getMeta('currency_id'))); + + if (is_null($opposingCurrency->id)) { + Log::error(sprintf('Account #%d ("%s") must have currency preference but has none.', $opposing->account->id, $opposing->account->name)); + + return; + } + + // if the destination account currency is the same, both foreign_amount and foreign_currency_id must be NULL for both transactions: + if ($opposingCurrency->id === $currency->id) { + // update both transactions to match: + $transaction->foreign_amount = null; + $transaction->foreign_currency_id = null; + $opposing->foreign_amount = null; + $opposing->foreign_currency_id = null; + $opposing->transaction_currency_id = $currency->id; + $transaction->save(); + $opposing->save(); + Log::debug(sprintf('Cleaned up transaction #%d and #%d', $transaction->id, $opposing->id)); + + return; + } + // if destination account currency is different, both transactions must have this currency as foreign currency id. + if ($opposingCurrency->id !== $currency->id) { + $transaction->foreign_currency_id = $opposingCurrency->id; + $opposing->foreign_currency_id = $opposingCurrency->id; + $transaction->save(); + $opposing->save(); + Log::debug(sprintf('Verified foreign currency ID of transaction #%d and #%d', $transaction->id, $opposing->id)); + } + + // if foreign amount of one is null and the other is not, use this to restore: + if (is_null($transaction->foreign_amount) && !is_null($opposing->foreign_amount)) { + $transaction->foreign_amount = bcmul(strval($opposing->foreign_amount), '-1'); + $transaction->save(); + Log::debug(sprintf('Restored foreign amount of transaction (1) #%d to %s', $transaction->id, $transaction->foreign_amount)); + } + + // if foreign amount of one is null and the other is not, use this to restore (other way around) + if (is_null($opposing->foreign_amount) && !is_null($transaction->foreign_amount)) { + $opposing->foreign_amount = bcmul(strval($transaction->foreign_amount), '-1'); + $opposing->save(); + Log::debug(sprintf('Restored foreign amount of transaction (2) #%d to %s', $opposing->id, $opposing->foreign_amount)); + } + + // when both are zero, try to grab it from journal: + if (is_null($opposing->foreign_amount) && is_null($transaction->foreign_amount)) { + + $foreignAmount = $journal->getMeta('foreign_amount'); + if (is_null($foreignAmount)) { + Log::debug(sprintf('Journal #%d has missing foreign currency data, forced to do 1:1 conversion :(.', $transaction->transaction_journal_id)); + $transaction->foreign_amount = bcmul(strval($transaction->amount), '-1'); + $opposing->foreign_amount = bcmul(strval($opposing->amount), '-1'); + $transaction->save(); + $opposing->save(); + + return; + } + $foreignPositive = app('steam')->positive(strval($foreignAmount)); + Log::debug( + sprintf( + 'Journal #%d has missing foreign currency info, try to restore from meta-data ("%s").', $transaction->transaction_journal_id, $foreignAmount + ) + ); + $transaction->foreign_amount = bcmul($foreignPositive, '-1'); + $opposing->foreign_amount = $foreignPositive; + $transaction->save(); + $opposing->save(); + } + + + return; } } diff --git a/app/Console/Commands/UpgradeFireflyInstructions.php b/app/Console/Commands/UpgradeFireflyInstructions.php index 363e5089f7..bed25e3e0e 100644 --- a/app/Console/Commands/UpgradeFireflyInstructions.php +++ b/app/Console/Commands/UpgradeFireflyInstructions.php @@ -84,6 +84,9 @@ class UpgradeFireflyInstructions extends Command } } + /** + * Render instructions. + */ private function installInstructions() { /** @var string $version */ @@ -102,7 +105,7 @@ class UpgradeFireflyInstructions extends Command $this->boxed(''); if (is_null($text)) { - $this->boxed(sprintf('Thank you for installin Firefly III, v%s!', $version)); + $this->boxed(sprintf('Thank you for installing Firefly III, v%s!', $version)); $this->boxedInfo('There are no extra installation instructions.'); $this->boxed('Firefly III should be ready for use.'); $this->boxed(''); @@ -131,6 +134,9 @@ class UpgradeFireflyInstructions extends Command } + /** + * Render upgrade instructions. + */ private function updateInstructions() { /** @var string $version */ diff --git a/app/Console/Commands/UseEncryption.php b/app/Console/Commands/UseEncryption.php index 89e6bf012d..ef0e68ac4a 100644 --- a/app/Console/Commands/UseEncryption.php +++ b/app/Console/Commands/UseEncryption.php @@ -1,4 +1,14 @@ handleObjects('Account', 'name', 'encrypted'); $this->handleObjects('Bill', 'name', 'name_encrypted'); $this->handleObjects('Bill', 'match', 'match_encrypted'); @@ -57,6 +68,8 @@ class UseEncryption extends Command } /** + * Run each object and encrypt them (or not). + * * @param string $class * @param string $field * @param string $indicator diff --git a/app/Console/Commands/VerifyDatabase.php b/app/Console/Commands/VerifyDatabase.php index 6e128e7f53..4f1ab1938f 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\PiggyBankEvent; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; @@ -94,6 +95,40 @@ class VerifyDatabase extends Command // report on journals with the wrong types of accounts. $this->reportIncorrectJournals(); + // report (and fix) piggy banks + $this->repairPiggyBanks(); + + } + + /** + * Make sure there are only transfers linked to piggy bank events. + */ + private function repairPiggyBanks(): void + { + $set = PiggyBankEvent::with(['PiggyBank', 'TransactionJournal', 'TransactionJournal.TransactionType'])->get(); + $set->each( + function (PiggyBankEvent $event) { + if (is_null($event->transaction_journal_id)) { + return true; + } + /** @var TransactionJournal $journal */ + $journal = $event->transactionJournal()->first(); + if (is_null($journal)) { + return true; + } + + $type = $journal->transactionType->type; + if ($type !== TransactionType::TRANSFER) { + $event->transaction_journal_id = null; + $event->save(); + $this->line(sprintf('Piggy bank #%d was referenced by an invalid event. This has been fixed.', $event->piggy_bank_id)); + } + + return true; + } + ); + + return; } /** @@ -169,6 +204,9 @@ class VerifyDatabase extends Command } } + /** + * Report on journals with bad account types linked to them. + */ private function reportIncorrectJournals() { $configuration = [ @@ -235,7 +273,7 @@ class VerifyDatabase extends Command } /** - * + * Report on journals without transactions. */ private function reportNoTransactions() { @@ -253,6 +291,8 @@ class VerifyDatabase extends Command } /** + * Report on things with no linked journals. + * * @param string $name */ private function reportObject(string $name) @@ -324,7 +364,7 @@ class VerifyDatabase extends Command } /** - * + * Report on transfers that have budgets. */ private function reportTransfersBudgets() { diff --git a/app/Export/Collector/UploadCollector.php b/app/Export/Collector/UploadCollector.php index 17f863e721..a27de79610 100644 --- a/app/Export/Collector/UploadCollector.php +++ b/app/Export/Collector/UploadCollector.php @@ -15,6 +15,7 @@ namespace FireflyIII\Export\Collector; use Crypt; use Illuminate\Contracts\Encryption\DecryptException; +use Illuminate\Contracts\Filesystem\FileNotFoundException; use Log; use Storage; @@ -50,14 +51,6 @@ class UploadCollector extends BasicCollector implements CollectorInterface public function run(): bool { Log::debug('Going to collect attachments', ['key' => $this->job->key]); - - // file names associated with the old import routine. - $this->vintageFormat = sprintf('csv-upload-%d-', $this->job->user->id); - - // collect old upload files (names beginning with "csv-upload". - $this->collectVintageUploads(); - - // then collect current upload files: $this->collectModernUploads(); return true; @@ -70,7 +63,8 @@ class UploadCollector extends BasicCollector implements CollectorInterface */ private function collectModernUploads(): bool { - $set = $this->job->user->importJobs()->where('status', 'import_complete')->get(['import_jobs.*']); + $set = $this->job->user->importJobs()->whereIn('status', ['import_complete', 'finished'])->get(['import_jobs.*']); + Log::debug(sprintf('Found %d import jobs', $set->count())); $keys = []; if ($set->count() > 0) { $keys = $set->pluck('key')->toArray(); @@ -83,59 +77,6 @@ class UploadCollector extends BasicCollector implements CollectorInterface return true; } - /** - * This method collects all the uploads that are uploaded using the "old" importer. So from before the summer of 2016. - * - * @return bool - */ - private function collectVintageUploads(): bool - { - // grab upload directory. - $files = $this->uploadDisk->files(); - - foreach ($files as $entry) { - $this->processVintageUpload($entry); - } - - return true; - } - - /** - * This method tells you when the vintage upload file was actually uploaded. - * - * @param string $entry - * - * @return string - */ - private function getVintageUploadDate(string $entry): string - { - // this is an original upload. - $parts = explode('-', str_replace(['.csv.encrypted', $this->vintageFormat], '', $entry)); - $originalUpload = intval($parts[1]); - $date = date('Y-m-d \a\t H-i-s', $originalUpload); - - return $date; - } - - /** - * Tells you if a file name is a vintage upload. - * - * @param string $entry - * - * @return bool - */ - private function isVintageImport(string $entry): bool - { - $len = strlen($this->vintageFormat); - // file is part of the old import routine: - if (substr($entry, 0, $len) === $this->vintageFormat) { - - return true; - } - - return false; - } - /** * @param string $key * @@ -153,7 +94,7 @@ class UploadCollector extends BasicCollector implements CollectorInterface $content = ''; try { $content = Crypt::decrypt($this->uploadDisk->get(sprintf('%s.upload', $key))); - } catch (DecryptException $e) { + } catch (FileNotFoundException | DecryptException $e) { Log::error(sprintf('Could not decrypt old import file "%s". Skipped because: %s', $key, $e->getMessage())); } @@ -168,47 +109,4 @@ class UploadCollector extends BasicCollector implements CollectorInterface return true; } - /** - * If the file is a vintage upload, process it. - * - * @param string $entry - * - * @return bool - */ - private function processVintageUpload(string $entry): bool - { - if ($this->isVintageImport($entry)) { - $this->saveVintageImportFile($entry); - - return true; - } - - return false; - } - - - /** - * This will store the content of the old vintage upload somewhere. - * - * @param string $entry - */ - private function saveVintageImportFile(string $entry) - { - $content = ''; - try { - $content = Crypt::decrypt($this->uploadDisk->get($entry)); - } catch (DecryptException $e) { - Log::error('Could not decrypt old CSV import file ' . $entry . '. Skipped because ' . $e->getMessage()); - } - - if (strlen($content) > 0) { - // add to export disk. - $date = $this->getVintageUploadDate($entry); - $file = $this->job->key . '-Old import dated ' . $date . '.csv'; - $this->exportDisk->put($file, $content); - $this->getEntries()->push($file); - } - } - - } diff --git a/app/Export/Entry/Entry.php b/app/Export/Entry/Entry.php index 81ef189d36..8aff206d47 100644 --- a/app/Export/Entry/Entry.php +++ b/app/Export/Entry/Entry.php @@ -13,6 +13,7 @@ declare(strict_types=1); namespace FireflyIII\Export\Entry; +use FireflyIII\Models\Transaction; use Steam; /** @@ -37,24 +38,43 @@ final class Entry { // @formatter:off public $journal_id; + public $transaction_id = 0; + public $date; public $description; public $currency_code; public $amount; + public $foreign_currency_code = ''; + public $foreign_amount = '0'; public $transaction_type; public $asset_account_id; public $asset_account_name; + public $asset_account_iban; + public $asset_account_bic; + public $asset_account_number; + public $asset_currency_code; public $opposing_account_id; public $opposing_account_name; + public $opposing_account_iban; + public $opposing_account_bic; + public $opposing_account_number; + public $opposing_currency_code; public $budget_id; public $budget_name; + public $category_id; public $category_name; + + public $bill_id; + public $bill_name; + + public $notes; + public $tags; // @formatter:on /** @@ -95,5 +115,75 @@ final class Entry return $entry; } + /** + * Converts a given transaction (as collected by the collector) into an export entry. + * + * @param Transaction $transaction + * + * @return Entry + */ + public static function fromTransaction(Transaction $transaction): Entry + { + $entry = new self; + $entry->journal_id = $transaction->journal_id; + $entry->transaction_id = $transaction->id; + $entry->date = $transaction->date->format('Ymd'); + $entry->description = $transaction->description; + if (strlen(strval($transaction->transaction_description)) > 0) { + $entry->description = $transaction->transaction_description . '(' . $transaction->description . ')'; + } + $entry->currency_code = $transaction->transactionCurrency->code; + $entry->amount = round($transaction->transaction_amount, $transaction->transactionCurrency->decimal_places); + + $entry->foreign_currency_code = is_null($transaction->foreign_currency_id) ? null : $transaction->foreignCurrency->code; + $entry->foreign_amount = is_null($transaction->foreign_currency_id) + ? null + : strval( + round( + $transaction->transaction_foreign_amount, $transaction->foreignCurrency->decimal_places + ) + ); + + $entry->transaction_type = $transaction->transaction_type_type; + $entry->asset_account_id = $transaction->account_id; + $entry->asset_account_name = app('steam')->tryDecrypt($transaction->account_name); + $entry->asset_account_iban = $transaction->account_iban; + $entry->asset_account_number = $transaction->account_number; + $entry->asset_account_bic = $transaction->account_bic; + $entry->asset_currency_code = $transaction->account_currency_code; + + $entry->opposing_account_id = $transaction->opposing_account_id; + $entry->opposing_account_name = app('steam')->tryDecrypt($transaction->opposing_account_name); + $entry->opposing_account_iban = $transaction->opposing_account_iban; + $entry->opposing_account_number = $transaction->opposing_account_number; + $entry->opposing_account_bic = $transaction->opposing_account_bic; + $entry->opposing_currency_code = $transaction->opposing_currency_code; + + /** budget */ + $entry->budget_id = $transaction->transaction_budget_id; + $entry->budget_name = app('steam')->tryDecrypt($transaction->transaction_budget_name); + if (is_null($transaction->transaction_budget_id)) { + $entry->budget_id = $transaction->transaction_journal_budget_id; + $entry->budget_name = app('steam')->tryDecrypt($transaction->transaction_journal_budget_name); + } + + /** category */ + $entry->category_id = $transaction->transaction_category_id; + $entry->category_name = app('steam')->tryDecrypt($transaction->transaction_category_name); + if (is_null($transaction->transaction_category_id)) { + $entry->category_id = $transaction->transaction_journal_category_id; + $entry->category_name = app('steam')->tryDecrypt($transaction->transaction_journal_category_name); + } + + /** budget */ + $entry->bill_id = $transaction->bill_id; + $entry->bill_name = app('steam')->tryDecrypt($transaction->bill_name); + + $entry->tags = $transaction->tags; + $entry->notes = $transaction->notes; + + return $entry; + } + } diff --git a/app/Export/ExpandedProcessor.php b/app/Export/ExpandedProcessor.php new file mode 100644 index 0000000000..8babc5b473 --- /dev/null +++ b/app/Export/ExpandedProcessor.php @@ -0,0 +1,339 @@ +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 + { + // use journal collector thing. + /** @var JournalCollectorInterface $collector */ + $collector = app(JournalCollectorInterface::class); + $collector->setAccounts($this->accounts)->setRange($this->settings['startDate'], $this->settings['endDate']) + ->withOpposingAccount()->withBudgetInformation()->withCategoryInformation() + ->removeFilter(InternalTransferFilter::class); + $transactions = $collector->getJournals(); + // get some more meta data for each entry: + $ids = $transactions->pluck('journal_id')->toArray(); + $assetIds = $transactions->pluck('account_id')->toArray(); + $opposingIds = $transactions->pluck('opposing_account_id')->toArray(); + $notes = $this->getNotes($ids); + $tags = $this->getTags($ids); + $ibans = $this->getIbans($assetIds) + $this->getIbans($opposingIds); + $currencies = $this->getAccountCurrencies($ibans); + $transactions->each( + function (Transaction $transaction) use ($notes, $tags, $ibans, $currencies) { + $journalId = intval($transaction->journal_id); + $accountId = intval($transaction->account_id); + $opposingId = intval($transaction->opposing_account_id); + $currencyId = $ibans[$accountId]['currency_id'] ?? 0; + $opposingCurrencyId = $ibans[$opposingId]['currency_id'] ?? 0; + $transaction->notes = $notes[$journalId] ?? ''; + $transaction->tags = join(',', $tags[$journalId] ?? []); + $transaction->account_number = $ibans[$accountId]['accountNumber'] ?? ''; + $transaction->account_bic = $ibans[$accountId]['BIC'] ?? ''; + $transaction->account_currency_code = $currencies[$currencyId] ?? ''; + $transaction->opposing_account_number = $ibans[$opposingId]['accountNumber'] ?? ''; + $transaction->opposing_account_bic = $ibans[$opposingId]['BIC'] ?? ''; + $transaction->opposing_currency_code = $currencies[$opposingCurrencyId] ?? ''; + + } + ); + + $this->journals = $transactions; + + 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 + { + $this->journals->each( + function (Transaction $transaction) { + $this->exportEntries->push(Entry::fromTransaction($transaction)); + } + ); + 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; + } + + /** + * Save export job settings to class. + * + * @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); + } + } + + /** + * @param array $array + * + * @return array + */ + private function getAccountCurrencies(array $array): array + { + /** @var CurrencyRepositoryInterface $repository */ + $repository = app(CurrencyRepositoryInterface::class); + $return = []; + $ids = []; + $repository->setUser($this->job->user); + foreach ($array as $value) { + $ids[] = $value['currency_id'] ?? 0; + } + $ids = array_unique($ids); + $result = $repository->getByIds($ids); + + foreach ($result as $currency) { + $return[$currency->id] = $currency->code; + } + + return $return; + } + + /** + * Get all IBAN / SWIFT / account numbers + * + * @param array $array + * + * @return array + */ + private function getIbans(array $array): array + { + $array = array_unique($array); + $return = []; + $set = AccountMeta::whereIn('account_id', $array) + ->leftJoin('accounts', 'accounts.id', 'account_meta.account_id') + ->where('accounts.user_id', $this->job->user_id) + ->whereIn('account_meta.name', ['accountNumber', 'BIC', 'currency_id']) + ->get(['account_meta.id', 'account_meta.account_id', 'account_meta.name', 'account_meta.data']); + /** @var AccountMeta $meta */ + foreach ($set as $meta) { + $id = intval($meta->account_id); + $return[$id][$meta->name] = $meta->data; + } + + return $return; + } + + /** + * Returns, if present, for the given journal ID's the notes. + * + * @param array $array + * + * @return array + */ + private function getNotes(array $array): array + { + $array = array_unique($array); + $set = TransactionJournalMeta::whereIn('journal_meta.transaction_journal_id', $array) + ->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'journal_meta.transaction_journal_id') + ->where('transaction_journals.user_id', $this->job->user_id) + ->where('journal_meta.name', 'notes')->get( + ['journal_meta.transaction_journal_id', 'journal_meta.data', 'journal_meta.id'] + ); + $return = []; + /** @var TransactionJournalMeta $meta */ + foreach ($set as $meta) { + $id = intval($meta->transaction_journal_id); + $return[$id] = $meta->data; + } + + return $return; + } + + /** + * Returns a comma joined list of all the users tags linked to these journals. + * + * @param array $array + * + * @return array + */ + private function getTags(array $array): array + { + $set = DB::table('tag_transaction_journal') + ->whereIn('tag_transaction_journal.transaction_journal_id', $array) + ->leftJoin('tags', 'tag_transaction_journal.tag_id', '=', 'tags.id') + ->leftJoin('transaction_journals', 'transaction_journals.id', '=', 'tag_transaction_journal.transaction_journal_id') + ->where('transaction_journals.user_id', $this->job->user_id) + ->get(['tag_transaction_journal.transaction_journal_id', 'tags.tag']); + $result = []; + foreach ($set as $entry) { + $id = intval($entry->transaction_journal_id); + $result[$id] = isset($result[$id]) ? $result[$id] : []; + $result[$id][] = Crypt::decrypt($entry->tag); + } + + return $result; + } +} diff --git a/app/Export/Exporter/CsvExporter.php b/app/Export/Exporter/CsvExporter.php index 34a56182e0..dea7519fa7 100644 --- a/app/Export/Exporter/CsvExporter.php +++ b/app/Export/Exporter/CsvExporter.php @@ -58,8 +58,12 @@ class CsvExporter extends BasicExporter implements ExporterInterface // get field names for header row: $first = $this->getEntries()->first(); - $headers = array_keys(get_object_vars($first)); - $rows[] = $headers; + $headers = []; + if (!is_null($first)) { + $headers = array_keys(get_object_vars($first)); + } + + $rows[] = $headers; /** @var Entry $entry */ foreach ($this->getEntries() as $entry) { diff --git a/app/Helpers/Collector/JournalCollector.php b/app/Helpers/Collector/JournalCollector.php index c31295c235..939831be30 100644 --- a/app/Helpers/Collector/JournalCollector.php +++ b/app/Helpers/Collector/JournalCollector.php @@ -15,7 +15,6 @@ namespace FireflyIII\Helpers\Collector; use Carbon\Carbon; -use Crypt; use DB; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Helpers\Filter\FilterInterface; @@ -31,7 +30,6 @@ use FireflyIII\Models\Tag; use FireflyIII\Models\Transaction; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\User; -use Illuminate\Contracts\Encryption\DecryptException; use Illuminate\Database\Eloquent\Builder as EloquentBuilder; use Illuminate\Database\Query\JoinClause; use Illuminate\Pagination\LengthAwarePaginator; @@ -86,7 +84,9 @@ class JournalCollector implements JournalCollectorInterface 'accounts.name as account_name', 'accounts.encrypted as account_encrypted', + 'accounts.iban as account_iban', 'account_types.type as account_type', + ]; /** @var bool */ private $filterTransfers = false; @@ -175,12 +175,10 @@ class JournalCollector implements JournalCollectorInterface if (!is_null($transaction->bill_name)) { $transaction->bill_name = Steam::decrypt(intval($transaction->bill_name_encrypted), $transaction->bill_name); } + $transaction->opposing_account_name = app('steam')->tryDecrypt($transaction->opposing_account_name); + $transaction->account_iban = app('steam')->tryDecrypt($transaction->account_iban); + $transaction->opposing_account_iban = app('steam')->tryDecrypt($transaction->opposing_account_iban); - try { - $transaction->opposing_account_name = Crypt::decrypt($transaction->opposing_account_name); - } catch (DecryptException $e) { - // if this fails its already decrypted. - } } ); @@ -621,6 +619,8 @@ class JournalCollector implements JournalCollectorInterface $this->query->leftJoin('budgets as transaction_journal_budgets', 'transaction_journal_budgets.id', '=', 'budget_transaction_journal.budget_id'); $this->query->leftJoin('budget_transaction', 'budget_transaction.transaction_id', '=', 'transactions.id'); $this->query->leftJoin('budgets as transaction_budgets', 'transaction_budgets.id', '=', 'budget_transaction.budget_id'); + $this->query->whereNull('transaction_journal_budgets.deleted_at'); + $this->query->whereNull('transaction_budgets.deleted_at'); $this->fields[] = 'budget_transaction_journal.budget_id as transaction_journal_budget_id'; $this->fields[] = 'transaction_journal_budgets.encrypted as transaction_journal_budget_encrypted'; @@ -677,10 +677,12 @@ class JournalCollector implements JournalCollectorInterface $this->query->leftJoin('account_types as opposing_account_types', 'opposing_accounts.account_type_id', '=', 'opposing_account_types.id'); $this->query->whereNull('opposing.deleted_at'); - $this->fields[] = 'opposing.id as opposing_id'; - $this->fields[] = 'opposing.account_id as opposing_account_id'; - $this->fields[] = 'opposing_accounts.name as opposing_account_name'; - $this->fields[] = 'opposing_accounts.encrypted as opposing_account_encrypted'; + $this->fields[] = 'opposing.id as opposing_id'; + $this->fields[] = 'opposing.account_id as opposing_account_id'; + $this->fields[] = 'opposing_accounts.name as opposing_account_name'; + $this->fields[] = 'opposing_accounts.encrypted as opposing_account_encrypted'; + $this->fields[] = 'opposing_accounts.iban as opposing_account_iban'; + $this->fields[] = 'opposing_account_types.type as opposing_account_type'; $this->joinedOpposing = true; Log::debug('joinedOpposing is now true!'); diff --git a/app/Helpers/Report/BalanceReportHelper.php b/app/Helpers/Report/BalanceReportHelper.php index dadef8fe41..fdd7563ef5 100644 --- a/app/Helpers/Report/BalanceReportHelper.php +++ b/app/Helpers/Report/BalanceReportHelper.php @@ -14,16 +14,12 @@ declare(strict_types=1); namespace FireflyIII\Helpers\Report; use Carbon\Carbon; -use DB; use FireflyIII\Helpers\Collection\Balance; use FireflyIII\Helpers\Collection\BalanceEntry; use FireflyIII\Helpers\Collection\BalanceHeader; use FireflyIII\Helpers\Collection\BalanceLine; use FireflyIII\Models\BudgetLimit; -use FireflyIII\Models\Tag; -use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; -use Illuminate\Database\Query\JoinClause; use Illuminate\Support\Collection; use Log; @@ -74,14 +70,9 @@ class BalanceReportHelper implements BalanceReportHelperInterface $line = $this->createBalanceLine($budgetLimit, $accounts); $balance->addBalanceLine($line); } - Log::debug('Create rest of the things.'); - $noBudgetLine = $this->createNoBudgetLine($accounts, $start, $end); - $coveredByTagLine = $this->createTagsBalanceLine($accounts, $start, $end); - $leftUnbalancedLine = $this->createLeftUnbalancedLine($noBudgetLine, $coveredByTagLine); + $noBudgetLine = $this->createNoBudgetLine($accounts, $start, $end); $balance->addBalanceLine($noBudgetLine); - $balance->addBalanceLine($coveredByTagLine); - $balance->addBalanceLine($leftUnbalancedLine); $balance->setBalanceHeader($header); Log::debug('Clear unused budgets.'); @@ -93,54 +84,6 @@ class BalanceReportHelper implements BalanceReportHelperInterface return $balance; } - /** - * This method collects all transfers that are part of a "balancing act" tag - * and groups the amounts of those transfers by their destination account. - * - * This is used to indicate which expenses, usually outside of budgets, have been - * corrected by transfers from a savings account. - * - * @param Collection $accounts - * @param Carbon $start - * @param Carbon $end - * - * @return Collection - */ - private function allCoveredByBalancingActs(Collection $accounts, Carbon $start, Carbon $end): Collection - { - $ids = $accounts->pluck('id')->toArray(); - $set = auth()->user()->tags() - ->leftJoin('tag_transaction_journal', 'tag_transaction_journal.tag_id', '=', 'tags.id') - ->leftJoin('transaction_journals', 'tag_transaction_journal.transaction_journal_id', '=', 'transaction_journals.id') - ->leftJoin('transaction_types', 'transaction_journals.transaction_type_id', '=', 'transaction_types.id') - ->leftJoin( - 'transactions AS t_source', function (JoinClause $join) { - $join->on('transaction_journals.id', '=', 't_source.transaction_journal_id')->where('t_source.amount', '<', 0); - } - ) - ->leftJoin( - 'transactions AS t_destination', function (JoinClause $join) { - $join->on('transaction_journals.id', '=', 't_destination.transaction_journal_id')->where('t_destination.amount', '>', 0); - } - ) - ->where('tags.tagMode', 'balancingAct') - ->where('transaction_types.type', TransactionType::TRANSFER) - ->where('transaction_journals.date', '>=', $start->format('Y-m-d')) - ->where('transaction_journals.date', '<=', $end->format('Y-m-d')) - ->whereNull('transaction_journals.deleted_at') - ->whereIn('t_source.account_id', $ids) - ->whereIn('t_destination.account_id', $ids) - ->groupBy('t_destination.account_id') - ->get( - [ - 't_destination.account_id', - DB::raw('SUM(t_destination.amount) AS sum'), - ] - ); - - return $set; - } - /** * @param BudgetLimit $budgetLimit @@ -168,40 +111,6 @@ class BalanceReportHelper implements BalanceReportHelperInterface return $line; } - /** - * @param BalanceLine $noBudgetLine - * @param BalanceLine $coveredByTagLine - * - * @return BalanceLine - */ - private function createLeftUnbalancedLine(BalanceLine $noBudgetLine, BalanceLine $coveredByTagLine): BalanceLine - { - $line = new BalanceLine; - $line->setRole(BalanceLine::ROLE_DIFFROLE); - $noBudgetEntries = $noBudgetLine->getBalanceEntries(); - $tagEntries = $coveredByTagLine->getBalanceEntries(); - - foreach ($noBudgetEntries as $entry) { - $account = $entry->getAccount(); - $tagEntry = $tagEntries->filter( - function (BalanceEntry $current) use ($account) { - return $current->getAccount()->id === $account->id; - } - ); - if ($tagEntry->first()) { - // found corresponding entry. As we should: - $newEntry = new BalanceEntry; - $newEntry->setAccount($account); - $spent = bcadd($tagEntry->first()->getLeft(), $entry->getSpent()); - $newEntry->setSpent($spent); - $line->addBalanceEntry($newEntry); - } - } - - return $line; - - - } /** * @param Collection $accounts @@ -227,41 +136,6 @@ class BalanceReportHelper implements BalanceReportHelperInterface return $empty; } - /** - * @param Collection $accounts - * @param Carbon $start - * @param Carbon $end - * - * @return BalanceLine - */ - private function createTagsBalanceLine(Collection $accounts, Carbon $start, Carbon $end): BalanceLine - { - $tags = new BalanceLine; - $tagsLeft = $this->allCoveredByBalancingActs($accounts, $start, $end); - - $tags->setRole(BalanceLine::ROLE_TAGROLE); - - foreach ($accounts as $account) { - $leftEntry = $tagsLeft->filter( - function (Tag $tag) use ($account) { - return $tag->account_id === $account->id; - } - ); - $left = '0'; - if (!is_null($leftEntry->first())) { - $left = $leftEntry->first()->sum; - } - - // balanced by tags - $tagEntry = new BalanceEntry; - $tagEntry->setAccount($account); - $tagEntry->setLeft($left); - $tags->addBalanceEntry($tagEntry); - - } - - return $tags; - } /** * @param Balance $balance diff --git a/app/Http/Controllers/AccountController.php b/app/Http/Controllers/AccountController.php index b1f35acc20..995a3c9e5d 100644 --- a/app/Http/Controllers/AccountController.php +++ b/app/Http/Controllers/AccountController.php @@ -194,7 +194,7 @@ class AccountController extends Controller return view( 'accounts.edit', compact( - 'allCurrencies', 'currencySelectList', 'account', 'currency', 'subTitle', 'subTitleIcon', 'what', 'roles' + 'allCurrencies', 'currencySelectList', 'account', 'currency', 'subTitle', 'subTitleIcon', 'what', 'roles', 'preFilled' ) ); } diff --git a/app/Http/Controllers/Admin/LinkController.php b/app/Http/Controllers/Admin/LinkController.php new file mode 100644 index 0000000000..93efc19d03 --- /dev/null +++ b/app/Http/Controllers/Admin/LinkController.php @@ -0,0 +1,229 @@ +middleware( + function ($request, $next) { + View::share('title', strval(trans('firefly.administration'))); + View::share('mainTitleIcon', 'fa-hand-spock-o'); + + return $next($request); + } + ); + } + + /** + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + */ + public function create() + { + $subTitle = trans('firefly.create_new_link_type'); + $subTitleIcon = 'fa-link'; + + // put previous url in session if not redirect from store (not "create another"). + if (session('link_types.create.fromStore') !== true) { + $this->rememberPreviousUri('link_types.create.uri'); + } + + return view('admin.link.create', compact('subTitle', 'subTitleIcon')); + } + + /** + * @param Request $request + * @param LinkTypeRepositoryInterface $repository + * @param LinkType $linkType + * + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|View + */ + public function delete(Request $request, LinkTypeRepositoryInterface $repository, LinkType $linkType) + { + if (!$linkType->editable) { + $request->session()->flash('error', strval(trans('firefly.cannot_edit_link_type', ['name' => $linkType->name]))); + + return redirect(route('admin.links.index')); + } + + $subTitle = trans('firefly.delete_link_type', ['name' => $linkType->name]); + $otherTypes = $repository->get(); + $count = $repository->countJournals($linkType); + $moveTo = []; + $moveTo[0] = trans('firefly.do_not_save_connection'); + /** @var LinkType $otherType */ + foreach ($otherTypes as $otherType) { + if ($otherType->id !== $linkType->id) { + $moveTo[$otherType->id] = sprintf('%s (%s / %s)', $otherType->name, $otherType->inward, $otherType->outward); + } + } + // put previous url in session + $this->rememberPreviousUri('link_types.delete.uri'); + + return view('admin.link.delete', compact('linkType', 'subTitle', 'moveTo', 'count')); + } + + /** + * @param Request $request + * @param LinkTypeRepositoryInterface $repository + * @param LinkType $linkType + * + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + */ + public function destroy(Request $request, LinkTypeRepositoryInterface $repository, LinkType $linkType) + { + $name = $linkType->name; + $moveTo = $repository->find(intval($request->get('move_link_type_before_delete'))); + $repository->destroy($linkType, $moveTo); + + $request->session()->flash('success', strval(trans('firefly.deleted_link_type', ['name' => $name]))); + Preferences::mark(); + + return redirect($this->getPreviousUri('link_types.delete.uri')); + } + + /** + * @param Request $request + * @param LinkType $linkType + * + * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View + */ + public function edit(Request $request, LinkType $linkType) + { + if (!$linkType->editable) { + $request->session()->flash('error', strval(trans('firefly.cannot_edit_link_type', ['name' => $linkType->name]))); + + return redirect(route('admin.links.index')); + } + $subTitle = trans('firefly.edit_link_type', ['name' => $linkType->name]); + $subTitleIcon = 'fa-link'; + + // put previous url in session if not redirect from store (not "return_to_edit"). + if (session('link_types.edit.fromUpdate') !== true) { + $this->rememberPreviousUri('link_types.edit.uri'); + } + $request->session()->forget('link_types.edit.fromUpdate'); + + return view('admin.link.edit', compact('subTitle', 'subTitleIcon', 'linkType')); + } + + /** + * @param LinkTypeRepositoryInterface $repository + * + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + */ + public function index(LinkTypeRepositoryInterface $repository) + { + $subTitle = trans('firefly.journal_link_configuration'); + $subTitleIcon = 'fa-link'; + $linkTypes = $repository->get(); + $linkTypes->each( + function (LinkType $linkType) use ($repository) { + $linkType->journalCount = $repository->countJournals($linkType); + } + ); + + return view('admin.link.index', compact('subTitle', 'subTitleIcon', 'linkTypes')); + } + + /** + * @param LinkType $linkType + * + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + */ + public function show(LinkType $linkType) + { + $subTitle = trans('firefly.overview_for_link', ['name' => $linkType->name]); + $subTitleIcon = 'fa-link'; + $links = $linkType->transactionJournalLinks()->get(); + + return view('admin.link.show', compact('subTitle', 'subTitleIcon', 'linkType', 'links')); + } + + /** + * @param LinkTypeFormRequest $request + * @param LinkTypeRepositoryInterface $repository + * + * @return $this|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + */ + public function store(LinkTypeFormRequest $request, LinkTypeRepositoryInterface $repository) + { + $data = [ + 'name' => $request->string('name'), + 'inward' => $request->string('inward'), + 'outward' => $request->string('outward'), + ]; + $linkType = $repository->store($data); + $request->session()->flash('success', strval(trans('firefly.stored_new_link_type', ['name' => $linkType->name]))); + + if (intval($request->get('create_another')) === 1) { + // set value so create routine will not overwrite URL: + $request->session()->put('link_types.create.fromStore', true); + + return redirect(route('link_types.create', [$request->input('what')]))->withInput(); + } + + // redirect to previous URL. + return redirect($this->getPreviousUri('link_types.create.uri')); + } + + public function update(LinkTypeFormRequest $request, LinkTypeRepositoryInterface $repository, LinkType $linkType) + { + if (!$linkType->editable) { + $request->session()->flash('error', strval(trans('firefly.cannot_edit_link_type', ['name' => $linkType->name]))); + + return redirect(route('admin.links.index')); + } + + $data = [ + 'name' => $request->string('name'), + 'inward' => $request->string('inward'), + 'outward' => $request->string('outward'), + ]; + $repository->update($linkType, $data); + + $request->session()->flash('success', strval(trans('firefly.updated_link_type', ['name' => $linkType->name]))); + Preferences::mark(); + + if (intval($request->get('return_to_edit')) === 1) { + // set value so edit routine will not overwrite URL: + $request->session()->put('link_types.edit.fromUpdate', true); + + return redirect(route('admin.links.edit', [$linkType->id]))->withInput(['return_to_edit' => 1]); + } + + // redirect to previous URL. + return redirect($this->getPreviousUri('link_types.edit.uri')); + } + +} diff --git a/app/Http/Controllers/BillController.php b/app/Http/Controllers/BillController.php index 38139d5102..c5ac25fcd3 100644 --- a/app/Http/Controllers/BillController.php +++ b/app/Http/Controllers/BillController.php @@ -13,6 +13,7 @@ declare(strict_types=1); namespace FireflyIII\Http\Controllers; +use Amount; use Carbon\Carbon; use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Http\Requests\BillFormRequest; @@ -129,6 +130,11 @@ class BillController extends Controller if (session('bills.edit.fromUpdate') !== true) { $this->rememberPreviousUri('bills.edit.uri'); } + + $currency = Amount::getDefaultCurrency(); + $bill->amount_min = round($bill->amount_min, $currency->decimal_places); + $bill->amount_max = round($bill->amount_max, $currency->decimal_places); + $request->session()->forget('bills.edit.fromUpdate'); $request->session()->flash('gaEventCategory', 'bills'); $request->session()->flash('gaEventAction', 'edit'); diff --git a/app/Http/Controllers/BudgetController.php b/app/Http/Controllers/BudgetController.php index 3e051b8b83..8b89aaf4be 100644 --- a/app/Http/Controllers/BudgetController.php +++ b/app/Http/Controllers/BudgetController.php @@ -75,11 +75,9 @@ class BudgetController extends Controller */ public function amount(Request $request, Budget $budget) { - $amount = intval($request->get('amount')); - /** @var Carbon $start */ - $start = session('start', Carbon::now()->startOfMonth()); - /** @var Carbon $end */ - $end = session('end', Carbon::now()->endOfMonth()); + $amount = intval($request->get('amount')); + $start = Carbon::createFromFormat('Y-m-d', $request->get('start')); + $end = Carbon::createFromFormat('Y-m-d', $request->get('end')); $budgetLimit = $this->repository->updateLimitAmount($budget, $start, $end, $amount); if ($amount === 0) { $budgetLimit = null; @@ -243,7 +241,7 @@ class BudgetController extends Controller compact( 'available', 'currentMonth', 'next', 'nextText', 'prev', 'prevText', 'periodStart', 'periodEnd', 'budgetInformation', 'inactive', 'budgets', - 'spent', 'budgeted', 'previousLoop', 'nextLoop', 'start' + 'spent', 'budgeted', 'previousLoop', 'nextLoop', 'start', 'end' ) ); } @@ -313,15 +311,15 @@ class BudgetController extends Controller */ public function postUpdateIncome(BudgetIncomeRequest $request) { - $start = session('start', new Carbon); - $end = session('end', new Carbon); + $start = Carbon::createFromFormat('Y-m-d', $request->string('start')); + $end = Carbon::createFromFormat('Y-m-d', $request->string('end')); $defaultCurrency = Amount::getDefaultCurrency(); $amount = $request->get('amount'); $this->repository->setAvailableBudget($defaultCurrency, $start, $end, $amount); Preferences::mark(); - return redirect(route('budgets.index')); + return redirect(route('budgets.index', [$start->format('Y-m-d')])); } /** @@ -443,15 +441,16 @@ class BudgetController extends Controller } /** - * @return View + * @param Carbon $start + * @param Carbon $end + * + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ - public function updateIncome() + public function updateIncome(Carbon $start, Carbon $end) { - $start = session('start', new Carbon); - $end = session('end', new Carbon); $defaultCurrency = Amount::getDefaultCurrency(); $available = $this->repository->getAvailableBudget($defaultCurrency, $start, $end); - + $available = round($available, $defaultCurrency->decimal_places); return view('budgets.income', compact('available', 'start', 'end')); } diff --git a/app/Http/Controllers/ExportController.php b/app/Http/Controllers/ExportController.php index 6bb4cd3f44..5cdd3bed06 100644 --- a/app/Http/Controllers/ExportController.php +++ b/app/Http/Controllers/ExportController.php @@ -137,13 +137,14 @@ class ExportController extends Controller public function postIndex(ExportFormRequest $request, AccountRepositoryInterface $repository, ExportJobRepositoryInterface $jobs) { $job = $jobs->findByKey($request->get('job')); + $accounts = $request->get('accounts') ?? []; $settings = [ - 'accounts' => $repository->getAccountsById($request->get('accounts')), + 'accounts' => $repository->getAccountsById($accounts), 'startDate' => new Carbon($request->get('export_start_range')), 'endDate' => new Carbon($request->get('export_end_range')), 'exportFormat' => $request->get('exportFormat'), - 'includeAttachments' => intval($request->get('include_attachments')) === 1, - 'includeOldUploads' => intval($request->get('include_old_uploads')) === 1, + 'includeAttachments' => $request->boolean('include_attachments'), + 'includeOldUploads' => $request->boolean('include_old_uploads'), 'job' => $job, ]; @@ -159,12 +160,14 @@ class ExportController extends Controller $jobs->changeStatus($job, 'export_status_collecting_journals'); $processor->collectJournals(); $jobs->changeStatus($job, 'export_status_collected_journals'); + /* * Transform to exportable entries: */ $jobs->changeStatus($job, 'export_status_converting_to_export_format'); $processor->convertJournals(); $jobs->changeStatus($job, 'export_status_converted_to_export_format'); + /* * Transform to (temporary) file: */ @@ -180,6 +183,7 @@ class ExportController extends Controller $jobs->changeStatus($job, 'export_status_collected_attachments'); } + /* * Collect old uploads */ diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 21a6e23de9..e29bb0d6f5 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -82,6 +82,14 @@ class HomeController extends Controller */ public function displayError() { + Log::debug('This is a test message at the DEBUG level.'); + Log::info('This is a test message at the INFO level.'); + Log::notice('This is a test message at the NOTICE level.'); + Log::warning('This is a test message at the WARNING level.'); + Log::error('This is a test message at the ERROR level.'); + Log::critical('This is a test message at the CRITICAL level.'); + Log::alert('This is a test message at the ALERT level.'); + Log::emergency('This is a test message at the EMERGENCY level.'); throw new FireflyException('A very simple test error.'); } diff --git a/app/Http/Controllers/Import/BankController.php b/app/Http/Controllers/Import/BankController.php index d78620c9e3..661da55a77 100644 --- a/app/Http/Controllers/Import/BankController.php +++ b/app/Http/Controllers/Import/BankController.php @@ -13,18 +13,126 @@ namespace FireflyIII\Http\Controllers\Import; use FireflyIII\Http\Controllers\Controller; +use FireflyIII\Support\Import\Information\InformationInterface; use FireflyIII\Support\Import\Prerequisites\PrerequisitesInterface; +use Illuminate\Http\Request; +use Log; +use Session; class BankController extends Controller { - public function postPrerequisites() + /** + * This method must ask the user all parameters necessary to start importing data. This may not be enough + * to finish the import itself (ie. mapping) but it should be enough to begin: accounts to import from, + * accounts to import into, data ranges, etc. + * + * @param string $bank + * + * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View + */ + public function form(string $bank) { + $class = config(sprintf('firefly.import_pre.%s', $bank)); + /** @var PrerequisitesInterface $object */ + $object = app($class); + $object->setUser(auth()->user()); + + if ($object->hasPrerequisites()) { + return redirect(route('import.bank.prerequisites', [$bank])); + } + $class = config(sprintf('firefly.import_info.%s', $bank)); + /** @var InformationInterface $object */ + $object = app($class); + $object->setUser(auth()->user()); + $remoteAccounts = $object->getAccounts(); + + return view('import.bank.form', compact('remoteAccounts', 'bank')); } /** + * With the information given in the submitted form Firefly III will call upon the bank's classes to return transaction + * information as requested. The user will be able to map unknown data and continue. Or maybe, it's put into some kind of + * fake CSV file and forwarded to the import routine. + * + * @param Request $request + * @param string $bank + * + * @return \Illuminate\Http\RedirectResponse|null + */ + public function postForm(Request $request, string $bank) + { + + $class = config(sprintf('firefly.import_pre.%s', $bank)); + /** @var PrerequisitesInterface $object */ + $object = app($class); + $object->setUser(auth()->user()); + + if ($object->hasPrerequisites()) { + return redirect(route('import.bank.prerequisites', [$bank])); + } + $remoteAccounts = $request->get('do_import'); + if (!is_array($remoteAccounts) || count($remoteAccounts) === 0) { + Session::flash('error', 'Must select accounts'); + + return redirect(route('import.bank.form', [$bank])); + } + $remoteAccounts = array_keys($remoteAccounts); + + $class = config(sprintf('firefly.import_pre.%s', $bank)); + // get import file + + // get import config + + + } + + /** + * This method processes the prerequisites the user has entered in the previous step. + * + * Whatever storePrerequisites does, it should make sure that the system is ready to continue immediately. So + * no extra calls or stuff, except maybe to open a session + * + * @see PrerequisitesInterface::storePrerequisites + * + * @param Request $request + * @param string $bank + * + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + */ + public function postPrerequisites(Request $request, string $bank) + { + Log::debug(sprintf('Now in postPrerequisites for %s', $bank)); + $class = config(sprintf('firefly.import_pre.%s', $bank)); + /** @var PrerequisitesInterface $object */ + $object = app($class); + $object->setUser(auth()->user()); + if (!$object->hasPrerequisites()) { + Log::debug(sprintf('No more prerequisites for %s, move to form.', $bank)); + + return redirect(route('import.bank.form', [$bank])); + } + Log::debug('Going to store entered preprerequisites.'); + // store post data + $result = $object->storePrerequisites($request); + + if ($result->count() > 0) { + Session::flash('error', $result->first()); + + return redirect(route('import.bank.prerequisites', [$bank])); + } + + return redirect(route('import.bank.form', [$bank])); + } + + /** + * This method shows you, if necessary, a form that allows you to enter any required values, such as API keys, + * login passwords or other values. + * * @param string $bank + * + * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View */ public function prerequisites(string $bank) { @@ -40,10 +148,7 @@ class BankController extends Controller return view($view, $parameters); } - if (!$object->hasPrerequisites()) { - echo 'redirect to import form.'; - } - + return redirect(route('import.bank.form', [$bank])); } } diff --git a/app/Http/Controllers/Json/AutoCompleteController.php b/app/Http/Controllers/Json/AutoCompleteController.php new file mode 100644 index 0000000000..8f654d9f82 --- /dev/null +++ b/app/Http/Controllers/Json/AutoCompleteController.php @@ -0,0 +1,171 @@ +getAccountsByType( + [AccountType::REVENUE, AccountType::EXPENSE, AccountType::BENEFICIARY, AccountType::DEFAULT, AccountType::ASSET] + )->pluck('name')->toArray() + ); + sort($return); + + return Response::json($return); + + } + + /** + * @param JournalCollectorInterface $collector + * + * @return \Illuminate\Http\JsonResponse + */ + public function allTransactionJournals(JournalCollectorInterface $collector) + { + $collector->setLimit(250)->setPage(1); + $return = array_unique($collector->getJournals()->pluck('description')->toArray()); + sort($return); + + return Response::json($return); + } + + /** + * Returns a JSON list of all beneficiaries. + * + * @param AccountRepositoryInterface $repository + * + * @return \Illuminate\Http\JsonResponse + * + */ + public function expenseAccounts(AccountRepositoryInterface $repository) + { + $set = $repository->getAccountsByType([AccountType::EXPENSE, AccountType::BENEFICIARY]); + $filtered = $set->filter( + function (Account $account) { + if ($account->active) { + return $account; + } + + return false; + } + ); + $return = array_unique($filtered->pluck('name')->toArray()); + + sort($return); + + return Response::json($return); + } + + /** + * @param JournalCollectorInterface $collector + * + * @param TransactionJournal $except + * + * @return \Illuminate\Http\JsonResponse|mixed + */ + public function journalsWithId(JournalCollectorInterface $collector, TransactionJournal $except) + { + + $cache = new CacheProperties; + $cache->addProperty('recent-journals-id'); + + if ($cache->has()) { + return $cache->get(); // @codeCoverageIgnore + } + + $collector->setLimit(400)->setPage(1); + $set = $collector->getJournals()->pluck('description', 'journal_id')->toArray(); + $return = []; + foreach ($set as $id => $description) { + $id = intval($id); + if ($id !== $except->id) { + $return[] = [ + 'id' => $id, + 'name' => $id . ': ' . $description, + ]; + } + } + + $cache->store($return); + + return Response::json($return); + } + + /** + * @param AccountRepositoryInterface $repository + * + * @return \Illuminate\Http\JsonResponse + * + */ + public function revenueAccounts(AccountRepositoryInterface $repository) + { + $set = $repository->getAccountsByType([AccountType::REVENUE]); + $filtered = $set->filter( + function (Account $account) { + if ($account->active) { + return $account; + } + + return false; + } + ); + $return = array_unique($filtered->pluck('name')->toArray()); + sort($return); + + return Response::json($return); + } + + /** + * @param JournalCollectorInterface $collector + * @param string $what + * + * @return \Illuminate\Http\JsonResponse + */ + public function transactionJournals(JournalCollectorInterface $collector, string $what) + { + $type = config('firefly.transactionTypesByWhat.' . $what); + $types = [$type]; + + $collector->setTypes($types)->setLimit(250)->setPage(1); + $return = array_unique($collector->getJournals()->pluck('description')->toArray()); + sort($return); + + return Response::json($return); + } + +} diff --git a/app/Http/Controllers/JsonController.php b/app/Http/Controllers/JsonController.php index 849b0631f9..4805e620eb 100644 --- a/app/Http/Controllers/JsonController.php +++ b/app/Http/Controllers/JsonController.php @@ -16,9 +16,7 @@ namespace FireflyIII\Http\Controllers; use Amount; use Carbon\Carbon; use FireflyIII\Helpers\Collector\JournalCollectorInterface; -use FireflyIII\Models\AccountType; use FireflyIII\Models\TransactionType; -use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Category\CategoryRepositoryInterface; @@ -62,43 +60,6 @@ class JsonController extends Controller return Response::json(['html' => $view]); } - /** - * Returns a JSON list of all accounts. - * - * @param AccountRepositoryInterface $repository - * - * @return \Illuminate\Http\JsonResponse - * - */ - public function allAccounts(AccountRepositoryInterface $repository) - { - $return = array_unique( - $repository->getAccountsByType( - [AccountType::REVENUE, AccountType::EXPENSE, AccountType::BENEFICIARY, AccountType::DEFAULT, AccountType::ASSET] - )->pluck('name')->toArray() - ); - sort($return); - - return Response::json($return); - - } - - /** - * @param JournalCollectorInterface $collector - * - * @return \Illuminate\Http\JsonResponse - */ - public function allTransactionJournals(JournalCollectorInterface $collector) - { - $collector->setLimit(100)->setPage(1); - $return = array_unique($collector->getJournals()->pluck('description')->toArray()); - sort($return); - - return Response::json($return); - - - } - /** * @param BillRepositoryInterface $repository * @@ -235,36 +196,6 @@ class JsonController extends Controller return Response::json($return); } - /** - * Returns a JSON list of all beneficiaries. - * - * @param AccountRepositoryInterface $repository - * - * @return \Illuminate\Http\JsonResponse - * - */ - public function expenseAccounts(AccountRepositoryInterface $repository) - { - $return = array_unique($repository->getAccountsByType([AccountType::EXPENSE, AccountType::BENEFICIARY])->pluck('name')->toArray()); - sort($return); - - return Response::json($return); - } - - /** - * @param AccountRepositoryInterface $repository - * - * @return \Illuminate\Http\JsonResponse - * - */ - public function revenueAccounts(AccountRepositoryInterface $repository) - { - $return = array_unique($repository->getAccountsByType([AccountType::REVENUE])->pluck('name')->toArray()); - sort($return); - - return Response::json($return); - } - /** * Returns a JSON list of all beneficiaries. * @@ -281,26 +212,6 @@ class JsonController extends Controller } - /** - * @param JournalCollectorInterface $collector - * @param string $what - * - * @return \Illuminate\Http\JsonResponse - */ - public function transactionJournals(JournalCollectorInterface $collector, string $what) - { - $type = config('firefly.transactionTypesByWhat.' . $what); - $types = [$type]; - - $collector->setTypes($types)->setLimit(100)->setPage(1); - $return = array_unique($collector->getJournals()->pluck('description')->toArray()); - sort($return); - - return Response::json($return); - - - } - /** * @param JournalRepositoryInterface $repository * @@ -329,6 +240,7 @@ class JsonController extends Controller $triggers[$key] = trans('firefly.rule_trigger_' . $key . '_choice'); } } + asort($triggers); $view = view('rules.partials.trigger', compact('triggers', 'count'))->render(); diff --git a/app/Http/Controllers/RuleController.php b/app/Http/Controllers/RuleController.php index 46e1d3f8ed..46de443874 100644 --- a/app/Http/Controllers/RuleController.php +++ b/app/Http/Controllers/RuleController.php @@ -166,10 +166,13 @@ class RuleController extends Controller */ public function edit(Request $request, RuleRepositoryInterface $repository, Rule $rule) { - $oldTriggers = $this->getCurrentTriggers($rule); - $triggerCount = count($oldTriggers); - $oldActions = $this->getCurrentActions($rule); - $actionCount = count($oldActions); + /** @var RuleGroupRepositoryInterface $ruleGroupRepository */ + $ruleGroupRepository = app(RuleGroupRepositoryInterface::class); + $oldTriggers = $this->getCurrentTriggers($rule); + $triggerCount = count($oldTriggers); + $oldActions = $this->getCurrentActions($rule); + $actionCount = count($oldActions); + $ruleGroups = ExpandedForm::makeSelectList($ruleGroupRepository->get()); // has old input? if ($request->old()) { @@ -191,7 +194,12 @@ class RuleController extends Controller Session::flash('gaEventCategory', 'rules'); Session::flash('gaEventAction', 'edit-rule'); - return view('rules.rule.edit', compact('rule', 'subTitle', 'primaryTrigger', 'oldTriggers', 'oldActions', 'triggerCount', 'actionCount')); + return view( + 'rules.rule.edit', compact( + 'rule', 'subTitle', + 'primaryTrigger', 'oldTriggers', 'oldActions', 'triggerCount', 'actionCount', 'ruleGroups' + ) + ); } /** @@ -523,7 +531,7 @@ class RuleController extends Controller $actions[] = view( 'rules.partials.action', [ - 'oldTrigger' => $entry->action_type, + 'oldAction' => $entry->action_type, 'oldValue' => $entry->action_value, 'oldChecked' => $entry->stop_processing, 'count' => $count, diff --git a/app/Http/Controllers/TagController.php b/app/Http/Controllers/TagController.php index 5dcbe252cb..f4ecb7f429 100644 --- a/app/Http/Controllers/TagController.php +++ b/app/Http/Controllers/TagController.php @@ -43,9 +43,6 @@ use View; class TagController extends Controller { - /** @var array */ - public $tagOptions = []; - /** @var TagRepositoryInterface */ protected $repository; @@ -60,17 +57,8 @@ class TagController extends Controller $this->middleware( function ($request, $next) { $this->repository = app(TagRepositoryInterface::class); - $this->tagOptions = [ - 'nothing' => trans('firefly.regular_tag'), - 'balancingAct' => trans('firefly.balancing_act'), - 'advancePayment' => trans('firefly.advance_payment'), - ]; - - View::share('title', strval(trans('firefly.tags'))); View::share('mainTitleIcon', 'fa-tags'); - View::share('tagOptions', $this->tagOptions); - return $next($request); } @@ -168,41 +156,22 @@ class TagController extends Controller */ public function index(TagRepositoryInterface $repository) { - $title = 'Tags'; - $mainTitleIcon = 'fa-tags'; - $types = ['nothing', 'balancingAct', 'advancePayment']; - $hasTypes = 0; // which types of tag the user actually has. - $counts = []; // how many of each type? - $count = $repository->count(); - // loop each types and get the tags, group them by year. - $collection = []; - foreach ($types as $type) { + // collect tags by year: + /** @var Carbon $start */ + $start = clone(session('first')); + $now = new Carbon; + $clouds = []; + $clouds['no-date'] = $repository->tagCloud(null); + while ($now > $start) { + $year = $now->year; + $clouds[$year] = $repository->tagCloud($year); - /** @var Collection $tags */ - $tags = $repository->getByType($type); - $tags = $tags->sortBy( - function (Tag $tag) { - $date = !is_null($tag->date) ? $tag->date->format('Ymd') : '000000'; - - return strtolower($date . $tag->tag); - } - ); - if ($tags->count() > 0) { - $hasTypes++; - } - $counts[$type] = $tags->count(); - - /** @var Tag $tag */ - foreach ($tags as $tag) { - $year = is_null($tag->date) ? trans('firefly.no_year') : $tag->date->year; - $monthFormatted = is_null($tag->date) ? trans('firefly.no_month') : $tag->date->formatLocalized($this->monthFormat); - - $collection[$type][$year][$monthFormatted][] = $tag; - } + $now->subYear(); } + $count = $repository->count(); - return view('tags.index', compact('title', 'mainTitleIcon', 'counts', 'hasTypes', 'types', 'collection', 'count')); + return view('tags.index', compact('clouds', 'count')); } /** @@ -235,6 +204,7 @@ class TagController extends Controller $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']); } @@ -249,6 +219,7 @@ class TagController extends Controller ); $periods = $this->getPeriodOverview($tag); $sum = $repository->sumOfTag($tag, $start, $end); + $result = $repository->resultOfTag($tag, $start, $end); $path = route('tags.show', [$tag->id, $moment]); } @@ -257,6 +228,8 @@ class TagController extends Controller $start = clone session('start', Navigation::startOfPeriod(new Carbon, $range)); $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)] @@ -271,10 +244,9 @@ class TagController extends Controller $journals->setPath($path); - return view('tags.show', compact('apiKey', 'tag', 'periods', 'subTitle', 'subTitleIcon', 'journals', 'sum', 'start', 'end', 'moment')); + return view('tags.show', compact('apiKey', 'tag', 'result', 'periods', 'subTitle', 'subTitleIcon', 'journals', 'sum', 'start', 'end', 'moment')); } - /** * @param TagFormRequest $request * @@ -371,4 +343,6 @@ class TagController extends Controller return $collection; } + + } diff --git a/app/Http/Controllers/Transaction/LinkController.php b/app/Http/Controllers/Transaction/LinkController.php new file mode 100644 index 0000000000..98aaf10651 --- /dev/null +++ b/app/Http/Controllers/Transaction/LinkController.php @@ -0,0 +1,143 @@ +middleware( + function ($request, $next) { + View::share('title', trans('firefly.transactions')); + View::share('mainTitleIcon', 'fa-repeat'); + + return $next($request); + } + ); + + } + + + /** + * @param TransactionJournalLink $link + * + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + */ + public function delete(TransactionJournalLink $link) + { + $subTitleIcon = 'fa-link'; + $subTitle = trans('breadcrumbs.delete_journal_link'); + $this->rememberPreviousUri('journal_links.delete.uri'); + + return view('transactions.links.delete', compact('link', 'subTitle', 'subTitleIcon')); + } + + /** + * @param LinkTypeRepositoryInterface $repository + * @param TransactionJournalLink $link + * + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + */ + public function destroy(LinkTypeRepositoryInterface $repository, TransactionJournalLink $link) + { + $repository->destroyLink($link); + + Session::flash('success', strval(trans('firefly.deleted_link'))); + Preferences::mark(); + + return redirect(strval(session('journal_links.delete.uri'))); + } + + /** + * @param JournalLinkRequest $request + * @param LinkTypeRepositoryInterface $repository + * @param JournalRepositoryInterface $journalRepository + * @param TransactionJournal $journal + * + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + */ + public function store( + JournalLinkRequest $request, LinkTypeRepositoryInterface $repository, JournalRepositoryInterface $journalRepository, TransactionJournal $journal + ) { + $linkInfo = $request->getLinkInfo(); + $linkType = $repository->find($linkInfo['link_type_id']); + $other = $journalRepository->find($linkInfo['transaction_journal_id']); + $alreadyLinked = $repository->findLink($journal, $other); + if ($alreadyLinked) { + Session::flash('error', trans('firefly.journals_error_linked')); + + return redirect(route('transactions.show', [$journal->id])); + } + Log::debug(sprintf('Journal is %d, opposing is %d', $journal->id, $other->id)); + + $journalLink = new TransactionJournalLink; + $journalLink->linkType()->associate($linkType); + if ($linkInfo['direction'] === 'inward') { + Log::debug(sprintf('Link type is inwards ("%s"), so %d is source and %d is destination.', $linkType->inward, $other->id, $journal->id)); + $journalLink->source()->associate($other); + $journalLink->destination()->associate($journal); + } + + if ($linkInfo['direction'] === 'outward') { + Log::debug(sprintf('Link type is inwards ("%s"), so %d is source and %d is destination.', $linkType->outward, $journal->id, $other->id)); + $journalLink->source()->associate($journal); + $journalLink->destination()->associate($other); + } + + $journalLink->comment = $linkInfo['comments']; + $journalLink->save(); + Session::flash('success', trans('firefly.journals_linked')); + + return redirect(route('transactions.show', [$journal->id])); + } + + /** + * @param LinkTypeRepositoryInterface $repository + * @param TransactionJournalLink $link + * + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + */ + public function switch(LinkTypeRepositoryInterface $repository, TransactionJournalLink $link) + { + + $repository->switchLink($link); + + return redirect(URL::previous()); + } + +} diff --git a/app/Http/Controllers/Transaction/SingleController.php b/app/Http/Controllers/Transaction/SingleController.php index b8baff5568..4c40a76125 100644 --- a/app/Http/Controllers/Transaction/SingleController.php +++ b/app/Http/Controllers/Transaction/SingleController.php @@ -14,12 +14,14 @@ declare(strict_types=1); namespace FireflyIII\Http\Controllers\Transaction; +use Carbon\Carbon; use ExpandedForm; use FireflyIII\Events\StoredTransactionJournal; use FireflyIII\Events\UpdatedTransactionJournal; use FireflyIII\Helpers\Attachments\AttachmentHelperInterface; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Requests\JournalFormRequest; +use FireflyIII\Models\Account; use FireflyIII\Models\AccountType; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; @@ -115,7 +117,7 @@ class SingleController extends Controller 'foreign_amount' => $foreignAmount, 'native_amount' => $foreignAmount, 'amount_currency_id_amount' => $transaction->foreign_currency_id ?? 0, - 'date' => $journal->date->format('Y-m-d'), + 'date' => (new Carbon())->format('Y-m-d'), 'budget_id' => $budgetId, 'category' => $categoryName, 'tags' => $tags, @@ -142,7 +144,7 @@ class SingleController extends Controller { $what = strtolower($what); $uploadSize = min(Steam::phpBytes(ini_get('upload_max_filesize')), Steam::phpBytes(ini_get('post_max_size'))); - $assetAccounts = ExpandedForm::makeSelectList($this->accounts->getActiveAccountsByType([AccountType::DEFAULT, AccountType::ASSET])); + $assetAccounts = $this->groupedActiveAccountList(); $budgets = ExpandedForm::makeSelectListWithEmpty($this->budgets->getActiveBudgets()); $piggyBanks = $this->piggyBanks->getPiggyBanksWithAmount(); $piggies = ExpandedForm::makeSelectListWithEmpty($piggyBanks); @@ -238,7 +240,7 @@ class SingleController extends Controller } $what = strtolower($journal->transactionTypeStr()); - $assetAccounts = ExpandedForm::makeSelectList($this->accounts->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET])); + $assetAccounts = $this->groupedAccountList(); $budgetList = ExpandedForm::makeSelectListWithEmpty($this->budgets->getBudgets()); // view related code @@ -408,6 +410,46 @@ class SingleController extends Controller return redirect($this->getPreviousUri('transactions.edit.uri')); } + /** + * @return array + */ + private function groupedAccountList(): array + { + $accounts = $this->accounts->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); + $return = []; + /** @var Account $account */ + foreach ($accounts as $account) { + $type = $account->getMeta('accountRole'); + if (strlen($type) === 0) { + $type = 'no_account_type'; + } + $key = strval(trans('firefly.opt_group_' . $type)); + $return[$key][$account->id] = $account->name; + } + + return $return; + } + + /** + * @return array + */ + private function groupedActiveAccountList(): array + { + $accounts = $this->accounts->getActiveAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); + $return = []; + /** @var Account $account */ + foreach ($accounts as $account) { + $type = $account->getMeta('accountRole'); + if (strlen($type) === 0) { + $type = 'no_account_type'; + } + $key = strval(trans('firefly.opt_group_' . $type)); + $return[$key][$account->id] = $account->name; + } + + return $return; + } + /** * @param TransactionJournal $journal * diff --git a/app/Http/Controllers/Transaction/SplitController.php b/app/Http/Controllers/Transaction/SplitController.php index 23225eae8f..8f3783a476 100644 --- a/app/Http/Controllers/Transaction/SplitController.php +++ b/app/Http/Controllers/Transaction/SplitController.php @@ -18,6 +18,8 @@ use ExpandedForm; use FireflyIII\Events\UpdatedTransactionJournal; use FireflyIII\Helpers\Attachments\AttachmentHelperInterface; use FireflyIII\Http\Controllers\Controller; +use FireflyIII\Http\Requests\SplitJournalFormRequest; +use FireflyIII\Models\Account; use FireflyIII\Models\AccountType; use FireflyIII\Models\TransactionJournal; use FireflyIII\Repositories\Account\AccountRepositoryInterface; @@ -94,13 +96,23 @@ class SplitController extends Controller $uploadSize = min(Steam::phpBytes(ini_get('upload_max_filesize')), Steam::phpBytes(ini_get('post_max_size'))); $currencies = $this->currencies->get(); - $assetAccounts = ExpandedForm::makeSelectList($this->accounts->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET])); + $accountList = $this->accounts->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); + $assetAccounts = ExpandedForm::makeSelectList($accountList); $optionalFields = Preferences::get('transaction_journal_optional_fields', [])->data; $budgets = ExpandedForm::makeSelectListWithEmpty($this->budgets->getActiveBudgets()); $preFilled = $this->arrayFromJournal($request, $journal); $subTitle = trans('breadcrumbs.edit_journal', ['description' => $journal->description]); $subTitleIcon = 'fa-pencil'; + $accountArray = []; + // account array to display currency info: + /** @var Account $account */ + foreach ($accountList as $account) { + $accountArray[$account->id] = $account; + $accountArray[$account->id]['currency_id'] = intval($account->getMeta('currency_id')); + } + + Session::flash('gaEventCategory', 'transactions'); Session::flash('gaEventAction', 'edit-split-' . $preFilled['what']); @@ -115,25 +127,24 @@ class SplitController extends Controller compact( 'subTitleIcon', 'currencies', 'optionalFields', 'preFilled', 'subTitle', 'uploadSize', 'assetAccounts', - 'budgets', 'journal' + 'budgets', 'journal', 'accountArray', 'previous' ) ); } /** - * @param Request $request + * @param SplitJournalFormRequest $request * @param JournalRepositoryInterface $repository * @param TransactionJournal $journal * * @return $this|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector */ - public function update(Request $request, JournalRepositoryInterface $repository, TransactionJournal $journal) + public function update(SplitJournalFormRequest $request, JournalRepositoryInterface $repository, TransactionJournal $journal) { if ($this->isOpeningBalance($journal)) { return $this->redirectToAccount($journal); } - $data = $this->arrayFromInput($request); $journal = $repository->updateSplitJournal($journal, $data); /** @var array $files */ @@ -167,11 +178,11 @@ class SplitController extends Controller } /** - * @param Request $request + * @param SplitJournalFormRequest $request * * @return array */ - private function arrayFromInput(Request $request): array + private function arrayFromInput(SplitJournalFormRequest $request): array { $array = [ 'journal_description' => $request->get('journal_description'), @@ -200,8 +211,8 @@ class SplitController extends Controller } /** - * @param Request $request - * @param TransactionJournal $journal + * @param SplitJournalFormRequest|Request $request + * @param TransactionJournal $journal * * @return array */ @@ -234,6 +245,8 @@ class SplitController extends Controller // transactions. 'transactions' => $this->getTransactionDataFromJournal($journal), ]; + // update transactions array with old request data. + $array['transactions'] = $this->updateWithPrevious($array['transactions'], $request->old()); return $array; } @@ -282,11 +295,11 @@ class SplitController extends Controller } /** - * @param Request $request + * @param SplitJournalFormRequest|Request $request * * @return array */ - private function getTransactionDataFromRequest(Request $request): array + private function getTransactionDataFromRequest(SplitJournalFormRequest $request): array { $return = []; $transactions = $request->get('transactions'); @@ -312,5 +325,36 @@ class SplitController extends Controller return $return; } + /** + * @param $array + * @param $old + * + * @return array + */ + private function updateWithPrevious($array, $old): array + { + if (count($old) === 0 || !isset($old['transactions'])) { + return $array; + } + $old = $old['transactions']; + foreach ($old as $index => $row) { + if (isset($array[$index])) { + $array[$index] = array_merge($array[$index], $row); + continue; + } + // take some info from first transaction, that should at least exist. + $array[$index] = $row; + $array[$index]['transaction_currency_id'] = $array[0]['transaction_currency_id']; + $array[$index]['transaction_currency_code'] = $array[0]['transaction_currency_code']; + $array[$index]['transaction_currency_symbol'] = $array[0]['transaction_currency_symbol']; + $array[$index]['foreign_amount'] = round($array[0]['foreign_destination_amount'] ?? '0', 12); + $array[$index]['foreign_currency_id'] = $array[0]['foreign_currency_id']; + $array[$index]['foreign_currency_code'] = $array[0]['foreign_currency_code']; + $array[$index]['foreign_currency_symbol'] = $array[0]['foreign_currency_symbol']; + } + + return $array; + } + } diff --git a/app/Http/Controllers/TransactionController.php b/app/Http/Controllers/TransactionController.php index 059a1e3fb7..59465552e1 100644 --- a/app/Http/Controllers/TransactionController.php +++ b/app/Http/Controllers/TransactionController.php @@ -17,9 +17,11 @@ use Carbon\Carbon; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Helpers\Filter\InternalTransferFilter; +use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Journal\JournalTaskerInterface; +use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface; use FireflyIII\Support\CacheProperties; use Illuminate\Http\Request; use Illuminate\Support\Collection; @@ -27,7 +29,6 @@ use Log; use Navigation; use Preferences; use Response; -use Steam; use View; /** @@ -150,23 +151,26 @@ class TransactionController extends Controller } /** - * @param TransactionJournal $journal - * @param JournalTaskerInterface $tasker + * @param TransactionJournal $journal + * @param JournalTaskerInterface $tasker + * + * @param LinkTypeRepositoryInterface $linkTypeRepository * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|View */ - public function show(TransactionJournal $journal, JournalTaskerInterface $tasker) + public function show(TransactionJournal $journal, JournalTaskerInterface $tasker, LinkTypeRepositoryInterface $linkTypeRepository) { if ($this->isOpeningBalance($journal)) { return $this->redirectToAccount($journal); } - + $linkTypes = $linkTypeRepository->get(); + $links = $linkTypeRepository->getLinks($journal); $events = $tasker->getPiggyBankEvents($journal); $transactions = $tasker->getTransactionsOverview($journal); $what = strtolower($journal->transaction_type_type ?? $journal->transactionType->type); $subTitle = trans('firefly.' . $what) . ' "' . e($journal->description) . '"'; - return view('transactions.show', compact('journal', 'events', 'subTitle', 'what', 'transactions')); + return view('transactions.show', compact('journal', 'events', 'subTitle', 'what', 'transactions', 'linkTypes', 'links')); } @@ -210,35 +214,24 @@ class TransactionController extends Controller $collector = app(JournalCollectorInterface::class); $collector->setAllAssetAccounts()->setRange($end, $currentEnd)->withOpposingAccount()->setTypes($types); $collector->removeFilter(InternalTransferFilter::class); - $set = $collector->getJournals(); - $sum = $set->sum('transaction_amount'); - $journals = $set->count(); + $journals = $collector->getJournals(); + $sum = $journals->sum('transaction_amount'); + + // count per currency: + $sums = $this->sumPerCurrency($journals); $dateStr = $end->format('Y-m-d'); $dateName = Navigation::periodShow($end, $range); $array = [ - 'string' => $dateStr, - 'name' => $dateName, - 'count' => $journals, - 'spent' => 0, - 'earned' => 0, - 'transferred' => 0, - 'date' => clone $end, + 'string' => $dateStr, + 'name' => $dateName, + 'sum' => $sum, + 'sums' => $sums, + 'date' => clone $end, ]; Log::debug(sprintf('What is %s', $what)); - switch ($what) { - case 'withdrawal': - $array['spent'] = $sum; - break; - case 'deposit': - $array['earned'] = $sum; - break; - case 'transfers': - case 'transfer': - $array['transferred'] = Steam::positive($sum); - break; - + if ($journals->count() > 0) { + $entries->push($array); } - $entries->push($array); $end = Navigation::subtractPeriod($end, $range, 1); } Log::debug('End of loop'); @@ -247,4 +240,41 @@ class TransactionController extends Controller return $entries; } + /** + * @param Collection $collection + * + * @return array + */ + private function sumPerCurrency(Collection $collection): array + { + $return = []; + /** @var Transaction $transaction */ + foreach ($collection as $transaction) { + $currencyId = $transaction->transaction_currency_id; + + // save currency information: + if (!isset($return[$currencyId])) { + $currencySymbol = $transaction->transaction_currency_symbol; + $decimalPlaces = $transaction->transaction_currency_dp; + $currencyCode = $transaction->transaction_currency_code; + $return[$currencyId] = [ + 'currency' => [ + 'id' => $currencyId, + 'code' => $currencyCode, + 'symbol' => $currencySymbol, + 'dp' => $decimalPlaces, + ], + 'sum' => '0', + 'count' => 0, + ]; + } + // save amount: + $return[$currencyId]['sum'] = bcadd($return[$currencyId]['sum'], $transaction->transaction_amount); + $return[$currencyId]['count']++; + } + asort($return); + + return $return; + } + } diff --git a/app/Http/Requests/BudgetIncomeRequest.php b/app/Http/Requests/BudgetIncomeRequest.php index 8af316dd48..7f2375e3b0 100644 --- a/app/Http/Requests/BudgetIncomeRequest.php +++ b/app/Http/Requests/BudgetIncomeRequest.php @@ -37,6 +37,8 @@ class BudgetIncomeRequest extends Request { return [ 'amount' => 'numeric|required|min:0', + 'start' => 'required|date|before:end', + 'end' => 'required|date|after:start', ]; } } diff --git a/app/Http/Requests/ExportFormRequest.php b/app/Http/Requests/ExportFormRequest.php index 16a5638302..7b02ec5520 100644 --- a/app/Http/Requests/ExportFormRequest.php +++ b/app/Http/Requests/ExportFormRequest.php @@ -38,10 +38,9 @@ class ExportFormRequest extends Request public function rules() { $sessionFirst = clone session('first'); - - $first = $sessionFirst->subDay()->format('Y-m-d'); - $today = Carbon::create()->addDay()->format('Y-m-d'); - $formats = join(',', array_keys(config('firefly.export_formats'))); + $first = $sessionFirst->subDay()->format('Y-m-d'); + $today = Carbon::create()->addDay()->format('Y-m-d'); + $formats = join(',', array_keys(config('firefly.export_formats'))); return [ 'export_start_range' => 'required|date|after:' . $first, diff --git a/app/Http/Requests/JournalFormRequest.php b/app/Http/Requests/JournalFormRequest.php index 12d35d8617..f38acfbc4d 100644 --- a/app/Http/Requests/JournalFormRequest.php +++ b/app/Http/Requests/JournalFormRequest.php @@ -110,7 +110,7 @@ class JournalFormRequest extends Request // foreign currency amounts 'native_amount' => 'numeric|more:0', 'source_amount' => 'numeric|more:0', - 'destination_amount' => 'numeric|more:0', + 'destination_amount' => 'numeric', ]; // some rules get an upgrade depending on the type of data: diff --git a/app/Http/Requests/JournalLinkRequest.php b/app/Http/Requests/JournalLinkRequest.php new file mode 100644 index 0000000000..50b2069d47 --- /dev/null +++ b/app/Http/Requests/JournalLinkRequest.php @@ -0,0 +1,74 @@ +check(); + } + + /** + * @return array + */ + public function getLinkInfo(): array + { + $return = []; + $linkType = $this->get('link_type'); + $parts = explode('_', $linkType); + $return['link_type_id'] = intval($parts[0]); + $return['transaction_journal_id'] = $this->integer('link_journal_id'); + $return['comments'] = strlen($this->string('comments')) > 0 ? $this->string('comments') : null; + $return['direction'] = $parts[1]; + if ($return['transaction_journal_id'] === 0 && ctype_digit($this->string('link_other'))) { + $return['transaction_journal_id'] = $this->integer('link_other'); + } + + return $return; + } + + /** + * @return array + */ + public function rules() + { + // all possible combinations of link types and inward / outward: + $combinations = []; + $linkTypes = LinkType::get(['id']); + /** @var LinkType $type */ + foreach ($linkTypes as $type) { + $combinations[] = sprintf('%d_inward', $type->id); + $combinations[] = sprintf('%d_outward', $type->id); + } + $string = join(',', $combinations); + + return [ + 'link_type' => sprintf('required|in:%s', $string), + 'link_other' => 'belongsToUser:transaction_journals', + 'link_journal_id' => 'belongsToUser:transaction_journals', + ]; + } +} diff --git a/app/Http/Requests/LinkTypeFormRequest.php b/app/Http/Requests/LinkTypeFormRequest.php new file mode 100644 index 0000000000..625e40d0d5 --- /dev/null +++ b/app/Http/Requests/LinkTypeFormRequest.php @@ -0,0 +1,57 @@ +check() && auth()->user()->hasRole('owner'); + } + + /** + * @return array + */ + public function rules() + { + /** @var LinkTypeRepositoryInterface $repository */ + $repository = app(LinkTypeRepositoryInterface::class); + $nameRule = 'required|min:1|unique:link_types,name'; + $idRule = ''; + if (!is_null($repository->find($this->integer('id'))->id)) { + $idRule = 'exists:link_types,id'; + $nameRule = 'required|min:1'; + } + + $rules = [ + 'id' => $idRule, + 'name' => $nameRule, + 'inward' => 'required|min:1|different:outward', + 'outward' => 'required|min:1|different:inward', + ]; + + return $rules; + } +} diff --git a/app/Http/Requests/Request.php b/app/Http/Requests/Request.php index 16e77bad4a..04fa99de73 100644 --- a/app/Http/Requests/Request.php +++ b/app/Http/Requests/Request.php @@ -28,64 +28,17 @@ class Request extends FormRequest * * @return bool */ - protected function boolean(string $field): bool + public function boolean(string $field): bool { return intval($this->input($field)) === 1; } - /** - * @param string $field - * - * @return Carbon|null - */ - protected function date(string $field) - { - return $this->get($field) ? new Carbon($this->get($field)) : null; - } - - /** - * @param string $field - * - * @return float - */ - protected function float(string $field): float - { - return round($this->input($field), 12); - } - - /** - * @param string $field - * @param string $type - * - * @return array - */ - protected function getArray(string $field, string $type): array - { - $original = $this->get($field); - $return = []; - foreach ($original as $index => $value) { - $return[$index] = $this->$type($value); - } - - return $return; - } - - /** - * @param string $field - * - * @return int - */ - protected function integer(string $field): int - { - return intval($this->get($field)); - } - /** * @param string $field * * @return string */ - protected function string(string $field): string + public function string(string $field): string { $string = $this->get($field) ?? ''; $search = [ @@ -140,4 +93,51 @@ class Request extends FormRequest return trim($string); } + + /** + * @param string $field + * + * @return Carbon|null + */ + protected function date(string $field) + { + return $this->get($field) ? new Carbon($this->get($field)) : null; + } + + /** + * @param string $field + * + * @return float + */ + protected function float(string $field): float + { + return round($this->input($field), 12); + } + + /** + * @param string $field + * @param string $type + * + * @return array + */ + protected function getArray(string $field, string $type): array + { + $original = $this->get($field); + $return = []; + foreach ($original as $index => $value) { + $return[$index] = $this->$type($value); + } + + return $return; + } + + /** + * @param string $field + * + * @return int + */ + protected function integer(string $field): int + { + return intval($this->get($field)); + } } diff --git a/app/Http/Requests/RuleFormRequest.php b/app/Http/Requests/RuleFormRequest.php index 8206b53264..d2a965ca6d 100644 --- a/app/Http/Requests/RuleFormRequest.php +++ b/app/Http/Requests/RuleFormRequest.php @@ -13,7 +13,7 @@ declare(strict_types=1); namespace FireflyIII\Http\Requests; -use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; +use FireflyIII\Repositories\Rule\RuleRepositoryInterface; /** * Class RuleFormRequest @@ -39,6 +39,7 @@ class RuleFormRequest extends Request { return [ 'title' => $this->string('title'), + 'rule_group_id' => $this->integer('rule_group_id'), 'active' => $this->boolean('active'), 'trigger' => $this->string('trigger'), 'description' => $this->string('description'), @@ -57,19 +58,18 @@ class RuleFormRequest extends Request */ public function rules() { - /** @var RuleGroupRepositoryInterface $repository */ - $repository = app(RuleGroupRepositoryInterface::class); + /** @var RuleRepositoryInterface $repository */ + $repository = app(RuleRepositoryInterface::class); $validTriggers = array_keys(config('firefly.rule-triggers')); $validActions = array_keys(config('firefly.rule-actions')); // some actions require text: $contextActions = join(',', config('firefly.rule-actions-text')); - $titleRule = 'required|between:1,100|uniqueObjectForUser:rule_groups,title'; + $titleRule = 'required|between:1,100|uniqueObjectForUser:rules,title'; if (!is_null($repository->find(intval($this->get('id')))->id)) { - $titleRule = 'required|between:1,100|uniqueObjectForUser:rule_groups,title,' . intval($this->get('id')); + $titleRule = 'required|between:1,100|uniqueObjectForUser:rules,title,' . intval($this->get('id')); } - $rules = [ 'title' => $titleRule, 'description' => 'between:1,5000', diff --git a/app/Http/Requests/SplitJournalFormRequest.php b/app/Http/Requests/SplitJournalFormRequest.php index 2c1fab0dac..1a2f0defa3 100644 --- a/app/Http/Requests/SplitJournalFormRequest.php +++ b/app/Http/Requests/SplitJournalFormRequest.php @@ -61,23 +61,23 @@ class SplitJournalFormRequest extends Request public function rules(): array { return [ - 'what' => 'required|in:withdrawal,deposit,transfer', - 'journal_description' => 'required|between:1,255', - 'id' => 'numeric|belongsToUser:transaction_journals,id', - 'journal_source_account_id' => 'numeric|belongsToUser:accounts,id', - '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', - 'description.*' => 'required|between:1,255', - 'destination_account_id.*' => 'numeric|belongsToUser:accounts,id', - 'destination_account_name.*' => 'between:1,255', - 'amount.*' => 'required|numeric', - 'budget_id.*' => 'belongsToUser:budgets,id', - 'category.*' => 'between:1,255', - 'piggy_bank_id.*' => 'between:1,255', + 'what' => 'required|in:withdrawal,deposit,transfer', + 'journal_description' => 'required|between:1,255', + 'id' => 'numeric|belongsToUser:transaction_journals,id', + 'journal_source_account_id' => 'numeric|belongsToUser:accounts,id', + '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', + 'transactions.*.description' => 'required|between:1,255', + 'transactions.*.destination_account_id' => 'numeric|belongsToUser:accounts,id', + 'transactions.*.destination_account_name' => 'between:1,255', + 'transactions.*.amount' => 'required|numeric', + 'transactions.*.budget_id' => 'belongsToUser:budgets,id', + 'transactions.*.category' => 'between:1,255', + 'transactions.*.piggy_bank_id' => 'between:1,255', ]; } diff --git a/app/Http/Requests/TagFormRequest.php b/app/Http/Requests/TagFormRequest.php index 00808beb34..71f1fdd796 100644 --- a/app/Http/Requests/TagFormRequest.php +++ b/app/Http/Requests/TagFormRequest.php @@ -37,14 +37,13 @@ class TagFormRequest extends Request */ public function collectTagData(): array { + $latitude = null; + $longitude = null; + $zoomLevel = null; if ($this->get('setTag') === 'true') { $latitude = $this->string('latitude'); $longitude = $this->string('longitude'); $zoomLevel = $this->integer('zoomLevel'); - } else { - $latitude = null; - $longitude = null; - $zoomLevel = null; } $data = [ diff --git a/app/Http/breadcrumbs.php b/app/Http/breadcrumbs.php index 5c79e234b5..cd0ed7939f 100644 --- a/app/Http/breadcrumbs.php +++ b/app/Http/breadcrumbs.php @@ -21,12 +21,14 @@ use FireflyIII\Models\Budget; use FireflyIII\Models\BudgetLimit; use FireflyIII\Models\Category; use FireflyIII\Models\ImportJob; +use FireflyIII\Models\LinkType; use FireflyIII\Models\PiggyBank; use FireflyIII\Models\Rule; use FireflyIII\Models\RuleGroup; use FireflyIII\Models\Tag; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionJournal; +use FireflyIII\Models\TransactionJournalLink; use FireflyIII\Models\TransactionType; use FireflyIII\User; use Illuminate\Support\Collection; @@ -152,6 +154,49 @@ Breadcrumbs::register( ); +Breadcrumbs::register( + 'admin.links.index', function (BreadCrumbGenerator $breadcrumbs) { + $breadcrumbs->parent('admin.index'); + $breadcrumbs->push(trans('firefly.journal_link_configuration'), route('admin.links.index')); +} +); + +Breadcrumbs::register( + 'admin.links.create', function (BreadCrumbGenerator $breadcrumbs) { + $breadcrumbs->parent('admin.links.index'); + $breadcrumbs->push(trans('firefly.create_new_link_type'), route('admin.links.create')); +} +); + +Breadcrumbs::register( + 'admin.links.show', function (BreadCrumbGenerator $breadcrumbs, LinkType $linkType) { + $breadcrumbs->parent('admin.links.index'); + $breadcrumbs->push(trans('firefly.overview_for_link', [$linkType->name]), route('admin.links.show', [$linkType->id])); +} +); + +Breadcrumbs::register( + 'admin.links.edit', function (BreadCrumbGenerator $breadcrumbs, LinkType $linkType) { + $breadcrumbs->parent('admin.links.index'); + $breadcrumbs->push(trans('firefly.edit_link_type', ['name' => $linkType->name]), route('admin.links.edit', [$linkType->id])); +} +); + +Breadcrumbs::register( + 'admin.links.delete', function (BreadCrumbGenerator $breadcrumbs, LinkType $linkType) { + $breadcrumbs->parent('admin.links.index'); + $breadcrumbs->push(trans('firefly.delete_link_type', ['name' => $linkType->name]), route('admin.links.delete', [$linkType->id])); +} +); + +Breadcrumbs::register( + 'transactions.link.delete', function (BreadCrumbGenerator $breadcrumbs, TransactionJournalLink $link) { + $breadcrumbs->parent('home'); + $breadcrumbs->push(trans('breadcrumbs.delete_journal_link'), route('transactions.link.delete', $link->id)); + +} +); + /** * ATTACHMENTS */ diff --git a/app/Import/Converter/Amount.php b/app/Import/Converter/Amount.php index 160c8c05e6..1177b86a2e 100644 --- a/app/Import/Converter/Amount.php +++ b/app/Import/Converter/Amount.php @@ -13,6 +13,8 @@ declare(strict_types=1); namespace FireflyIII\Import\Converter; +use Log; + /** * Class RabobankDebetCredit * @@ -34,31 +36,40 @@ class Amount implements ConverterInterface */ public function convert($value): string { + Log::debug(sprintf('Start with amount "%s"', $value)); $len = strlen($value); $decimalPosition = $len - 3; $decimal = null; if (($len > 2 && $value{$decimalPosition} === '.') || ($len > 2 && strpos($value, '.') > $decimalPosition)) { $decimal = '.'; + Log::debug(sprintf('Decimal character in "%s" seems to be a dot.', $value)); } if ($len > 2 && $value{$decimalPosition} === ',') { $decimal = ','; + Log::debug(sprintf('Decimal character in "%s" seems to be a comma.', $value)); } // if decimal is dot, replace all comma's and spaces with nothing. then parse as float (round to 4 pos) if ($decimal === '.') { - $search = [',', ' ']; - $value = str_replace($search, '', $value); + $search = [',', ' ']; + $oldValue = $value; + $value = str_replace($search, '', $value); + Log::debug(sprintf('Converted amount from "%s" to "%s".', $oldValue, $value)); } if ($decimal === ',') { - $search = ['.', ' ']; - $value = str_replace($search, '', $value); - $value = str_replace(',', '.', $value); + $search = ['.', ' ']; + $oldValue = $value; + $value = str_replace($search, '', $value); + $value = str_replace(',', '.', $value); + Log::debug(sprintf('Converted amount from "%s" to "%s".', $oldValue, $value)); } if (is_null($decimal)) { // replace all: - $search = ['.', ' ', ',']; - $value = str_replace($search, '', $value); + $search = ['.', ' ', ',']; + $oldValue = $value; + $value = str_replace($search, '', $value); + Log::debug(sprintf('No decimal character found. Converted amount from "%s" to "%s".', $oldValue, $value)); } return strval(round(floatval($value), 12)); diff --git a/app/Import/FileProcessor/CsvProcessor.php b/app/Import/FileProcessor/CsvProcessor.php index e81ec8a87a..d671a65d63 100644 --- a/app/Import/FileProcessor/CsvProcessor.php +++ b/app/Import/FileProcessor/CsvProcessor.php @@ -151,10 +151,14 @@ class CsvProcessor implements FileProcessorInterface */ private function getImportArray(): Iterator { - $content = $this->job->uploadFileContents(); - $config = $this->job->configuration; - $reader = Reader::createFromString($content); - $reader->setDelimiter($config['delimiter']); + $content = $this->job->uploadFileContents(); + $config = $this->job->configuration; + $reader = Reader::createFromString($content); + $delimiter = $config['delimiter']; + if ($delimiter === 'tab') { + $delimiter = "\t"; + } + $reader->setDelimiter($delimiter); $start = $config['has-headers'] ? 1 : 0; $results = $reader->setOffset($start)->fetch(); Log::debug(sprintf('Created a CSV reader starting at offset %d', $start)); diff --git a/app/Import/Object/ImportJournal.php b/app/Import/Object/ImportJournal.php index a72f574f28..33b7db299b 100644 --- a/app/Import/Object/ImportJournal.php +++ b/app/Import/Object/ImportJournal.php @@ -37,6 +37,8 @@ class ImportJournal public $budget; /** @var ImportCategory */ public $category; + /** @var ImportCurrency */ + public $currency; /** @var string */ public $description = ''; /** @var string */ @@ -51,8 +53,8 @@ class ImportJournal public $tags = []; /** @var string */ private $amount; - /** @var ImportCurrency */ - public $currency; + /** @var string */ + private $convertedAmount = null; /** @var string */ private $date = ''; /** @var string */ @@ -85,25 +87,37 @@ class ImportJournal /** * @return string + * @throws FireflyException */ public function getAmount(): string { - if (is_null($this->amount)) { + Log::debug('Now in getAmount()'); + if (is_null($this->convertedAmount)) { + Log::debug('convertedAmount is NULL'); /** @var ConverterInterface $amountConverter */ - $amountConverter = app(Amount::class); - $this->amount = $amountConverter->convert($this->amount); + $amountConverter = app(Amount::class); + $this->convertedAmount = $amountConverter->convert($this->amount); + Log::debug(sprintf('First attempt to convert gives "%s"', $this->convertedAmount)); // modify foreach ($this->modifiers as $modifier) { $class = sprintf('FireflyIII\Import\Converter\%s', config(sprintf('csv.import_roles.%s.converter', $modifier['role']))); /** @var ConverterInterface $converter */ $converter = app($class); + Log::debug(sprintf('Now launching converter %s', $class)); if ($converter->convert($modifier['value']) === -1) { - $this->amount = Steam::negative($this->amount); + $this->convertedAmount = Steam::negative($this->convertedAmount); } + Log::debug(sprintf('convertedAmount after conversion is %s', $this->convertedAmount)); } + + Log::debug(sprintf('After modifiers the result is: "%s"', $this->convertedAmount)); + } + Log::debug(sprintf('convertedAmount is: "%s"', $this->convertedAmount)); + if (bccomp($this->convertedAmount, '0') === 0) { + throw new FireflyException('Amount is zero.'); } - return $this->amount; + return $this->convertedAmount; } /** diff --git a/app/Import/Specifics/RabobankDescription.php b/app/Import/Specifics/RabobankDescription.php index ec92580f74..5dd23cb512 100644 --- a/app/Import/Specifics/RabobankDescription.php +++ b/app/Import/Specifics/RabobankDescription.php @@ -59,7 +59,8 @@ class RabobankDescription implements SpecificInterface ); $row[6] = $alternateName; $row[10] = ''; - } else { + } + if (!(strlen($oppositeAccount) < 1 && strlen($oppositeName) < 1)) { Log::debug('Rabobank specific: either opposite account or name are filled.'); } diff --git a/app/Import/Storage/ImportStorage.php b/app/Import/Storage/ImportStorage.php index 50980ad2a9..66ba023c17 100644 --- a/app/Import/Storage/ImportStorage.php +++ b/app/Import/Storage/ImportStorage.php @@ -11,6 +11,8 @@ declare(strict_types=1); namespace FireflyIII\Import\Storage; +use ErrorException; +use Exception; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Import\Object\ImportJournal; use FireflyIII\Models\ImportJob; @@ -95,7 +97,7 @@ class ImportStorage function (ImportJournal $importJournal, int $index) { try { $this->storeImportJournal($index, $importJournal); - } catch (FireflyException $e) { + } catch (FireflyException | ErrorException | Exception $e) { $this->errors->push($e->getMessage()); Log::error(sprintf('Cannot import row #%d because: %s', $index, $e->getMessage())); } @@ -142,7 +144,10 @@ class ImportStorage if ($this->isDoubleTransfer($parameters) || $this->hashAlreadyImported($importJournal->hash)) { $this->job->addStepsDone(3); // throw error - throw new FireflyException('Detected a possible duplicate, skip this one.'); + $message = sprintf('Detected a possible duplicate, skip this one (hash: %s).', $importJournal->hash); + Log::error($message, $parameters); + throw new FireflyException($message); + } unset($parameters); @@ -202,25 +207,32 @@ class ImportStorage return false; } - $amount = app('steam')->positive($parameters['amount']); - $names = [$parameters['asset'], $parameters['opposing']]; + $amount = app('steam')->positive($parameters['amount']); + $names = [$parameters['asset'], $parameters['opposing']]; + $transfer = []; + $hit = false; sort($names); foreach ($this->transfers as $transfer) { - if ($parameters['description'] !== $transfer['description']) { - return false; + if ($parameters['description'] === $transfer['description']) { + $hit = true; } - if ($names !== $transfer['names']) { - return false; + if ($names === $transfer['names']) { + $hit = true; } - if (bccomp($amount, $transfer['amount']) !== 0) { - return false; + if (bccomp($amount, $transfer['amount']) === 0) { + $hit = true; } - if ($parameters['date'] !== $transfer['date']) { - return false; + if ($parameters['date'] === $transfer['date']) { + $hit = true; } } + if ($hit === true) { + Log::error( + 'There already is a transfer imported with these properties. Compare existing with new. ', ['existing' => $transfer, 'new' => $parameters] + ); + } - return true; + return $hit; } } diff --git a/app/Import/Storage/ImportSupport.php b/app/Import/Storage/ImportSupport.php index 38b444b98e..7c2f487e48 100644 --- a/app/Import/Storage/ImportSupport.php +++ b/app/Import/Storage/ImportSupport.php @@ -214,7 +214,7 @@ trait ImportSupport */ private function getTransactionType(string $amount, Account $account): string { - $transactionType = ''; + $transactionType = TransactionType::WITHDRAWAL; // amount is negative, it's a withdrawal, opposing is an expense: if (bccomp($amount, '0') === -1) { $transactionType = TransactionType::WITHDRAWAL; @@ -296,12 +296,15 @@ trait ImportSupport */ private function hashAlreadyImported(string $hash): bool { - $json = json_encode($hash); + $json = json_encode($hash); + /** @var TransactionJournalMeta $entry */ $entry = TransactionJournalMeta::leftJoin('transaction_journals', 'transaction_journals.id', '=', 'journal_meta.transaction_journal_id') ->where('data', $json) ->where('name', 'importHash') ->first(); if (!is_null($entry)) { + Log::error(sprintf('A journal with hash %s has already been imported (spoiler: it\'s journal #%d)', $hash, $entry->transaction_journal_id)); + return true; } @@ -441,4 +444,4 @@ trait ImportSupport return; } -} \ No newline at end of file +} diff --git a/app/Mail/RegisteredUser.php b/app/Mail/RegisteredUser.php index 01d7f675cd..bb1468035a 100644 --- a/app/Mail/RegisteredUser.php +++ b/app/Mail/RegisteredUser.php @@ -1,6 +1,15 @@ 'date', + 'updated_at' => 'date', + 'deleted_at' => 'date', + 'editable' => 'boolean', + ]; + + /** + * @param $value + * + * @return mixed + * @throws NotFoundHttpException + */ + public static function routeBinder($value) + { + if (auth()->check()) { + $model = self::where('id', $value)->first(); + if (!is_null($model)) { + return $model; + } + } + throw new NotFoundHttpException; + } + + public function transactionJournalLinks() + { + return $this->hasMany(TransactionJournalLink::class); + } + +} diff --git a/app/Models/PiggyBank.php b/app/Models/PiggyBank.php index 2c8d67539c..19bf7de6b2 100644 --- a/app/Models/PiggyBank.php +++ b/app/Models/PiggyBank.php @@ -84,6 +84,7 @@ class PiggyBank extends Model return $this->currentRep; } // repeating piggy banks are no longer supported. + /** @var PiggyBankRepetition $rep */ $rep = $this->piggyBankRepetitions()->first(['piggy_bank_repetitions.*']); if (is_null($rep)) { return new PiggyBankRepetition(); diff --git a/app/Models/Preference.php b/app/Models/Preference.php index 7b7922b4e0..4bacffea77 100644 --- a/app/Models/Preference.php +++ b/app/Models/Preference.php @@ -14,6 +14,7 @@ declare(strict_types=1); namespace FireflyIII\Models; use Crypt; +use Exception; use FireflyIII\Exceptions\FireflyException; use Illuminate\Contracts\Encryption\DecryptException; use Illuminate\Database\Eloquent\Model; @@ -56,7 +57,15 @@ class Preference extends Model sprintf('Could not decrypt preference #%d. If this error persists, please run "php artisan cache:clear" on the command line.', $this->id) ); } - + $unserialized = false; + try { + $unserialized = unserialize($data); + } catch (Exception $e) { + // don't care, assume is false. + } + if (!($unserialized === false)) { + return $unserialized; + } return json_decode($data, true); } @@ -66,7 +75,7 @@ class Preference extends Model */ public function setDataAttribute($value) { - $this->attributes['data'] = Crypt::encrypt(json_encode($value)); + $this->attributes['data'] = Crypt::encrypt(serialize($value)); } /** diff --git a/app/Models/Transaction.php b/app/Models/Transaction.php index c9b139d485..cb3938ddde 100644 --- a/app/Models/Transaction.php +++ b/app/Models/Transaction.php @@ -22,6 +22,48 @@ use Watson\Validating\ValidatingTrait; /** * Class Transaction * + * @property-read int $journal_id + * @property-read 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-read int $account_id + * @property-read string $account_name + * @property string $account_iban + * @property string $account_number + * @property string $account_bic + * @property string $account_currency_code + * + * @property-read int $opposing_account_id + * @property string $opposing_account_name + * @property string $opposing_account_iban + * @property string $opposing_account_number + * @property string $opposing_account_bic + * @property string $opposing_currency_code + * + * + * @property-read int $transaction_budget_id + * @property-read string $transaction_budget_name + * @property-read int $transaction_journal_budget_id + * @property-read string $transaction_journal_budget_name + * + * @property-read int $transaction_category_id + * @property-read string $transaction_category_name + * @property-read int $transaction_journal_category_id + * @property-read string $transaction_journal_category_name + * + * @property-read int $bill_id + * @property string $bill_name + * + * @property string $notes + * @property string $tags + * + * @property string $transaction_currency_symbol + * @property int $transaction_currency_dp + * @property string $transaction_currency_code + * * @package FireflyIII\Models */ class Transaction extends Model diff --git a/app/Models/TransactionJournal.php b/app/Models/TransactionJournal.php index 977ef1ea90..275ae35af2 100644 --- a/app/Models/TransactionJournal.php +++ b/app/Models/TransactionJournal.php @@ -140,6 +140,14 @@ class TransactionJournal extends Model return true; } + /** + * @return HasMany + */ + public function destinationJournalLinks(): HasMany + { + return $this->hasMany(TransactionJournalLink::class, 'destination_id'); + } + /** * * @param $value @@ -372,6 +380,14 @@ class TransactionJournal extends Model return $entry; } + /** + * @return HasMany + */ + public function sourceJournalLinks(): HasMany + { + return $this->hasMany(TransactionJournalLink::class, 'source_id'); + } + /** * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany */ diff --git a/app/Models/TransactionJournalLink.php b/app/Models/TransactionJournalLink.php new file mode 100644 index 0000000000..0d2bac9193 --- /dev/null +++ b/app/Models/TransactionJournalLink.php @@ -0,0 +1,105 @@ +check()) { + $model = self::where('journal_links.id', $value) + ->leftJoin('transaction_journals as t_a', 't_a.id', '=', 'source_id') + ->leftJoin('transaction_journals as t_b', 't_b.id', '=', 'destination_id') + ->where('t_a.user_id', auth()->user()->id) + ->where('t_b.user_id', auth()->user()->id) + ->first(['journal_links.*']); + if (!is_null($model)) { + return $model; + } + } + throw new NotFoundHttpException; + } + + /** + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function destination() + { + return $this->belongsTo(TransactionJournal::class, 'destination_id'); + } + + /** + * @param $value + * + * @return null|string + */ + public function getCommentAttribute($value): ?string + { + if (!is_null($value)) { + return Crypt::decrypt($value); + } + + return null; + } + + /** + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function linkType(): BelongsTo + { + return $this->belongsTo(LinkType::class); + } + + /** + * + * @param $value + */ + public function setCommentAttribute($value): void + { + if (!is_null($value) && strlen($value) > 0) { + $this->attributes['comment'] = Crypt::encrypt($value); + + return; + } + $this->attributes['comment'] = null; + } + + /** + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function source() + { + return $this->belongsTo(TransactionJournal::class, 'source_id'); + } + + +} diff --git a/app/Providers/AdminServiceProvider.php b/app/Providers/AdminServiceProvider.php new file mode 100644 index 0000000000..764953698f --- /dev/null +++ b/app/Providers/AdminServiceProvider.php @@ -0,0 +1,63 @@ +linkType(); + } + + /** + * + */ + private function linkType() + { + $this->app->bind( + LinkTypeRepositoryInterface::class, + function (Application $app) { + /** @var LinkTypeRepository $repository */ + $repository = app(LinkTypeRepository::class); + if ($app->auth->check()) { + $repository->setUser(auth()->user()); + } + + return $repository; + } + ); + } + +} diff --git a/app/Providers/FireflyServiceProvider.php b/app/Providers/FireflyServiceProvider.php index a2b6429f20..2323ba9340 100644 --- a/app/Providers/FireflyServiceProvider.php +++ b/app/Providers/FireflyServiceProvider.php @@ -13,7 +13,7 @@ declare(strict_types=1); namespace FireflyIII\Providers; -use FireflyIII\Export\Processor; +use FireflyIII\Export\ExpandedProcessor; use FireflyIII\Export\ProcessorInterface; use FireflyIII\Generator\Chart\Basic\ChartJsGenerator; use FireflyIII\Generator\Chart\Basic\GeneratorInterface; @@ -138,7 +138,8 @@ class FireflyServiceProvider extends ServiceProvider ); // other generators - $this->app->bind(ProcessorInterface::class, Processor::class); + // export: + $this->app->bind(ProcessorInterface::class, ExpandedProcessor::class); $this->app->bind(UserRepositoryInterface::class, UserRepository::class); $this->app->bind(AttachmentHelperInterface::class, AttachmentHelper::class); diff --git a/app/Repositories/Account/FindAccountsTrait.php b/app/Repositories/Account/FindAccountsTrait.php index e06a598a47..6bd9a42d45 100644 --- a/app/Repositories/Account/FindAccountsTrait.php +++ b/app/Repositories/Account/FindAccountsTrait.php @@ -205,10 +205,12 @@ trait FindAccountsTrait */ public function getCashAccount(): Account { - $type = AccountType::where('type', AccountType::CASH)->first(); - $account = Account::firstOrCreateEncrypted( - ['user_id' => $this->user->id, 'account_type_id' => $type->id, 'name' => 'Cash account', 'active' => 1] + $type = AccountType::where('type', AccountType::CASH)->first(); + $account = Account::firstOrCreateEncrypted( + ['user_id' => $this->user->id, 'account_type_id' => $type->id, 'name' => 'Cash account'] ); + $account->active = true; + $account->save(); return $account; } diff --git a/app/Repositories/Bill/BillRepository.php b/app/Repositories/Bill/BillRepository.php index e6957abe4b..5d510c8e75 100644 --- a/app/Repositories/Bill/BillRepository.php +++ b/app/Repositories/Bill/BillRepository.php @@ -116,7 +116,7 @@ class BillRepository implements BillRepositoryInterface $set = $set->sortBy( function (Bill $bill) { - $int = $bill->active === 1 ? 0 : 1; + $int = $bill->active ? 0 : 1; return $int . strtolower($bill->name); } diff --git a/app/Repositories/Currency/CurrencyRepository.php b/app/Repositories/Currency/CurrencyRepository.php index 6e0ae64ae7..d86adea16c 100644 --- a/app/Repositories/Currency/CurrencyRepository.php +++ b/app/Repositories/Currency/CurrencyRepository.php @@ -166,6 +166,16 @@ class CurrencyRepository implements CurrencyRepositoryInterface return TransactionCurrency::get(); } + /** + * @param array $ids + * + * @return Collection + */ + public function getByIds(array $ids): Collection + { + return TransactionCurrency::whereIn('id', $ids)->get(); + } + /** * @param Preference $preference * diff --git a/app/Repositories/Currency/CurrencyRepositoryInterface.php b/app/Repositories/Currency/CurrencyRepositoryInterface.php index 6c2ccdd61b..07b953aeca 100644 --- a/app/Repositories/Currency/CurrencyRepositoryInterface.php +++ b/app/Repositories/Currency/CurrencyRepositoryInterface.php @@ -90,6 +90,13 @@ interface CurrencyRepositoryInterface */ public function get(): Collection; + /** + * @param array $ids + * + * @return Collection + */ + public function getByIds(array $ids): Collection; + /** * @param Preference $preference * diff --git a/app/Repositories/Journal/SupportJournalsTrait.php b/app/Repositories/Journal/SupportJournalsTrait.php index df57879971..ee36766599 100644 --- a/app/Repositories/Journal/SupportJournalsTrait.php +++ b/app/Repositories/Journal/SupportJournalsTrait.php @@ -117,8 +117,11 @@ trait SupportJournalsTrait if (strlen($data['source_account_name']) > 0) { $sourceType = AccountType::where('type', 'Revenue account')->first(); $sourceAccount = Account::firstOrCreateEncrypted( - ['user_id' => $user->id, 'account_type_id' => $sourceType->id, 'name' => $data['source_account_name'], 'active' => 1] + ['user_id' => $user->id, 'account_type_id' => $sourceType->id, 'name' => $data['source_account_name']] ); + // always make account active + $sourceAccount->active = true; + $sourceAccount->save(); Log::debug(sprintf('source account name is "%s", account is %d', $data['source_account_name'], $sourceAccount->id)); @@ -132,8 +135,11 @@ trait SupportJournalsTrait $sourceType = AccountType::where('type', AccountType::CASH)->first(); $sourceAccount = Account::firstOrCreateEncrypted( - ['user_id' => $user->id, 'account_type_id' => $sourceType->id, 'name' => 'Cash account', 'active' => 1] + ['user_id' => $user->id, 'account_type_id' => $sourceType->id, 'name' => 'Cash account'] ); + // always make account active + $sourceAccount->active = true; + $sourceAccount->save(); return [ 'source' => $sourceAccount, @@ -161,10 +167,13 @@ trait SupportJournalsTrait 'user_id' => $user->id, 'account_type_id' => $destinationType->id, 'name' => $data['destination_account_name'], - 'active' => 1, ] ); + // always make account active + $destinationAccount->active = true; + $destinationAccount->save(); + Log::debug(sprintf('destination account name is "%s", account is %d', $data['destination_account_name'], $destinationAccount->id)); return [ @@ -175,8 +184,11 @@ trait SupportJournalsTrait Log::debug('destination_account_name is empty, so default to cash account!'); $destinationType = AccountType::where('type', AccountType::CASH)->first(); $destinationAccount = Account::firstOrCreateEncrypted( - ['user_id' => $user->id, 'account_type_id' => $destinationType->id, 'name' => 'Cash account', 'active' => 1] + ['user_id' => $user->id, 'account_type_id' => $destinationType->id, 'name' => 'Cash account'] ); + // always make account active + $destinationAccount->active = true; + $destinationAccount->save(); return [ 'source' => $sourceAccount, diff --git a/app/Repositories/LinkType/LinkTypeRepository.php b/app/Repositories/LinkType/LinkTypeRepository.php new file mode 100644 index 0000000000..55f1bdb8fe --- /dev/null +++ b/app/Repositories/LinkType/LinkTypeRepository.php @@ -0,0 +1,181 @@ +transactionJournalLinks()->count() * 2; + } + + /** + * @param LinkType $linkType + * @param LinkType $moveTo + * + * @return bool + */ + public function destroy(LinkType $linkType, LinkType $moveTo): bool + { + if (!is_null($moveTo->id)) { + TransactionJournalLink::where('link_type_id', $linkType->id)->update(['link_type_id' => $moveTo->id]); + } + $linkType->delete(); + + return true; + } + + /** + * @param TransactionJournalLink $link + * + * @return bool + */ + public function destroyLink(TransactionJournalLink $link): bool + { + $link->delete(); + + return true; + } + + /** + * @param int $id + * + * @return LinkType + */ + public function find(int $id): LinkType + { + $linkType = LinkType::find($id); + if (is_null($linkType)) { + return new LinkType; + } + + return $linkType; + } + + /** + * Check if link exists between journals. + * + * @param TransactionJournal $one + * @param TransactionJournal $two + * + * @return bool + */ + public function findLink(TransactionJournal $one, TransactionJournal $two): bool + { + $count = TransactionJournalLink::whereDestinationId($one->id)->whereSourceId($two->id)->count(); + $opposingCount = TransactionJournalLink::whereDestinationId($two->id)->whereSourceId($one->id)->count(); + + return ($count + $opposingCount > 0); + + + } + + /** + * @return Collection + */ + public function get(): Collection + { + return LinkType::orderBy('name', 'ASC')->get(); + } + + /** + * Return list of existing connections. + * + * @param TransactionJournal $journal + * + * @return Collection + */ + public function getLinks(TransactionJournal $journal): Collection + { + $outward = TransactionJournalLink::whereSourceId($journal->id)->get(); + $inward = TransactionJournalLink::whereDestinationId($journal->id)->get(); + + return $outward->merge($inward); + } + + /** + * @param User $user + */ + public function setUser(User $user) + { + $this->user = $user; + } + + /** + * @param array $data + * + * @return LinkType + */ + public function store(array $data): LinkType + { + $linkType = new LinkType; + $linkType->name = $data['name']; + $linkType->inward = $data['inward']; + $linkType->outward = $data['outward']; + $linkType->editable = true; + $linkType->save(); + + return $linkType; + } + + /** + * @param TransactionJournalLink $link + * + * @return bool + */ + public function switchLink(TransactionJournalLink $link): bool + { + $source = $link->source_id; + $link->source_id = $link->destination_id; + $link->destination_id = $source; + $link->save(); + + return true; + } + + /** + * @param LinkType $linkType + * @param array $data + * + * @return LinkType + */ + public function update(LinkType $linkType, array $data): LinkType + { + $linkType->name = $data['name']; + $linkType->inward = $data['inward']; + $linkType->outward = $data['outward']; + $linkType->save(); + + return $linkType; + + } +} diff --git a/app/Repositories/LinkType/LinkTypeRepositoryInterface.php b/app/Repositories/LinkType/LinkTypeRepositoryInterface.php new file mode 100644 index 0000000000..a67fe34805 --- /dev/null +++ b/app/Repositories/LinkType/LinkTypeRepositoryInterface.php @@ -0,0 +1,102 @@ +user->rules()->find($ruleId); + if (is_null($rule)) { + return new Rule; + } + + return $rule; + } + /** * FIxXME can return null * @@ -286,7 +301,7 @@ class RuleRepository implements RuleRepositoryInterface $ruleTrigger->active = 1; $ruleTrigger->stop_processing = $values['stopProcessing']; $ruleTrigger->trigger_type = $values['action']; - $ruleTrigger->trigger_value = $values['value']; + $ruleTrigger->trigger_value = is_null($values['value']) ? '' : $values['value']; $ruleTrigger->save(); return $ruleTrigger; @@ -301,6 +316,7 @@ class RuleRepository implements RuleRepositoryInterface public function update(Rule $rule, array $data): Rule { // update rule: + $rule->rule_group_id = $data['rule_group_id']; $rule->active = $data['active']; $rule->stop_processing = $data['stop_processing']; $rule->title = $data['title']; diff --git a/app/Repositories/Rule/RuleRepositoryInterface.php b/app/Repositories/Rule/RuleRepositoryInterface.php index 13fc6c3382..7a916d14a0 100644 --- a/app/Repositories/Rule/RuleRepositoryInterface.php +++ b/app/Repositories/Rule/RuleRepositoryInterface.php @@ -38,6 +38,14 @@ interface RuleRepositoryInterface */ public function destroy(Rule $rule): bool; + /** + * @param int $ruleId + * + * @return Rule + */ + public function find(int $ruleId): Rule; + + /** * @return RuleGroup */ diff --git a/app/Repositories/Tag/TagRepository.php b/app/Repositories/Tag/TagRepository.php index e81201ef0b..bc0b780065 100644 --- a/app/Repositories/Tag/TagRepository.php +++ b/app/Repositories/Tag/TagRepository.php @@ -186,6 +186,34 @@ 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 */ @@ -253,11 +281,71 @@ class TagRepository implements TagRepositoryInterface } $collector->setAllAssetAccounts()->setTag($tag); - $sum = $collector->getJournals()->sum('transaction_amount'); + $journals = $collector->getJournals(); + $sum = '0'; + foreach ($journals as $journal) { + $sum = bcadd($sum, app('steam')->positive(strval($journal->transaction_amount))); + } return strval($sum); } + /** + * Generates a tag cloud. + * + * @param int|null $year + * + * @return array + */ + public function tagCloud(?int $year): array + { + $min = null; + $max = 0; + $query = $this->user->tags(); + $return = []; + Log::debug('Going to build tag-cloud'); + if (!is_null($year)) { + Log::debug(sprintf('Year is not null: %d', $year)); + $start = $year . '-01-01'; + $end = $year . '-12-31'; + $query->where('date', '>=', $start)->where('date', '<=', $end); + } + if (is_null($year)) { + $query->whereNull('date'); + Log::debug('Year is NULL'); + } + $tags = $query->orderBy('id', 'desc')->get(); + $temporary = []; + Log::debug(sprintf('Found %d tags', $tags->count())); + /** @var Tag $tag */ + foreach ($tags as $tag) { + + $amount = floatval($this->sumOfTag($tag, null, null)); + $min = $amount < $min || is_null($min) ? $amount : $min; + $max = $amount > $max ? $amount : $max; + $temporary[] = [ + 'amount' => $amount, + 'tag' => $tag, + ]; + Log::debug(sprintf('Now working on tag %s with total amount %s', $tag->tag, $amount)); + Log::debug(sprintf('Minimum is now %f, maximum is %f', $min, $max)); + } + /** @var array $entry */ + foreach ($temporary as $entry) { + $scale = $this->cloudScale([12, 20], $entry['amount'], $min, $max); + $tagId = $entry['tag']->id; + $return[$tagId] = [ + 'scale' => $scale, + 'tag' => $entry['tag'], + ]; + } + + Log::debug('DONE with tagcloud'); + + return $return; + } + + /** * @param Tag $tag * @param array $data @@ -277,4 +365,38 @@ class TagRepository implements TagRepositoryInterface return $tag; } + /** + * @param array $range + * @param float $amount + * @param float $min + * @param float $max + * + * @return int + */ + private function cloudScale(array $range, float $amount, float $min, float $max): int + { + Log::debug(sprintf('Now in cloudScale with %s as amount and %f min, %f max', $amount, $min, $max)); + $amountDiff = $max - $min; + Log::debug(sprintf('AmountDiff is %f', $amountDiff)); + + // no difference? Every tag same range: + if ($amountDiff === 0.0) { + Log::debug(sprintf('AmountDiff is zero, return %d', $range[0])); + + return $range[0]; + } + + $diff = $range[1] - $range[0]; + $step = 1; + if ($diff != 0) { + $step = $amountDiff / $diff; + } + if ($step == 0) { + $step = 1; + } + $extra = round($amount / $step); + + + return intval($range[0] + $extra); + } } diff --git a/app/Repositories/Tag/TagRepositoryInterface.php b/app/Repositories/Tag/TagRepositoryInterface.php index 8cc71547ba..688c71dd90 100644 --- a/app/Repositories/Tag/TagRepositoryInterface.php +++ b/app/Repositories/Tag/TagRepositoryInterface.php @@ -103,6 +103,15 @@ 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 */ @@ -135,6 +144,15 @@ interface TagRepositoryInterface */ public function sumOfTag(Tag $tag, ?Carbon $start, ?Carbon $end): string; + /** + * Generates a tag cloud. + * + * @param int|null $year + * + * @return array + */ + public function tagCloud(?int $year): array; + /** * Update a tag. * diff --git a/app/Rules/Processor.php b/app/Rules/Processor.php index 478c7bf0df..5916da22e5 100644 --- a/app/Rules/Processor.php +++ b/app/Rules/Processor.php @@ -118,7 +118,8 @@ final class Processor { $self = new self; foreach ($triggers as $entry) { - $trigger = TriggerFactory::makeTriggerFromStrings($entry['type'], $entry['value'], $entry['stopProcessing']); + $entry['value'] = is_null($entry['value']) ? '' : $entry['value']; + $trigger = TriggerFactory::makeTriggerFromStrings($entry['type'], $entry['value'], $entry['stopProcessing']); $self->triggers->push($trigger); } diff --git a/app/Rules/Triggers/HasAnyBudget.php b/app/Rules/Triggers/HasAnyBudget.php new file mode 100644 index 0000000000..74d77eab01 --- /dev/null +++ b/app/Rules/Triggers/HasAnyBudget.php @@ -0,0 +1,65 @@ +budgets()->count(); + if ($count > 0) { + Log::debug(sprintf('RuleTrigger HasAnyBudget for journal #%d: count is %d, return true.', $journal->id, $count)); + + return true; + } + Log::debug(sprintf('RuleTrigger HasAnyBudget for journal #%d: count is %d, return false.', $journal->id, $count)); + + return false; + + } +} diff --git a/app/Rules/Triggers/HasAnyCategory.php b/app/Rules/Triggers/HasAnyCategory.php new file mode 100644 index 0000000000..c7902e0e95 --- /dev/null +++ b/app/Rules/Triggers/HasAnyCategory.php @@ -0,0 +1,65 @@ +categories()->count(); + if ($count > 0) { + Log::debug(sprintf('RuleTrigger HasAnyCategory for journal #%d: count is %d, return true.', $journal->id, $count)); + + return true; + } + Log::debug(sprintf('RuleTrigger HasAnyCategory for journal #%d: count is %d, return false.', $journal->id, $count)); + + return false; + + } +} diff --git a/app/Rules/Triggers/HasAnyTag.php b/app/Rules/Triggers/HasAnyTag.php new file mode 100644 index 0000000000..a7e2ecd5bd --- /dev/null +++ b/app/Rules/Triggers/HasAnyTag.php @@ -0,0 +1,65 @@ +tags()->count(); + if ($count > 0) { + Log::debug(sprintf('RuleTrigger HasAnyTag for journal #%d: count is %d, return true.', $journal->id, $count)); + + return true; + } + Log::debug(sprintf('RuleTrigger HasAnyTag for journal #%d: count is %d, return false.', $journal->id, $count)); + + return false; + + } +} diff --git a/app/Rules/Triggers/HasNoBudget.php b/app/Rules/Triggers/HasNoBudget.php new file mode 100644 index 0000000000..9df4143805 --- /dev/null +++ b/app/Rules/Triggers/HasNoBudget.php @@ -0,0 +1,65 @@ +budgets()->count(); + if ($count === 0) { + Log::debug(sprintf('RuleTrigger HasNoBudget for journal #%d: count is %d, return true.', $journal->id, $count)); + + return true; + } + Log::debug(sprintf('RuleTrigger HasNoBudget for journal #%d: count is %d, return false.', $journal->id, $count)); + + return false; + + } +} diff --git a/app/Rules/Triggers/HasNoCategory.php b/app/Rules/Triggers/HasNoCategory.php new file mode 100644 index 0000000000..4f6e367b30 --- /dev/null +++ b/app/Rules/Triggers/HasNoCategory.php @@ -0,0 +1,65 @@ +categories()->count(); + if ($count === 0) { + Log::debug(sprintf('RuleTrigger HasNoCategory for journal #%d: count is %d, return true.', $journal->id, $count)); + + return true; + } + Log::debug(sprintf('RuleTrigger HasNoCategory for journal #%d: count is %d, return false.', $journal->id, $count)); + + return false; + + } +} diff --git a/app/Rules/Triggers/HasNoTag.php b/app/Rules/Triggers/HasNoTag.php new file mode 100644 index 0000000000..813aaf82ff --- /dev/null +++ b/app/Rules/Triggers/HasNoTag.php @@ -0,0 +1,65 @@ +tags()->count(); + if ($count === 0) { + Log::debug(sprintf('RuleTrigger HasNoTag for journal #%d: count is %d, return true.', $journal->id, $count)); + + return true; + } + Log::debug(sprintf('RuleTrigger HasNoTag for journal #%d: count is %d, return false.', $journal->id, $count)); + + return false; + + } +} diff --git a/app/Services/Bunq/Id/BunqId.php b/app/Services/Bunq/Id/BunqId.php new file mode 100644 index 0000000000..a6b05054c8 --- /dev/null +++ b/app/Services/Bunq/Id/BunqId.php @@ -0,0 +1,43 @@ +id; + } + + /** + * @param int $id + */ + public function setId(int $id) + { + $this->id = $id; + } + + +} diff --git a/app/Services/Bunq/Id/DeviceServerId.php b/app/Services/Bunq/Id/DeviceServerId.php new file mode 100644 index 0000000000..aa24f4a884 --- /dev/null +++ b/app/Services/Bunq/Id/DeviceServerId.php @@ -0,0 +1,25 @@ +type = $data['type']; + $this->name = $data['name']; + $this->value = $data['value']; + + return; + } + + /** + * @return string + */ + public function getName(): string + { + return $this->name; + } + + /** + * @return string + */ + public function getType(): string + { + return $this->type; + } + + /** + * @return string + */ + public function getValue(): string + { + return $this->value; + } + + +} diff --git a/app/Services/Bunq/Object/Amount.php b/app/Services/Bunq/Object/Amount.php new file mode 100644 index 0000000000..c1f647c496 --- /dev/null +++ b/app/Services/Bunq/Object/Amount.php @@ -0,0 +1,57 @@ +currency = $data['currency']; + $this->value = $data['value']; + + return; + } + + /** + * @return string + */ + public function getCurrency(): string + { + return $this->currency; + } + + /** + * @return string + */ + public function getValue(): string + { + return $this->value; + } + + +} diff --git a/app/Services/Bunq/Object/Avatar.php b/app/Services/Bunq/Object/Avatar.php new file mode 100644 index 0000000000..576ad8d660 --- /dev/null +++ b/app/Services/Bunq/Object/Avatar.php @@ -0,0 +1,23 @@ +setId($data['id']); + $this->id = $id; + $this->created = Carbon::createFromFormat('Y-m-d H:i:s.u', $data['created']); + $this->updated = Carbon::createFromFormat('Y-m-d H:i:s.u', $data['updated']); + $this->ip = $data['ip']; + $this->description = $data['description']; + $this->status = $data['status']; + } + + /** + * @return DeviceServerId + */ + public function getId(): DeviceServerId + { + return $this->id; + } + + /** + * @return string + */ + public function getIp(): string + { + return $this->ip; + } + + +} diff --git a/app/Services/Bunq/Object/MonetaryAccountBank.php b/app/Services/Bunq/Object/MonetaryAccountBank.php new file mode 100644 index 0000000000..858e0176a9 --- /dev/null +++ b/app/Services/Bunq/Object/MonetaryAccountBank.php @@ -0,0 +1,151 @@ +id = $data['id']; + $this->created = Carbon::createFromFormat('Y-m-d H:i:s.u', $data['created']); + $this->updated = Carbon::createFromFormat('Y-m-d H:i:s.u', $data['updated']); + $this->balance = new Amount($data['balance']); + $this->currency = $data['currency']; + $this->dailyLimit = new Amount($data['daily_limit']); + $this->dailySpent = new Amount($data['daily_spent']); + $this->description = $data['description']; + $this->publicUuid = $data['public_uuid']; + $this->status = $data['status']; + $this->subStatus = $data['sub_status']; + $this->userId = $data['user_id']; + $this->status = $data['status']; + $this->subStatus = $data['sub_status']; + $this->monetaryAccountProfile = new MonetaryAccountProfile($data['monetary_account_profile']); + $this->setting = new MonetaryAccountSetting($data['setting']); + $this->overdraftLimit = new Amount($data['overdraft_limit']); + + $this->publicUuid = $data['public_uuid']; + + // create aliases: + foreach ($data['alias'] as $alias) { + $this->aliases[] = new Alias($alias); + } + foreach ($data['notification_filters'] as $filter) { + $this->notificationFilters = new NotificationFilter($filter); + } + + return; + } + + /** + * @return array + */ + public function getAliases(): array + { + return $this->aliases; + } + + /** + * @return Amount + */ + public function getBalance(): Amount + { + return $this->balance; + } + + /** + * @return string + */ + public function getCurrency(): string + { + return $this->currency; + } + + /** + * @return string + */ + public function getDescription(): string + { + return $this->description; + } + + /** + * @return int + */ + public function getId(): int + { + return $this->id; + } + + /** + * @return MonetaryAccountSetting + */ + public function getSetting(): MonetaryAccountSetting + { + return $this->setting; + } + +} diff --git a/app/Services/Bunq/Object/MonetaryAccountProfile.php b/app/Services/Bunq/Object/MonetaryAccountProfile.php new file mode 100644 index 0000000000..187e9d772a --- /dev/null +++ b/app/Services/Bunq/Object/MonetaryAccountProfile.php @@ -0,0 +1,44 @@ +profileDrain = null; + $this->profileFill = null; + $this->profileActionRequired = $data['profile_action_required']; + $this->profileAmountRequired = new Amount($data['profile_amount_required']); + + return; + } + +} diff --git a/app/Services/Bunq/Object/MonetaryAccountSetting.php b/app/Services/Bunq/Object/MonetaryAccountSetting.php new file mode 100644 index 0000000000..054d4e54e0 --- /dev/null +++ b/app/Services/Bunq/Object/MonetaryAccountSetting.php @@ -0,0 +1,68 @@ +color = $data['color']; + $this->defaultAvatarStatus = $data['default_avatar_status']; + $this->restrictionChat = $data['restriction_chat']; + + return; + } + + /** + * @return string + */ + public function getColor(): string + { + return $this->color; + } + + /** + * @return string + */ + public function getDefaultAvatarStatus(): string + { + return $this->defaultAvatarStatus; + } + + /** + * @return string + */ + public function getRestrictionChat(): string + { + return $this->restrictionChat; + } + + +} diff --git a/app/Services/Bunq/Object/NotificationFilter.php b/app/Services/Bunq/Object/NotificationFilter.php new file mode 100644 index 0000000000..16e24410c9 --- /dev/null +++ b/app/Services/Bunq/Object/NotificationFilter.php @@ -0,0 +1,31 @@ +publicKey = $response['server_public_key']; + } + + /** + * @return string + */ + public function getPublicKey(): string + { + return $this->publicKey; + } + + /** + * @param string $publicKey + */ + public function setPublicKey(string $publicKey) + { + $this->publicKey = $publicKey; + } + + +} diff --git a/app/Services/Bunq/Object/UserCompany.php b/app/Services/Bunq/Object/UserCompany.php new file mode 100644 index 0000000000..4529924969 --- /dev/null +++ b/app/Services/Bunq/Object/UserCompany.php @@ -0,0 +1,106 @@ +id = intval($data['id']); + $this->created = Carbon::createFromFormat('Y-m-d H:i:s.u', $data['created']); + $this->updated = Carbon::createFromFormat('Y-m-d H:i:s.u', $data['updated']); + $this->status = $data['status']; + $this->subStatus = $data['sub_status']; + $this->publicUuid = $data['public_uuid']; + $this->displayName = $data['display_name']; + $this->publicNickName = $data['public_nick_name']; + $this->language = $data['language']; + $this->region = $data['region']; + $this->sessionTimeout = intval($data['session_timeout']); + $this->versionTos = intval($data['version_terms_of_service']); + $this->cocNumber = $data['chamber_of_commerce_number']; + $this->typeOfBusinessEntity = $data['type_of_business_entity'] ?? ''; + $this->sectorOfIndustry = $data['sector_of_industry'] ?? ''; + $this->counterBankIban = $data['counter_bank_iban']; + $this->name = $data['name']; + + } + + /** + * @return int + */ + public function getId(): int + { + return $this->id; + } + + +} diff --git a/app/Services/Bunq/Object/UserLight.php b/app/Services/Bunq/Object/UserLight.php new file mode 100644 index 0000000000..cad3a8c6be --- /dev/null +++ b/app/Services/Bunq/Object/UserLight.php @@ -0,0 +1,70 @@ +id = intval($data['id']); + $this->created = Carbon::createFromFormat('Y-m-d H:i:s.u', $data['created']); + $this->updated = Carbon::createFromFormat('Y-m-d H:i:s.u', $data['updated']); + $this->publicUuid = $data['public_uuid']; + $this->displayName = $data['display_name']; + $this->publicNickName = $data['public_nick_name']; + $this->firstName = $data['first_name']; + $this->middleName = $data['middle_name']; + $this->lastName = $data['last_name']; + $this->legalName = $data['legal_name']; + // aliases + } + +} diff --git a/app/Services/Bunq/Object/UserPerson.php b/app/Services/Bunq/Object/UserPerson.php new file mode 100644 index 0000000000..7a3c865e6b --- /dev/null +++ b/app/Services/Bunq/Object/UserPerson.php @@ -0,0 +1,141 @@ +id = intval($data['id']); + $this->created = Carbon::createFromFormat('Y-m-d H:i:s.u', $data['created']); + $this->updated = Carbon::createFromFormat('Y-m-d H:i:s.u', $data['updated']); + $this->status = $data['status']; + $this->subStatus = $data['sub_status']; + $this->publicUuid = $data['public_uuid']; + $this->displayName = $data['display_name']; + $this->publicNickName = $data['public_nick_name']; + $this->language = $data['language']; + $this->region = $data['region']; + $this->sessionTimeout = intval($data['session_timeout']); + $this->firstName = $data['first_name']; + $this->middleName = $data['middle_name']; + $this->lastName = $data['last_name']; + $this->legalName = $data['legal_name']; + $this->taxResident = $data['tax_resident']; + $this->dateOfBirth = Carbon::createFromFormat('Y-m-d', $data['date_of_birth']); + $this->placeOfBirth = $data['place_of_birth']; + $this->countryOfBirth = $data['country_of_birth']; + $this->nationality = $data['nationality']; + $this->gender = $data['gender']; + $this->versionTos = intval($data['version_terms_of_service']); + $this->documentNumber = $data['document_number']; + $this->documentType = $data['document_type']; + $this->documentCountry = $data['document_country_of_issuance']; + + // create aliases + // create avatar + // create daily limit + // create notification filters + // create address main, postal + // document front, back attachment + // customer, customer_limit + // billing contracts + } + + /** + * @return int + */ + public function getId(): int + { + return $this->id; + } + + +} diff --git a/app/Services/Bunq/Request/BunqRequest.php b/app/Services/Bunq/Request/BunqRequest.php new file mode 100644 index 0000000000..b54cbd8890 --- /dev/null +++ b/app/Services/Bunq/Request/BunqRequest.php @@ -0,0 +1,451 @@ + 'X-Bunq-Client-Response-Id', + 'x-bunq-client-request-id' => 'X-Bunq-Client-Request-Id', + ]; + + /** + * BunqRequest constructor. + */ + public function __construct() + { + $this->server = config('firefly.bunq.server'); + } + + /** + * + */ + abstract public function call(): void; + + /** + * @return string + */ + public function getServer(): string + { + return $this->server; + } + + /** + * @param string $privateKey + */ + public function setPrivateKey(string $privateKey) + { + $this->privateKey = $privateKey; + } + + /** + * @param string $secret + */ + public function setSecret(string $secret) + { + $this->secret = $secret; + } + + /** + * @param ServerPublicKey $serverPublicKey + */ + public function setServerPublicKey(ServerPublicKey $serverPublicKey) + { + $this->serverPublicKey = $serverPublicKey; + } + + /** + * @param string $method + * @param string $uri + * @param array $headers + * @param string $data + * + * @return string + * @throws FireflyException + */ + protected function generateSignature(string $method, string $uri, array $headers, string $data): string + { + if (strlen($this->privateKey) === 0) { + throw new FireflyException('No private key present.'); + } + if (strtolower($method) === 'get' || strtolower($method) === 'delete') { + $data = ''; + } + + $uri = str_replace(['https://api.bunq.com', 'https://sandbox.public.api.bunq.com'], '', $uri); + $toSign = sprintf("%s %s\n", strtoupper($method), $uri); + $headersToSign = ['Cache-Control', 'User-Agent']; + ksort($headers); + foreach ($headers as $name => $value) { + if (in_array($name, $headersToSign) || substr($name, 0, 7) === 'X-Bunq-') { + $toSign .= sprintf("%s: %s\n", $name, $value); + } + } + $toSign .= "\n" . $data; + $signature = ''; + + openssl_sign($toSign, $signature, $this->privateKey, OPENSSL_ALGO_SHA256); + $signature = base64_encode($signature); + + return $signature; + } + + /** + * @param string $key + * @param array $response + * + * @return array + */ + protected function getArrayFromResponse(string $key, array $response): array + { + $result = []; + if (isset($response['Response'])) { + foreach ($response['Response'] as $entry) { + $currentKey = key($entry); + $data = current($entry); + if ($currentKey === $key) { + $result[] = $data; + } + } + } + + return $result; + } + + protected function getDefaultHeaders(): array + { + $userAgent = sprintf('FireflyIII v%s', config('firefly.version')); + + return [ + 'X-Bunq-Client-Request-Id' => uniqid('FFIII'), + 'Cache-Control' => 'no-cache', + 'User-Agent' => $userAgent, + 'X-Bunq-Language' => 'en_US', + 'X-Bunq-Region' => 'nl_NL', + 'X-Bunq-Geolocation' => '0 0 0 0 NL', + ]; + } + + /** + * @param string $key + * @param array $response + * + * @return array + */ + protected function getKeyFromResponse(string $key, array $response): array + { + if (isset($response['Response'])) { + foreach ($response['Response'] as $entry) { + $currentKey = key($entry); + $data = current($entry); + if ($currentKey === $key) { + return $data; + } + } + } + + return []; + } + + /** + * @param string $uri + * @param array $headers + * + * @return array + * @throws Exception + */ + protected function sendSignedBunqDelete(string $uri, array $headers): array + { + if (strlen($this->server) === 0) { + throw new FireflyException('No bunq server defined'); + } + + $fullUri = $this->server . $uri; + $signature = $this->generateSignature('delete', $uri, $headers, ''); + $headers['X-Bunq-Client-Signature'] = $signature; + try { + $response = Requests::delete($fullUri, $headers); + } catch (Requests_Exception $e) { + return ['Error' => [0 => ['error_description' => $e->getMessage(), 'error_description_translated' => $e->getMessage()],]]; + } + + $body = $response->body; + $array = json_decode($body, true); + $responseHeaders = $response->headers->getAll(); + $statusCode = $response->status_code; + $array['ResponseHeaders'] = $responseHeaders; + $array['ResponseStatusCode'] = $statusCode; + + Log::debug(sprintf('Response to DELETE %s is %s', $fullUri, $body)); + if ($this->isErrorResponse($array)) { + $this->throwResponseError($array); + } + + if (!$this->verifyServerSignature($body, $responseHeaders, $statusCode)) { + throw new FireflyException(sprintf('Could not verify signature for request to "%s"', $uri)); + } + + + return $array; + } + + /** + * @param string $uri + * @param array $data + * @param array $headers + * + * @return array + * @throws Exception + */ + protected function sendSignedBunqGet(string $uri, array $data, array $headers): array + { + if (strlen($this->server) === 0) { + throw new FireflyException('No bunq server defined'); + } + + $body = json_encode($data); + $fullUri = $this->server . $uri; + $signature = $this->generateSignature('get', $uri, $headers, $body); + $headers['X-Bunq-Client-Signature'] = $signature; + try { + $response = Requests::get($fullUri, $headers); + } catch (Requests_Exception $e) { + return ['Error' => [0 => ['error_description' => $e->getMessage(), 'error_description_translated' => $e->getMessage()],]]; + } + + $body = $response->body; + $array = json_decode($body, true); + $responseHeaders = $response->headers->getAll(); + $statusCode = $response->status_code; + $array['ResponseHeaders'] = $responseHeaders; + $array['ResponseStatusCode'] = $statusCode; + + if ($this->isErrorResponse($array)) { + $this->throwResponseError($array); + } + + if (!$this->verifyServerSignature($body, $responseHeaders, $statusCode)) { + throw new FireflyException(sprintf('Could not verify signature for request to "%s"', $uri)); + } + + return $array; + } + + /** + * @param string $uri + * @param array $data + * @param array $headers + * + * @return array + * @throws Exception + */ + protected function sendSignedBunqPost(string $uri, array $data, array $headers): array + { + $body = json_encode($data); + $fullUri = $this->server . $uri; + $signature = $this->generateSignature('post', $uri, $headers, $body); + $headers['X-Bunq-Client-Signature'] = $signature; + try { + $response = Requests::post($fullUri, $headers, $body); + } catch (Requests_Exception $e) { + return ['Error' => [0 => ['error_description' => $e->getMessage(), 'error_description_translated' => $e->getMessage()],]]; + } + + $body = $response->body; + $array = json_decode($body, true); + $responseHeaders = $response->headers->getAll(); + $statusCode = $response->status_code; + $array['ResponseHeaders'] = $responseHeaders; + $array['ResponseStatusCode'] = $statusCode; + + if ($this->isErrorResponse($array)) { + $this->throwResponseError($array); + } + + if (!$this->verifyServerSignature($body, $responseHeaders, $statusCode)) { + throw new FireflyException(sprintf('Could not verify signature for request to "%s"', $uri)); + } + + + return $array; + } + + /** + * @param string $uri + * @param array $headers + * + * @return array + */ + protected function sendUnsignedBunqDelete(string $uri, array $headers): array + { + $fullUri = $this->server . $uri; + try { + $response = Requests::delete($fullUri, $headers); + } catch (Requests_Exception $e) { + return ['Error' => [0 => ['error_description' => $e->getMessage(), 'error_description_translated' => $e->getMessage()],]]; + } + $body = $response->body; + $array = json_decode($body, true); + $responseHeaders = $response->headers->getAll(); + $statusCode = $response->status_code; + $array['ResponseHeaders'] = $responseHeaders; + $array['ResponseStatusCode'] = $statusCode; + + if ($this->isErrorResponse($array)) { + $this->throwResponseError($array); + } + + return $array; + } + + /** + * @param string $uri + * @param array $data + * @param array $headers + * + * @return array + */ + protected function sendUnsignedBunqPost(string $uri, array $data, array $headers): array + { + $body = json_encode($data); + $fullUri = $this->server . $uri; + try { + $response = Requests::post($fullUri, $headers, $body); + } catch (Requests_Exception $e) { + return ['Error' => [0 => ['error_description' => $e->getMessage(), 'error_description_translated' => $e->getMessage()],]]; + } + $body = $response->body; + $array = json_decode($body, true); + $responseHeaders = $response->headers->getAll(); + $statusCode = $response->status_code; + $array['ResponseHeaders'] = $responseHeaders; + $array['ResponseStatusCode'] = $statusCode; + + if ($this->isErrorResponse($array)) { + $this->throwResponseError($array); + } + + + return $array; + } + + /** + * @param array $response + * + * @return bool + */ + private function isErrorResponse(array $response): bool + { + $key = key($response); + if ($key === 'Error') { + return true; + } + + return false; + } + + /** + * @param array $response + * + * @throws Exception + */ + private function throwResponseError(array $response) + { + $message = []; + if (isset($response['Error'])) { + foreach ($response['Error'] as $error) { + $message[] = $error['error_description']; + } + } + throw new FireflyException('Bunq ERROR ' . $response['ResponseStatusCode'] . ': ' . join(', ', $message)); + } + + /** + * @param string $body + * @param array $headers + * @param int $statusCode + * + * @return bool + * @throws Exception + */ + private function verifyServerSignature(string $body, array $headers, int $statusCode): bool + { + Log::debug('Going to verify signature for body+headers+status'); + $dataToVerify = $statusCode . "\n"; + $verifyHeaders = []; + + // false when no public key is present + if (is_null($this->serverPublicKey)) { + Log::error('No public key present in class, so return FALSE.'); + + return false; + } + foreach ($headers as $header => $value) { + + // skip non-bunq headers or signature + if (substr($header, 0, 7) !== 'x-bunq-' || $header === 'x-bunq-server-signature') { + continue; + } + // need to have upper case variant of header: + if (!isset($this->upperCaseHeaders[$header])) { + throw new FireflyException(sprintf('No upper case variant for header "%s"', $header)); + } + $header = $this->upperCaseHeaders[$header]; + $verifyHeaders[$header] = $value[0]; + } + // sort verification headers: + ksort($verifyHeaders); + + // add them to data to sign: + foreach ($verifyHeaders as $header => $value) { + $dataToVerify .= $header . ': ' . trim($value) . "\n"; + } + + $signature = $headers['x-bunq-server-signature'][0]; + $dataToVerify .= "\n" . $body; + $result = openssl_verify($dataToVerify, base64_decode($signature), $this->serverPublicKey->getPublicKey(), OPENSSL_ALGO_SHA256); + + if (is_int($result) && $result < 1) { + Log::error(sprintf('Result of verification is %d, return false.', $result)); + + return false; + } + if (!is_int($result)) { + Log::error(sprintf('Result of verification is a boolean (%d), return false.', $result)); + } + Log::info('Signature is a match, return true.'); + + return true; + } +} diff --git a/app/Services/Bunq/Request/DeleteDeviceSessionRequest.php b/app/Services/Bunq/Request/DeleteDeviceSessionRequest.php new file mode 100644 index 0000000000..cd70b833c9 --- /dev/null +++ b/app/Services/Bunq/Request/DeleteDeviceSessionRequest.php @@ -0,0 +1,49 @@ +sessionToken->getId()); + $headers = $this->getDefaultHeaders(); + $headers['X-Bunq-Client-Authentication'] = $this->sessionToken->getToken(); + $this->sendSignedBunqDelete($uri, $headers); + + return; + } + + /** + * @param SessionToken $sessionToken + */ + public function setSessionToken(SessionToken $sessionToken) + { + $this->sessionToken = $sessionToken; + } +} diff --git a/app/Services/Bunq/Request/DeviceServerRequest.php b/app/Services/Bunq/Request/DeviceServerRequest.php new file mode 100644 index 0000000000..8b5c0a2d1a --- /dev/null +++ b/app/Services/Bunq/Request/DeviceServerRequest.php @@ -0,0 +1,82 @@ + $this->description, 'secret' => $this->secret, 'permitted_ips' => $this->permittedIps]; + $headers = $this->getDefaultHeaders(); + $headers['X-Bunq-Client-Authentication'] = $this->installationToken->getToken(); + $response = $this->sendSignedBunqPost($uri, $data, $headers); + $deviceServerId = new DeviceServerId; + $deviceServerId->setId(intval($response['Response'][0]['Id']['id'])); + $this->deviceServerId = $deviceServerId; + + return; + } + + /** + * @return DeviceServerId + */ + public function getDeviceServerId(): DeviceServerId + { + return $this->deviceServerId; + } + + /** + * @param string $description + */ + public function setDescription(string $description) + { + $this->description = $description; + } + + /** + * @param InstallationToken $installationToken + */ + public function setInstallationToken(InstallationToken $installationToken) + { + $this->installationToken = $installationToken; + } + + /** + * @param array $permittedIps + */ + public function setPermittedIps(array $permittedIps) + { + $this->permittedIps = $permittedIps; + } +} diff --git a/app/Services/Bunq/Request/DeviceSessionRequest.php b/app/Services/Bunq/Request/DeviceSessionRequest.php new file mode 100644 index 0000000000..c2658afb72 --- /dev/null +++ b/app/Services/Bunq/Request/DeviceSessionRequest.php @@ -0,0 +1,149 @@ + $this->secret]; + $headers = $this->getDefaultHeaders(); + $headers['X-Bunq-Client-Authentication'] = $this->installationToken->getToken(); + $response = $this->sendSignedBunqPost($uri, $data, $headers); + + + $this->deviceSessionId = $this->extractDeviceSessionId($response); + $this->sessionToken = $this->extractSessionToken($response); + $this->userPerson = $this->extractUserPerson($response); + $this->userCompany = $this->extractUserCompany($response); + + Log::debug(sprintf('Session ID: %s', serialize($this->deviceSessionId))); + Log::debug(sprintf('Session token: %s', serialize($this->sessionToken))); + Log::debug(sprintf('Session user person: %s', serialize($this->userPerson))); + Log::debug(sprintf('Session user company: %s', serialize($this->userCompany))); + + return; + } + + /** + * @return DeviceSessionId + */ + public function getDeviceSessionId(): DeviceSessionId + { + return $this->deviceSessionId; + } + + /** + * @return SessionToken + */ + public function getSessionToken(): SessionToken + { + return $this->sessionToken; + } + + /** + * @return UserPerson + */ + public function getUserPerson(): UserPerson + { + return $this->userPerson; + } + + /** + * @param InstallationToken $installationToken + */ + public function setInstallationToken(InstallationToken $installationToken) + { + $this->installationToken = $installationToken; + } + + /** + * @param array $response + * + * @return DeviceSessionId + */ + private function extractDeviceSessionId(array $response): DeviceSessionId + { + $data = $this->getKeyFromResponse('Id', $response); + $deviceSessionId = new DeviceSessionId; + $deviceSessionId->setId(intval($data['id'])); + + return $deviceSessionId; + } + + private function extractSessionToken(array $response): SessionToken + { + $data = $this->getKeyFromResponse('Token', $response); + $sessionToken = new SessionToken($data); + + return $sessionToken; + } + + /** + * @param $response + * + * @return UserCompany + */ + private function extractUserCompany($response): UserCompany + { + $data = $this->getKeyFromResponse('UserCompany', $response); + $userCompany = new UserCompany($data); + + + return $userCompany; + } + + /** + * @param $response + * + * @return UserPerson + */ + private function extractUserPerson($response): UserPerson + { + $data = $this->getKeyFromResponse('UserPerson', $response); + $userPerson = new UserPerson($data); + + + return $userPerson; + } + + +} diff --git a/app/Services/Bunq/Request/InstallationTokenRequest.php b/app/Services/Bunq/Request/InstallationTokenRequest.php new file mode 100644 index 0000000000..829c5986e3 --- /dev/null +++ b/app/Services/Bunq/Request/InstallationTokenRequest.php @@ -0,0 +1,147 @@ + $this->publicKey,]; + $headers = $this->getDefaultHeaders(); + $response = $this->sendUnsignedBunqPost($uri, $data, $headers); + Log::debug('Installation request response', $response); + + $this->installationId = $this->extractInstallationId($response); + $this->serverPublicKey = $this->extractServerPublicKey($response); + $this->installationToken = $this->extractInstallationToken($response); + + Log::debug(sprintf('Installation ID: %s', serialize($this->installationId))); + Log::debug(sprintf('Installation token: %s', serialize($this->installationToken))); + Log::debug(sprintf('server public key: %s', serialize($this->serverPublicKey))); + + return; + } + + /** + * @return InstallationId + */ + public function getInstallationId(): InstallationId + { + return $this->installationId; + } + + /** + * @return InstallationToken + */ + public function getInstallationToken(): InstallationToken + { + return $this->installationToken; + } + + /** + * @return string + */ + public function getPublicKey(): string + { + return $this->publicKey; + } + + /** + * @param string $publicKey + */ + public function setPublicKey(string $publicKey) + { + $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 + * + * @return InstallationId + */ + private function extractInstallationId(array $response): InstallationId + { + $installationId = new InstallationId; + $data = $this->getKeyFromResponse('Id', $response); + $installationId->setId(intval($data['id'])); + + return $installationId; + + } + + /** + * @param array $response + * + * @return InstallationToken + */ + private function extractInstallationToken(array $response): InstallationToken + { + + $data = $this->getKeyFromResponse('Token', $response); + $installationToken = new InstallationToken($data); + + return $installationToken; + } + + /** + * @param array $response + * + * @return ServerPublicKey + */ + private function extractServerPublicKey(array $response): ServerPublicKey + { + $data = $this->getKeyFromResponse('ServerPublicKey', $response); + $serverPublicKey = new ServerPublicKey($data); + + return $serverPublicKey; + } +} diff --git a/app/Services/Bunq/Request/ListDeviceServerRequest.php b/app/Services/Bunq/Request/ListDeviceServerRequest.php new file mode 100644 index 0000000000..bfc7b7109f --- /dev/null +++ b/app/Services/Bunq/Request/ListDeviceServerRequest.php @@ -0,0 +1,73 @@ +devices = new Collection; + } + + /** + * + */ + public function call(): void + { + $uri = '/v1/device-server'; + $data = []; + $headers = $this->getDefaultHeaders(); + $headers['X-Bunq-Client-Authentication'] = $this->installationToken->getToken(); + $response = $this->sendSignedBunqGet($uri, $data, $headers); + + // create device server objects: + $raw = $this->getArrayFromResponse('DeviceServer', $response); + /** @var array $entry */ + foreach ($raw as $entry) { + $this->devices->push(new DeviceServer($entry)); + } + + return; + } + + /** + * @return Collection + */ + public function getDevices(): Collection + { + return $this->devices; + } + + /** + * @param InstallationToken $installationToken + */ + public function setInstallationToken(InstallationToken $installationToken) + { + $this->installationToken = $installationToken; + } +} diff --git a/app/Services/Bunq/Request/ListMonetaryAccountRequest.php b/app/Services/Bunq/Request/ListMonetaryAccountRequest.php new file mode 100644 index 0000000000..6378edff8c --- /dev/null +++ b/app/Services/Bunq/Request/ListMonetaryAccountRequest.php @@ -0,0 +1,79 @@ +monetaryAccounts = new Collection; + $uri = sprintf('/v1/user/%d/monetary-account', $this->userId); + $data = []; + $headers = $this->getDefaultHeaders(); + $headers['X-Bunq-Client-Authentication'] = $this->sessionToken->getToken(); + $response = $this->sendSignedBunqGet($uri, $data, $headers); + + // create device server objects: + $raw = $this->getArrayFromResponse('MonetaryAccountBank', $response); + foreach ($raw as $entry) { + $account = new MonetaryAccountBank($entry); + $this->monetaryAccounts->push($account); + } + + return; + } + + /** + * @return Collection + */ + public function getMonetaryAccounts(): Collection + { + return $this->monetaryAccounts; + } + + /** + * @param SessionToken $sessionToken + */ + public function setSessionToken(SessionToken $sessionToken) + { + $this->sessionToken = $sessionToken; + } + + /** + * @param int $userId + */ + public function setUserId(int $userId) + { + $this->userId = $userId; + } + +} diff --git a/app/Services/Bunq/Request/ListUserRequest.php b/app/Services/Bunq/Request/ListUserRequest.php new file mode 100644 index 0000000000..06acb45647 --- /dev/null +++ b/app/Services/Bunq/Request/ListUserRequest.php @@ -0,0 +1,90 @@ +getDefaultHeaders(); + $headers['X-Bunq-Client-Authentication'] = $this->sessionToken->getToken(); + $response = $this->sendSignedBunqGet($uri, $data, $headers); + + // create user objects: + $light = $this->getKeyFromResponse('UserLight', $response); + $company = $this->getKeyFromResponse('UserCompany', $response); + $person = $this->getKeyFromResponse('UserPerson', $response); + $this->userLight = new UserLight($light); + $this->userCompany = new UserCompany($company); + $this->userPerson = new UserPerson($person); + + return; + } + + /** + * @return UserCompany + */ + public function getUserCompany(): UserCompany + { + return $this->userCompany; + } + + /** + * @return UserLight + */ + public function getUserLight(): UserLight + { + return $this->userLight; + } + + /** + * @return UserPerson + */ + public function getUserPerson(): UserPerson + { + return $this->userPerson; + } + + + /** + * @param SessionToken $sessionToken + */ + public function setSessionToken(SessionToken $sessionToken) + { + $this->sessionToken = $sessionToken; + } +} diff --git a/app/Services/Bunq/Token/BunqToken.php b/app/Services/Bunq/Token/BunqToken.php new file mode 100644 index 0000000000..9f27fcbe92 --- /dev/null +++ b/app/Services/Bunq/Token/BunqToken.php @@ -0,0 +1,89 @@ +makeTokenFromResponse($response); + } + + /** + * @return Carbon + */ + public function getCreated(): Carbon + { + return $this->created; + } + + /** + * @return int + */ + public function getId(): int + { + return $this->id; + } + + /** + * @return string + */ + public function getToken(): string + { + return $this->token; + } + + /** + * @return Carbon + */ + public function getUpdated(): Carbon + { + return $this->updated; + } + + /** + * @param array $response + */ + protected function makeTokenFromResponse(array $response): void + { + $this->id = $response['id']; + $this->created = Carbon::createFromFormat('Y-m-d H:i:s.u', $response['created']); + $this->updated = Carbon::createFromFormat('Y-m-d H:i:s.u', $response['updated']); + $this->token = $response['token']; + + return; + } + +} diff --git a/app/Services/Bunq/Token/InstallationToken.php b/app/Services/Bunq/Token/InstallationToken.php new file mode 100644 index 0000000000..30bd7f5ac4 --- /dev/null +++ b/app/Services/Bunq/Token/InstallationToken.php @@ -0,0 +1,24 @@ +symbol . $space . $formatted; if (!$precedes) { - $result = $space . $formatted . $format->symbol; + $result = $formatted . $space . $format->symbol; } if ($coloured === true) { if ($amount > 0) { return sprintf('%s', $result); - } else { - if ($amount < 0) { - return sprintf('%s', $result); - } + } + if ($amount < 0) { + return sprintf('%s', $result); } return sprintf('%s', $result); @@ -194,14 +193,13 @@ class Amount $cache->addProperty('getCurrencySymbol'); if ($cache->has()) { return $cache->get(); // @codeCoverageIgnore - } else { - $currencyPreference = Prefs::get('currencyPreference', config('firefly.default_currency', 'EUR')); - $currency = TransactionCurrency::where('code', $currencyPreference->data)->first(); - - $cache->store($currency->symbol); - - return $currency->symbol; } + $currencyPreference = Prefs::get('currencyPreference', config('firefly.default_currency', 'EUR')); + $currency = TransactionCurrency::where('code', $currencyPreference->data)->first(); + + $cache->store($currency->symbol); + + return $currency->symbol; } /** @@ -300,6 +298,7 @@ class Amount public function transactionAmount(TransactionModel $transaction, bool $coloured = true): string { $amount = bcmul(app('steam')->positive(strval($transaction->transaction_amount)), '-1'); + $format = '%s'; if ($transaction->transaction_type_type === TransactionType::DEPOSIT) { @@ -322,7 +321,11 @@ class Amount if (!is_null($transaction->transaction_foreign_amount)) { - $amount = strval($transaction->transaction_foreign_amount); + $amount = bcmul(app('steam')->positive(strval($transaction->transaction_foreign_amount)), '-1'); + if ($transaction->transaction_type_type === TransactionType::DEPOSIT) { + $amount = bcmul($amount, '-1'); + } + if ($transaction->transaction_type_type === TransactionType::TRANSFER) { $amount = app('steam')->positive($amount); diff --git a/app/Support/FireflyConfig.php b/app/Support/FireflyConfig.php index 68f2323396..0f6801f017 100644 --- a/app/Support/FireflyConfig.php +++ b/app/Support/FireflyConfig.php @@ -100,14 +100,13 @@ class FireflyConfig Cache::forget('ff-config-' . $name); return $item; - } else { - Log::debug('Exists already ', ['name' => $name]); - $config->data = $value; - $config->save(); - Cache::forget('ff-config-' . $name); - - return $config; } + Log::debug('Exists already ', ['name' => $name]); + $config->data = $value; + $config->save(); + Cache::forget('ff-config-' . $name); + + return $config; } diff --git a/app/Support/Import/Information/BunqInformation.php b/app/Support/Import/Information/BunqInformation.php new file mode 100644 index 0000000000..dc1428e103 --- /dev/null +++ b/app/Support/Import/Information/BunqInformation.php @@ -0,0 +1,201 @@ +addProperty('bunq.get-accounts'); + $cache->addProperty(date('dmy h')); + if ($cache->has()) { + return $cache->get(); // @codeCoverageIgnore + } + Log::debug('Now in getAccounts()'); + $sessionToken = $this->startSession(); + $id = $this->getUserInformation($sessionToken); + // get list of Bunq accounts: + $accounts = $this->getMonetaryAccounts($sessionToken, $id); + $return = []; + /** @var MonetaryAccountBank $account */ + foreach ($accounts as $account) { + + $current = [ + 'id' => $account->getId(), + 'name' => $account->getDescription(), + 'currency' => $account->getCurrency(), + 'balance' => $account->getBalance()->getValue(), + 'color' => $account->getSetting()->getColor(), + ]; + /** @var Alias $alias */ + foreach ($account->getAliases() as $alias) { + if ($alias->getType() === 'IBAN') { + $current['number'] = $alias->getValue(); + } + } + $return[] = $current; + } + $cache->store($return); + + $this->closeSession($sessionToken); + + return $return; + } + + /** + * Set the user for this Prerequisites-routine. Class is expected to implement and save this. + * + * @param User $user + */ + public function setUser(User $user): void + { + $this->user = $user; + } + + /** + * @param SessionToken $sessionToken + */ + private function closeSession(SessionToken $sessionToken): void + { + Log::debug('Going to close session'); + $apiKey = Preferences::getForUser($this->user, 'bunq_api_key')->data; + $serverPublicKey = Preferences::getForUser($this->user, 'bunq_server_public_key')->data; + $privateKey = Preferences::getForUser($this->user, 'bunq_private_key')->data; + $request = new DeleteDeviceSessionRequest(); + $request->setSecret($apiKey); + $request->setPrivateKey($privateKey); + $request->setServerPublicKey($serverPublicKey); + $request->setSessionToken($sessionToken); + $request->call(); + + return; + } + + /** + * @param SessionToken $sessionToken + * @param int $userId + * + * @return Collection + */ + private function getMonetaryAccounts(SessionToken $sessionToken, int $userId): Collection + { + $apiKey = Preferences::getForUser($this->user, 'bunq_api_key')->data; + $serverPublicKey = Preferences::getForUser($this->user, 'bunq_server_public_key')->data; + $privateKey = Preferences::getForUser($this->user, 'bunq_private_key')->data; + $request = new ListMonetaryAccountRequest; + + $request->setSessionToken($sessionToken); + $request->setSecret($apiKey); + $request->setServerPublicKey($serverPublicKey); + $request->setPrivateKey($privateKey); + $request->setUserId($userId); + $request->call(); + + return $request->getMonetaryAccounts(); + + } + + /** + * @param SessionToken $sessionToken + * + * @return int + * @throws FireflyException + */ + private function getUserInformation(SessionToken $sessionToken): int + { + $apiKey = Preferences::getForUser($this->user, 'bunq_api_key')->data; + $serverPublicKey = Preferences::getForUser($this->user, 'bunq_server_public_key')->data; + $privateKey = Preferences::getForUser($this->user, 'bunq_private_key')->data; + $request = new ListUserRequest; + $request->setSessionToken($sessionToken); + $request->setSecret($apiKey); + $request->setServerPublicKey($serverPublicKey); + $request->setPrivateKey($privateKey); + $request->call(); + // return the first that isn't null? + $company = $request->getUserCompany(); + if ($company->getId() > 0) { + return $company->getId(); + } + $user = $request->getUserPerson(); + if ($user->getId() > 0) { + return $user->getId(); + } + throw new FireflyException('Expected user or company from Bunq, but got neither.'); + } + + /** + * @return SessionToken + */ + private function startSession(): SessionToken + { + Log::debug('Now in startSession.'); + $apiKey = Preferences::getForUser($this->user, 'bunq_api_key')->data; + $serverPublicKey = Preferences::getForUser($this->user, 'bunq_server_public_key')->data; + $privateKey = Preferences::getForUser($this->user, 'bunq_private_key')->data; + $installationToken = Preferences::getForUser($this->user, 'bunq_installation_token')->data; + $request = new DeviceSessionRequest(); + $request->setSecret($apiKey); + $request->setServerPublicKey($serverPublicKey); + $request->setPrivateKey($privateKey); + $request->setInstallationToken($installationToken); + $request->call(); + $sessionToken = $request->getSessionToken(); + Log::debug(sprintf('Now have got session token: %s', serialize($sessionToken))); + + return $sessionToken; + } +} diff --git a/app/Support/Import/Information/InformationInterface.php b/app/Support/Import/Information/InformationInterface.php new file mode 100644 index 0000000000..980703e26a --- /dev/null +++ b/app/Support/Import/Information/InformationInterface.php @@ -0,0 +1,48 @@ +user, 'bunq_api_key', false); - return ($apiKey->data === false); + + return ($apiKey->data === false || is_null($apiKey->data)); } /** @@ -68,4 +83,245 @@ class BunqPrerequisites implements PrerequisitesInterface return; } + + /** + * This method responds to the user's submission of an API key. It tries to register this instance as a new Firefly III device. + * If this fails, the error is returned in a message bag and the user is notified (this is fairly friendly). + * + * @param Request $request + * + * @return MessageBag + */ + public function storePrerequisites(Request $request): MessageBag + { + $apiKey = $request->get('api_key'); + Log::debug('Storing bunq API key'); + Preferences::setForUser($this->user, 'bunq_api_key', $apiKey); + // register Firefly III as a new device. + $serverId = null; + $messages = new MessageBag; + try { + $serverId = $this->registerDevice(); + Log::debug(sprintf('Found device server with id %d', $serverId->getId())); + } catch (FireflyException $e) { + $messages->add('error', $e->getMessage()); + } + + return $messages; + } + + /** + * This method creates a new public/private keypair for the user. This isn't really secure, since the key is generated on the fly with + * no regards for HSM's, smart cards or other things. It would require some low level programming to get this right. But the private key + * is stored encrypted in the database so it's something. + */ + private function createKeyPair(): void + { + Log::debug('Generate new key pair for user.'); + $keyConfig = [ + "digest_alg" => "sha512", + "private_key_bits" => 2048, + "private_key_type" => OPENSSL_KEYTYPE_RSA, + ]; + // Create the private and public key + $res = openssl_pkey_new($keyConfig); + + // Extract the private key from $res to $privKey + $privKey = ''; + openssl_pkey_export($res, $privKey); + + // Extract the public key from $res to $pubKey + $pubKey = openssl_pkey_get_details($res); + + Preferences::setForUser($this->user, 'bunq_private_key', $privKey); + Preferences::setForUser($this->user, 'bunq_public_key', $pubKey['key']); + Log::debug('Created key pair'); + + return; + + } + + /** + * When the device server cannot be registered for some reason (when previous attempts failed to be stored) this method can be used + * to try and detect the server ID for this firefly instance. + * + * @return DeviceServerId + * @throws FireflyException + */ + private function getExistingDevice(): DeviceServerId + { + $installationToken = $this->getInstallationToken(); + $serverPublicKey = $this->getServerPublicKey(); + $request = new ListDeviceServerRequest; + $remoteIp = $this->getRemoteIp(); + $request->setInstallationToken($installationToken); + $request->setServerPublicKey($serverPublicKey); + $request->setPrivateKey($this->getPrivateKey()); + $request->call(); + $devices = $request->getDevices(); + /** @var DeviceServer $device */ + foreach ($devices as $device) { + if ($device->getIp() === $remoteIp) { + return $device->getId(); + } + } + throw new FireflyException('Cannot find existing Server Device that can be used by this instance of Firefly III.'); + } + + /** + * Get the installation token, either from the users preferences or from Bunq. + * + * @return InstallationToken + */ + private function getInstallationToken(): InstallationToken + { + Log::debug('Get installation token.'); + $token = Preferences::getForUser($this->user, 'bunq_installation_token', null); + if (!is_null($token)) { + return $token->data; + } + Log::debug('Have no token, request one.'); + + // verify bunq api code: + $publicKey = $this->getPublicKey(); + $request = new InstallationTokenRequest; + $request->setPublicKey($publicKey); + $request->call(); + Log::debug('Sent request'); + + $installationToken = $request->getInstallationToken(); + $installationId = $request->getInstallationId(); + $serverPublicKey = $request->getServerPublicKey(); + + Preferences::setForUser($this->user, 'bunq_installation_token', $installationToken); + Preferences::setForUser($this->user, 'bunq_installation_id', $installationId); + Preferences::setForUser($this->user, 'bunq_server_public_key', $serverPublicKey); + + return $installationToken; + } + + /** + * Get the private key from the users preferences. + * + * @return string + */ + private function getPrivateKey(): string + { + Log::debug('get private key'); + $preference = Preferences::getForUser($this->user, 'bunq_private_key', null); + if (is_null($preference)) { + Log::debug('private key is null'); + // create key pair + $this->createKeyPair(); + } + $preference = Preferences::getForUser($this->user, 'bunq_private_key', null); + Log::debug('Return private key for user'); + + return $preference->data; + } + + /** + * Get a public key from the users preferences. + * + * @return string + */ + private function getPublicKey(): string + { + Log::debug('get public key'); + $preference = Preferences::getForUser($this->user, 'bunq_public_key', null); + if (is_null($preference)) { + Log::debug('public key is null'); + // create key pair + $this->createKeyPair(); + } + $preference = Preferences::getForUser($this->user, 'bunq_public_key', null); + Log::debug('Return public key for user'); + + return $preference->data; + } + + /** + * Request users server remote IP. Let's assume this value will not change any time soon. + * + * @return string + * @throws FireflyException + */ + private function getRemoteIp(): string + { + $preference = Preferences::getForUser($this->user, 'external_ip', null); + if (is_null($preference)) { + try { + $response = Requests::get('https://api.ipify.org'); + } catch (Requests_Exception $e) { + throw new FireflyException(sprintf('Could not retrieve external IP: %s', $e->getMessage())); + } + 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); + + return $ip; + } + + return $preference->data; + } + + /** + * Get the public key of the server, necessary to verify server signature. + * + * @return ServerPublicKey + */ + private function getServerPublicKey(): ServerPublicKey + { + return Preferences::getForUser($this->user, 'bunq_server_public_key', null)->data; + } + + /** + * To install Firefly III as a new device: + * - Send an installation token request. + * - Use this token to send a device server request + * - Store the installation token + * - Use the installation token each time we need a session. + */ + private function registerDevice(): DeviceServerId + { + Log::debug('Now in registerDevice'); + $deviceServerId = Preferences::getForUser($this->user, 'bunq_device_server_id', null); + $serverIp = $this->getRemoteIp(); + if (!is_null($deviceServerId)) { + Log::debug('Have device server ID.'); + + return $deviceServerId->data; + } + Log::debug('Device server id is null, do register.'); + $installationToken = $this->getInstallationToken(); + $serverPublicKey = $this->getServerPublicKey(); + $apiKey = Preferences::getForUser($this->user, 'bunq_api_key', ''); + $request = new DeviceServerRequest; + $request->setPrivateKey($this->getPrivateKey()); + $request->setDescription('Firefly III v' . config('firefly.version') . ' for ' . $this->user->email); + $request->setSecret($apiKey->data); + $request->setPermittedIps([$serverIp]); + $request->setInstallationToken($installationToken); + $request->setServerPublicKey($serverPublicKey); + $deviceServerId = null; + // try to register device: + try { + $request->call(); + $deviceServerId = $request->getDeviceServerId(); + } catch (FireflyException $e) { + Log::error($e->getMessage()); + } + if (is_null($deviceServerId)) { + // try get the current from a list: + $deviceServerId = $this->getExistingDevice(); + } + + Preferences::setForUser($this->user, 'bunq_device_server_id', $deviceServerId); + Log::debug(sprintf('Server ID: %s', serialize($deviceServerId))); + + return $deviceServerId; + } + } diff --git a/app/Support/Import/Prerequisites/PrerequisitesInterface.php b/app/Support/Import/Prerequisites/PrerequisitesInterface.php index 803ee90e7e..03c62fc910 100644 --- a/app/Support/Import/Prerequisites/PrerequisitesInterface.php +++ b/app/Support/Import/Prerequisites/PrerequisitesInterface.php @@ -13,6 +13,8 @@ namespace FireflyIII\Support\Import\Prerequisites; use FireflyIII\User; +use Illuminate\Http\Request; +use Illuminate\Support\MessageBag; interface PrerequisitesInterface { @@ -44,4 +46,11 @@ interface PrerequisitesInterface * @param User $user */ public function setUser(User $user): void; + + /** + * @param Request $request + * + * @return MessageBag + */ + public function storePrerequisites(Request $request): MessageBag; } diff --git a/app/Support/Search/Search.php b/app/Support/Search/Search.php index 9d9a575928..55dea965d2 100644 --- a/app/Support/Search/Search.php +++ b/app/Support/Search/Search.php @@ -107,12 +107,12 @@ class Search implements SearchInterface do { /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); - $collector->setAllAssetAccounts()->setLimit($pageSize)->setPage($page); + $collector->setAllAssetAccounts()->setLimit($pageSize)->setPage($page)->withOpposingAccount(); if ($this->hasModifiers()) { $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); } $collector->removeFilter(InternalTransferFilter::class); - $set = $collector->getPaginatedJournals()->getCollection(); + $set = $collector->getPaginatedJournals()->getCollection(); Log::debug(sprintf('Found %d journals to check. ', $set->count())); @@ -236,7 +236,7 @@ class Search implements SearchInterface return false; } foreach ($needle as $what) { - if (strpos($haystack, $what) !== false) { + if (stripos($haystack, $what) !== false) { return true; } } diff --git a/app/Support/Twig/AmountFormat.php b/app/Support/Twig/AmountFormat.php index 55e5c28942..3f9cd2ebcf 100644 --- a/app/Support/Twig/AmountFormat.php +++ b/app/Support/Twig/AmountFormat.php @@ -46,6 +46,7 @@ class AmountFormat extends Twig_Extension { return [ $this->formatAmountByAccount(), + $this->formatAmountBySymbol(), $this->transactionAmount(), $this->journalAmount(), $this->formatDestinationAfter(), @@ -125,6 +126,27 @@ class AmountFormat extends Twig_Extension ); } + /** + * Will format the amount by the currency related to the given account. + * + * @return Twig_SimpleFunction + */ + protected function formatAmountBySymbol(): Twig_SimpleFunction + { + return new Twig_SimpleFunction( + 'formatAmountBySymbol', function (string $amount, string $symbol, int $decimalPlaces = 2, bool $coloured = true): string { + + $currency = new TransactionCurrency; + $currency->symbol = $symbol; + $currency->decimal_places = $decimalPlaces; + + return app('amount')->formatAnything($currency, $amount, $coloured); + + + }, ['is_safe' => ['html']] + ); + } + /** * @return Twig_SimpleFilter */ diff --git a/app/Support/Twig/General.php b/app/Support/Twig/General.php index c027514019..f4c1e319b3 100644 --- a/app/Support/Twig/General.php +++ b/app/Support/Twig/General.php @@ -61,6 +61,7 @@ class General extends Twig_Extension $this->steamPositive(), $this->activeRoutePartial(), $this->activeRoutePartialWhat(), + ]; } diff --git a/app/Support/Twig/Rule.php b/app/Support/Twig/Rule.php index 9924e6f7a0..42efe5a2b6 100644 --- a/app/Support/Twig/Rule.php +++ b/app/Support/Twig/Rule.php @@ -39,6 +39,7 @@ class Rule extends Twig_Extension $possibleActions[$key] = trans('firefly.rule_action_' . $key . '_choice'); } unset($key, $ruleActions); + asort($possibleActions); return $possibleActions; } @@ -75,6 +76,7 @@ class Rule extends Twig_Extension } } unset($key, $ruleTriggers); + asort($possibleTriggers); return $possibleTriggers; } diff --git a/app/Support/Twig/Translation.php b/app/Support/Twig/Translation.php index a01b616bd6..40ce29ebdb 100644 --- a/app/Support/Twig/Translation.php +++ b/app/Support/Twig/Translation.php @@ -15,6 +15,7 @@ namespace FireflyIII\Support\Twig; use Twig_Extension; use Twig_SimpleFilter; +use Twig_SimpleFunction; /** * @@ -43,6 +44,19 @@ class Translation extends Twig_Extension return $filters; } + + /** + * {@inheritDoc} + */ + public function getFunctions(): array + { + return [ + $this->journalLinkTranslation(), + + ]; + + } + /** * {@inheritDoc} */ @@ -50,4 +64,24 @@ class Translation extends Twig_Extension { return 'FireflyIII\Support\Twig\Translation'; } + + /** + * @return Twig_SimpleFunction + */ + public function journalLinkTranslation(): Twig_SimpleFunction + { + return new Twig_SimpleFunction( + 'journalLinkTranslation', function (int $linkTypeId, string $direction, string $original) { + $key = sprintf('firefly.%d_%s', $linkTypeId, $direction); + $translation = trans($key); + if ($key === $translation) { + return $original; + } + + return $translation; + + + }, ['is_safe' => ['html']] + ); + } } diff --git a/app/Validation/FireflyValidator.php b/app/Validation/FireflyValidator.php index 62f6747123..ef16f8787b 100644 --- a/app/Validation/FireflyValidator.php +++ b/app/Validation/FireflyValidator.php @@ -387,7 +387,7 @@ class FireflyValidator extends Validator $exclude = $parameters[2] ?? 0; // get entries from table - $set = DB::table($table)->where('user_id', auth()->user()->id) + $set = DB::table($table)->where('user_id', auth()->user()->id)->whereNull('deleted_at') ->where('id', '!=', $exclude)->get([$field]); foreach ($set as $entry) { diff --git a/composer.lock b/composer.lock index a405cfb5a7..bac94be3f2 100644 --- a/composer.lock +++ b/composer.lock @@ -220,16 +220,16 @@ }, { "name": "doctrine/cache", - "version": "v1.7.0", + "version": "v1.7.1", "source": { "type": "git", "url": "https://github.com/doctrine/cache.git", - "reference": "53d9518ffeb019c51d542ff60cb578f076d3ff16" + "reference": "b3217d58609e9c8e661cd41357a54d926c4a2a1a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/cache/zipball/53d9518ffeb019c51d542ff60cb578f076d3ff16", - "reference": "53d9518ffeb019c51d542ff60cb578f076d3ff16", + "url": "https://api.github.com/repos/doctrine/cache/zipball/b3217d58609e9c8e661cd41357a54d926c4a2a1a", + "reference": "b3217d58609e9c8e661cd41357a54d926c4a2a1a", "shasum": "" }, "require": { @@ -290,7 +290,7 @@ "cache", "caching" ], - "time": "2017-07-22T13:00:15+00:00" + "time": "2017-08-25T07:02:50+00:00" }, { "name": "doctrine/collections", @@ -361,16 +361,16 @@ }, { "name": "doctrine/common", - "version": "v2.8.0", + "version": "v2.8.1", "source": { "type": "git", "url": "https://github.com/doctrine/common.git", - "reference": "ed349f953d443963c590b008b37b864b8a3c4b21" + "reference": "f68c297ce6455e8fd794aa8ffaf9fa458f6ade66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/common/zipball/ed349f953d443963c590b008b37b864b8a3c4b21", - "reference": "ed349f953d443963c590b008b37b864b8a3c4b21", + "url": "https://api.github.com/repos/doctrine/common/zipball/f68c297ce6455e8fd794aa8ffaf9fa458f6ade66", + "reference": "f68c297ce6455e8fd794aa8ffaf9fa458f6ade66", "shasum": "" }, "require": { @@ -430,20 +430,20 @@ "persistence", "spl" ], - "time": "2017-07-22T09:01:43+00:00" + "time": "2017-08-31T08:43:38+00:00" }, { "name": "doctrine/dbal", - "version": "v2.6.1", + "version": "v2.6.2", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "1a086f853425b1f5349775ce57e45a772d2d2ba5" + "reference": "1a4ee83a5a709555f2c6f9057a3aacf892451c7e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/1a086f853425b1f5349775ce57e45a772d2d2ba5", - "reference": "1a086f853425b1f5349775ce57e45a772d2d2ba5", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/1a4ee83a5a709555f2c6f9057a3aacf892451c7e", + "reference": "1a4ee83a5a709555f2c6f9057a3aacf892451c7e", "shasum": "" }, "require": { @@ -503,37 +503,37 @@ "persistence", "queryobject" ], - "time": "2017-07-28T10:40:18+00:00" + "time": "2017-08-28T11:02:56+00:00" }, { "name": "doctrine/inflector", - "version": "v1.1.0", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "90b2128806bfde671b6952ab8bea493942c1fdae" + "reference": "e11d84c6e018beedd929cff5220969a3c6d1d462" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/90b2128806bfde671b6952ab8bea493942c1fdae", - "reference": "90b2128806bfde671b6952ab8bea493942c1fdae", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/e11d84c6e018beedd929cff5220969a3c6d1d462", + "reference": "e11d84c6e018beedd929cff5220969a3c6d1d462", "shasum": "" }, "require": { - "php": ">=5.3.2" + "php": "^7.0" }, "require-dev": { - "phpunit/phpunit": "4.*" + "phpunit/phpunit": "^6.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1.x-dev" + "dev-master": "1.2.x-dev" } }, "autoload": { - "psr-0": { - "Doctrine\\Common\\Inflector\\": "lib/" + "psr-4": { + "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector" } }, "notification-url": "https://packagist.org/downloads/", @@ -570,7 +570,7 @@ "singularize", "string" ], - "time": "2015-11-06T14:35:42+00:00" + "time": "2017-07-22T12:18:28+00:00" }, { "name": "doctrine/lexer", @@ -670,20 +670,20 @@ }, { "name": "laravel/framework", - "version": "v5.4.32", + "version": "v5.4.36", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "b8300578d159199b1195413b67318c79068cd24d" + "reference": "1062a22232071c3e8636487c86ec1ae75681bbf9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/b8300578d159199b1195413b67318c79068cd24d", - "reference": "b8300578d159199b1195413b67318c79068cd24d", + "url": "https://api.github.com/repos/laravel/framework/zipball/1062a22232071c3e8636487c86ec1ae75681bbf9", + "reference": "1062a22232071c3e8636487c86ec1ae75681bbf9", "shasum": "" }, "require": { - "doctrine/inflector": "~1.1.0", + "doctrine/inflector": "~1.1", "erusev/parsedown": "~1.6", "ext-mbstring": "*", "ext-openssl": "*", @@ -795,20 +795,20 @@ "framework", "laravel" ], - "time": "2017-08-03T12:59:42+00:00" + "time": "2017-08-30T09:26:16+00:00" }, { "name": "laravelcollective/html", - "version": "v5.4.8", + "version": "v5.4.9", "source": { "type": "git", "url": "https://github.com/LaravelCollective/html.git", - "reference": "9b8f51e7a2368911c896f5d42757886bae0717b5" + "reference": "f04965dc688254f4c77f684ab0b42264f9eb9634" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/LaravelCollective/html/zipball/9b8f51e7a2368911c896f5d42757886bae0717b5", - "reference": "9b8f51e7a2368911c896f5d42757886bae0717b5", + "url": "https://api.github.com/repos/LaravelCollective/html/zipball/f04965dc688254f4c77f684ab0b42264f9eb9634", + "reference": "f04965dc688254f4c77f684ab0b42264f9eb9634", "shasum": "" }, "require": { @@ -849,7 +849,7 @@ ], "description": "HTML and Form Builders for the Laravel Framework", "homepage": "http://laravelcollective.com", - "time": "2017-05-22T06:35:07+00:00" + "time": "2017-08-12T15:52:38+00:00" }, { "name": "league/commonmark", @@ -1475,21 +1475,21 @@ }, { "name": "rcrowe/twigbridge", - "version": "v0.9.4", + "version": "v0.9.5", "source": { "type": "git", "url": "https://github.com/rcrowe/TwigBridge.git", - "reference": "effda159c436b08eae1a9d9ba3d28bee8f7b0f3f" + "reference": "0a0784c6fb4d383bceebd7ee4f8a2dcac15df5cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rcrowe/TwigBridge/zipball/effda159c436b08eae1a9d9ba3d28bee8f7b0f3f", - "reference": "effda159c436b08eae1a9d9ba3d28bee8f7b0f3f", + "url": "https://api.github.com/repos/rcrowe/TwigBridge/zipball/0a0784c6fb4d383bceebd7ee4f8a2dcac15df5cf", + "reference": "0a0784c6fb4d383bceebd7ee4f8a2dcac15df5cf", "shasum": "" }, "require": { - "illuminate/support": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*", - "illuminate/view": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*", + "illuminate/support": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*|5.5.*", + "illuminate/view": "5.0.*|5.1.*|5.2.*|5.3.*|5.4.*|5.5.*", "php": ">=5.4.0", "twig/twig": "~1.30" }, @@ -1535,7 +1535,7 @@ "laravel", "twig" ], - "time": "2017-01-21T14:33:47+00:00" + "time": "2017-08-28T11:57:12+00:00" }, { "name": "rmccue/requests", @@ -1642,20 +1642,20 @@ }, { "name": "symfony/console", - "version": "v3.3.6", + "version": "v3.3.8", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "b0878233cb5c4391347e5495089c7af11b8e6201" + "reference": "d6596cb5022b6a0bd940eae54a1de78646a5fda6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/b0878233cb5c4391347e5495089c7af11b8e6201", - "reference": "b0878233cb5c4391347e5495089c7af11b8e6201", + "url": "https://api.github.com/repos/symfony/console/zipball/d6596cb5022b6a0bd940eae54a1de78646a5fda6", + "reference": "d6596cb5022b6a0bd940eae54a1de78646a5fda6", "shasum": "" }, "require": { - "php": ">=5.5.9", + "php": "^5.5.9|>=7.0.8", "symfony/debug": "~2.8|~3.0", "symfony/polyfill-mbstring": "~1.0" }, @@ -1668,7 +1668,6 @@ "symfony/dependency-injection": "~3.3", "symfony/event-dispatcher": "~2.8|~3.0", "symfony/filesystem": "~2.8|~3.0", - "symfony/http-kernel": "~2.8|~3.0", "symfony/process": "~2.8|~3.0" }, "suggest": { @@ -1707,7 +1706,7 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2017-07-29T21:27:59+00:00" + "time": "2017-08-27T14:52:21+00:00" }, { "name": "symfony/css-selector", @@ -1764,20 +1763,20 @@ }, { "name": "symfony/debug", - "version": "v3.3.6", + "version": "v3.3.8", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "7c13ae8ce1e2adbbd574fc39de7be498e1284e13" + "reference": "084d804fe35808eb2ef596ec83d85d9768aa6c9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/7c13ae8ce1e2adbbd574fc39de7be498e1284e13", - "reference": "7c13ae8ce1e2adbbd574fc39de7be498e1284e13", + "url": "https://api.github.com/repos/symfony/debug/zipball/084d804fe35808eb2ef596ec83d85d9768aa6c9d", + "reference": "084d804fe35808eb2ef596ec83d85d9768aa6c9d", "shasum": "" }, "require": { - "php": ">=5.5.9", + "php": "^5.5.9|>=7.0.8", "psr/log": "~1.0" }, "conflict": { @@ -1816,11 +1815,11 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2017-07-28T15:27:31+00:00" + "time": "2017-08-27T14:52:21+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v2.8.26", + "version": "v2.8.27", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", @@ -1880,20 +1879,20 @@ }, { "name": "symfony/finder", - "version": "v3.3.6", + "version": "v3.3.8", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "baea7f66d30854ad32988c11a09d7ffd485810c4" + "reference": "b2260dbc80f3c4198f903215f91a1ac7fe9fe09e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/baea7f66d30854ad32988c11a09d7ffd485810c4", - "reference": "baea7f66d30854ad32988c11a09d7ffd485810c4", + "url": "https://api.github.com/repos/symfony/finder/zipball/b2260dbc80f3c4198f903215f91a1ac7fe9fe09e", + "reference": "b2260dbc80f3c4198f903215f91a1ac7fe9fe09e", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": "^5.5.9|>=7.0.8" }, "type": "library", "extra": { @@ -1925,24 +1924,24 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2017-06-01T21:01:25+00:00" + "time": "2017-07-29T21:54:42+00:00" }, { "name": "symfony/http-foundation", - "version": "v3.3.6", + "version": "v3.3.8", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "49e8cd2d59a7aa9bfab19e46de680c76e500a031" + "reference": "14bacad23a4f075bfd3fd456755236cb261320e3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/49e8cd2d59a7aa9bfab19e46de680c76e500a031", - "reference": "49e8cd2d59a7aa9bfab19e46de680c76e500a031", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/14bacad23a4f075bfd3fd456755236cb261320e3", + "reference": "14bacad23a4f075bfd3fd456755236cb261320e3", "shasum": "" }, "require": { - "php": ">=5.5.9", + "php": "^5.5.9|>=7.0.8", "symfony/polyfill-mbstring": "~1.1" }, "require-dev": { @@ -1978,7 +1977,7 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2017-07-21T11:04:46+00:00" + "time": "2017-08-10T07:07:06+00:00" }, { "name": "symfony/http-kernel", @@ -2067,16 +2066,16 @@ }, { "name": "symfony/polyfill-mbstring", - "version": "v1.4.0", + "version": "v1.5.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "f29dca382a6485c3cbe6379f0c61230167681937" + "reference": "7c8fae0ac1d216eb54349e6a8baa57d515fe8803" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/f29dca382a6485c3cbe6379f0c61230167681937", - "reference": "f29dca382a6485c3cbe6379f0c61230167681937", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7c8fae0ac1d216eb54349e6a8baa57d515fe8803", + "reference": "7c8fae0ac1d216eb54349e6a8baa57d515fe8803", "shasum": "" }, "require": { @@ -2088,7 +2087,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4-dev" + "dev-master": "1.5-dev" } }, "autoload": { @@ -2122,20 +2121,20 @@ "portable", "shim" ], - "time": "2017-06-09T14:24:12+00:00" + "time": "2017-06-14T15:44:48+00:00" }, { "name": "symfony/polyfill-php56", - "version": "v1.4.0", + "version": "v1.5.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php56.git", - "reference": "bc0b7d6cb36b10cfabb170a3e359944a95174929" + "reference": "e85ebdef569b84e8709864e1a290c40f156b30ca" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/bc0b7d6cb36b10cfabb170a3e359944a95174929", - "reference": "bc0b7d6cb36b10cfabb170a3e359944a95174929", + "url": "https://api.github.com/repos/symfony/polyfill-php56/zipball/e85ebdef569b84e8709864e1a290c40f156b30ca", + "reference": "e85ebdef569b84e8709864e1a290c40f156b30ca", "shasum": "" }, "require": { @@ -2145,7 +2144,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4-dev" + "dev-master": "1.5-dev" } }, "autoload": { @@ -2178,20 +2177,20 @@ "portable", "shim" ], - "time": "2017-06-09T08:25:21+00:00" + "time": "2017-06-14T15:44:48+00:00" }, { "name": "symfony/polyfill-util", - "version": "v1.4.0", + "version": "v1.5.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-util.git", - "reference": "ebccbde4aad410f6438d86d7d261c6b4d2b9a51d" + "reference": "67925d1cf0b84bd234a83bebf26d4eb281744c6d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/ebccbde4aad410f6438d86d7d261c6b4d2b9a51d", - "reference": "ebccbde4aad410f6438d86d7d261c6b4d2b9a51d", + "url": "https://api.github.com/repos/symfony/polyfill-util/zipball/67925d1cf0b84bd234a83bebf26d4eb281744c6d", + "reference": "67925d1cf0b84bd234a83bebf26d4eb281744c6d", "shasum": "" }, "require": { @@ -2200,7 +2199,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.4-dev" + "dev-master": "1.5-dev" } }, "autoload": { @@ -2230,24 +2229,24 @@ "polyfill", "shim" ], - "time": "2017-06-09T08:25:21+00:00" + "time": "2017-07-05T15:09:33+00:00" }, { "name": "symfony/process", - "version": "v3.3.6", + "version": "v3.3.8", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "07432804942b9f6dd7b7377faf9920af5f95d70a" + "reference": "b7666e9b438027a1ea0e1ee813ec5042d5d7f6f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/07432804942b9f6dd7b7377faf9920af5f95d70a", - "reference": "07432804942b9f6dd7b7377faf9920af5f95d70a", + "url": "https://api.github.com/repos/symfony/process/zipball/b7666e9b438027a1ea0e1ee813ec5042d5d7f6f0", + "reference": "b7666e9b438027a1ea0e1ee813ec5042d5d7f6f0", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": "^5.5.9|>=7.0.8" }, "type": "library", "extra": { @@ -2279,24 +2278,24 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2017-07-13T13:05:09+00:00" + "time": "2017-07-29T21:54:42+00:00" }, { "name": "symfony/routing", - "version": "v3.3.6", + "version": "v3.3.8", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "4aee1a917fd4859ff8b51b9fd1dfb790a5ecfa26" + "reference": "970326dcd04522e1cd1fe128abaee54c225e27f9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/4aee1a917fd4859ff8b51b9fd1dfb790a5ecfa26", - "reference": "4aee1a917fd4859ff8b51b9fd1dfb790a5ecfa26", + "url": "https://api.github.com/repos/symfony/routing/zipball/970326dcd04522e1cd1fe128abaee54c225e27f9", + "reference": "970326dcd04522e1cd1fe128abaee54c225e27f9", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": "^5.5.9|>=7.0.8" }, "conflict": { "symfony/config": "<2.8", @@ -2357,24 +2356,24 @@ "uri", "url" ], - "time": "2017-07-21T17:43:13+00:00" + "time": "2017-07-29T21:54:42+00:00" }, { "name": "symfony/translation", - "version": "v3.3.6", + "version": "v3.3.8", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "35dd5fb003c90e8bd4d8cabdf94bf9c96d06fdc3" + "reference": "add53753d978f635492dfe8cd6953f6a7361ef90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/35dd5fb003c90e8bd4d8cabdf94bf9c96d06fdc3", - "reference": "35dd5fb003c90e8bd4d8cabdf94bf9c96d06fdc3", + "url": "https://api.github.com/repos/symfony/translation/zipball/add53753d978f635492dfe8cd6953f6a7361ef90", + "reference": "add53753d978f635492dfe8cd6953f6a7361ef90", "shasum": "" }, "require": { - "php": ">=5.5.9", + "php": "^5.5.9|>=7.0.8", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { @@ -2422,24 +2421,24 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2017-06-24T16:45:30+00:00" + "time": "2017-07-29T21:54:42+00:00" }, { "name": "symfony/var-dumper", - "version": "v3.3.6", + "version": "v3.3.8", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "b2623bccb969ad595c2090f9be498b74670d0663" + "reference": "89fcb5a73e0ede2be2512234c4e40457bb22b35f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/b2623bccb969ad595c2090f9be498b74670d0663", - "reference": "b2623bccb969ad595c2090f9be498b74670d0663", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/89fcb5a73e0ede2be2512234c4e40457bb22b35f", + "reference": "89fcb5a73e0ede2be2512234c4e40457bb22b35f", "shasum": "" }, "require": { - "php": ">=5.5.9", + "php": "^5.5.9|>=7.0.8", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { @@ -2490,7 +2489,7 @@ "debug", "dump" ], - "time": "2017-07-28T06:06:09+00:00" + "time": "2017-08-27T14:52:21+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -2652,16 +2651,16 @@ }, { "name": "watson/validating", - "version": "3.0.1", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/dwightwatson/validating.git", - "reference": "3cef5b4cd0af2dc26d2c7ca668bd12f4d4ab421b" + "reference": "c6e9194b034a24d3b6e447bbc7a94d88fad9a1fd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dwightwatson/validating/zipball/3cef5b4cd0af2dc26d2c7ca668bd12f4d4ab421b", - "reference": "3cef5b4cd0af2dc26d2c7ca668bd12f4d4ab421b", + "url": "https://api.github.com/repos/dwightwatson/validating/zipball/c6e9194b034a24d3b6e447bbc7a94d88fad9a1fd", + "reference": "c6e9194b034a24d3b6e447bbc7a94d88fad9a1fd", "shasum": "" }, "require": { @@ -2698,7 +2697,7 @@ "laravel", "validation" ], - "time": "2016-10-31T21:53:17+00:00" + "time": "2017-08-25T02:12:38+00:00" } ], "packages-dev": [ @@ -2929,29 +2928,31 @@ }, { "name": "fzaninotto/faker", - "version": "v1.6.0", + "version": "v1.7.1", "source": { "type": "git", "url": "https://github.com/fzaninotto/Faker.git", - "reference": "44f9a286a04b80c76a4e5fb7aad8bb539b920123" + "reference": "d3ed4cc37051c1ca52d22d76b437d14809fc7e0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/44f9a286a04b80c76a4e5fb7aad8bb539b920123", - "reference": "44f9a286a04b80c76a4e5fb7aad8bb539b920123", + "url": "https://api.github.com/repos/fzaninotto/Faker/zipball/d3ed4cc37051c1ca52d22d76b437d14809fc7e0d", + "reference": "d3ed4cc37051c1ca52d22d76b437d14809fc7e0d", "shasum": "" }, "require": { - "php": "^5.3.3|^7.0" + "php": "^5.3.3 || ^7.0" }, "require-dev": { "ext-intl": "*", - "phpunit/phpunit": "~4.0", - "squizlabs/php_codesniffer": "~1.5" + "phpunit/phpunit": "^4.0 || ^5.0", + "squizlabs/php_codesniffer": "^1.5" }, "type": "library", "extra": { - "branch-alias": [] + "branch-alias": { + "dev-master": "1.8-dev" + } }, "autoload": { "psr-4": { @@ -2973,7 +2974,7 @@ "faker", "fixtures" ], - "time": "2016-04-29T12:21:54+00:00" + "time": "2017-08-15T16:48:10+00:00" }, { "name": "guzzle/guzzle", @@ -3340,22 +3341,22 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "3.2.2", + "version": "4.1.1", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "4aada1f93c72c35e22fb1383b47fee43b8f1d157" + "reference": "2d3d238c433cf69caeb4842e97a3223a116f94b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/4aada1f93c72c35e22fb1383b47fee43b8f1d157", - "reference": "4aada1f93c72c35e22fb1383b47fee43b8f1d157", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/2d3d238c433cf69caeb4842e97a3223a116f94b2", + "reference": "2d3d238c433cf69caeb4842e97a3223a116f94b2", "shasum": "" }, "require": { - "php": ">=5.5", + "php": "^7.0", "phpdocumentor/reflection-common": "^1.0@dev", - "phpdocumentor/type-resolver": "^0.3.0", + "phpdocumentor/type-resolver": "^0.4.0", "webmozart/assert": "^1.0" }, "require-dev": { @@ -3381,20 +3382,20 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2017-08-08T06:39:58+00:00" + "time": "2017-08-30T18:51:59+00:00" }, { "name": "phpdocumentor/type-resolver", - "version": "0.3.0", + "version": "0.4.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "fb3933512008d8162b3cdf9e18dba9309b7c3773" + "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/fb3933512008d8162b3cdf9e18dba9309b7c3773", - "reference": "fb3933512008d8162b3cdf9e18dba9309b7c3773", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", + "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", "shasum": "" }, "require": { @@ -3428,26 +3429,26 @@ "email": "me@mikevanriel.com" } ], - "time": "2017-06-03T08:32:36+00:00" + "time": "2017-07-14T14:27:02+00:00" }, { "name": "phpspec/prophecy", - "version": "v1.7.0", + "version": "v1.7.2", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "93d39f1f7f9326d746203c7c056f300f7f126073" + "reference": "c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/93d39f1f7f9326d746203c7c056f300f7f126073", - "reference": "93d39f1f7f9326d746203c7c056f300f7f126073", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6", + "reference": "c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6", "shasum": "" }, "require": { "doctrine/instantiator": "^1.0.2", "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "^2.0|^3.0.2", + "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", "sebastian/comparator": "^1.1|^2.0", "sebastian/recursion-context": "^1.0|^2.0|^3.0" }, @@ -3458,7 +3459,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.6.x-dev" + "dev-master": "1.7.x-dev" } }, "autoload": { @@ -3491,7 +3492,7 @@ "spy", "stub" ], - "time": "2017-03-02T20:05:34+00:00" + "time": "2017-09-04T11:05:03+00:00" }, { "name": "phpunit/php-code-coverage", @@ -3695,16 +3696,16 @@ }, { "name": "phpunit/php-token-stream", - "version": "2.0.0", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "ecb0b2cdaa0add708fe6f329ef65ae0c5225130b" + "reference": "9a02332089ac48e704c70f6cefed30c224e3c0b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/ecb0b2cdaa0add708fe6f329ef65ae0c5225130b", - "reference": "ecb0b2cdaa0add708fe6f329ef65ae0c5225130b", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/9a02332089ac48e704c70f6cefed30c224e3c0b0", + "reference": "9a02332089ac48e704c70f6cefed30c224e3c0b0", "shasum": "" }, "require": { @@ -3740,7 +3741,7 @@ "keywords": [ "tokenizer" ], - "time": "2017-08-03T14:17:41+00:00" + "time": "2017-08-20T05:47:52+00:00" }, { "name": "phpunit/phpunit", @@ -4456,20 +4457,20 @@ }, { "name": "symfony/class-loader", - "version": "v3.3.6", + "version": "v3.3.8", "source": { "type": "git", "url": "https://github.com/symfony/class-loader.git", - "reference": "386a294d621576302e7cc36965d6ed53b8c73c4f" + "reference": "9c69968ce57924e9e93550895cd2b0477edf0e19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/class-loader/zipball/386a294d621576302e7cc36965d6ed53b8c73c4f", - "reference": "386a294d621576302e7cc36965d6ed53b8c73c4f", + "url": "https://api.github.com/repos/symfony/class-loader/zipball/9c69968ce57924e9e93550895cd2b0477edf0e19", + "reference": "9c69968ce57924e9e93550895cd2b0477edf0e19", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": "^5.5.9|>=7.0.8" }, "require-dev": { "symfony/finder": "~2.8|~3.0", @@ -4508,24 +4509,24 @@ ], "description": "Symfony ClassLoader Component", "homepage": "https://symfony.com", - "time": "2017-06-02T09:51:43+00:00" + "time": "2017-07-29T21:54:42+00:00" }, { "name": "symfony/config", - "version": "v3.3.6", + "version": "v3.3.8", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "54ee12b0dd60f294132cabae6f5da9573d2e5297" + "reference": "6ac0cc1f047c1dbc058fc25b7a4d91b068ed4488" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/54ee12b0dd60f294132cabae6f5da9573d2e5297", - "reference": "54ee12b0dd60f294132cabae6f5da9573d2e5297", + "url": "https://api.github.com/repos/symfony/config/zipball/6ac0cc1f047c1dbc058fc25b7a4d91b068ed4488", + "reference": "6ac0cc1f047c1dbc058fc25b7a4d91b068ed4488", "shasum": "" }, "require": { - "php": ">=5.5.9", + "php": "^5.5.9|>=7.0.8", "symfony/filesystem": "~2.8|~3.0" }, "conflict": { @@ -4570,7 +4571,7 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2017-07-19T07:37:29+00:00" + "time": "2017-08-03T08:59:45+00:00" }, { "name": "symfony/dom-crawler", @@ -4630,20 +4631,20 @@ }, { "name": "symfony/filesystem", - "version": "v3.3.6", + "version": "v3.3.8", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "427987eb4eed764c3b6e38d52a0f87989e010676" + "reference": "b32a0e5f928d0fa3d1dd03c78d020777e50c10cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/427987eb4eed764c3b6e38d52a0f87989e010676", - "reference": "427987eb4eed764c3b6e38d52a0f87989e010676", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/b32a0e5f928d0fa3d1dd03c78d020777e50c10cb", + "reference": "b32a0e5f928d0fa3d1dd03c78d020777e50c10cb", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": "^5.5.9|>=7.0.8" }, "type": "library", "extra": { @@ -4675,24 +4676,24 @@ ], "description": "Symfony Filesystem Component", "homepage": "https://symfony.com", - "time": "2017-07-11T07:17:58+00:00" + "time": "2017-07-29T21:54:42+00:00" }, { "name": "symfony/stopwatch", - "version": "v3.3.6", + "version": "v3.3.8", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", - "reference": "602a15299dc01556013b07167d4f5d3a60e90d15" + "reference": "9a5610a8d6a50985a7be485c0ba745c22607beeb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/stopwatch/zipball/602a15299dc01556013b07167d4f5d3a60e90d15", - "reference": "602a15299dc01556013b07167d4f5d3a60e90d15", + "url": "https://api.github.com/repos/symfony/stopwatch/zipball/9a5610a8d6a50985a7be485c0ba745c22607beeb", + "reference": "9a5610a8d6a50985a7be485c0ba745c22607beeb", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": "^5.5.9|>=7.0.8" }, "type": "library", "extra": { @@ -4724,24 +4725,24 @@ ], "description": "Symfony Stopwatch Component", "homepage": "https://symfony.com", - "time": "2017-04-12T14:14:56+00:00" + "time": "2017-07-29T21:54:42+00:00" }, { "name": "symfony/yaml", - "version": "v3.3.6", + "version": "v3.3.8", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "ddc23324e6cfe066f3dd34a37ff494fa80b617ed" + "reference": "1d8c2a99c80862bdc3af94c1781bf70f86bccac0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/ddc23324e6cfe066f3dd34a37ff494fa80b617ed", - "reference": "ddc23324e6cfe066f3dd34a37ff494fa80b617ed", + "url": "https://api.github.com/repos/symfony/yaml/zipball/1d8c2a99c80862bdc3af94c1781bf70f86bccac0", + "reference": "1d8c2a99c80862bdc3af94c1781bf70f86bccac0", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": "^5.5.9|>=7.0.8" }, "require-dev": { "symfony/console": "~2.8|~3.0" @@ -4779,7 +4780,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2017-07-23T12:43:26+00:00" + "time": "2017-07-29T21:54:42+00:00" }, { "name": "webmozart/assert", diff --git a/config/app.php b/config/app.php index 1f0172e6b5..56b26276bb 100644 --- a/config/app.php +++ b/config/app.php @@ -88,6 +88,7 @@ return [ FireflyIII\Providers\RuleGroupServiceProvider::class, FireflyIII\Providers\SearchServiceProvider::class, FireflyIII\Providers\TagServiceProvider::class, + FireflyIII\Providers\AdminServiceProvider::class, ], diff --git a/config/auth.php b/config/auth.php index ddf966efc8..52d3280350 100644 --- a/config/auth.php +++ b/config/auth.php @@ -1,16 +1,16 @@ [ 'guard' => 'web', diff --git a/config/broadcasting.php b/config/broadcasting.php index e4012544ff..3257e542d3 100644 --- a/config/broadcasting.php +++ b/config/broadcasting.php @@ -1,16 +1,17 @@ false, ], 'encryption' => (is_null(env('USE_ENCRYPTION')) || env('USE_ENCRYPTION') === true), - 'version' => '4.6.4', + 'version' => '4.6.5', 'maxUploadSize' => 15242880, 'allowedMimes' => ['image/png', 'image/jpeg', 'application/pdf'], 'list_length' => 10, @@ -39,9 +39,18 @@ return [ 'import_processors' => [ 'csv' => 'FireflyIII\Import\FileProcessor\CsvProcessor', ], - 'import_pre' => [ + 'import_pre' => [ 'bunq' => 'FireflyIII\Support\Import\Prerequisites\BunqPrerequisites', ], + 'import_info' => [ + 'bunq' => 'FireflyIII\Support\Import\Information\BunqInformation', + ], + 'import_transactions' => [ + 'bunq' => 'FireflyIII\Support\Import\Transactions\BunqTransactions', + ], + 'bunq' => [ + 'server' => 'https://sandbox.public.api.bunq.com', + ], 'default_export_format' => 'csv', 'default_import_format' => 'csv', 'bill_periods' => ['weekly', 'monthly', 'quarterly', 'half-year', 'yearly'], @@ -140,6 +149,7 @@ return [ 'budget' => 'FireflyIII\Models\Budget', 'category' => 'FireflyIII\Models\Category', 'transaction_type' => 'FireflyIII\Models\TransactionType', + 'journalLink' => \FireflyIII\Models\TransactionJournalLink::class, 'currency' => 'FireflyIII\Models\TransactionCurrency', 'fromCurrencyCode' => 'FireflyIII\Support\Binder\CurrencyCode', 'toCurrencyCode' => 'FireflyIII\Support\Binder\CurrencyCode', @@ -184,6 +194,12 @@ return [ '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', ], 'rule-actions' => [ 'set_category' => 'FireflyIII\Rules\Actions\SetCategory', diff --git a/config/mail.php b/config/mail.php index 61d69cdc5b..f5d33fd68e 100644 --- a/config/mail.php +++ b/config/mail.php @@ -1,16 +1,17 @@ - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. + * See the LICENSE file for details. */ +declare(strict_types=1); + + /** * Configuration options for Twig. */ @@ -157,6 +158,7 @@ return [ 'Lang', 'Preferences', 'URL', + 'Steam', 'Config', 'Request', 'ExpandedForm' => [ diff --git a/database/factories/ModelFactory.php b/database/factories/ModelFactory.php index c014cb7078..8669ccf1b3 100644 --- a/database/factories/ModelFactory.php +++ b/database/factories/ModelFactory.php @@ -210,6 +210,7 @@ $factory->define( 'id' => $faker->unique()->numberBetween(1000, 10000), 'name' => $faker->words(3, true), 'account_type_id' => 1, + 'active' => true, ]; } ); diff --git a/database/migrations/2016_10_09_150037_expand_transactions_table.php b/database/migrations/2016_10_09_150037_expand_transactions_table.php index 6b4e345582..6909aaa2a5 100644 --- a/database/migrations/2016_10_09_150037_expand_transactions_table.php +++ b/database/migrations/2016_10_09_150037_expand_transactions_table.php @@ -1,16 +1,16 @@ increments('id'); + $table->timestamps(); + $table->softDeletes(); + $table->string('name'); + $table->string('outward'); + $table->string('inward'); + $table->boolean('editable'); + + $table->unique(['name', 'outward','inward']); + } + ); + } + + if (!Schema::hasTable('journal_links')) { + Schema::create( + 'journal_links', function (Blueprint $table) { + $table->increments('id'); + $table->timestamps(); + $table->integer('link_type_id', false, true); + $table->integer('source_id', false, true); + $table->integer('destination_id', false, true); + $table->text('comment')->nullable(); + + $table->foreign('link_type_id')->references('id')->on('link_types')->onDelete('cascade'); + $table->foreign('source_id')->references('id')->on('transaction_journals')->onDelete('cascade'); + $table->foreign('destination_id')->references('id')->on('transaction_journals')->onDelete('cascade'); + + $table->unique(['link_type_id','source_id','destination_id']); + + + } + ); + } + } +} diff --git a/database/seeds/DatabaseSeeder.php b/database/seeds/DatabaseSeeder.php index 504c129e47..03adb0669e 100644 --- a/database/seeds/DatabaseSeeder.php +++ b/database/seeds/DatabaseSeeder.php @@ -28,6 +28,7 @@ class DatabaseSeeder extends Seeder $this->call(TransactionCurrencySeeder::class); $this->call(TransactionTypeSeeder::class); $this->call(PermissionSeeder::class); + $this->call(LinkTypeSeeder::class); } } diff --git a/database/seeds/LinkTypeSeeder.php b/database/seeds/LinkTypeSeeder.php new file mode 100644 index 0000000000..3b872e4588 --- /dev/null +++ b/database/seeds/LinkTypeSeeder.php @@ -0,0 +1,57 @@ +name = 'Related'; + $link->inward = 'relates to'; + $link->outward = 'relates to'; + $link->editable = false; + $link->save(); + + $link = new LinkType; + $link->name = 'Refund'; + $link->inward = 'is (partially) refunded by'; + $link->outward = '(partially) refunds'; + $link->editable = false; + $link->save(); + + $link = new LinkType; + $link->name = 'Paid'; + $link->inward = 'is (partially) paid for by'; + $link->outward = '(partially) pays for'; + $link->editable = false; + $link->save(); + + $link = new LinkType; + $link->name = 'Reimbursement'; + $link->inward = 'is (partially) reimbursed by'; + $link->outward = '(partially) reimburses'; + $link->editable = false; + $link->save(); + + } + +} diff --git a/docker/apache-firefly.conf b/docker/apache-firefly.conf index 8d9a34c130..6c7db54550 100644 --- a/docker/apache-firefly.conf +++ b/docker/apache-firefly.conf @@ -12,13 +12,10 @@ ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined - - Options -Indexes +FollowSymLinks - AllowOverride All - Order allow,deny - allow from all - + + Options -Indexes +FollowSymLinks + AllowOverride All + Order allow,deny + allow from all + - - - diff --git a/docker/apache2.conf b/docker/apache2.conf new file mode 100644 index 0000000000..e00594817e --- /dev/null +++ b/docker/apache2.conf @@ -0,0 +1,221 @@ +# This is the main Apache server configuration file. It contains the +# configuration directives that give the server its instructions. +# See http://httpd.apache.org/docs/2.4/ for detailed information about +# the directives and /usr/share/doc/apache2/README.Debian about Debian specific +# hints. +# +# +# Summary of how the Apache 2 configuration works in Debian: +# The Apache 2 web server configuration in Debian is quite different to +# upstream's suggested way to configure the web server. This is because Debian's +# default Apache2 installation attempts to make adding and removing modules, +# virtual hosts, and extra configuration directives as flexible as possible, in +# order to make automating the changes and administering the server as easy as +# possible. + +# It is split into several files forming the configuration hierarchy outlined +# below, all located in the /etc/apache2/ directory: +# +# /etc/apache2/ +# |-- apache2.conf +# | `-- ports.conf +# |-- mods-enabled +# | |-- *.load +# | `-- *.conf +# |-- conf-enabled +# | `-- *.conf +# `-- sites-enabled +# `-- *.conf +# +# +# * apache2.conf is the main configuration file (this file). It puts the pieces +# together by including all remaining configuration files when starting up the +# web server. +# +# * ports.conf is always included from the main configuration file. It is +# supposed to determine listening ports for incoming connections which can be +# customized anytime. +# +# * Configuration files in the mods-enabled/, conf-enabled/ and sites-enabled/ +# directories contain particular configuration snippets which manage modules, +# global configuration fragments, or virtual host configurations, +# respectively. +# +# They are activated by symlinking available configuration files from their +# respective *-available/ counterparts. These should be managed by using our +# helpers a2enmod/a2dismod, a2ensite/a2dissite and a2enconf/a2disconf. See +# their respective man pages for detailed information. +# +# * The binary is called apache2. Due to the use of environment variables, in +# the default configuration, apache2 needs to be started/stopped with +# /etc/init.d/apache2 or apache2ctl. Calling /usr/bin/apache2 directly will not +# work with the default configuration. + + +# Global configuration +# + +# +# ServerRoot: The top of the directory tree under which the server's +# configuration, error, and log files are kept. +# +# NOTE! If you intend to place this on an NFS (or otherwise network) +# mounted filesystem then please read the Mutex documentation (available +# at ); +# you will save yourself a lot of trouble. +# +# Do NOT add a slash at the end of the directory path. +# +#ServerRoot "/etc/apache2" + +# +# The accept serialization lock file MUST BE STORED ON A LOCAL DISK. +# +Mutex file:${APACHE_LOCK_DIR} default + +# +# PidFile: The file in which the server should record its process +# identification number when it starts. +# This needs to be set in /etc/apache2/envvars +# +PidFile ${APACHE_PID_FILE} + +# +# Timeout: The number of seconds before receives and sends time out. +# +Timeout 300 + +# +# KeepAlive: Whether or not to allow persistent connections (more than +# one request per connection). Set to "Off" to deactivate. +# +KeepAlive On + +# +# MaxKeepAliveRequests: The maximum number of requests to allow +# during a persistent connection. Set to 0 to allow an unlimited amount. +# We recommend you leave this number high, for maximum performance. +# +MaxKeepAliveRequests 100 + +# +# KeepAliveTimeout: Number of seconds to wait for the next request from the +# same client on the same connection. +# +KeepAliveTimeout 5 + + +# These need to be set in /etc/apache2/envvars +User ${APACHE_RUN_USER} +Group ${APACHE_RUN_GROUP} + +# +# HostnameLookups: Log the names of clients or just their IP addresses +# e.g., www.apache.org (on) or 204.62.129.132 (off). +# The default is off because it'd be overall better for the net if people +# had to knowingly turn this feature on, since enabling it means that +# each client request will result in AT LEAST one lookup request to the +# nameserver. +# +HostnameLookups Off + +# ErrorLog: The location of the error log file. +# If you do not specify an ErrorLog directive within a +# container, error messages relating to that virtual host will be +# logged here. If you *do* define an error logfile for a +# container, that host's errors will be logged there and not here. +# +ErrorLog ${APACHE_LOG_DIR}/error.log + +# +# LogLevel: Control the severity of messages logged to the error_log. +# Available values: trace8, ..., trace1, debug, info, notice, warn, +# error, crit, alert, emerg. +# It is also possible to configure the log level for particular modules, e.g. +# "LogLevel info ssl:warn" +# +LogLevel warn + +# Include module configuration: +IncludeOptional mods-enabled/*.load +IncludeOptional mods-enabled/*.conf + +# Include list of ports to listen on +Include ports.conf + + +# Sets the default security model of the Apache2 HTTPD server. It does +# not allow access to the root filesystem outside of /usr/share and /var/www. +# The former is used by web applications packaged in Debian, +# the latter may be used for local directories served by the web server. If +# your system is serving content from a sub-directory in /srv you must allow +# access here, or in any related virtual host. + + Options FollowSymLinks + AllowOverride None + Require all denied + + + + AllowOverride None + Require all granted + + + + Options Indexes FollowSymLinks + AllowOverride All + Require all granted + + +# +# Options Indexes FollowSymLinks +# AllowOverride None +# Require all granted +# + + + + +# AccessFileName: The name of the file to look for in each directory +# for additional configuration directives. See also the AllowOverride +# directive. +# +AccessFileName .htaccess + +# +# The following lines prevent .htaccess and .htpasswd files from being +# viewed by Web clients. +# + + Require all denied + + + +# +# The following directives define some format nicknames for use with +# a CustomLog directive. +# +# These deviate from the Common Log Format definitions in that they use %O +# (the actual bytes sent including headers) instead of %b (the size of the +# requested file), because the latter makes it impossible to detect partial +# requests. +# +# Note that the use of %{X-Forwarded-For}i instead of %h is not recommended. +# Use mod_remoteip instead. +# +LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined +LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined +LogFormat "%h %l %u %t \"%r\" %>s %O" common +LogFormat "%{Referer}i -> %U" referer +LogFormat "%{User-agent}i" agent + +# Include of directories ignores editors' and dpkg's backup files, +# see README.Debian for details. + +# Include generic snippets of statements +IncludeOptional conf-enabled/*.conf + +# Include the virtual host configurations: +IncludeOptional sites-enabled/*.conf + +# vim: syntax=apache ts=4 sw=4 sts=4 sr noet diff --git a/docker/entrypoint.sh b/docker/entrypoint.sh index 0baf22e862..2d7d479bfb 100755 --- a/docker/entrypoint.sh +++ b/docker/entrypoint.sh @@ -2,15 +2,4 @@ cat .env.docker | envsubst > .env -if [ "${INIT_DATABASE:="no"}" = "yes" ]; then - echo "Init database detected, checking mysql status" - # depends on your machine, but it may take a file to boot mysql container the first time - until php artisan firefly:verify &>/dev/null - do - echo "waiting mysql" - sleep 10 - done - php artisan migrate:refresh --seed -fi - exec apache2-foreground diff --git a/gulpfile.js b/gulpfile.js index 04d503d8d5..5f7804554a 100755 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,3 +1,12 @@ +/* + * 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'); diff --git a/phpunit.coverage.xml b/phpunit.coverage.xml index 0997eb6bb2..b0b352d90a 100755 --- a/phpunit.coverage.xml +++ b/phpunit.coverage.xml @@ -1,4 +1,13 @@ + + + + 0) { $('.budget-link[data-id="' + id + '"]').attr('href', 'budgets/show/' + id + '/' + data.repetition); @@ -120,8 +121,8 @@ $(function () { $('.selectPeriod').change(function (e) { var sel = $(e.target).val(); if (sel !== "x") { - var newURI = budgetIndexURI.replace("REPLACE", sel); - window.location.assign(newURI); + var newUri = budgetIndexUri.replace("REPLACE", sel); + window.location.assign(newUri); } }); @@ -129,7 +130,7 @@ $(function () { function updateIncome() { "use strict"; - $('#defaultModal').empty().load('budgets/income', function () { + $('#defaultModal').empty().load(updateIncomeUri, function () { $('#defaultModal').modal('show'); }); diff --git a/public/js/ff/reports/default/all.js b/public/js/ff/reports/default/all.js index 6fc394d7dd..ad4bef22b0 100644 --- a/public/js/ff/reports/default/all.js +++ b/public/js/ff/reports/default/all.js @@ -109,6 +109,7 @@ function clickCategoryChart(e) { "use strict"; var link = $(e.target); var categoryId = link.data('category'); + $('#category_help').remove(); var URL = 'chart/category/report-period/' + categoryId + '/' + accountIds + '/' + startDate + '/' + endDate; var container = 'category_chart'; @@ -120,6 +121,7 @@ function clickBudgetChart(e) { "use strict"; var link = $(e.target); var budgetId = link.data('budget'); + $('#budget_help').remove(); var URL = 'chart/budget/period/' + budgetId + '/' + accountIds + '/' + startDate + '/' + endDate; var container = 'budget_chart'; diff --git a/public/js/ff/rules/create-edit.js b/public/js/ff/rules/create-edit.js index 3b8e871e04..24407d3987 100644 --- a/public/js/ff/rules/create-edit.js +++ b/public/js/ff/rules/create-edit.js @@ -229,6 +229,7 @@ function updateTriggerInput(selectList) { var parent = selectList.parent().parent(); // the text input we're looking for: var input = parent.find('input[name^="rule-trigger-value["]'); + input.prop('disabled', false); switch (selectList.val()) { case 'from_account_starts': case 'from_account_ends': @@ -259,6 +260,15 @@ function updateTriggerInput(selectList) { case 'description_is': createAutoComplete(input, 'json/transaction-journals/all'); break; + case 'has_no_category': + case 'has_any_category': + case 'has_no_budget': + case 'has_any_budget': + case 'has_no_tag': + case 'has_any_tag': + input.prop('disabled', true); + input.typeahead('destroy'); + break; default: input.typeahead('destroy'); break; diff --git a/public/js/ff/transactions/show.js b/public/js/ff/transactions/show.js new file mode 100644 index 0000000000..9e797ce3b2 --- /dev/null +++ b/public/js/ff/transactions/show.js @@ -0,0 +1,39 @@ +/* + * show.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. + */ + +/** global: autoCompleteUri */ + +$(function () { + "use strict"; + + + $.getJSON(autoCompleteUri).done(function (data) { + var $input = $("#link_other"); + $input.typeahead({ + source: data, + autoSelect: true + }); + $input.change(function() { + var current = $input.typeahead("getActive"); + if (current) { + // Some item from your model is active! + if (current.name.toLowerCase() === $input.val().toLowerCase()) { + // This means the exact match is found. Use toLowerCase() if you want case insensitive match. + $('input[name="link_journal_id"]').val(current.id); + } else { + $('input[name="link_journal_id"]').val(0); + } + } else { + $('input[name="link_journal_id"]').val(0); + } + }); + }); + + +}); \ No newline at end of file diff --git a/public/js/ff/transactions/single/create.js b/public/js/ff/transactions/single/create.js index f1b375bb92..e1a0c04c9f 100644 --- a/public/js/ff/transactions/single/create.js +++ b/public/js/ff/transactions/single/create.js @@ -37,6 +37,7 @@ $(document).ready(function () { // when user selects different currency, $('.currency-option').on('click', selectsForeignCurrency); + $('#ffInput_description').focus(); }); /** @@ -84,6 +85,7 @@ function updateDescription() { $.getJSON('json/transaction-journals/' + what).done(function (data) { $('input[name="description"]').typeahead('destroy').typeahead({source: data}); }); + $('#ffInput_description').focus(); } /** diff --git a/public/js/ff/transactions/split/edit.js b/public/js/ff/transactions/split/edit.js index dbe9cfba98..197e9f6fb6 100644 --- a/public/js/ff/transactions/split/edit.js +++ b/public/js/ff/transactions/split/edit.js @@ -7,7 +7,7 @@ */ -/** global: originalSum, accounting, what, Modernizr */ +/** global: originalSum, accounting, what, Modernizr, currencySymbol */ var destAccounts = {}; var srcAccounts = {}; @@ -231,13 +231,14 @@ function calculateSum() { sum = Math.round(sum * 100) / 100; left = Math.round(left * 100) / 100; + $('.amount-warning').remove(); if (sum !== originalSum) { var holder = $('#journal_amount_holder'); var par = holder.find('p.form-control-static'); - $('').text(' (' + accounting.formatMoney(sum) + ')').addClass('text-danger amount-warning').appendTo(par); + $('').text(' (' + accounting.formatMoney(sum, currencySymbol) + ')').addClass('text-danger amount-warning').appendTo(par); // also add what's left to divide (or vice versa) - $('').text(' (' + accounting.formatMoney(left) + ')').addClass('text-danger amount-warning').appendTo(par); + $('').text(' (' + accounting.formatMoney(left, currencySymbol) + ')').addClass('text-danger amount-warning').appendTo(par); } } \ No newline at end of file diff --git a/resources/lang/de_DE/auth.php b/resources/lang/de_DE/auth.php index 89d1936fd1..2ed9237587 100644 --- a/resources/lang/de_DE/auth.php +++ b/resources/lang/de_DE/auth.php @@ -27,4 +27,4 @@ return [ 'failed' => 'Falscher Benutzername und/oder falsches Passwort.', 'throttle' => 'Zu viele Login-Versuche. Bitte versuchen Sie es in :seconds Sekunde(n) erneut.', -]; \ No newline at end of file +]; diff --git a/resources/lang/de_DE/breadcrumbs.php b/resources/lang/de_DE/breadcrumbs.php index 24a40bcd42..5279222e16 100644 --- a/resources/lang/de_DE/breadcrumbs.php +++ b/resources/lang/de_DE/breadcrumbs.php @@ -13,31 +13,32 @@ declare(strict_types=1); */ return [ - 'home' => 'Home', - 'edit_currency' => 'Bearbeite die Währung ":name"', - 'delete_currency' => 'Lösche die Währung ":name"', - 'newPiggyBank' => 'Erstellen Sie ein neues Sparschwein', - 'edit_piggyBank' => 'Bearbeite Sparschwein ":name"', - 'preferences' => 'Einstellungen', - 'profile' => 'Profil', - 'changePassword' => 'Passwort ändern', - 'bills' => 'Rechnungen', - 'newBill' => 'Neue Rechnung', - 'edit_bill' => 'Bearbeite Rechnung ":name"', - 'delete_bill' => 'Lösche Rechnung ":name"', - 'reports' => 'Berichte', - 'search_result' => 'Search results for ":query"', - 'withdrawal_list' => 'Ausgaben', - 'deposit_list' => 'Umsatz, Einkommen und Einlagen', - 'transfer_list' => 'Überweisungen', - 'transfers_list' => 'Überweisungen', - 'create_withdrawal' => 'Erstelle eine neue Ausgabe', - 'create_deposit' => 'Erstelle ein neues Einkommen', - 'create_transfer' => 'Erstelle eine neue Überweisung', - 'edit_journal' => 'Bearbeite Transaktion ":description"', - 'delete_journal' => 'Lösche Transaktion ":description"', - 'tags' => 'Markierungen', - 'createTag' => 'Neuen Tag erstellen', - 'edit_tag' => 'Bearbeite Tag ":tag"', - 'delete_tag' => 'Lösche Tag ":tag"', -]; \ No newline at end of file + 'home' => 'Home', + 'edit_currency' => 'Bearbeite die Währung ":name"', + 'delete_currency' => 'Lösche die Währung ":name"', + 'newPiggyBank' => 'Erstellen Sie ein neues Sparschwein', + 'edit_piggyBank' => 'Bearbeite Sparschwein ":name"', + 'preferences' => 'Einstellungen', + 'profile' => 'Profil', + 'changePassword' => 'Passwort ändern', + 'bills' => 'Rechnungen', + 'newBill' => 'Neue Rechnung', + 'edit_bill' => 'Bearbeite Rechnung ":name"', + 'delete_bill' => 'Lösche Rechnung ":name"', + 'reports' => 'Berichte', + 'search_result' => 'Suchergebnisse für ":query"', + 'withdrawal_list' => 'Ausgaben', + 'deposit_list' => 'Umsatz, Einkommen und Einlagen', + 'transfer_list' => 'Überweisungen', + 'transfers_list' => 'Überweisungen', + 'create_withdrawal' => 'Erstelle eine neue Ausgabe', + 'create_deposit' => 'Erstelle ein neues Einkommen', + 'create_transfer' => 'Erstelle eine neue Überweisung', + 'edit_journal' => 'Bearbeite Transaktion ":description"', + 'delete_journal' => 'Lösche Transaktion ":description"', + 'tags' => 'Markierungen', + 'createTag' => 'Neuen Tag erstellen', + 'edit_tag' => 'Bearbeite Tag ":tag"', + 'delete_tag' => 'Lösche Tag ":tag"', + 'delete_journal_link' => 'Verbindung zwischen Transaktionen löschen', +]; diff --git a/resources/lang/de_DE/config.php b/resources/lang/de_DE/config.php index d303d9e308..0556b0f612 100644 --- a/resources/lang/de_DE/config.php +++ b/resources/lang/de_DE/config.php @@ -22,4 +22,4 @@ return [ 'year' => '%Y', 'half_year' => '%B %Y', -]; \ No newline at end of file +]; diff --git a/resources/lang/de_DE/csv.php b/resources/lang/de_DE/csv.php index c110606470..d411b3f33a 100644 --- a/resources/lang/de_DE/csv.php +++ b/resources/lang/de_DE/csv.php @@ -17,7 +17,7 @@ return [ 'initial_title' => 'Import Einrichten (1/3) - Grundlegende Einstellungen', 'initial_text' => 'Um Ihre Datei korrekt importieren zu können, überprüfen Sie die folgenden Optionen.', 'initial_box' => 'Standard CSV Importeinstellungen', - 'initial_box_title' => 'Basic CSV import setup options', + 'initial_box_title' => 'Standard CSV Importoptionen', 'initial_header_help' => 'Hier auswählen, wenn die ersten Zeilen der CSV-Datei die Spaltenüberschriften sind.', 'initial_date_help' => 'Datumsformat in ihrer CSV-Datei. Geben Sie das Format so an, wie es diese Seite zeigt. Die Standardeinstellung ergibt Daten die so aussehen: :dateExample.', 'initial_delimiter_help' => 'Wählen Sie das Trennzeichen, welches in ihrer Datei genutzt wird. Wenn Sie nicht sicher sind ist Komma die sicherste Option.', @@ -35,11 +35,11 @@ return [ 'roles_column' => 'Spalte', 'roles_no_example_data' => 'Keine Beispieldaten vorhanden', 'roles_submit' => 'Fortfahren mit Schritt 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.', + 'roles_warning' => 'Markieren Sie zumindest eine Spalte als Betrags-spalte. Es empfiehlt sich auch, eine Spalte für die Beschreibung, das Datum und das Gegenkonto auszuwählen.', // map data 'map_title' => 'Import Einrichten (3/3) - Import mit bereits vorhandenen Daten verknüpfen', - 'map_text' => 'In den folgenden Tabellen zeigt der linke Wert Informationen, die sich in Ihrer hochgeladenen CSV-Datei befinden. Es ist Ihre Aufgabe, diesen Wert, wenn möglich, einem bereits in der Datenbank vorhandem zuzuordnen. Firefly wird sich an diese Zuordnung halten. Wenn kein Wert für die Zuordnung vorhanden ist oder Sie den bestimmten Wert nicht abbilden möchten, wählen Sie nichts aus.', + 'map_text' => 'In den folgenden Tabellen zeigt der linke Wert Informationen, die sich in Ihrer hochgeladenen CSV-Datei befinden. Es ist Ihre Aufgabe, diesen Wert, wenn möglich, einem bereits in der Datenbank vorhandenen zuzuordnen. Firefly wird sich an diese Zuordnung halten. Wenn kein Wert für die Zuordnung vorhanden ist oder Sie den bestimmten Wert nicht abbilden möchten, wählen Sie nichts aus.', 'map_field_value' => 'Feldwert', 'map_field_mapped_to' => 'Zugeordnet zu', 'map_do_not_map' => '(keine Zuordnung)', @@ -54,7 +54,7 @@ return [ 'column_amount-comma-separated' => 'Betrag (Komma als Dezimaltrennzeichen)', 'column_bill-id' => 'Rechnung (ID übereinstimmend mit Firefly)', 'column_bill-name' => 'Name der Rechnung', - 'column_budget-id' => 'Bidget (ID übereinstimmend mit Firefly)', + 'column_budget-id' => 'Budget (ID übereinstimmend mit Firefly)', 'column_budget-name' => 'Budgetname', 'column_category-id' => 'Kategorie (ID übereinstimmend mit Firefly)', 'column_category-name' => 'Name der Kategorie', @@ -80,4 +80,4 @@ return [ 'column_tags-space' => 'Tags (durch Leerzeichen getrennt)', 'column_account-number' => 'Bestandskonto (Kontonr.)', 'column_opposing-number' => 'Zielkonto (Kontonr.)', -]; \ No newline at end of file +]; diff --git a/resources/lang/de_DE/demo.php b/resources/lang/de_DE/demo.php index b5c31f0146..19d4a1bbf5 100644 --- a/resources/lang/de_DE/demo.php +++ b/resources/lang/de_DE/demo.php @@ -12,15 +12,15 @@ declare(strict_types=1); return [ 'no_demo_text' => 'Leider gibt es keine zusätzlichen Demoerklärungen für diese Seite.', 'see_help_icon' => 'Trotzdem kann der -Icon in der oberen rechten Ecke mehr erzählen.', - 'index' => 'Wilkommen bei Firefly III! Auf dieser Seite erhalten Sie einen schnellen Überblick über Ihre Finanzen. Für weitere Informationen, besuchen Sie die Accounts → Girokonten und natürlich Budgets und Berichte Seiten. Oder sehen Sie sich einfach um und schauen wo Sie landen.', + 'index' => 'Willkommen bei Firefly III! Auf dieser Seite erhalten Sie einen schnellen Überblick über Ihre Finanzen. Für weitere Informationen, besuchen Sie die Accounts → Girokonten und natürlich Budgets und Berichte Seiten. Oder sehen Sie sich einfach um und schauen wo Sie landen.', 'accounts-index' => 'Vermögenskonten sind Ihre persönlichen Bank-Konten. Aufwandskonten sind Konten, denen Sie Geld zahlen, z. B. Läden und Freunde. Einnahmekonten sind Konten von denen Sie Geld erhalten, z. B. Ihr Arbeitgeber und andere Einkommensquellen. Auf dieser Seite können Sie diese bearbeiten oder entfernen.', - 'budgets-index' => 'Diese Seite zeigt Ihnen einen Überblick über Ihre Budgets. Die obere Leiste zeigt den Betrag, der zur Verfügung steht. Dieser kann für einen Zeitraum angepasst werden, indem Sie auf den Betrag auf der rechten Seite klicken. Wieviel bisher ausgegeb wurde wird darunter angezeigt. Darunter sind die Aufwendungen pro Haushalt und wieviel dafür veranschlagt ist.', - 'reports-index-start' => 'Firefly III unterstützt vier Berichtarten. Mehr Informationen hirzu können durch ein Klick auf das Symbol in der oberen rechten Ecke aufgerufen werden.', + 'budgets-index' => 'Diese Seite zeigt Ihnen einen Überblick über Ihre Budgets. Die obere Leiste zeigt den Betrag, der zur Verfügung steht. Dieser kann für einen Zeitraum angepasst werden, indem Sie auf den Betrag auf der rechten Seite klicken. Wie viel bisher ausgegeben wurde wird darunter angezeigt. Darunter sind die Aufwendungen pro Haushalt und wie viel dafür veranschlagt ist.', + 'reports-index-start' => 'Firefly III unterstützt vier Berichtarten. Mehr Informationen hierzu können durch ein Klick auf das Symbol in der oberen rechten Ecke aufgerufen werden.', 'reports-index-examples' => 'Achten Sie darauf, diese Beispiele anzusehen: eine monatliche Finanzübersicht, eine jährliche Finanzübersicht und eine Haushaltsübersicht.', - 'currencies-index' => 'Firefly III unterstützt mehrere Währungen. Obwohl es den Euro standardmäßig nutzt, ist es möglich US-Dollar oder viele andere Währungen zu verwenden. Wie Sie sehen können, ist eine kleine Auswahl an Währungen aufgenommen worden, aber Sie können Ihre Eigenen hinzufügen. Die Standardwährung zu ändern, wird die Währung der vorhandenen Buchungen jedoch nicht ändern: Firefly III unterstützt die Verwendung mehrerer Währungen zur gleichen Zeit.', + 'currencies-index' => 'Firefly III unterstützt mehrere Währungen. Obwohl es den Euro standardmäßig nutzt, ist es möglich US-Dollar oder viele andere Währungen zu verwenden. Wie Sie sehen können, ist eine kleine Auswahl an Währungen aufgenommen worden, aber Sie können Ihre eigenen hinzufügen. Die Standardwährung zu ändern, wird die Währung der vorhandenen Buchungen jedoch nicht ändern: Firefly III unterstützt die Verwendung mehrerer Währungen zur gleichen Zeit.', 'transactions-index' => 'Diese Aufwendungen, Einzahlungen und Überweisungen sind nicht besonders einfallsreich. Sie wurden automatisch generiert.', 'piggy-banks-index' => 'Wie Sie sehen können, gibt es drei Sparschweine. Benutzen die Plus- und Minusknöpfe um die Menge des Geldes in den Sparschweinen zu beeinflussen. Klicken Sie auf den Namen des Sparschweins um Details einzusehen.', - 'import-index' => 'Natürlich kann eine CSV-Datei in Firefly III importiert werden ', + 'import-index' => 'Natürlich kann jede CSV-Datei in Firefly III importiert werden ', 'import-configure-security' => 'Aufgrund von Sicherheitsbedenken wurde der Upload mit einer lokalen Datei ersetzt.', 'import-configure-configuration' => 'Die unten stehende Konfiguration für die lokale Datei ist korrekt.', -]; \ No newline at end of file +]; diff --git a/resources/lang/de_DE/firefly.php b/resources/lang/de_DE/firefly.php index e1abf3a408..25a9468efb 100644 --- a/resources/lang/de_DE/firefly.php +++ b/resources/lang/de_DE/firefly.php @@ -13,7 +13,6 @@ declare(strict_types=1); return [ // general stuff: - 'language_incomplete' => 'unvollständige Übersetzung', 'close' => 'Schließen', 'actions' => 'Aktionen', 'edit' => 'Bearbeiten', @@ -28,13 +27,8 @@ return [ 'to' => 'Bis', 'showEverything' => 'Alles anzeigen', 'never' => 'Nie', - 'search_results_for' => 'Suchergebnisse für ":query"', - 'no_results_for_empty_search' => 'Your search was empty, so nothing was found.', - 'bounced_error' => 'Die Nachricht an :email ist nicht zustellbar, sodass Sie keinen Zugang haben.', - 'deleted_error' => 'Die Zugangsdaten stimmen nicht überein.', - 'general_blocked_error' => 'Ihr Benutzerkonto wurde deaktiviert, sodass Sie sich nicht anmelden können.', - 'expired_error' => 'Ihr Benutzerkonto ist abgelaufen und kann nicht mehr genutzt werden.', - 'removed_amount' => ':amount enfernt', + 'no_results_for_empty_search' => 'Ihre Suche war leer, also wurde nichts gefunden.', + 'removed_amount' => ':amount entfernt', 'added_amount' => ':amount hinzugefügt', 'asset_account_role_help' => 'Alle zusätzlichen Optionen, welche aus ihren Entscheidung entstehen, können später eingestellt werden.', 'Opening balance' => 'Eröffnungsbilanz', @@ -47,7 +41,7 @@ return [ 'new_revenue_account' => 'Neuer Kreditor (Geldeingang)', 'new_budget' => 'Neues Budget', 'new_bill' => 'Neue Rechnung', - 'block_account_logout' => 'Sie wurden ausgeloggt. Blockierte Benutzerkonten können diese Seite nicht nutzen. Haben Sie eine gültige E-Mailadresse registriert?', + 'block_account_logout' => 'Sie wurden ausgeloggt. Blockierte Benutzerkonten können diese Seite nicht nutzen. Haben Sie sich mit einer gültigen E-Mail Adresse registriert?', 'flash_success' => 'Geschafft!', 'flash_info' => 'Nachricht', 'flash_warning' => 'Achtung!', @@ -56,7 +50,6 @@ return [ 'flash_error_multiple' => 'Es gibt einen Fehler|Es gibt :count Fehler', 'net_worth' => 'Vermögen', 'route_has_no_help' => 'Es gibt keinen Hilfetext für diese Seite.', - 'help_may_not_be_your_language' => 'Dieser Hilfstext ist in Englisch. Er ist noch nicht in Deutsch verfügbar', 'two_factor_welcome' => 'Hallo :user!', 'two_factor_enter_code' => 'Um fortzufahren geben Sie bitte ihren Zwei-Faktor-Authentifizierungscode ein. Ihre Anwendung kann diesen für Sie generieren.', 'two_factor_code_here' => 'Code hier eingeben', @@ -68,11 +61,8 @@ return [ 'two_factor_lost_intro' => 'Leider ist dieses etwas, dass sie nicht über die Weboberfläche zurücksetzen können. Sie haben zwei Möglichkeiten.', 'two_factor_lost_fix_self' => 'Wenn Sie Ihre eigene Instanz von Firefly III betreiben, überprüfen Sie die Logdatei unter storage/logs für weitere Anweisungen.', 'two_factor_lost_fix_owner' => 'Ansonsten, mailen Sie dem Inhaber der Website, :site_owner und bitten Sie ihn, Ihre Zwei-Faktor Authentifizierung zurückzusetzen.', - 'warning_much_data' => ':days Tage an Daten können eine Weile dauern zu laden.', + 'warning_much_data' => ':days Tage Daten können eine Weile zu laden benötigen.', 'registered' => 'Sie haben sich erfolgreich registriert!', - 'tagbalancingAct' => 'Ausgleich', - 'tagadvancePayment' => 'Vorauszahlung', - 'tagnothing' => '', 'Default asset account' => 'Standard-Anlagekonto', 'no_budget_pointer' => 'Sie scheinen keine Budgets festgelegt zu haben. Sie sollten welche auf der Budget-Seite erstellen. Budgets können Ihnen helfen ihre Ausgaben zu verfolgen.', 'Savings account' => 'Sparkonto', @@ -81,16 +71,15 @@ return [ 'destination_accounts' => 'Zielkonto', 'user_id_is' => 'Ihre Benutzerkennung ist :user', 'field_supports_markdown' => 'Diese Feld unterstützt Abschlag .', - 'need_more_help' => 'Wenn du hilfe beim bedienen von Firefly III brauchst, erstelle ein Ticket auf 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.', - 'nothing_to_display' => 'Es gibt keine Transaktionen zum Anzeigen', + 'need_more_help' => 'Wenn du Hilfe beim Bedienen von Firefly III brauchst, erstelle ein Ticket auf Github.', + 'reenable_intro_text' => 'Sie können auch die Einführung wieder aktivieren.', + 'intro_boxes_after_refresh' => 'Die Einführungsfelder werden wieder angezeigt, wenn Sie die Seite aktualisieren.', 'show_all_no_filter' => 'Alle Transaktionen anzeigen, ohne diese nach Datum zu gruppieren.', 'expenses_by_category' => 'Ausgaben nach Kategorie', 'expenses_by_budget' => 'Ausgaben nach Budget', 'income_by_category' => 'Einkommen nach Kategorie', - 'expenses_by_asset_account' => 'Expenses by asset account', - 'expenses_by_expense_account' => 'Expenses by expense account', + 'expenses_by_asset_account' => 'Aufwendungen nach Vermögenskonto', + 'expenses_by_expense_account' => 'Aufwendungen nach Aufwandskonto', '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', @@ -98,11 +87,7 @@ return [ '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_change_demo' => 'Sie können nicht das Kennwort des Demo-Kontos ändern.', - 'cannot_delete_demo' => 'Das Demo-Konto kann nicht entfernt werden.', 'cannot_reset_demo_user' => 'Sie können nicht das Kennwort des Demo-Kontos zurücksetzen', - 'per_period' => 'Pro Periode', - 'all_periods' => 'Alle Perioden', '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.', @@ -111,11 +96,9 @@ return [ 'chart_account_in_period' => 'Diagramm für alle Transaktionen des Kontos ":name" zwischen :start und :end', 'chart_category_in_period' => 'Diagramm für alle Transaktionen der Kategorie ":name" zwischen :start und :end', 'chart_category_all' => 'Diagramm für alle Transaktionen der Kategorie ":name"', - 'budget_in_period_breadcrumb' => 'Zwischen :start und :end', 'clone_withdrawal' => 'Diese Ausgabe klonen', 'clone_deposit' => 'Diese Einnahme klonen', 'clone_transfer' => 'Diese Überweisung klonen', - 'transaction_journal_other_options' => 'Weitere Optionen', 'multi_select_no_selection' => 'Nichts ausgewählt', 'multi_select_all_selected' => 'Alle ausgewählt', 'multi_select_filter_placeholder' => 'Suche..', @@ -130,7 +113,7 @@ return [ 'transferred' => 'Überwiesen', 'all_withdrawal' => 'Alle Ausgaben', 'all_transactions' => 'Alle Transaktionen', - 'title_withdrawal_between' => 'Alle Ausgabe zwischen :start und :end', + 'title_withdrawal_between' => 'Alle Ausgaben zwischen :start und :end', 'all_deposit' => 'Alle Einnahmen', 'title_deposit_between' => 'Alle Einnahmen zwischen :start und :end', 'all_transfers' => 'Alle Transfers', @@ -144,18 +127,18 @@ return [ 'journals_in_period_for_category' => 'Alle Transaktionen für Kategorie :name zwischen :start und :end', 'journals_in_period_for_tag' => 'Alle Transaktionen für Tag :tag zwischen :start und :end', 'not_available_demo_user' => 'Die Funktionen, auf welche sie zugreifen wollen, steht Demo-Benutzer nicht zur Verfügung.', - '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 angengeben 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 korrenkt angeben.', + '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', // search 'search' => 'Suche', - '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 ...', + 'search_found_transactions' => 'Anzahl der gefundenen Transaktionen:', + 'general_search_error' => 'Bei der Suche ist ein Fehler aufgetreten. Bitte überprüfen Sie die Protokolldateien für weitere Informationen.', + 'search_box' => 'Suche', + '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 ...', // repeat frequencies: 'repeat_freq_yearly' => 'Jährlich', @@ -164,18 +147,6 @@ return [ 'quarterly' => 'vierteljährlich', 'half-year' => 'halbjährlich', 'yearly' => 'jährlich', - // account confirmation: - 'confirm_account_header' => 'Bitte bestätigen Sie Ihr Konto', - 'confirm_account_intro' => 'Eine E-Mail wurde an die Adresse gesendet, welche bei der Registrierung angegeben wurde. Bitte lese die Mail für weitere Anweisungen. Wenn Sie die Mail nicht erhalten haben, kann Firefly Sie erneut senden.', - 'confirm_account_resend_email' => 'Senden Sie mir die Bestätigung, ich möchte meinen Account aktivieren.', - 'account_is_confirmed' => 'Ihr Benutzerkonto wurde bestätigt!', - 'invalid_activation_code' => 'Es scheint der genutzte Code ist ungültig oder ist abgelaufen.', - 'confirm_account_is_resent_header' => 'Die Bestätigung wurde erneut gesendet', - 'confirm_account_is_resent_text' => 'Die Bestätigungsmail wurde erneut gesendet. Wenn Sie die Bestätigungsmail weiterhin nicht erhalten wenden Sie sich bitte an den Seitenbetreiber unter Seitenbetreiber> oder überprüfen Sie das Fehlerprotokoll.', - 'confirm_account_is_resent_go_home' => 'Zur Hauptseite von Firefly wechseln', - 'confirm_account_not_resent_header' => 'Etwas ist schief gelaufen :(', - 'confirm_account_not_resent_intro' => 'Die Bestätigung wurde nicht erneut versendet. Wenn Sie immer noch keine Bestätigung erhalten haben, wenden Sie sich stattdessen bitte an den Inhaber der Webseite :owner. Möglicherweise haben Sie zu oft versucht die Bestätigung zu senden. Sie können die Bestätigung nur einmal pro Stunde durch Firefly III erneut senden lassen.', - 'confirm_account_not_resent_go_home' => 'Zur Hauptseite von Firefly wechseln', // export data: 'import_and_export' => 'Import und Export', @@ -183,7 +154,7 @@ return [ '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 kompatibeles Format', + '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', @@ -205,7 +176,6 @@ return [ 'export_status_created_zip_file' => 'Zip-Datei erstellt!', 'export_status_finished' => 'Export erfolgreich beendet! Yay!', 'export_data_please_wait' => 'Bitte warten...', - 'attachment_explanation' => 'Die Datei mit dem Namen \':attachment_name\' (#:attachment_id) wurde urspünglich am :date mit dem Betrag :amount zu :type \':description\' (#:journal_id) hochgeladen.', // rules 'rules' => 'Regeln', @@ -214,7 +184,7 @@ return [ 'rule_actions' => 'Regel wird', 'new_rule' => 'Neue Regel', 'new_rule_group' => 'Neue Regelgruppe', - 'rule_priority_up' => 'Regel eine höhrere Priorität zuweisen', + 'rule_priority_up' => 'Regel eine höhere Priorität zuweisen', 'rule_priority_down' => 'Regel eine geringere Priorität zuweisen', 'make_new_rule_group' => 'Neue Regelgruppe erstellen', 'store_new_rule_group' => 'Speichere neue Regelgruppe', @@ -255,60 +225,74 @@ return [ 'delete_rule' => 'Lösche Regel ":title"', 'update_rule' => 'Regel bearbeiten', 'test_rule_triggers' => 'Zeige übereinstimmende Überweisungen', - 'warning_transaction_subset' => 'Aus Kapazitätgründen ist diese Liste auf :max_num_transactions Überweisungen limitiert und zeigt möglicherweise nur einen Teil dieser an', - 'warning_no_matching_transactions' => 'Keine übereinstimmenden Überweisungen gefunden. Aus Kapazitätgründen werden nur die letzten :num_transactions Überweisungen überprüft.', + 'warning_transaction_subset' => 'Aus Kapazitätsgründen ist diese Liste auf :max_num_transactions Überweisungen limitiert und zeigt möglicherweise nur einen Teil dieser an', + 'warning_no_matching_transactions' => 'Keine übereinstimmenden Überweisungen gefunden. Aus Kapazitätsgründen werden nur die letzten :num_transactions Überweisungen überprüft.', 'warning_no_valid_triggers' => 'Keine gültigen Trigger gefunden.', - 'apply_rule_selection' => '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.', + 'apply_rule_selection' => 'Übernehmen Sie die Regel ": title" auf eine Auswahl Ihrer Transaktionen', + 'apply_rule_selection_intro' => 'Regeln wie ": title" werden in der Regel nur auf neue oder aktualisierte Transaktionen angewandt, aber Sie können die Regel auch auf eine Auswahl Ihrer bestehenden Transaktionen anwenden. Dies kann nützlich sein, wenn Sie eine Regel aktualisiert haben und Sie die Änderungen benötigen, auf andere Transaktionen zu aktualisieren.', 'include_transactions_from_accounts' => 'Überweisungen von diesem Konto einbeziehen', - 'applied_rule_selection' => 'Rule ":title" has been applied to your selection.', + 'applied_rule_selection' => 'Regel ": Titel" wurde auf Ihre Auswahl angewendet.', 'execute' => 'Ausführen', - '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.', + 'apply_rule_group_selection' => 'Anwenden der Regelgruppe ": title" auf eine Auswahl Ihrer Transaktionen', + 'apply_rule_group_selection_intro' => 'Regelgruppen wie ": title" werden in der Regel nur auf neue oder aktualisierte Transaktionen angewandt, aber Sie können die Gruppe auch auf eine Auswahl Ihrer bestehenden Transaktionen anwenden. Dies kann nützlich sein, wenn Sie eine Gruppe aktualisiert haben und Sie die Änderungen benötigen, auf andere Transaktionen zu aktualisieren.', + 'applied_rule_group_selection' => 'Regelgruppe ": title" wurde auf Ihre Auswahl angewendet.', // actions and triggers 'rule_trigger_user_action' => 'Die Nutzeraktion ist ":trigger_value"', - 'rule_trigger_from_account_starts' => 'Das Quellkonto startet mit ":trigger_value"', - 'rule_trigger_from_account_ends' => 'Das Quellkonto endet mit ":trigger_value"', - 'rule_trigger_from_account_is' => 'Das Quellkonto ist ":trigger_value"', - 'rule_trigger_from_account_contains' => 'Das Quellkonto enthält ":trigger_value"', - 'rule_trigger_to_account_starts' => 'Das Zielkonto startet mit ":trigger_value"', - 'rule_trigger_to_account_ends' => 'Das Zielkonto endet mit ":trigger_value"', - 'rule_trigger_to_account_is' => 'Das Zielkonto ist ":trigger_value"', - 'rule_trigger_to_account_contains' => 'Zielkonto enthält ":trigger_value"', - 'rule_trigger_transaction_type' => 'Transaktion ist vom Typ ": Trigger_value"', - 'rule_trigger_category_is' => 'Kategorie ist ":trigger_value"', - 'rule_trigger_amount_less' => 'Betrag ist kleiner als :trigger_value', - 'rule_trigger_amount_exactly' => 'Betrag ist :trigger_value', - 'rule_trigger_amount_more' => 'Betrag ist größer als :trigger_value', - 'rule_trigger_description_starts' => 'Beschreibung beginnt mit ":trigger_value"', - 'rule_trigger_description_ends' => 'Beschreibung endet mit ":trigger_value"', - 'rule_trigger_description_contains' => 'Beschreibung enthält ":trigger_value"', - 'rule_trigger_description_is' => 'Beschreibung ist ":trigger_value"', 'rule_trigger_from_account_starts_choice' => 'Herkunftskonto beginnt mit..', + 'rule_trigger_from_account_starts' => 'Das Quellkonto startet mit ":trigger_value"', 'rule_trigger_from_account_ends_choice' => 'Herkunftskonto endet mit..', + 'rule_trigger_from_account_ends' => 'Das Quellkonto endet mit ":trigger_value"', 'rule_trigger_from_account_is_choice' => 'Herkunftskonto ist..', + 'rule_trigger_from_account_is' => 'Das Quellkonto ist ":trigger_value"', 'rule_trigger_from_account_contains_choice' => 'Herkunftskonto enthält..', + 'rule_trigger_from_account_contains' => 'Das Quellkonto enthält ":trigger_value"', 'rule_trigger_to_account_starts_choice' => 'Zielkonto beginnt mit..', + 'rule_trigger_to_account_starts' => 'Das Zielkonto startet mit ":trigger_value"', 'rule_trigger_to_account_ends_choice' => 'Zielkonto endet mit..', + 'rule_trigger_to_account_ends' => 'Das Zielkonto endet mit ":trigger_value"', 'rule_trigger_to_account_is_choice' => 'Zielkonto ist..', + 'rule_trigger_to_account_is' => 'Das Zielkonto ist ":trigger_value"', 'rule_trigger_to_account_contains_choice' => 'Zielkonto enthält..', + 'rule_trigger_to_account_contains' => 'Zielkonto enthält ":trigger_value"', 'rule_trigger_transaction_type_choice' => 'Überweisung ist vom Typ..', - 'rule_trigger_amount_less_choice' => 'Betrag ist geringer als..', - 'rule_trigger_amount_exactly_choice' => 'Betrag ist..', - 'rule_trigger_amount_more_choice' => 'Betragn ist mehr als..', - 'rule_trigger_description_starts_choice' => 'Beschreibung beginnt mit..', - 'rule_trigger_description_ends_choice' => 'Beschreibung endet mit..', - 'rule_trigger_description_contains_choice' => 'Beschreibung enthält..', - 'rule_trigger_description_is_choice' => 'Beschreibung ist..', + 'rule_trigger_transaction_type' => 'Transaktion ist vom Typ ": Trigger_value"', 'rule_trigger_category_is_choice' => 'Kategorie ist..', + 'rule_trigger_category_is' => 'Kategorie ist ":trigger_value"', + 'rule_trigger_amount_less_choice' => 'Betrag ist geringer als..', + 'rule_trigger_amount_less' => 'Betrag ist kleiner als :trigger_value', + 'rule_trigger_amount_exactly_choice' => 'Betrag ist..', + 'rule_trigger_amount_exactly' => 'Betrag ist :trigger_value', + 'rule_trigger_amount_more_choice' => 'Betrag ist mehr als..', + 'rule_trigger_amount_more' => 'Betrag ist größer als :trigger_value', + 'rule_trigger_description_starts_choice' => 'Beschreibung beginnt mit..', + 'rule_trigger_description_starts' => 'Beschreibung beginnt mit ":trigger_value"', + 'rule_trigger_description_ends_choice' => 'Beschreibung endet mit..', + 'rule_trigger_description_ends' => 'Beschreibung endet mit ":trigger_value"', + 'rule_trigger_description_contains_choice' => 'Beschreibung enthält..', + 'rule_trigger_description_contains' => 'Beschreibung enthält ":trigger_value"', + 'rule_trigger_description_is_choice' => 'Beschreibung ist..', + 'rule_trigger_description_is' => 'Beschreibung ist ":trigger_value"', 'rule_trigger_budget_is_choice' => 'Budget ist..', + 'rule_trigger_budget_is' => 'Budget is ":trigger_value"', 'rule_trigger_tag_is_choice' => '(A) Tag ist..', + 'rule_trigger_tag_is' => 'A tag is ":trigger_value"', 'rule_trigger_has_attachments_choice' => 'Hat zumindest so viele Anhänge', 'rule_trigger_has_attachments' => 'Hat zumindest :trigger_value Anhäng(e)', 'rule_trigger_store_journal' => 'Wenn eine Transaktion erstellt wird', 'rule_trigger_update_journal' => 'Wenn eine Transaktion aktualisiert wird', + 'rule_trigger_has_no_category_choice' => 'Has no category', + 'rule_trigger_has_no_category' => 'Transaction has no category', + 'rule_trigger_has_any_category_choice' => 'Has a (any) category', + 'rule_trigger_has_any_category' => 'Transaction has a (any) category', + 'rule_trigger_has_no_budget_choice' => 'Has no budget', + 'rule_trigger_has_no_budget' => 'Transaction has no budget', + 'rule_trigger_has_any_budget_choice' => 'Has a (any) budget', + 'rule_trigger_has_any_budget' => 'Transaction has a (any) budget', + 'rule_trigger_has_no_tag_choice' => 'Has no tag(s)', + 'rule_trigger_has_no_tag' => 'Transaction has no 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_action_set_category' => 'Kategorie zu ":action_value" festlegen', 'rule_action_clear_category' => 'Bereinige Kategorie', 'rule_action_set_budget' => 'Budget zu ":action_value" festlegen', @@ -340,12 +324,14 @@ return [ 'no_location_set' => 'Kein Ort gesetzt.', 'meta_data' => 'Metadaten', 'location' => 'Standort', + 'without_date' => 'Ohne Datum', + 'result' => 'Ergebnis', // preferences 'pref_home_screen_accounts' => 'Konten auf dem Startbildschirm', 'pref_home_screen_accounts_help' => 'Welche Konten sollen auf dem Startbildschirm angezeigt werden?', 'pref_view_range' => 'Sichtbare Zeiträume', - 'pref_view_range_help' => 'Einige Grafiken werden automatisch nach Zeiträumen gruppiert. Welchen Zeitraum wollen Sie festlegen?', + 'pref_view_range_help' => 'Einige Diagramme werden automatisch nach Zeiträumen gruppiert. Welchen Zeitraum wollen Sie festlegen?', 'pref_1D' => 'Ein Tag', 'pref_1W' => 'Eine Woche', 'pref_1M' => 'Ein Monat', @@ -356,7 +342,7 @@ return [ 'pref_languages_help' => 'Firefly III unterstützt mehrere Sprachen. Welche möchten Sie nutzen?', 'pref_custom_fiscal_year' => 'Einstellungen zum Geschäftsjahr', 'pref_custom_fiscal_year_label' => 'Aktiviert', - 'pref_custom_fiscal_year_help' => 'In Ländern, in denen ein Geschäftsjahr nicht vom 1. Januar bis 31. Dezemeber dauert, können Sie diese Option anstellen und Start / Ende des Geschäftsjahres angeben', + 'pref_custom_fiscal_year_help' => 'In Ländern, in denen ein Geschäftsjahr nicht vom 1. Januar bis 31. Dezember dauert, können Sie diese Option anstellen und Start / Ende des Geschäftsjahres angeben', 'pref_fiscal_year_start_label' => 'Startdatum des Geschäftsjahr', 'pref_two_factor_auth' => 'Zwei-Faktor-Authentifizierung', 'pref_two_factor_auth_help' => 'Wenn Sie die Zwei-Faktor-Authentifizierung aktivieren, fügen Sie ihrem Benutzerkonto eine zusätzliche Sicherheitsebene hinzu. Sie loggen sich ein mit etwas das Sie wissen (ihrem Passwort) und etwas das Sie besitzen (einem Bestätigungscode). Bestätigungscodes werden von Anwendungen auf ihrem Smartphone, wie Authy oder Google Authenticator, generiert.', @@ -365,8 +351,8 @@ return [ 'pref_two_factor_auth_remove_it' => 'Vergessen Sie nicht ihr Benutzerkonto aus ihrer Authentifizierungsapp zu entfernen!', 'pref_two_factor_auth_code' => 'Code überprüfen', 'pref_two_factor_auth_code_help' => 'Scannen Sie den QR-Code mit einer Anwendung wie Authy oder Google Authenticator auf ihrem Handy und geben Sie den generierten Code ein.', - 'pref_two_factor_auth_reset_code' => 'Setze den Verfizierungskode zurück', - 'pref_two_factor_auth_remove_code' => 'Entferne den Verfizierungskode', + 'pref_two_factor_auth_reset_code' => 'Verifizierungscode zurücksetzen', + 'pref_two_factor_auth_remove_code' => 'Verifizierungscode entfernen', 'pref_two_factor_auth_remove_will_disable' => '(dies wird auch Zwei-Faktor-Authentifizierung deaktivieren)', 'pref_save_settings' => 'Einstellungen speichern', 'saved_preferences' => 'Einstellungen gespeichert!', @@ -379,9 +365,9 @@ return [ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'pref_home_do_show_deposits' => 'Ja, zeige sie an', 'successful_count' => 'davon :count erfolgreich', - 'transaction_page_size_title' => 'Seitengröße', + 'transaction_page_size_title' => 'Einträge pro Seite', 'transaction_page_size_help' => 'Jede Liste von Transaktionen zeigt maximal folgende Anzahl an Transaktionen', - 'transaction_page_size_label' => 'Seitengröße', + 'transaction_page_size_label' => 'Einträge pro Seite', 'between_dates' => '(:start und :end)', 'pref_optional_fields_transaction' => 'Optionale Felder für Überweisungen', 'pref_optional_fields_transaction_help' => 'Standardmäßig sind nicht alle Felder aktiviert, wenn eine neue Überweisung erstellt wird (wegen der Übersicht). Unten können Sie diese Felder aktivieren, wenn Sie glauben, dass Sie nützlich für Sie sind. Alle Felder die deaktiviert sind, aber bereits ausgefüllt sind, werden unabhängig von ihren Einstellung sichtbar sein.', @@ -419,20 +405,20 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'password_changed' => 'Passwort geändert!', 'should_change' => 'Ziel ist es, ihr Passwort zu ändern.', 'invalid_password' => 'Ungültiges Passwort!', - '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).', + 'what_is_pw_security' => 'Was ist "Kennwort Sicherheit überprüfen"?', + 'secure_pw_title' => 'So wählen Sie ein sicheres Passwort aus', + 'secure_pw_history' => 'Im August 2017 veröffentlichte die bekannte Sicherheitsforscherin Troy Hunt eine Liste von 306 Millionen gestohlenen Passwörtern. Diese Passwörter wurden während der Einbrüche bei Firmen wie LinkedIn, Adobe und NeoPets (und vielen mehr) gestohlen.', 'secure_pw_check_box' => '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_sha1' => 'Aber ich dachte, dass SHA1 schon geknackt wurde?', '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.', + '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.', // attachments - 'nr_of_attachments' => 'Eine Anhang |:count Anhänge', + 'nr_of_attachments' => 'Ein Anhang |:count Anhänge', 'attachments' => 'Anhänge', 'edit_attachment' => 'Anhang ":name" bearbeiten', 'update_attachment' => 'Anhang aktualisieren', @@ -457,18 +443,18 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'convert_to_Deposit' => '":description" zu einer Einzahlung konvertieren', 'convert_to_Transfer' => '":description" zu einer Überweisung konvertieren', 'convert_options_WithdrawalDeposit' => 'Konvertieren Sie eine Ausgabe in eine Einzahlung', - 'convert_options_WithdrawalTransfer' => 'Konvertieren Sie eine Ausgabe in eine Übreweisung', + 'convert_options_WithdrawalTransfer' => 'Konvertieren Sie eine Ausgabe in eine Überweisung', 'convert_options_DepositTransfer' => 'Konvertieren Sie eine Einzahlung in eine Überweisung', '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 eine Ausgabe zu einer Einzahlung', - 'convert_Withdrawal_to_transfer' => 'Konvertieren Sie eine Ausgabe zu einer Übreweisung', - 'convert_Deposit_to_withdrawal' => 'Konvertieren Sie eine Einzahlung zu einer Ausgabe', - 'convert_Deposit_to_transfer' => 'Konvertieren Sie eine Einzahlung zu einer Überweisung', - 'convert_Transfer_to_deposit' => 'Konvertieren Sie eine Überweisung zu einer Einzahlung', - 'convert_Transfer_to_withdrawal' => 'Konvertieren Sie eine Überweisung zu einer Ausgabe', + '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', + 'convert_Deposit_to_transfer' => 'Konvertieren Sie diese Einzahlung zu einer Überweisung', + 'convert_Transfer_to_deposit' => 'Konvertieren Sie diese Überweisung zu einer Einzahlung', + 'convert_Transfer_to_withdrawal' => 'Konvertieren Sie diese Überweisung zu einer Ausgabe', 'convert_please_set_revenue_source' => 'Bitte ein Eingangskonto wählen, woher das Geld kommen wird.', 'convert_please_set_asset_destination' => 'Bitte wählen Sie ein Bestandskonto aus wo das Geld hingehen wird.', 'convert_please_set_expense_destination' => 'Bitte wählen Sie ein Spesenkonto wo das Geld hingehen wird.', @@ -524,7 +510,6 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'createBudget' => 'Neues Budget', 'inactiveBudgets' => 'Inaktive Budgets', 'without_budget_between' => 'Überweisungen ohne Budget zwischen :start und :end', - 'budget_in_month' => ':name in :month', 'delete_budget' => 'Budget ":name" löschen', 'deleted_budget' => 'Budget ":name" gelöscht', 'edit_budget' => 'Budget ":name" bearbeiten', @@ -532,13 +517,13 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'update_amount' => 'Betrag aktualisieren', 'update_budget' => 'Budget aktualisieren', 'update_budget_amount_range' => 'Aktualisiere (erwarteten) verfügbaren Betrag zwischen :start und :end', - 'budget_period_navigator' => 'Period navigator', + 'budget_period_navigator' => 'Zeitraum-navigator', // bills: 'matching_on' => 'Reagiert auf', 'between_amounts' => 'zwischen :low und :high.', 'repeats' => 'Wiederholungen', - 'connected_journals' => 'Vernüpfte Überweisungen', + 'connected_journals' => 'Verknüpfte Überweisungen', 'auto_match_on' => 'Automatisch von Firefly abgestimmt', 'auto_match_off' => 'Nicht automatisch gefunden von Firefly', 'next_expected_match' => 'Nächste erwartete Übereinstimmung', @@ -550,15 +535,15 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'update_bill' => 'Aktualisieren Sie eine Rechnung', 'updated_bill' => 'Rechnung ":name" aktualisiert', 'store_new_bill' => 'Neue Rechnung speichern', - 'stored_new_bill' => 'Neue Rechung ":name" gespeichert', - 'cannot_scan_inactive_bill' => 'Inaktive Rechnungen können nicht gesacannt werden.', + 'stored_new_bill' => 'Neue Rechnung ":name" gespeichert', + 'cannot_scan_inactive_bill' => 'Inaktive Rechnungen können nicht gescannt werden.', 'rescanned_bill' => 'Alles gescannt.', 'average_bill_amount_year' => 'Durchschnittliche Rechnungssumme (:year)', 'average_bill_amount_overall' => 'Durchschnittliche Rechnungssumme (gesamt)', 'not_or_not_yet' => '(noch) nicht', 'not_expected_period' => 'Diesen Zeitraum nicht erwartet', - 'bill_is_active' => 'Bill is active', - 'bill_will_automatch' => 'Bill will automatically linked to matching transactions', + 'bill_is_active' => 'Rechnung ist aktiv', + 'bill_will_automatch' => 'Rechnung wird automatisch mit passenden Transaktionen verknüpft', // accounts: 'details_for_asset' => 'Details für Girokonto ":name"', 'details_for_expense' => 'Details für Debitor ":name"', @@ -598,8 +583,6 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'select_more_than_one_category' => 'Bitte mehr als eine Kategorie wählen', 'select_more_than_one_budget' => 'Bitte mehr als ein Budget wählen', 'select_more_than_one_tag' => 'Bitte wählen Sie mehr als einen Tag aus', - 'from_to' => 'Von :start bis :end', - 'from_to_breadcrumb' => 'von :start bis :end', 'account_default_currency' => 'Wenn Sie eine andere Währung auswählen, werden neue Transaktionen von diesem Konto standardmäßig diese Währung ausgewählt haben.', // categories: @@ -624,7 +607,7 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'update_transfer' => 'Überweisungen aktualisieren', 'updated_withdrawal' => 'Ausgabe ":description" aktualisiert', 'updated_deposit' => 'Einnahme ":description" aktualisiert', - 'updated_transfer' => 'Überweisung ":description" aktualisert', + 'updated_transfer' => 'Überweisung ":description" aktualisiert', 'delete_withdrawal' => 'Ausgabe ":description" löschen', 'delete_deposit' => 'Einnahme ":description" löschen', 'delete_transfer' => 'Überweisung ":description" löschen', @@ -642,6 +625,11 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'perm-delete-many' => 'Das Löschen von mehreren Elementen auf einmal kann sich störend auswirken. Bitte seien Sie vorsichtig.', 'mass_deleted_transactions_success' => ':amount Überweisung(en) gelöscht.', 'mass_edited_transactions_success' => ':amount Überweisung(en) aktualisiert', + 'opt_group_no_account_type' => '(no account type)', + 'opt_group_defaultAsset' => 'Standard-Anlagekonto', + 'opt_group_savingAsset' => 'Sparkonten', + 'opt_group_sharedAsset' => 'Shared asset accounts', + 'opt_group_ccAsset' => 'Credit cards', // new user: @@ -657,8 +645,6 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'yourAccounts' => 'Deine Konten', 'budgetsAndSpending' => 'Budgets und Ausgaben', 'savings' => 'Erspartes', - 'markAsSavingsToContinue' => 'Markieren Sie ihre Girokonten als "Sparkonten" um diese Anzeige zu füllen', - 'createPiggyToContinue' => 'Erstellen Sie Sparschweine um dieses Panel zu füllen.', 'newWithdrawal' => 'Neue Ausgabe', 'newDeposit' => 'Neue Einnahme', 'newTransfer' => 'Neue Überweisung', @@ -666,8 +652,6 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'moneyOut' => 'Geldausgang', 'billsToPay' => 'Rechnungen zu bezahlen', 'billsPaid' => 'Rechnungen bezahlt', - 'divided' => 'geteilt', - 'toDivide' => 'zu teilen', // menu and titles, should be recycled as often as possible: 'currency' => 'Währung', @@ -727,20 +711,11 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'reports_can_bookmark' => 'Berichte können als Lesezeichen gespeichert werden.', 'incomeVsExpenses' => 'Einkommen vs Ausgaben', 'accountBalances' => 'Kontostände', - 'balanceStartOfYear' => 'Bilanz zum Jahresbeginn', - 'balanceEndOfYear' => 'Bilanz zum Jahresende', - 'balanceStartOfMonth' => 'Bilanz zum Monatsbeginn', - 'balanceEndOfMonth' => 'Bilanz zum Monatsende', 'balanceStart' => 'Bilanz zum Beginn der Periode', 'balanceEnd' => 'Bilanz zum Ende der Periode', - 'reportsOwnAccounts' => 'Berichte für Ihren eigenen Konten', - 'reportsOwnAccountsAndShared' => 'Reports for your own accounts and shared accounts', 'splitByAccount' => 'Nach Konto aufteilen', - 'balancedByTransfersAndTags' => 'Ausgeglichen durch Überweisungen und Tags', 'coveredWithTags' => 'Abgedeckt durch Tags', 'leftUnbalanced' => 'Left unbalanced', - 'expectedBalance' => 'Erwarteter Kontostand', - 'outsideOfBudgets' => 'Ausserhalb von Budgets', 'leftInBudget' => 'Übrig im Budget', 'sumOfSums' => 'Summe der Summen', 'noCategory' => '(keine Kategorie)', @@ -753,19 +728,12 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'topX' => 'top :number', 'show_full_list' => 'Zeige die gesamte Liste', 'show_only_top' => 'Nur die Top :number anzeigen', - 'sum_of_year' => 'Summe des Jahres', - 'sum_of_years' => 'Summe der Jahre', - 'average_of_year' => 'Durchschnitt des Jahres', - 'average_of_years' => 'Durchschnitt der Jahre', - 'categories_earned_in_year' => 'Kategorien (nach Einnahmen)', - 'categories_spent_in_year' => 'Kategorien (nach Ausgaben)', 'report_type' => 'Typ des Berichts', 'report_type_default' => 'Standard-Finanzbericht', 'report_type_audit' => 'Übersicht der Transaktionen (Prüfung)', 'report_type_category' => 'Kategorie-Bericht', 'report_type_budget' => 'Budgetbericht', 'report_type_tag' => 'Tag report', - 'report_type_meta-history' => 'Übersicht über Kategorien, Budgets und Rechnungen', 'more_info_help' => 'Weitere Informationen über diese Art von Berichten finden Sie in der Hilfe. Drücken Sie hierfür das (?)-Symbol in der oberen rechten Ecke.', 'report_included_accounts' => 'Eingezogene Konten', 'report_date_range' => 'Zeitraum', @@ -811,14 +779,16 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'description' => 'Beschreibung', 'sum_of_period' => 'Summe des Zeitraums', 'average_in_period' => 'Durchschnitt im Zeitraum', - 'account_role_defaultAsset' => 'Default asset account', + 'account_role_defaultAsset' => 'Standard-Anlagekonto', 'account_role_sharedAsset' => 'Shared asset account', - 'account_role_savingAsset' => 'Savings account', + 'account_role_savingAsset' => 'Sparkonto', 'account_role_ccAsset' => 'Kreditkarte', + 'budget_chart_click' => 'Please click on a budget name in the table above to see a chart.', + 'category_chart_click' => 'Please click on a category name in the table above to see a chart.', + // charts: 'chart' => 'Diagram', - 'dayOfMonth' => 'Tag des Monats', 'month' => 'Monat', 'budget' => 'Budget', 'spent' => 'Ausgegeben', @@ -839,7 +809,6 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'budgeted' => 'Budgetiert', 'period' => 'Zeitraum', 'balance' => 'Kontostand', - 'summary' => 'Zusammenfasssung', 'sum' => 'Summe', 'average' => 'Durchschnitt', 'balanceFor' => 'Kontostand für :name', @@ -859,47 +828,38 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'add_money_to_piggy_title' => 'Geld dem Sparschwein ":name" hinzufügen', 'remove_money_from_piggy_title' => 'Geld dem Sparschwein ":name" entnehmen', 'add' => 'Hinzufügen', + 'no_money_for_piggy' => 'You have no money to put in this piggy bank.', - 'remove' => 'Entfernen', - 'max_amount_add' => 'Der maximale Betrag, den Sie hinzufügen können ist', - 'max_amount_remove' => 'Der maximale Betrag, den Sie entnehmen können ist', - 'update_piggy_button' => 'Sparschwein aktualisieren', - 'update_piggy_title' => 'Sparschwein ":name" aktualisieren', - 'updated_piggy_bank' => 'Sparschwein ":name" aktualisiert', - 'details' => 'Details', - 'events' => 'Ereignisse', - 'target_amount' => 'Zielbetrag', - 'start_date' => 'Startdatum', - 'target_date' => 'Zieldatum', - 'no_target_date' => 'Kein Zieldatum', - 'todo' => 'Zu erledigen', - 'table' => 'Tabelle', - 'piggy_bank_not_exists' => 'Dieses Sparschwein existiert nicht mehr.', - 'add_any_amount_to_piggy' => 'Fügen sie Geld ihrem Sparschein hinzu, um ihr Ziel von :amount zu erreichen.', - 'add_set_amount_to_piggy' => ':amount einzahlen um Sparschwein bis :date zu füllen', - 'delete_piggy_bank' => 'Sparschwein ":name" löschen', - 'cannot_add_amount_piggy' => ':amount konnte nicht zu ":name" hinzugefügt werden.', - 'cannot_remove_from_piggy' => 'Could not remove :amount from ":name".', - 'deleted_piggy_bank' => 'Sparschwein ":name" gelöscht', - 'added_amount_to_piggy' => ':amount zu ":name" hinzugefügt', - 'removed_amount_from_piggy' => ':amount von ":name" entfernt', - 'cannot_remove_amount_piggy' => 'Konnten :amount nicht von ":name" entfernen.', + 'remove' => 'Entfernen', + 'max_amount_add' => 'Der maximale Betrag, den Sie hinzufügen können ist', + 'max_amount_remove' => 'Der maximale Betrag, den Sie entnehmen können ist', + 'update_piggy_button' => 'Sparschwein aktualisieren', + 'update_piggy_title' => 'Sparschwein ":name" aktualisieren', + 'updated_piggy_bank' => 'Sparschwein ":name" aktualisiert', + 'details' => 'Details', + 'events' => 'Ereignisse', + 'target_amount' => 'Zielbetrag', + 'start_date' => 'Startdatum', + 'target_date' => 'Zieldatum', + 'no_target_date' => 'Kein Zieldatum', + 'table' => 'Tabelle', + 'delete_piggy_bank' => 'Sparschwein ":name" löschen', + 'cannot_add_amount_piggy' => ':amount konnte nicht zu ":name" hinzugefügt werden.', + 'cannot_remove_from_piggy' => 'Could not remove :amount from ":name".', + 'deleted_piggy_bank' => 'Sparschwein ":name" gelöscht', + 'added_amount_to_piggy' => ':amount zu ":name" hinzugefügt', + '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', - 'edit_tag' => 'Tag ":tag" bearbeiten', - 'updated_tag' => 'Aktualisierter Tag ":tag"', - 'created_tag' => 'Tag ":tag" wurde erstellt!', - 'no_year' => 'Kein Jahr angegeben', - 'no_month' => 'Kein Monat angegeben', - 'tag_title_nothing' => 'Standard-Tags', - 'tag_title_balancingAct' => 'Ausgleich Tags', - 'tag_title_advancePayment' => 'Vorauszahlung 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', + 'edit_tag' => 'Tag ":tag" bearbeiten', + 'updated_tag' => 'Aktualisierter Tag ":tag"', + 'created_tag' => 'Tag ":tag" wurde erstellt!', 'transaction_journal_information' => 'Transaktionsinformationen', 'transaction_journal_meta' => 'Metainformationen', @@ -914,7 +874,7 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'instance_configuration' => 'Konfiguration', 'firefly_instance_configuration' => 'Konfigurationsoptionen für Firefly III', 'setting_single_user_mode' => 'Einzelnutzermodus', - 'setting_single_user_mode_explain' => 'Standardmäßig aktzeptiert Firefly III nur eine Registration: Sie. Diese Sicherheitsmaßnahme verhindert das Benutzen Ihrer Instanz durch andere, außer Sie erlauben es. Zukünftige Registrationen sind gesperrt. Wenn Sie dieses Kontrollkästchen deaktivieren können andere ihre Instanz ebenfalls benutzen, vorausgesetzt sie ist erreichbar (mit dem Internet verbunden).', + 'setting_single_user_mode_explain' => 'Standardmäßig akzeptiert Firefly III nur eine Registrierung: Sie. Diese Sicherheitsmaßnahme verhindert das Benutzen Ihrer Instanz durch andere, außer Sie erlauben es. Zukünftige Registrierungen sind gesperrt. Wenn Sie dieses Kontrollkästchen deaktivieren können andere ihre Instanz ebenfalls benutzen, vorausgesetzt sie ist erreichbar (mit dem Internet verbunden).', 'store_configuration' => 'Konfiguration speichern', 'single_user_administration' => 'Benutzerverwaltung für :email', 'edit_user' => 'Benutzer :email bearbeiten', @@ -926,44 +886,59 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'budgets_with_limits' => 'Budget(s) mit konfigurierten Betrag', 'rule_or_rules' => 'Regel(n)', 'rulegroup_or_groups' => 'Regelgruppe(n)', - 'setting_must_confirm_account' => 'Kontobestätigung', - 'setting_must_confirm_account_explain' => 'Wenn sie diese Option auswählen, müssen Benutzer vor Benutzung ihr Konto aktivieren.', 'configuration_updated' => 'Die Konfiguration wurde aktualisiert', 'setting_is_demo_site' => 'Demonstrationsseite', - 'setting_is_demo_site_explain' => 'Wenn sie diese Option auswählen, wird sich diese Installation wie eine Demonstrationsseite verhalten, was ungwollte Auswirkungen haben kann.', - 'setting_send_email_notifications' => 'E-Mail-Benachrichtigungen senden', - 'setting_send_email_explain' => 'Firefly III can send you email notifications about certain events. They will be sent to :site_owner. This email address can be set in the .env file.', + 'setting_is_demo_site_explain' => 'Wenn sie diese Option auswählen, wird sich diese Installation wie eine Demonstrationsseite verhalten, was ungewollte Auswirkungen haben kann.', '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', + // 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', + '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', // split a transaction: - 'transaction_meta_data' => 'Transaktions Metadaten', - 'transaction_dates' => 'Überweisungsdatum', 'splits' => 'Geteilte', - 'split_title_withdrawal' => 'Teilen Sie Ihre neue Ausgabe', - 'split_intro_one_withdrawal' => 'Firefly unterstützt die "Aufteilung" einer Ausgabe.', - 'split_intro_two_withdrawal' => 'Es bedeutet, dass die Menge des Geldes, die Sie aufgegeben haben auf mehrere Zielkonten, Budgets oder Kategorien aufgeteilt werden kann.', - 'split_intro_three_withdrawal' => 'For example: you could split your :total groceries so you pay :split_one from your "daily groceries" budget and :split_two from your "cigarettes" budget.', - 'split_table_intro_withdrawal' => 'Split your withdrawal in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_withdrawal' => 'Gesplittete Ausgabe speichern', - 'update_splitted_withdrawal' => 'Gesplittete Ausgabe aktualisieren', - 'split_title_deposit' => 'Neue Einnahme aufteilen', - 'split_intro_one_deposit' => 'Firefly untestützt das "Aufteilen" von Einnahmen.', - 'split_intro_two_deposit' => 'It means that the amount of money you\'ve earned is divided between several source revenue accounts or categories.', - 'split_intro_three_deposit' => 'For example: you could split your :total salary so you get :split_one as your base salary and :split_two as a reimbursment for expenses made.', - 'split_table_intro_deposit' => 'Split your deposit in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_deposit' => 'Store splitted deposit', - 'split_title_transfer' => 'Split your new transfer', - 'split_intro_one_transfer' => 'Firefly supports the "splitting" of a transfer.', - 'split_intro_two_transfer' => 'It means that the amount of money you\'re moving is divided between several categories or piggy banks.', - 'split_intro_three_transfer' => 'For example: you could split your :total move so you get :split_one in one piggy bank and :split_two in another.', - 'split_table_intro_transfer' => 'Split your transfer in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_transfer' => 'Store splitted transfer', 'add_another_split' => 'Eine weitere Aufteilung hinzufügen', 'split-transactions' => 'Transaktionen aufteilen', - 'split-new-transaction' => 'Eine neue Transaktion aufteilen', 'do_split' => 'Aufteilen', 'split_this_withdrawal' => 'Diese Ausgabe aufteilen', 'split_this_deposit' => 'Diese Einnahme aufteilen', @@ -1017,9 +992,6 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'import_status_finished_job' => 'The transactions imported can be found in tag :tag.', 'import_with_key' => 'Import with key \':key\'', - // different states: - 'import_status_job_running' => 'The import is underway. Please be patient...', - // sandstorm.io errors and messages: 'sandstorm_not_available' => 'This function is not available when you are using Firefly III within a Sandstorm.io environment.', @@ -1071,4 +1043,4 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'no_bills_create_default' => 'Create a bill', -]; \ No newline at end of file +]; diff --git a/resources/lang/de_DE/form.php b/resources/lang/de_DE/form.php index dcab7b67ef..3683f74ea6 100644 --- a/resources/lang/de_DE/form.php +++ b/resources/lang/de_DE/form.php @@ -34,7 +34,7 @@ return [ 'journal_source_account_name' => 'Kreditor (Quelle)', 'journal_source_account_id' => 'Girokonto (Quelle)', 'BIC' => 'BIC', - 'verify_password' => 'Verify password security', + 'verify_password' => 'Überprüfen Sie die Kennwortsicherheit', 'account_from_id' => 'Vom Konto', 'account_to_id' => 'Auf Konto', 'source_account' => 'Quellkonto', @@ -80,7 +80,7 @@ return [ 'source_account_revenue' => 'Quellkonto (Ertragskonto)', 'type' => 'Type', 'convert_Withdrawal' => 'Ändere zu Abhebung', - 'convert_Deposit' => 'Ändere zu Einzahlng', + 'convert_Deposit' => 'Ändere zu Einzahlung', 'convert_Transfer' => 'Ändere zu Überweisung', @@ -100,6 +100,7 @@ return [ 'code' => 'Code', 'iban' => 'IBAN', 'accountNumber' => 'Kontonummer', + 'creditCardNumber' => 'Credit card number', 'has_headers' => 'Kopfzeilen', 'date_format' => 'Datumsformat', 'specifix' => 'Bank- oder Dateispezifischer Korrekturen', @@ -135,6 +136,7 @@ return [ 'delete_attachment' => 'Lösche Anhang ":name"', 'delete_rule' => 'Lösche Regel ":title"', 'delete_rule_group' => 'Lösche Regelgruppe ":title"', + 'delete_link_type' => 'Delete link type ":name"', '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?', @@ -147,11 +149,14 @@ return [ 'journal_areYouSure' => 'Sind Sie sicher, dass Sie die Überweisung mit dem Namen ":description" löschen möchten?', 'mass_journal_are_you_sure' => 'Sind Sie sicher, dass Sie diese Überweisung löschen möchten?', 'tag_areYouSure' => 'Sind Sie sicher, dass Sie den Tag ":name" löschen möchten?', + 'journal_link_areYouSure' => 'Bist du sicher, dass du die Verknüpfung zwischen :source und :destination löschen möchtest?', + 'linkType_areYouSure' => 'Are you sure you want to delete the link type ":name" (":inward" / ":outward")?', 'permDeleteWarning' => 'Das Löschen von Dingen in Firefly ist dauerhaft und kann nicht rückgängig gemacht werden.', - 'mass_make_selection' => 'Sie können das Löschen von Elementen verhinden, indem Sie die Checkbox entfernen.', + 'mass_make_selection' => 'Sie können das Löschen von Elementen verhindern, indem Sie die Checkbox entfernen.', 'delete_all_permanently' => 'Ausgewähltes dauerhaft löschen', 'update_all_journals' => 'Diese Transaktionen aktualisieren', 'also_delete_transactions' => 'Die einzige Überweisung, die mit diesem Konto verknüpft ist, wird ebenfalls gelöscht. | Alle :count Überweisungen, die mit diesem Konto verknüpft sind, werden ebenfalls gelöscht.', + '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' => 'Die einzige Regel, die mit diesem Konto verknüpft ist, wird ebenfalls gelöscht. | Alle :count Regeln, die mit diesem Konto verknüpft sind, werden ebenfalls gelöscht.', 'also_delete_piggyBanks' => 'Das einzige Sparschwein, das mit diesem Konto verknüpft ist, wird ebenfalls gelöscht. | Alle :count Sparschweine, die mit diesem Konto verknüpft sind, werden ebenfalls gelöscht.', 'bill_keep_transactions' => 'Die einzige Überweisung, die mit dieser Rechnung verknüpft ist, wird nicht gelöscht. | Keine der :count Überweisungen, die mit dieser Rechnung verknüpft sind, werden gelöscht.', @@ -159,7 +164,7 @@ return [ 'category_keep_transactions' => 'Die eine Überweisungen, die mit dieser Kategorie verknüpft ist, wird nicht gelöscht. | Keine der :count Kategorien, die mit dieser Rechnung verknüpft sind, werden gelöscht.', 'tag_keep_transactions' => 'Die einzige Überweisung, die mit diesem Tag verknüpft ist, wird nicht gelöscht. | Keiner der :count Tags, die mit dieser Rechnung verknüpft sind, werden gelöscht.', - 'email' => 'Email-Addresse', + 'email' => 'E-Mail Adresse', 'password' => 'Passwort', 'password_confirmation' => 'Passwort (nochmal)', 'blocked' => 'Ist blockiert?', @@ -189,4 +194,7 @@ return [ 'payment_date' => 'Zahlungsdatum', 'invoice_date' => 'Rechnungsdatum', 'internal_reference' => 'Interner Verweis', -]; \ No newline at end of file + + 'inward' => 'Inward description', + 'outward' => 'Outward description', +]; diff --git a/resources/lang/de_DE/help.php b/resources/lang/de_DE/help.php index 1701cdfc6f..28bd88927c 100644 --- a/resources/lang/de_DE/help.php +++ b/resources/lang/de_DE/help.php @@ -17,7 +17,7 @@ return [ 'main-content-title' => 'Willkommen bei Firefly III', 'main-content-text' => 'Tun Sie sich selbst einen Gefallen und folgen Sie dieser kurzen Tour, damit Sie wissen wie alles funktioniert.', 'sidebar-toggle-title' => 'Sidebar um neuen Dinge zu erstellen', - 'sidebar-toggle-text' => 'Versteckt unter dem Plus-Icon sind alle Schaltflächen zum Erstellen von neuen Dingen. Konten, Überweisungen, Alles!', + 'sidebar-toggle-text' => 'Versteckt hinter dem Plus-Icon sind alle Schaltflächen zum Erstellen von neuen Dingen. Konten, Überweisungen, Alles!', 'account-menu-title' => 'Alle Ihre Konten', 'account-menu-text' => 'Hier finden Sie alle Konten, die Sie erstellt haben.', 'budget-menu-title' => 'Budget', @@ -32,4 +32,4 @@ return [ 'main-content-end-text' => 'Denken Sie daran, dass jede Seite ein kleines Fragezeichen in der oberen rechten Ecke hat. Klicken Sie darauf um Hilfe zur aktuellen Seite zu erhalten.', 'index' => 'index', 'home' => 'home', -]; \ No newline at end of file +]; diff --git a/resources/lang/de_DE/intro.php b/resources/lang/de_DE/intro.php index e945adcec8..02a0eead23 100644 --- a/resources/lang/de_DE/intro.php +++ b/resources/lang/de_DE/intro.php @@ -44,17 +44,17 @@ return [ '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 or multiple categories.', + '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 you how your expenses and income per category.', + 'reports_report_category_incomeAndExpensesChart' => 'This chart shows your expenses and income per category.', - 'reports_report_tag_intro' => 'This report will give you insight in or multiple tags.', + '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 you how your expenses and income per tag.', + 'reports_report_tag_incomeAndExpensesChart' => 'This chart shows your expenses and income per tag.', - 'reports_report_budget_intro' => 'This report will give you insight in or multiple budgets.', - 'reports_report_budget_pieCharts' => 'These charts will give you insight in expenses and income per budget or per account.', - 'reports_report_budget_incomeAndExpensesChart' => 'This chart shows you how your expenses and income per budget.', + '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.', @@ -118,4 +118,4 @@ return [ // 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/de_DE/list.php b/resources/lang/de_DE/list.php index b6181c5b8a..b3cd46d9b1 100644 --- a/resources/lang/de_DE/list.php +++ b/resources/lang/de_DE/list.php @@ -12,80 +12,78 @@ 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', - 'confirmed_from' => 'Bestätigt von', - 'registered_from' => 'Registriert seit', - 'blocked_code' => 'Blockcode', - 'domain' => 'Domain', - 'registration_attempts' => 'Registrierungsversuche', - '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', -]; \ No newline at end of file + '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', +]; diff --git a/resources/lang/de_DE/pagination.php b/resources/lang/de_DE/pagination.php index 245d3fd88b..93f901bbf6 100644 --- a/resources/lang/de_DE/pagination.php +++ b/resources/lang/de_DE/pagination.php @@ -16,4 +16,4 @@ return [ 'previous' => '« Vorherige', 'next' => 'Nächste »', -]; \ No newline at end of file +]; diff --git a/resources/lang/de_DE/passwords.php b/resources/lang/de_DE/passwords.php index 993adfee8f..272678f176 100644 --- a/resources/lang/de_DE/passwords.php +++ b/resources/lang/de_DE/passwords.php @@ -18,4 +18,4 @@ return [ 'sent' => 'Wir haben Ihnen einen Link zum Zurücksetzen des Passworts zugesendet!', 'reset' => 'Ihr Passwort wurde zurückgesetzt!', 'blocked' => 'Netter Versuch.', -]; \ No newline at end of file +]; diff --git a/resources/lang/de_DE/validation.php b/resources/lang/de_DE/validation.php index 583ebb4302..f9e52e740e 100644 --- a/resources/lang/de_DE/validation.php +++ b/resources/lang/de_DE/validation.php @@ -17,7 +17,6 @@ return [ 'deleted_user' => 'Aufgrund von Sicherheitsbeschränkungen ist eine Registrierung dieser Email-Adresse nicht zugelassen.', 'rule_trigger_value' => 'Dieser Wert ist für den ausgewählten Trigger ungültig.', 'rule_action_value' => 'Dieser Wert ist für die gewählte Aktion ungültig.', - 'invalid_domain' => 'Aufgrund von Sicherheitsbeschränkungen ist eine Registrierung von dieser Domain nicht zugelassen.', 'file_already_attached' => 'Die hochgeladene Datei ":name" ist diesem Objekt bereits angehängt.', 'file_attached' => 'Datei ":name" erfolgreich hochgeladen.', 'file_invalid_mime' => 'Die Datei ":name" ist vom Typ ":mime", welcher nicht zum Upload zugelassen ist.', @@ -30,8 +29,8 @@ return [ 'after' => ':attribute muss ein Datum nach :date sein.', 'alpha' => ':attribute darf nur Buchstaben enthalten.', 'alpha_dash' => ':attribute darf nur Buchstaben, Zahlen und Bindestrichen enthalten.', - 'alpha_num' => ':attribute darf nur Buchzahlen und Zahlen enthalten.', - 'array' => ':attribute muss eine Reihe sein.', + 'alpha_num' => ':attribute darf nur Buchstaben und Zahlen enthalten.', + 'array' => ':attribute muss eine Liste sein.', 'unique_for_user' => 'Es gibt bereits einen Eintrag mit diesem :attribute.', 'before' => ':attribute muss ein Datum vor dem :date sein.', 'unique_object_for_user' => 'Der Name wird bereits verwendet', @@ -47,7 +46,7 @@ return [ 'different' => ':attribute und :other müssen sich unterscheiden.', 'digits' => ':attribute muss :digits Stellen haben.', 'digits_between' => ':attribute muss zwischen :min und :max Stellen haben.', - 'email' => ':attribute muss eine gültige E-Mailadresse sein.', + 'email' => ':attribute muss eine gültige E-Mail Adresse sein.', 'filled' => ':attribute Feld muss ausgefüllt sein.', 'exists' => ':attribute ist ungültig.', 'image' => ':attribute muss ein Bild sein.', @@ -72,8 +71,8 @@ return [ 'required_unless' => ':attribute Feld ist notwendig, außer :other ist in :values enthalten.', 'required_with' => ':attribute Feld ist notwendig falls :values vorhanden sind.', 'required_with_all' => ':attribute Feld ist notwendig falls :values vorhanden sind.', - 'required_without' => ':attribute Feld ist notwenidig, falls :values nicht vorhanden ist.', - 'required_without_all' => ':attribute Feld ist notwenidig, falls kein :values vorhanden ist.', + 'required_without' => ':attribute Feld ist notwendig, falls :values nicht vorhanden ist.', + 'required_without_all' => ':attribute Feld ist notwendig, falls kein :values vorhanden ist.', 'same' => ':attribute und :other müssen übereinstimmen.', 'size.numeric' => ':attribute muss :size sein.', 'size.file' => ':attribute muss :size Kilobytes groß sein.', @@ -90,5 +89,5 @@ return [ 'in_array' => ':attribute existiert nicht in :other.', 'present' => 'Das :attribute Feld muss vorhanden sein.', 'amount_zero' => 'Der Gesamtbetrag darf nicht Null sein', - '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 + 'secure_password' => 'Das ist kein sicheres Passwort. Bitte versuche es erneut. Weitere Informationen finden Sie unter https://goo.gl/NCh2tN', +]; diff --git a/resources/lang/en_US/breadcrumbs.php b/resources/lang/en_US/breadcrumbs.php index 7cdacba597..0be3587f3c 100644 --- a/resources/lang/en_US/breadcrumbs.php +++ b/resources/lang/en_US/breadcrumbs.php @@ -13,31 +13,32 @@ declare(strict_types=1); */ return [ - 'home' => 'Home', - 'edit_currency' => 'Edit currency ":name"', - 'delete_currency' => 'Delete currency ":name"', - 'newPiggyBank' => 'Create a new piggy bank', - 'edit_piggyBank' => 'Edit piggy bank ":name"', - 'preferences' => 'Preferences', - 'profile' => 'Profile', - 'changePassword' => 'Change your password', - 'bills' => 'Bills', - 'newBill' => 'New bill', - 'edit_bill' => 'Edit bill ":name"', - 'delete_bill' => 'Delete bill ":name"', - 'reports' => 'Reports', - 'search_result' => 'Search results for ":query"', - 'withdrawal_list' => 'Expenses', - 'deposit_list' => 'Revenue, income and deposits', - 'transfer_list' => 'Transfers', - 'transfers_list' => 'Transfers', - 'create_withdrawal' => 'Create new withdrawal', - 'create_deposit' => 'Create new deposit', - 'create_transfer' => 'Create new transfer', - 'edit_journal' => 'Edit transaction ":description"', - 'delete_journal' => 'Delete transaction ":description"', - 'tags' => 'Tags', - 'createTag' => 'Create new tag', - 'edit_tag' => 'Edit tag ":tag"', - 'delete_tag' => 'Delete tag ":tag"', + 'home' => 'Home', + 'edit_currency' => 'Edit currency ":name"', + 'delete_currency' => 'Delete currency ":name"', + 'newPiggyBank' => 'Create a new piggy bank', + 'edit_piggyBank' => 'Edit piggy bank ":name"', + 'preferences' => 'Preferences', + 'profile' => 'Profile', + 'changePassword' => 'Change your password', + 'bills' => 'Bills', + 'newBill' => 'New bill', + 'edit_bill' => 'Edit bill ":name"', + 'delete_bill' => 'Delete bill ":name"', + 'reports' => 'Reports', + 'search_result' => 'Search results for ":query"', + 'withdrawal_list' => 'Expenses', + 'deposit_list' => 'Revenue, income and deposits', + 'transfer_list' => 'Transfers', + 'transfers_list' => 'Transfers', + 'create_withdrawal' => 'Create new withdrawal', + 'create_deposit' => 'Create new deposit', + 'create_transfer' => 'Create new transfer', + 'edit_journal' => 'Edit transaction ":description"', + 'delete_journal' => 'Delete transaction ":description"', + 'tags' => 'Tags', + 'createTag' => 'Create new tag', + 'edit_tag' => 'Edit tag ":tag"', + 'delete_tag' => 'Delete tag ":tag"', + 'delete_journal_link' => 'Delete link between transactions', ]; diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index fd23d22f83..843d2aef10 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -13,7 +13,6 @@ declare(strict_types=1); return [ // general stuff: - 'language_incomplete' => 'incomplete translation', 'close' => 'Close', 'actions' => 'Actions', 'edit' => 'Edit', @@ -28,12 +27,7 @@ return [ 'to' => 'To', 'showEverything' => 'Show everything', 'never' => 'Never', - 'search_results_for' => 'Search results for ":query"', 'no_results_for_empty_search' => 'Your search was empty, so nothing was found.', - 'bounced_error' => 'The message sent to :email bounced, so no access for you.', - 'deleted_error' => 'These credentials do not match our records.', - 'general_blocked_error' => 'Your account has been disabled, so you cannot login.', - 'expired_error' => 'Your account has expired, and can no longer be used.', 'removed_amount' => 'Removed :amount', 'added_amount' => 'Added :amount', 'asset_account_role_help' => 'Any extra options resulting from your choice can be set later.', @@ -56,7 +50,6 @@ return [ 'flash_error_multiple' => 'There is one error|There are :count errors', 'net_worth' => 'Net worth', 'route_has_no_help' => 'There is no help for this route.', - 'help_may_not_be_your_language' => 'This help text is in English. It is not yet available in your language', 'two_factor_welcome' => 'Hello, :user!', 'two_factor_enter_code' => 'To continue, please enter your two factor authentication code. Your application can generate it for you.', 'two_factor_code_here' => 'Enter code here', @@ -70,9 +63,6 @@ return [ 'two_factor_lost_fix_owner' => 'Otherwise, email the site owner, :site_owner and ask them to reset your two factor authentication.', 'warning_much_data' => ':days days of data may take a while to load.', 'registered' => 'You have registered successfully!', - 'tagbalancingAct' => 'Balancing act', - 'tagadvancePayment' => 'Advance payment', - 'tagnothing' => '', 'Default asset account' => 'Default asset account', 'no_budget_pointer' => 'You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.', 'Savings account' => 'Savings account', @@ -84,7 +74,6 @@ return [ '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.', - 'nothing_to_display' => 'There are no transactions to show you', 'show_all_no_filter' => 'Show all transactions without grouping them by date.', 'expenses_by_category' => 'Expenses by category', 'expenses_by_budget' => 'Expenses by budget', @@ -98,11 +87,7 @@ return [ '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_change_demo' => 'You cannot change the password of the demonstration account.', - 'cannot_delete_demo' => 'You cannot remove the demonstration account.', 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', - 'per_period' => 'Per period', - 'all_periods' => 'All periods', '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.', @@ -111,11 +96,9 @@ return [ '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"', - 'budget_in_period_breadcrumb' => 'Between :start and :end', 'clone_withdrawal' => 'Clone this withdrawal', 'clone_deposit' => 'Clone this deposit', 'clone_transfer' => 'Clone this transfer', - 'transaction_journal_other_options' => 'Other options', 'multi_select_no_selection' => 'None selected', 'multi_select_all_selected' => 'All selected', 'multi_select_filter_placeholder' => 'Find..', @@ -164,18 +147,6 @@ return [ 'quarterly' => 'quarterly', 'half-year' => 'every half year', 'yearly' => 'yearly', - // account confirmation: - 'confirm_account_header' => 'Please confirm your account', - 'confirm_account_intro' => 'An email has been sent to the address you used during your registration. Please check it out for further instructions. If you did not get this message, you can have Firefly send it again.', - 'confirm_account_resend_email' => 'Send me the confirmation message I need to activate my account.', - 'account_is_confirmed' => 'Your account has been confirmed!', - 'invalid_activation_code' => 'It seems the code you are using is not valid, or has expired.', - 'confirm_account_is_resent_header' => 'The confirmation has been resent', - 'confirm_account_is_resent_text' => 'The confirmation message has been resent. If you still did not receive the confirmation message, please contact the site owner at :owner or check the log files to see what went wrong.', - 'confirm_account_is_resent_go_home' => 'Go to the index page of Firefly', - 'confirm_account_not_resent_header' => 'Something went wrong :(', - 'confirm_account_not_resent_intro' => 'The confirmation message has been not resent. If you still did not receive the confirmation message, please contact the site owner at :owner instead. Possibly, you have tried to resend the activation message too often. You can have Firefly III try to resend the confirmation message every hour.', - 'confirm_account_not_resent_go_home' => 'Go to the index page of Firefly', // export data: 'import_and_export' => 'Import and export', @@ -205,7 +176,6 @@ return [ 'export_status_created_zip_file' => 'Created a zip file!', 'export_status_finished' => 'Export has succesfully finished! Yay!', 'export_data_please_wait' => 'Please wait...', - 'attachment_explanation' => 'The file called \':attachment_name\' (#:attachment_id) was originally uploaded to :type \':description\' (#:journal_id) dated :date for the amount of :amount.', // rules 'rules' => 'Rules', @@ -269,46 +239,60 @@ return [ // actions and triggers 'rule_trigger_user_action' => 'User action is ":trigger_value"', - 'rule_trigger_from_account_starts' => 'Source account starts with ":trigger_value"', - 'rule_trigger_from_account_ends' => 'Source account ends with ":trigger_value"', - 'rule_trigger_from_account_is' => 'Source account is ":trigger_value"', - 'rule_trigger_from_account_contains' => 'Source 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' => 'Description starts with ":trigger_value"', - 'rule_trigger_description_ends' => 'Description ends with ":trigger_value"', - 'rule_trigger_description_contains' => 'Description contains ":trigger_value"', - 'rule_trigger_description_is' => 'Description is ":trigger_value"', 'rule_trigger_from_account_starts_choice' => 'Source account starts with..', + 'rule_trigger_from_account_starts' => 'Source account starts with ":trigger_value"', 'rule_trigger_from_account_ends_choice' => 'Source account ends with..', + 'rule_trigger_from_account_ends' => 'Source account ends with ":trigger_value"', 'rule_trigger_from_account_is_choice' => 'Source account is..', + 'rule_trigger_from_account_is' => 'Source account is ":trigger_value"', 'rule_trigger_from_account_contains_choice' => 'Source account contains..', + 'rule_trigger_from_account_contains' => 'Source account contains ":trigger_value"', 'rule_trigger_to_account_starts_choice' => 'Destination account starts with..', + 'rule_trigger_to_account_starts' => 'Destination account starts with ":trigger_value"', 'rule_trigger_to_account_ends_choice' => 'Destination account ends with..', + 'rule_trigger_to_account_ends' => 'Destination account ends with ":trigger_value"', 'rule_trigger_to_account_is_choice' => 'Destination account is..', + 'rule_trigger_to_account_is' => 'Destination account is ":trigger_value"', 'rule_trigger_to_account_contains_choice' => 'Destination account contains..', + 'rule_trigger_to_account_contains' => 'Destination account contains ":trigger_value"', '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' => 'Description starts with..', - 'rule_trigger_description_ends_choice' => 'Description ends with..', - 'rule_trigger_description_contains_choice' => 'Description contains..', - 'rule_trigger_description_is_choice' => 'Description is..', + 'rule_trigger_transaction_type' => 'Transaction is of type ":trigger_value"', 'rule_trigger_category_is_choice' => 'Category is..', + 'rule_trigger_category_is' => 'Category is ":trigger_value"', + 'rule_trigger_amount_less_choice' => 'Amount is less than..', + 'rule_trigger_amount_less' => 'Amount is less than :trigger_value', + 'rule_trigger_amount_exactly_choice' => 'Amount is..', + 'rule_trigger_amount_exactly' => 'Amount is :trigger_value', + 'rule_trigger_amount_more_choice' => 'Amount is more than..', + 'rule_trigger_amount_more' => 'Amount is more than :trigger_value', + 'rule_trigger_description_starts_choice' => 'Description starts with..', + 'rule_trigger_description_starts' => 'Description starts with ":trigger_value"', + 'rule_trigger_description_ends_choice' => 'Description ends with..', + 'rule_trigger_description_ends' => 'Description ends with ":trigger_value"', + 'rule_trigger_description_contains_choice' => 'Description contains..', + 'rule_trigger_description_contains' => 'Description contains ":trigger_value"', + 'rule_trigger_description_is_choice' => 'Description is..', + 'rule_trigger_description_is' => 'Description is ":trigger_value"', 'rule_trigger_budget_is_choice' => 'Budget is..', + 'rule_trigger_budget_is' => 'Budget is ":trigger_value"', 'rule_trigger_tag_is_choice' => '(A) tag is..', + 'rule_trigger_tag_is' => 'A tag is ":trigger_value"', '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_trigger_has_no_category_choice' => 'Has no category', + 'rule_trigger_has_no_category' => 'Transaction has no category', + 'rule_trigger_has_any_category_choice' => 'Has a (any) category', + 'rule_trigger_has_any_category' => 'Transaction has a (any) category', + 'rule_trigger_has_no_budget_choice' => 'Has no budget', + 'rule_trigger_has_no_budget' => 'Transaction has no budget', + 'rule_trigger_has_any_budget_choice' => 'Has a (any) budget', + 'rule_trigger_has_any_budget' => 'Transaction has a (any) budget', + 'rule_trigger_has_no_tag_choice' => 'Has no tag(s)', + 'rule_trigger_has_no_tag' => 'Transaction has no 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_action_set_category' => 'Set category to ":action_value"', 'rule_action_clear_category' => 'Clear category', 'rule_action_set_budget' => 'Set budget to ":action_value"', @@ -340,6 +324,8 @@ return [ 'no_location_set' => 'No location set.', 'meta_data' => 'Meta data', 'location' => 'Location', + 'without_date' => 'Without date', + 'result' => 'Result', // preferences 'pref_home_screen_accounts' => 'Home screen accounts', @@ -523,7 +509,6 @@ return [ 'createBudget' => 'New budget', 'inactiveBudgets' => 'Inactive budgets', 'without_budget_between' => 'Transactions without a budget between :start and :end', - 'budget_in_month' => ':name in :month', 'delete_budget' => 'Delete budget ":name"', 'deleted_budget' => 'Deleted budget ":name"', 'edit_budget' => 'Edit budget ":name"', @@ -597,8 +582,6 @@ return [ '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', - 'from_to' => 'From :start to :end', - 'from_to_breadcrumb' => 'from :start to :end', 'account_default_currency' => 'If you select another currency, new transactions from this account will have this currency pre-selected.', // categories: @@ -641,6 +624,11 @@ return [ '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)', + 'opt_group_no_account_type' => '(no account type)', + 'opt_group_defaultAsset' => 'Default asset accounts', + 'opt_group_savingAsset' => 'Savings accounts', + 'opt_group_sharedAsset' => 'Shared asset accounts', + 'opt_group_ccAsset' => 'Credit cards', // new user: @@ -656,8 +644,6 @@ return [ 'yourAccounts' => 'Your accounts', 'budgetsAndSpending' => 'Budgets and spending', 'savings' => 'Savings', - 'markAsSavingsToContinue' => 'Mark your asset accounts as "Savings account" to fill this panel', - 'createPiggyToContinue' => 'Create piggy banks to fill this panel.', 'newWithdrawal' => 'New expense', 'newDeposit' => 'New deposit', 'newTransfer' => 'New transfer', @@ -665,8 +651,6 @@ return [ 'moneyOut' => 'Money out', 'billsToPay' => 'Bills to pay', 'billsPaid' => 'Bills paid', - 'divided' => 'divided', - 'toDivide' => 'left to divide', // menu and titles, should be recycled as often as possible: 'currency' => 'Currency', @@ -726,20 +710,11 @@ return [ 'reports_can_bookmark' => 'Remember that reports can be bookmarked.', 'incomeVsExpenses' => 'Income vs. expenses', 'accountBalances' => 'Account balances', - 'balanceStartOfYear' => 'Balance at start of year', - 'balanceEndOfYear' => 'Balance at end of year', - 'balanceStartOfMonth' => 'Balance at start of month', - 'balanceEndOfMonth' => 'Balance at end of month', 'balanceStart' => 'Balance at start of period', 'balanceEnd' => 'Balance at end of period', - 'reportsOwnAccounts' => 'Reports for your own accounts', - 'reportsOwnAccountsAndShared' => 'Reports for your own accounts and shared accounts', 'splitByAccount' => 'Split by account', - 'balancedByTransfersAndTags' => 'Balanced by transfers and tags', 'coveredWithTags' => 'Covered with tags', 'leftUnbalanced' => 'Left unbalanced', - 'expectedBalance' => 'Expected balance', - 'outsideOfBudgets' => 'Outside of budgets', 'leftInBudget' => 'Left in budget', 'sumOfSums' => 'Sum of sums', 'noCategory' => '(no category)', @@ -752,19 +727,12 @@ return [ 'topX' => 'top :number', 'show_full_list' => 'Show entire list', 'show_only_top' => 'Show only top :number', - 'sum_of_year' => 'Sum of year', - 'sum_of_years' => 'Sum of years', - 'average_of_year' => 'Average of year', - 'average_of_years' => 'Average of years', - 'categories_earned_in_year' => 'Categories (by earnings)', - 'categories_spent_in_year' => 'Categories (by spendings)', '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', - 'report_type_meta-history' => 'Categories, budgets and bills overview', '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', @@ -814,10 +782,12 @@ return [ 'account_role_sharedAsset' => 'Shared asset account', 'account_role_savingAsset' => 'Savings account', 'account_role_ccAsset' => 'Credit card', + 'budget_chart_click' => 'Please click on a budget name in the table above to see a chart.', + 'category_chart_click' => 'Please click on a category name in the table above to see a chart.', + // charts: 'chart' => 'Chart', - 'dayOfMonth' => 'Day of the month', 'month' => 'Month', 'budget' => 'Budget', 'spent' => 'Spent', @@ -838,7 +808,6 @@ return [ 'budgeted' => 'Budgeted', 'period' => 'Period', 'balance' => 'Balance', - 'summary' => 'Summary', 'sum' => 'Sum', 'average' => 'Average', 'balanceFor' => 'Balance for :name', @@ -858,47 +827,38 @@ return [ 'add_money_to_piggy_title' => 'Add money to piggy bank ":name"', 'remove_money_from_piggy_title' => 'Remove money from piggy bank ":name"', 'add' => 'Add', + 'no_money_for_piggy' => 'You have no money to put in this piggy bank.', - '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' => 'Target date', - 'no_target_date' => 'No target date', - 'todo' => 'to do', - 'table' => 'Table', - 'piggy_bank_not_exists' => 'Piggy bank no longer exists.', - 'add_any_amount_to_piggy' => 'Add money to this piggy bank to reach your target of :amount.', - 'add_set_amount_to_piggy' => 'Add :amount to fill this piggy bank on :date', - '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"', - 'cannot_remove_amount_piggy' => 'Could not remove :amount from ":name".', + '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' => 'Target date', + 'no_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' => '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', - 'edit_tag' => 'Edit tag ":tag"', - 'updated_tag' => 'Updated tag ":tag"', - 'created_tag' => 'Tag ":tag" has been created!', - 'no_year' => 'No year set', - 'no_month' => 'No month set', - 'tag_title_nothing' => 'Default tags', - 'tag_title_balancingAct' => 'Balancing act tags', - 'tag_title_advancePayment' => 'Advance payment 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', + 'edit_tag' => 'Edit tag ":tag"', + 'updated_tag' => 'Updated tag ":tag"', + 'created_tag' => 'Tag ":tag" has been created!', 'transaction_journal_information' => 'Transaction information', 'transaction_journal_meta' => 'Meta information', @@ -925,44 +885,59 @@ return [ 'budgets_with_limits' => 'budget(s) with configured amount', 'rule_or_rules' => 'rule(s)', 'rulegroup_or_groups' => 'rule group(s)', - 'setting_must_confirm_account' => 'Account confirmation', - 'setting_must_confirm_account_explain' => 'When this setting is enabled, users must activate their account before it can be used.', '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.', - 'setting_send_email_notifications' => 'Send email notifications', - 'setting_send_email_explain' => 'Firefly III can send you email notifications about certain events. They will be sent to :site_owner. This email address can be set in the .env file.', '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', + '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', // split a transaction: - 'transaction_meta_data' => 'Transaction meta-data', - 'transaction_dates' => 'Transaction dates', 'splits' => 'Splits', - 'split_title_withdrawal' => 'Split your new withdrawal', - 'split_intro_one_withdrawal' => 'Firefly supports the "splitting" of a withdrawal.', - 'split_intro_two_withdrawal' => 'It means that the amount of money you\'ve spent is divided between several destination expense accounts, budgets or categories.', - 'split_intro_three_withdrawal' => 'For example: you could split your :total groceries so you pay :split_one from your "daily groceries" budget and :split_two from your "cigarettes" budget.', - 'split_table_intro_withdrawal' => 'Split your withdrawal in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_withdrawal' => 'Store splitted withdrawal', - 'update_splitted_withdrawal' => 'Update splitted withdrawal', - 'split_title_deposit' => 'Split your new deposit', - 'split_intro_one_deposit' => 'Firefly supports the "splitting" of a deposit.', - 'split_intro_two_deposit' => 'It means that the amount of money you\'ve earned is divided between several source revenue accounts or categories.', - 'split_intro_three_deposit' => 'For example: you could split your :total salary so you get :split_one as your base salary and :split_two as a reimbursment for expenses made.', - 'split_table_intro_deposit' => 'Split your deposit in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_deposit' => 'Store splitted deposit', - 'split_title_transfer' => 'Split your new transfer', - 'split_intro_one_transfer' => 'Firefly supports the "splitting" of a transfer.', - 'split_intro_two_transfer' => 'It means that the amount of money you\'re moving is divided between several categories or piggy banks.', - 'split_intro_three_transfer' => 'For example: you could split your :total move so you get :split_one in one piggy bank and :split_two in another.', - 'split_table_intro_transfer' => 'Split your transfer in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_transfer' => 'Store splitted transfer', 'add_another_split' => 'Add another split', 'split-transactions' => 'Split transactions', - 'split-new-transaction' => 'Split a new transaction', 'do_split' => 'Do a split', 'split_this_withdrawal' => 'Split this withdrawal', 'split_this_deposit' => 'Split this deposit', @@ -1016,9 +991,6 @@ return [ 'import_status_finished_job' => 'The transactions imported can be found in tag :tag.', 'import_with_key' => 'Import with key \':key\'', - // different states: - 'import_status_job_running' => 'The import is underway. Please be patient...', - // sandstorm.io errors and messages: 'sandstorm_not_available' => 'This function is not available when you are using Firefly III within a Sandstorm.io environment.', diff --git a/resources/lang/en_US/form.php b/resources/lang/en_US/form.php index 1f0d3e0ef0..5c30300170 100644 --- a/resources/lang/en_US/form.php +++ b/resources/lang/en_US/form.php @@ -100,6 +100,7 @@ return [ 'code' => 'Code', 'iban' => 'IBAN', 'accountNumber' => 'Account number', + 'creditCardNumber' => 'Credit card number', 'has_headers' => 'Headers', 'date_format' => 'Date format', 'specifix' => 'Bank- or file specific fixes', @@ -135,6 +136,7 @@ return [ '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' => 'Are you sure you want to delete the bill named ":name"?', @@ -147,11 +149,14 @@ return [ 'journal_areYouSure' => 'Are you sure you want to delete the transaction described ":description"?', 'mass_journal_are_you_sure' => 'Are you sure you want to delete these transactions?', 'tag_areYouSure' => 'Are you sure you want to delete the tag ":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.', @@ -189,4 +194,7 @@ return [ 'payment_date' => 'Payment date', 'invoice_date' => 'Invoice date', 'internal_reference' => 'Internal reference', + + 'inward' => 'Inward description', + 'outward' => 'Outward description', ]; diff --git a/resources/lang/en_US/intro.php b/resources/lang/en_US/intro.php index 007d726e06..02a0eead23 100644 --- a/resources/lang/en_US/intro.php +++ b/resources/lang/en_US/intro.php @@ -44,17 +44,17 @@ return [ '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 or multiple categories.', + '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 you how your expenses and income per category.', + 'reports_report_category_incomeAndExpensesChart' => 'This chart shows your expenses and income per category.', - 'reports_report_tag_intro' => 'This report will give you insight in or multiple tags.', + '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 you how your expenses and income per tag.', + 'reports_report_tag_incomeAndExpensesChart' => 'This chart shows your expenses and income per tag.', - 'reports_report_budget_intro' => 'This report will give you insight in or multiple budgets.', - 'reports_report_budget_pieCharts' => 'These charts will give you insight in expenses and income per budget or per account.', - 'reports_report_budget_incomeAndExpensesChart' => 'This chart shows you how your expenses and income per budget.', + '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.', diff --git a/resources/lang/en_US/list.php b/resources/lang/en_US/list.php index c44721b8d5..217b26ce20 100644 --- a/resources/lang/en_US/list.php +++ b/resources/lang/en_US/list.php @@ -12,80 +12,78 @@ 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', - 'confirmed_from' => 'Confirmed from', - 'registered_from' => 'Registered from', - 'blocked_code' => 'Block code', - 'domain' => 'Domain', - 'registration_attempts' => 'Registration attempts', - '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', + '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', ]; diff --git a/resources/lang/en_US/validation.php b/resources/lang/en_US/validation.php index e266d67baa..9ea55191b5 100644 --- a/resources/lang/en_US/validation.php +++ b/resources/lang/en_US/validation.php @@ -17,7 +17,6 @@ return [ 'deleted_user' => 'Due to security constraints, you cannot register using this email address.', 'rule_trigger_value' => 'This value is invalid for the selected trigger.', 'rule_action_value' => 'This value is invalid for the selected action.', - 'invalid_domain' => 'Due to security constraints, you cannot register from this domain.', 'file_already_attached' => 'Uploaded file ":name" is already attached to this object.', 'file_attached' => 'Succesfully uploaded file ":name".', 'file_invalid_mime' => 'File ":name" is of type ":mime" which is not accepted as a new upload.', diff --git a/resources/lang/es_ES/auth.php b/resources/lang/es_ES/auth.php index a5934d5e73..d7264e69be 100644 --- a/resources/lang/es_ES/auth.php +++ b/resources/lang/es_ES/auth.php @@ -27,4 +27,4 @@ return [ 'failed' => 'Las credenciales no coinciden con los registros.', 'throttle' => 'Demasiados intentos de inicio de sesión. Por favor reintente en :seconds segundos.', -]; \ No newline at end of file +]; diff --git a/resources/lang/es_ES/breadcrumbs.php b/resources/lang/es_ES/breadcrumbs.php index 5909aac402..be02ccc42a 100644 --- a/resources/lang/es_ES/breadcrumbs.php +++ b/resources/lang/es_ES/breadcrumbs.php @@ -13,31 +13,32 @@ declare(strict_types=1); */ return [ - 'home' => 'Inicio', - 'edit_currency' => 'Editar moneda ":name"', - 'delete_currency' => 'Eliminar moneda ":name"', - 'newPiggyBank' => 'Crear nueva alcancía', - 'edit_piggyBank' => 'Editar alcancía ":name"', - 'preferences' => 'Preferencias', - 'profile' => 'Perfil', - 'changePassword' => 'Cambiar contraseña', - 'bills' => 'Facturas', - 'newBill' => 'Nueva factura', - 'edit_bill' => 'Editar factura ":name"', - 'delete_bill' => 'Eliminar factura ":name"', - 'reports' => 'Reportes', - 'search_result' => 'Search results for ":query"', - 'withdrawal_list' => 'Gastos', - 'deposit_list' => 'Ganancia, ingresos y depósitos', - 'transfer_list' => 'Transferencias', - 'transfers_list' => 'Transferencias', - 'create_withdrawal' => 'Crear nuevo retiro', - 'create_deposit' => 'Crear nuevo depósito', - 'create_transfer' => 'Crear nueva transferencia', - 'edit_journal' => 'Editar transacción ":description"', - 'delete_journal' => 'Eliminar transacción ":description"', - 'tags' => 'Etiquetas', - 'createTag' => 'Crear nueva etiqueta', - 'edit_tag' => 'Editar etiqueta ":tag"', - 'delete_tag' => 'Eliminar etiqueta ":tag"', -]; \ No newline at end of file + 'home' => 'Inicio', + 'edit_currency' => 'Editar moneda ":name"', + 'delete_currency' => 'Eliminar moneda ":name"', + 'newPiggyBank' => 'Crear nueva alcancía', + 'edit_piggyBank' => 'Editar alcancía ":name"', + 'preferences' => 'Preferencias', + 'profile' => 'Perfil', + 'changePassword' => 'Cambiar contraseña', + 'bills' => 'Facturas', + 'newBill' => 'Nueva factura', + 'edit_bill' => 'Editar factura ":name"', + 'delete_bill' => 'Eliminar factura ":name"', + 'reports' => 'Reportes', + 'search_result' => 'Resultados de la búsqueda para ":query"', + 'withdrawal_list' => 'Gastos', + 'deposit_list' => 'Ganancia, ingresos y depósitos', + 'transfer_list' => 'Transferencias', + 'transfers_list' => 'Transferencias', + 'create_withdrawal' => 'Crear nuevo retiro', + 'create_deposit' => 'Crear nuevo depósito', + 'create_transfer' => 'Crear nueva transferencia', + 'edit_journal' => 'Editar transacción ":description"', + 'delete_journal' => 'Eliminar transacción ":description"', + 'tags' => 'Etiquetas', + 'createTag' => 'Crear nueva etiqueta', + 'edit_tag' => 'Editar etiqueta ":tag"', + 'delete_tag' => 'Eliminar etiqueta ":tag"', + 'delete_journal_link' => 'Eliminar enlace entre transacciones', +]; diff --git a/resources/lang/es_ES/config.php b/resources/lang/es_ES/config.php index 5b382a0cb8..fcf67a8a6a 100644 --- a/resources/lang/es_ES/config.php +++ b/resources/lang/es_ES/config.php @@ -22,4 +22,4 @@ return [ 'year' => '%Y', 'half_year' => '%B %Y', -]; \ No newline at end of file +]; diff --git a/resources/lang/es_ES/csv.php b/resources/lang/es_ES/csv.php index b518776e5f..42c5abf09a 100644 --- a/resources/lang/es_ES/csv.php +++ b/resources/lang/es_ES/csv.php @@ -14,36 +14,36 @@ declare(strict_types=1); return [ // initial config - 'initial_title' => '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', + 'initial_title' => 'Configuración de importación (1/3) - Configuración de importación de CSV simple', + 'initial_text' => 'Para poder importar correctamente el archivo, por favor comprueba las opciones a continuación.', + 'initial_box' => 'Configuración de importación de CSV simple', + 'initial_box_title' => 'Opciones de configuración para importación de CSV simple', + 'initial_header_help' => 'Marque aquí si el CSV contiene títulos de columna en la primera fila.', + 'initial_date_help' => 'Formato de fecha y hora en el CSV. Siga un formato como los que indica esta página. El valor por defecto interpretará fechas que se vean así: :dateExample.', + 'initial_delimiter_help' => 'Elija el delimitador de campos de su archivo de entrada. Si no está seguro, la coma es la opción más segura.', + 'initial_import_account_help' => 'Si su archivo CSV NO contiene información sobre su(s) caja(s) de ahorros, seleccione una opción del desplegable para definir a qué cuenta pertenecen las transacciones del CSV.', + 'initial_submit' => 'Continúe con el paso 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.', + 'roles_title' => 'Configuración de importación (2/3) - Define el rol de cada columna', + 'roles_text' => 'Cada columna en su archivo CSV contiene ciertos datos. Indique qué tipo de datos debe esperar el importador. La opción de "mapear" datos significa que enlazará cada entrada encontrada en la columna con un valor en su base de datos. Una columna a menudo mapeada es la columna que contiene el IBAN de la cuenta de contrapartida. Eso puede enlazarse fácilmente con cuentas IBAN ya presentes en su base de datos.', + 'roles_table' => 'Tabla', + 'roles_column_name' => 'Nombre de la columna', + 'roles_column_example' => 'Ejemplo de datos de columna', + 'roles_column_role' => 'Significado de los datos de la columna', + 'roles_do_map_value' => 'Mapear estos valores', + 'roles_column' => 'Columna', + 'roles_no_example_data' => 'No hay datos de ejemplo disponibles', + 'roles_submit' => 'Continúe con el paso 3/3', + 'roles_warning' => 'Como mínimo, marque una columna como la columna de importe. También es aconsejable seleccionar una columna para la descripción, fecha y la cuenta de contrapartida.', // map data - 'map_title' => 'Import setup (3/3) - Connect import data to Firefly III data', + 'map_title' => 'Configuración de la importación (3/3) - Conecta los datos de importación a los datos de Firefly III', 'map_text' => 'En las siguientes tablas el valor de la izquierda muestra información encontrada en el CSV cargado. Es su tarea mapear este valor, si es posible, a un valor ya presente en su base de datos. Firefly respeterá este mapeo. Si no hay un valor hacia el cual mapear o no desea mapear un valor específico, no seleccione ninguno.', - 'map_field_value' => 'Field value', - 'map_field_mapped_to' => 'Mapped to', - 'map_do_not_map' => '(do not map)', - 'map_submit' => 'Start the import', + 'map_field_value' => 'Valor del campo', + 'map_field_mapped_to' => 'Mapeado a', + 'map_do_not_map' => '(no mapear)', + 'map_submit' => 'Iniciar la importación', // map things. 'column__ignore' => '(ignorar esta columna)', @@ -80,4 +80,4 @@ return [ 'column_tags-space' => 'Etiquetas (separadas por espacios)', 'column_account-number' => 'Caja de ahorro (número de cuenta)', 'column_opposing-number' => 'Cuenta opuesta (número de cuenta)', -]; \ No newline at end of file +]; diff --git a/resources/lang/es_ES/demo.php b/resources/lang/es_ES/demo.php index 8c8557a2b8..dfb4fc04c7 100644 --- a/resources/lang/es_ES/demo.php +++ b/resources/lang/es_ES/demo.php @@ -23,4 +23,4 @@ return [ 'import-index' => 'Por supuesto, cualquier archivo CSV puede ser importado en Firefly III', 'import-configure-security' => 'Debido a problemas de seguridad, su subida se ha sustituido por un archivo local.', 'import-configure-configuration' => 'La configuración que ves a continuación es correcta para el archivo local.', -]; \ No newline at end of file +]; diff --git a/resources/lang/es_ES/firefly.php b/resources/lang/es_ES/firefly.php index f746be2614..280b2a9c4a 100644 --- a/resources/lang/es_ES/firefly.php +++ b/resources/lang/es_ES/firefly.php @@ -13,27 +13,21 @@ declare(strict_types=1); return [ // general stuff: - 'language_incomplete' => 'traducción incompleta', 'close' => 'Cerrar', 'actions' => 'Acciones', 'edit' => 'Editar', 'delete' => 'Eliminar', - 'welcomeBack' => '¿Qué está tocando?', + 'welcomeBack' => '¿Qué está pasando?', 'everything' => 'Todo', 'customRange' => 'Rango personalizado', 'apply' => 'Aplicar', - 'select_date' => 'Select date..', + 'select_date' => 'Seleccionar fecha...', 'cancel' => 'Cancelar', 'from' => 'Desde', 'to' => 'Hasta', 'showEverything' => 'Mostrar todo', 'never' => 'Nunca', - 'search_results_for' => 'Resultados de la búsqueda para %{query}', - 'no_results_for_empty_search' => 'Your search was empty, so nothing was found.', - 'bounced_error' => 'El mensaje enviado al: correo electrónico no ha sido recibido, así que no hay acceso para usted.', - 'deleted_error' => 'Las credenciales no coinciden con los registros.', - 'general_blocked_error' => 'Tu cuenta ha sido creada. Ahora puedes iniciar sesión.', - 'expired_error' => 'Su cuenta ha caducado y ya no puede ser utilizado.', + 'no_results_for_empty_search' => 'Su búsqueda estaba vacía, por lo que no se encontró nada.', 'removed_amount' => 'Eliminado: cantidad', 'added_amount' => 'Agregado: cantidad', 'asset_account_role_help' => 'Las opciones extras como resultado de su elección se pueden establecer más tarde.', @@ -56,7 +50,6 @@ return [ 'flash_error_multiple' => 'Hay un error | Hay: contar errores', 'net_worth' => 'Valor Neto', 'route_has_no_help' => 'No hay datos en este registro.', - 'help_may_not_be_your_language' => 'Este texto de ayuda está en inglés. Aún no está disponible en tu idioma', 'two_factor_welcome' => 'Hola %{user}!', 'two_factor_enter_code' => 'Para continuar, introduce tu código de autenticación de dos pasos. La aplicación puede generarlo para usted.', 'two_factor_code_here' => 'Ingresar código aquí', @@ -65,60 +58,50 @@ return [ 'two_factor_forgot_title' => 'Autenticación en dos pasos perdida', 'two_factor_forgot' => 'I forgot my two-factor thing.', 'two_factor_lost_header' => 'Lost your two factor authentication?', - 'two_factor_lost_intro' => 'Unfortunately, this is not something you can reset from the web interface. You have two choices.', + 'two_factor_lost_intro' => 'Por desgracia, esto no es algo que se pueda restablecer desde la interfaz web. Tienes dos opciones.', 'two_factor_lost_fix_self' => 'If you run your own instance of Firefly III, check the logs in storage/logs for instructions.', 'two_factor_lost_fix_owner' => 'Otherwise, email the site owner, :site_owner and ask them to reset your two factor authentication.', 'warning_much_data' => ':days days of data may take a while to load.', - 'registered' => 'You have registered successfully!', - 'tagbalancingAct' => 'Balancing act', - 'tagadvancePayment' => 'Advance payment', - 'tagnothing' => '', + 'registered' => '¡Te has registrado con éxito!', 'Default asset account' => 'Default asset account', - 'no_budget_pointer' => 'You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.', - 'Savings account' => 'Savings account', - 'Credit card' => 'Credit card', - 'source_accounts' => 'Source account(s)', - 'destination_accounts' => 'Destination account(s)', - '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.', - 'nothing_to_display' => 'There are no transactions to show you', - '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', + 'no_budget_pointer' => 'Parece que aún no tienes presupuestos. Debe crear algunos en la página presupuestos. Los presupuestos pueden ayudarle a realizar un seguimiento de los gastos.', + 'Savings account' => 'Cuenta de ahorros', + 'Credit card' => 'Tarjeta de crédito', + 'source_accounts' => 'Cuenta(s) origen', + 'destination_accounts' => 'Cuenta(s) destino', + 'user_id_is' => 'Tu id de usuario es : user', + 'field_supports_markdown' => 'Este campo admite Markdown.', + 'need_more_help' => 'Si necesita más ayuda con Firefly III, por favor abre un ticket en Github.', + 'reenable_intro_text' => 'También puede volver a activar la guía de introducción.', + 'intro_boxes_after_refresh' => 'Los cuadros de introducción volverán a aparecer cuando actualices la página.', + 'show_all_no_filter' => 'Mostrar todas las transacciones sin agruparlas por fecha.', + 'expenses_by_category' => 'Gastos por categoría', + 'expenses_by_budget' => 'Gastos por presupuesto', + 'income_by_category' => 'Ingresos por categoría', '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', + '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_change_demo' => 'You cannot change the password of the demonstration account.', - 'cannot_delete_demo' => 'You cannot remove the demonstration account.', 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', - 'per_period' => 'Per period', - 'all_periods' => 'All periods', - '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.', + '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.', '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"', - 'budget_in_period_breadcrumb' => 'Between :start and :end', 'clone_withdrawal' => 'Clone this withdrawal', 'clone_deposit' => 'Clone this deposit', - 'clone_transfer' => 'Clone this transfer', - 'transaction_journal_other_options' => 'Other options', + 'clone_transfer' => 'Duplicar esta transferencia', 'multi_select_no_selection' => 'None selected', 'multi_select_all_selected' => 'All selected', - 'multi_select_filter_placeholder' => 'Find..', + 'multi_select_filter_placeholder' => 'Buscar...', 'between_dates_breadcrumb' => 'Between :start and :end', 'all_journals_without_budget' => 'All transactions without a budget', 'journals_without_budget' => 'Transactions without a budget', @@ -127,16 +110,16 @@ return [ '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', + 'transferred' => 'Transferido', + 'all_withdrawal' => 'Todos los gastos', + 'all_transactions' => 'Todas las transacciones', 'title_withdrawal_between' => 'All expenses between :start and :end', - 'all_deposit' => 'All revenue', + 'all_deposit' => 'Todos los ingresos', 'title_deposit_between' => 'All revenue between :start and :end', - 'all_transfers' => 'All transfers', + 'all_transfers' => 'Todas las transferencias', 'title_transfers_between' => 'All transfers between :start and :end', - 'all_transfer' => 'All transfers', - 'all_journals_for_tag' => 'All transactions for tag ":tag"', + 'all_transfer' => 'Todas las transferencias', + 'all_journals_for_tag' => 'Todas las transacciones etiquetadas como ":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', @@ -149,13 +132,13 @@ return [ 'transaction_data' => 'Transaction data', // search - '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 ...', + 'search' => 'Buscar', + 'search_found_transactions' => 'Transacciones encontradas:', + 'general_search_error' => 'Se ha producido un error durante la búsqueda. Por favor, compruebe los archivos de registro para obtener más información.', + 'search_box' => 'Buscar', + '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...', // repeat frequencies: 'repeat_freq_yearly' => 'yearly', @@ -164,29 +147,17 @@ return [ 'quarterly' => 'quarterly', 'half-year' => 'every half year', 'yearly' => 'yearly', - // account confirmation: - 'confirm_account_header' => 'Please confirm your account', - 'confirm_account_intro' => 'An email has been sent to the address you used during your registration. Please check it out for further instructions. If you did not get this message, you can have Firefly send it again.', - 'confirm_account_resend_email' => 'Send me the confirmation message I need to activate my account.', - 'account_is_confirmed' => 'Your account has been confirmed!', - 'invalid_activation_code' => 'It seems the code you are using is not valid, or has expired.', - 'confirm_account_is_resent_header' => 'The confirmation has been resent', - 'confirm_account_is_resent_text' => 'The confirmation message has been resent. If you still did not receive the confirmation message, please contact the site owner at :owner or check the log files to see what went wrong.', - 'confirm_account_is_resent_go_home' => 'Go to the index page of Firefly', - 'confirm_account_not_resent_header' => 'Something went wrong :(', - 'confirm_account_not_resent_intro' => 'The confirmation message has been not resent. If you still did not receive the confirmation message, please contact the site owner at :owner instead. Possibly, you have tried to resend the activation message too often. You can have Firefly III try to resend the confirmation message every hour.', - 'confirm_account_not_resent_go_home' => 'Go to the index page of Firefly', // export data: - 'import_and_export' => 'Import and export', - 'export_data' => 'Export data', + 'import_and_export' => 'Importar y exportar', + 'export_data' => 'Exportar datos', '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' => 'Formato de exportación', 'export_format_csv' => 'Comma separated values (CSV file)', 'export_format_mt940' => 'MT940 compatible format', - 'export_included_accounts' => 'Export transactions from these accounts', + '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' => 'Export', + 'do_export' => 'Exportar', 'export_status_never_started' => 'The export has not started yet', 'export_status_make_exporter' => 'Creating exporter thing...', 'export_status_collecting_journals' => 'Collecting your transactions...', @@ -204,11 +175,10 @@ return [ '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...', - 'attachment_explanation' => 'The file called \':attachment_name\' (#:attachment_id) was originally uploaded to :type \':description\' (#:journal_id) dated :date for the amount of :amount.', + 'export_data_please_wait' => 'Espera, por favor...', // rules - 'rules' => 'Rules', + 'rules' => 'Reglas', 'rule_name' => 'Name of rule', 'rule_triggers' => 'Rule triggers when', 'rule_actions' => 'Rule will', @@ -224,25 +194,25 @@ return [ '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', + 'no_rules_in_group' => 'No hay reglas en este grupo', '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:', + 'save_rules_by_moving' => 'Guardar esta(s) regla(s) moviéndola(s) a otro grupo:', '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.', + 'rule_help_stop_processing' => 'Al marcar esta casilla, las reglas posteriores de este grupo no se ejecutarán.', + 'rule_help_active' => 'Las reglas inactivas nunca se ejecutan.', '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' => 'All your rules not in a particular group.', + 'default_rule_group_name' => 'Reglaspredeterminada', + 'default_rule_group_description' => 'Todas las reglas que no pertenecen a ningún grupo.', 'default_rule_name' => 'Your first default rule', 'default_rule_description' => 'This rule is an example. You can safely delete it.', 'default_rule_trigger_description' => 'The Man Who Sold the World', 'default_rule_trigger_from_account' => 'David Bowie', 'default_rule_action_prepend' => 'Bought the world from ', - 'default_rule_action_set_category' => 'Large expenses', + 'default_rule_action_set_category' => 'Grandes gastos', 'trigger' => 'Trigger', 'trigger_value' => 'Trigger on value', 'stop_processing_other_triggers' => 'Stop processing other triggers', @@ -259,63 +229,77 @@ return [ '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.', + 'apply_rule_selection_intro' => 'Las reglas como ":title" normalmente sólo se aplican a transacciones nuevas o actualizadas, pero puedes indicarle a Firefly III que las ejecute en una selección de transacciones existentes. Esto puede ser útil si has actualizado una regla y necesitas que los cambios se apliquen a todas tus otras transacciones.', '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.', + 'apply_rule_group_selection_intro' => 'Los grupos de reglas como ":title" normalmente sólo se aplican a transacciones nuevas o actualizadas, pero puedes indicarle a Firefly III que ejecute todas las reglas de este grupo en una selección de transacciones existentes. Esto puede ser útil si has actualizado un grupo de reglas y necesitas que los cambios se apliquen a todas tus otras transacciones.', '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' => 'Source account starts with ":trigger_value"', - 'rule_trigger_from_account_ends' => 'Source account ends with ":trigger_value"', - 'rule_trigger_from_account_is' => 'Source account is ":trigger_value"', - 'rule_trigger_from_account_contains' => 'Source 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' => 'Description starts with ":trigger_value"', - 'rule_trigger_description_ends' => 'Description ends with ":trigger_value"', - 'rule_trigger_description_contains' => 'Description contains ":trigger_value"', - 'rule_trigger_description_is' => 'Description is ":trigger_value"', 'rule_trigger_from_account_starts_choice' => 'Source account starts with..', + 'rule_trigger_from_account_starts' => 'Source account starts with ":trigger_value"', 'rule_trigger_from_account_ends_choice' => 'Source account ends with..', + 'rule_trigger_from_account_ends' => 'Source account ends with ":trigger_value"', 'rule_trigger_from_account_is_choice' => 'Source account is..', + 'rule_trigger_from_account_is' => 'Source account is ":trigger_value"', 'rule_trigger_from_account_contains_choice' => 'Source account contains..', + 'rule_trigger_from_account_contains' => 'Source account contains ":trigger_value"', 'rule_trigger_to_account_starts_choice' => 'Destination account starts with..', + 'rule_trigger_to_account_starts' => 'Destination account starts with ":trigger_value"', 'rule_trigger_to_account_ends_choice' => 'Destination account ends with..', + 'rule_trigger_to_account_ends' => 'Destination account ends with ":trigger_value"', 'rule_trigger_to_account_is_choice' => 'Destination account is..', + 'rule_trigger_to_account_is' => 'Destination account is ":trigger_value"', 'rule_trigger_to_account_contains_choice' => 'Destination account contains..', + 'rule_trigger_to_account_contains' => 'Destination account contains ":trigger_value"', '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' => 'Description starts with..', - 'rule_trigger_description_ends_choice' => 'Description ends with..', - 'rule_trigger_description_contains_choice' => 'Description contains..', - 'rule_trigger_description_is_choice' => 'Description is..', + 'rule_trigger_transaction_type' => 'Transaction is of type ":trigger_value"', 'rule_trigger_category_is_choice' => 'Category is..', + 'rule_trigger_category_is' => 'Category is ":trigger_value"', + 'rule_trigger_amount_less_choice' => 'Amount is less than..', + 'rule_trigger_amount_less' => 'Amount is less than :trigger_value', + 'rule_trigger_amount_exactly_choice' => 'Amount is..', + 'rule_trigger_amount_exactly' => 'Amount is :trigger_value', + 'rule_trigger_amount_more_choice' => 'Amount is more than..', + 'rule_trigger_amount_more' => 'Amount is more than :trigger_value', + 'rule_trigger_description_starts_choice' => 'Description starts with..', + 'rule_trigger_description_starts' => 'Description starts with ":trigger_value"', + 'rule_trigger_description_ends_choice' => 'Description ends with..', + 'rule_trigger_description_ends' => 'Description ends with ":trigger_value"', + 'rule_trigger_description_contains_choice' => 'Description contains..', + 'rule_trigger_description_contains' => 'Description contains ":trigger_value"', + 'rule_trigger_description_is_choice' => 'Description is..', + 'rule_trigger_description_is' => 'Description is ":trigger_value"', 'rule_trigger_budget_is_choice' => 'Budget is..', + 'rule_trigger_budget_is' => 'Budget is ":trigger_value"', 'rule_trigger_tag_is_choice' => '(A) tag is..', + 'rule_trigger_tag_is' => 'A tag is ":trigger_value"', '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_trigger_has_no_category_choice' => 'Has no category', + 'rule_trigger_has_no_category' => 'Transaction has no category', + 'rule_trigger_has_any_category_choice' => 'Has a (any) category', + 'rule_trigger_has_any_category' => 'Transaction has a (any) category', + 'rule_trigger_has_no_budget_choice' => 'Has no budget', + 'rule_trigger_has_no_budget' => 'Transaction has no budget', + 'rule_trigger_has_any_budget_choice' => 'Has a (any) budget', + 'rule_trigger_has_any_budget' => 'Transaction has a (any) budget', + 'rule_trigger_has_no_tag_choice' => 'Has no tag(s)', + 'rule_trigger_has_no_tag' => 'Transaction has no 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_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' => 'Add tag ":action_value"', 'rule_action_remove_tag' => 'Remove tag ":action_value"', - 'rule_action_remove_all_tags' => 'Remove all tags', + 'rule_action_remove_all_tags' => 'Eliminar todas las etiquetas', 'rule_action_set_description' => 'Set description to ":action_value"', 'rule_action_append_description' => 'Append description with ":action_value"', 'rule_action_prepend_description' => 'Prepend description with ":action_value"', @@ -325,7 +309,7 @@ return [ 'rule_action_clear_budget_choice' => 'Clear any budget', 'rule_action_add_tag_choice' => 'Add tag..', 'rule_action_remove_tag_choice' => 'Remove tag..', - 'rule_action_remove_all_tags_choice' => 'Remove all tags', + 'rule_action_remove_all_tags_choice' => 'Eliminar todas las etiquetas', 'rule_action_set_description_choice' => 'Set description to..', 'rule_action_append_description_choice' => 'Append description with..', 'rule_action_prepend_description_choice' => 'Prepend description with..', @@ -340,10 +324,12 @@ return [ 'no_location_set' => 'No location set.', 'meta_data' => 'Meta data', 'location' => 'Location', + 'without_date' => 'Without date', + 'result' => 'Result', // preferences - 'pref_home_screen_accounts' => 'Home screen accounts', - 'pref_home_screen_accounts_help' => 'Which accounts should be displayed on the home page?', + 'pref_home_screen_accounts' => 'Cuentas de la pantalla de inicio', + 'pref_home_screen_accounts_help' => '¿Qué cuentas se deben mostrar en la página de inicio?', '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', @@ -369,11 +355,11 @@ return [ 'pref_two_factor_auth_remove_code' => 'Remove verification code', 'pref_two_factor_auth_remove_will_disable' => '(this will also disable two-factor authentication)', 'pref_save_settings' => 'Save settings', - 'saved_preferences' => 'Preferences saved!', + 'saved_preferences' => '¡Preferencias guardadas!', 'preferences_general' => 'General', - 'preferences_frontpage' => 'Home screen', - 'preferences_security' => 'Security', - 'preferences_layout' => 'Layout', + 'preferences_frontpage' => 'Pantalla de inicio', + 'preferences_security' => 'Seguridad', + 'preferences_layout' => 'Diseño', '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', @@ -420,7 +406,7 @@ return [ '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_history' => 'En agosto de 2017 el conocido investigador de seguridad Troy Hunt publicó una lista de 306 millones de contraseñas robadas. Estas contraseñas fueron robadas durante intrusiones a empresas como LinkedIn, Adobe y NeoPets (y muchos más).', '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.', @@ -441,10 +427,10 @@ return [ '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_expenses' => 'Gastos', + 'title_withdrawal' => 'Gastos', + 'title_revenue' => 'Ingresos / salarios', + 'title_deposit' => 'Ingresos / salarios', 'title_transfer' => 'Transfers', 'title_transfers' => 'Transfers', @@ -455,13 +441,13 @@ return [ '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_options_WithdrawalDeposit' => 'Convertir una retirada de efectivo en un depósito', + 'convert_options_WithdrawalTransfer' => 'Convertir una retirada de efectivo en una transferencia', + 'convert_options_DepositTransfer' => 'Convertir un depósito en una transferencia', + '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', @@ -510,7 +496,7 @@ return [ // forms: 'mandatoryFields' => 'Mandatory fields', 'optionalFields' => 'Optional fields', - 'options' => 'Options', + 'options' => 'Opciones', // budgets: 'create_new_budget' => 'Create a new budget', @@ -521,9 +507,8 @@ return [ 'transactions_no_budget' => 'Expenses without budget between :start and :end', 'spent_between' => 'Spent between :start and :end', 'createBudget' => 'New budget', - 'inactiveBudgets' => 'Inactive budgets', + 'inactiveBudgets' => 'Presupuestos inactivos', 'without_budget_between' => 'Transactions without a budget between :start and :end', - 'budget_in_month' => ':name in :month', 'delete_budget' => 'Delete budget ":name"', 'deleted_budget' => 'Deleted budget ":name"', 'edit_budget' => 'Edit budget ":name"', @@ -550,7 +535,7 @@ return [ 'updated_bill' => 'Updated bill ":name"', 'store_new_bill' => 'Store new bill', 'stored_new_bill' => 'Stored new bill ":name"', - 'cannot_scan_inactive_bill' => 'Inactive bills cannot be scanned.', + 'cannot_scan_inactive_bill' => 'Las facturas inactivas no pueden ser escaneadas.', 'rescanned_bill' => 'Rescanned everything.', 'average_bill_amount_year' => 'Average bill amount (:year)', 'average_bill_amount_overall' => 'Average bill amount (overall)', @@ -582,23 +567,21 @@ return [ 'make_new_expense_account' => 'Create a new expense account', 'make_new_revenue_account' => 'Create a new revenue account', 'asset_accounts' => 'Asset accounts', - 'expense_accounts' => 'Expense accounts', - 'revenue_accounts' => 'Revenue accounts', - 'cash_accounts' => 'Cash accounts', + 'expense_accounts' => 'Cuentas de gastos', + 'revenue_accounts' => 'Cuentas de ingresos', + 'cash_accounts' => 'Cuentas de efectivo', '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', + 'credit_card_options' => 'Opciones de tarjeta de crédito', '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', - 'from_to' => 'From :start to :end', - 'from_to_breadcrumb' => 'from :start to :end', 'account_default_currency' => 'If you select another currency, new transactions from this account will have this currency pre-selected.', // categories: @@ -607,7 +590,7 @@ return [ 'without_category' => 'Without a category', 'update_category' => 'Update category', 'updated_category' => 'Updated category ":name"', - 'categories' => 'Categories', + 'categories' => 'Categorías', 'edit_category' => 'Edit category ":name"', 'no_category' => '(no category)', 'category' => 'Category', @@ -641,6 +624,11 @@ return [ '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)', + 'opt_group_no_account_type' => '(no account type)', + 'opt_group_defaultAsset' => 'Default asset accounts', + 'opt_group_savingAsset' => 'Savings accounts', + 'opt_group_sharedAsset' => 'Shared asset accounts', + 'opt_group_ccAsset' => 'Credit cards', // new user: @@ -653,44 +641,40 @@ return [ 'stored_new_accounts_new_user' => 'Yay! Your new accounts have been stored.', // home page: - 'yourAccounts' => 'Your accounts', - 'budgetsAndSpending' => 'Budgets and spending', + 'yourAccounts' => 'Tus cuentas', + 'budgetsAndSpending' => 'Presupuestos y gastos', 'savings' => 'Savings', - 'markAsSavingsToContinue' => 'Mark your asset accounts as "Savings account" to fill this panel', - 'createPiggyToContinue' => 'Create piggy banks to fill this panel.', 'newWithdrawal' => 'New expense', 'newDeposit' => 'New deposit', 'newTransfer' => 'New transfer', 'moneyIn' => 'Money in', 'moneyOut' => 'Money out', - 'billsToPay' => 'Bills to pay', - 'billsPaid' => 'Bills paid', - 'divided' => 'divided', - 'toDivide' => 'left to divide', + 'billsToPay' => 'Facturas a pagar', + 'billsPaid' => 'Facturas pagadas', // menu and titles, should be recycled as often as possible: 'currency' => 'Currency', - 'preferences' => 'Preferences', - 'logout' => 'Logout', - 'searchPlaceholder' => 'Search...', - 'dashboard' => 'Dashboard', - 'currencies' => 'Currencies', - 'accounts' => 'Accounts', + 'preferences' => 'Preferencias', + 'logout' => 'Cerrar sesión', + 'searchPlaceholder' => 'Buscar...', + 'dashboard' => 'Panel de control', + 'currencies' => 'Divisas', + 'accounts' => 'Cuentas', 'Asset account' => 'Asset account', 'Default account' => 'Asset account', 'Expense account' => 'Expense account', 'Revenue account' => 'Revenue account', 'Initial balance account' => 'Initial balance account', - 'budgets' => 'Budgets', - 'tags' => 'Tags', - 'reports' => 'Reports', - 'transactions' => 'Transactions', - 'expenses' => 'Expenses', - 'income' => 'Revenue / income', + 'budgets' => 'Presupuestos', + 'tags' => 'Etiquetas', + 'reports' => 'Informes', + 'transactions' => 'Transacciones', + 'expenses' => 'Gastos', + 'income' => 'Ingresos / salarios', 'transfers' => 'Transfers', - 'moneyManagement' => 'Money management', - 'piggyBanks' => 'Piggy banks', - 'bills' => 'Bills', + 'moneyManagement' => 'Gestión del dinero', + 'piggyBanks' => 'Huchas', + 'bills' => 'Facturas', 'withdrawal' => 'Withdrawal', 'deposit' => 'Deposit', 'account' => 'Account', @@ -707,7 +691,7 @@ return [ 'unknown' => 'Unknown', 'daily' => 'Daily', 'monthly' => 'Monthly', - 'profile' => 'Profile', + 'profile' => 'Perfil', 'errors' => 'Errors', // reports: @@ -716,30 +700,21 @@ return [ '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_reports' => 'Enlaces rápidos', '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.', + 'reports_can_bookmark' => 'Recuerda que los informes pueden ser marcados como favoritos.', 'incomeVsExpenses' => 'Income vs. expenses', 'accountBalances' => 'Account balances', - 'balanceStartOfYear' => 'Balance at start of year', - 'balanceEndOfYear' => 'Balance at end of year', - 'balanceStartOfMonth' => 'Balance at start of month', - 'balanceEndOfMonth' => 'Balance at end of month', 'balanceStart' => 'Balance at start of period', 'balanceEnd' => 'Balance at end of period', - 'reportsOwnAccounts' => 'Reports for your own accounts', - 'reportsOwnAccountsAndShared' => 'Reports for your own accounts and shared accounts', 'splitByAccount' => 'Split by account', - 'balancedByTransfersAndTags' => 'Balanced by transfers and tags', 'coveredWithTags' => 'Covered with tags', 'leftUnbalanced' => 'Left unbalanced', - 'expectedBalance' => 'Expected balance', - 'outsideOfBudgets' => 'Outside of budgets', 'leftInBudget' => 'Left in budget', 'sumOfSums' => 'Sum of sums', 'noCategory' => '(no category)', @@ -752,21 +727,14 @@ return [ 'topX' => 'top :number', 'show_full_list' => 'Show entire list', 'show_only_top' => 'Show only top :number', - 'sum_of_year' => 'Sum of year', - 'sum_of_years' => 'Sum of years', - 'average_of_year' => 'Average of year', - 'average_of_years' => 'Average of years', - 'categories_earned_in_year' => 'Categories (by earnings)', - 'categories_spent_in_year' => 'Categories (by spendings)', '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', - 'report_type_meta-history' => 'Categories, budgets and bills overview', - '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', + 'more_info_help' => 'Puedes encontrar más información sobre estos tipos de informes en las páginas de ayuda. Pulsa el icono (?) En la esquina superior derecha.', + 'report_included_accounts' => 'Cuentas incluidas', 'report_date_range' => 'Date range', 'report_preset_ranges' => 'Pre-set ranges', 'shared' => 'Shared', @@ -778,9 +746,9 @@ return [ 'balance_amount' => 'Expenses in budget ":budget" paid from account ":account" between :start and :end', 'no_audit_activity' => 'No activity was recorded on account :account_name between :start and :end.', 'audit_end_balance' => 'Account balance of :account_name at the end of :end was: :balance', - 'reports_extra_options' => 'Extra options', - 'report_has_no_extra_options' => 'This report has no extra options', - 'reports_submit' => 'View report', + 'reports_extra_options' => 'Opciones adicionales', + 'report_has_no_extra_options' => 'Este informe no tiene opciones adicionales', + 'reports_submit' => 'Ver informe', 'end_after_start_date' => 'End date of report must be after start date.', 'select_category' => 'Select category(ies)', 'select_budget' => 'Select budget(s).', @@ -814,10 +782,12 @@ return [ 'account_role_sharedAsset' => 'Shared asset account', 'account_role_savingAsset' => 'Savings account', 'account_role_ccAsset' => 'Credit card', + 'budget_chart_click' => 'Please click on a budget name in the table above to see a chart.', + 'category_chart_click' => 'Please click on a category name in the table above to see a chart.', + // charts: 'chart' => 'Chart', - 'dayOfMonth' => 'Day of the month', 'month' => 'Month', 'budget' => 'Budget', 'spent' => 'Spent', @@ -838,7 +808,6 @@ return [ 'budgeted' => 'Budgeted', 'period' => 'Period', 'balance' => 'Balance', - 'summary' => 'Summary', 'sum' => 'Sum', 'average' => 'Average', 'balanceFor' => 'Balance for :name', @@ -850,55 +819,46 @@ return [ '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', + 'left_for_piggy_banks' => 'Apartado para las huchas', + 'sum_of_piggy_banks' => 'Total de huchas', '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', + 'no_money_for_piggy' => 'You have no money to put in this piggy bank.', - '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' => 'Target date', - 'no_target_date' => 'No target date', - 'todo' => 'to do', - 'table' => 'Table', - 'piggy_bank_not_exists' => 'Piggy bank no longer exists.', - 'add_any_amount_to_piggy' => 'Add money to this piggy bank to reach your target of :amount.', - 'add_set_amount_to_piggy' => 'Add :amount to fill this piggy bank on :date', - '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"', - 'cannot_remove_amount_piggy' => 'Could not remove :amount from ":name".', + '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' => 'Target date', + 'no_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' => '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', - 'edit_tag' => 'Edit tag ":tag"', - 'updated_tag' => 'Updated tag ":tag"', - 'created_tag' => 'Tag ":tag" has been created!', - 'no_year' => 'No year set', - 'no_month' => 'No month set', - 'tag_title_nothing' => 'Default tags', - 'tag_title_balancingAct' => 'Balancing act tags', - 'tag_title_advancePayment' => 'Advance payment 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', + 'edit_tag' => 'Edit tag ":tag"', + 'updated_tag' => 'Updated tag ":tag"', + 'created_tag' => 'Tag ":tag" has been created!', 'transaction_journal_information' => 'Transaction information', 'transaction_journal_meta' => 'Meta information', @@ -906,63 +866,78 @@ return [ 'number_of_decimals' => 'Number of decimals', // administration - 'administration' => 'Administration', - 'user_administration' => 'User administration', + 'administration' => 'Administración', + 'user_administration' => 'Administración de usuarios', 'list_all_users' => 'All users', 'all_users' => 'All users', 'instance_configuration' => 'Configuration', - 'firefly_instance_configuration' => 'Configuration options for Firefly III', + 'firefly_instance_configuration' => 'Opciones de configuración de 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', + 'single_user_administration' => 'Administración de usuarios para :email', 'edit_user' => 'Edit user :email', - 'hidden_fields_preferences' => 'Not all fields are visible right now. You must enable them in your settings.', + 'hidden_fields_preferences' => 'No todos los campos están visibles ahora. Debes habilitarlos en tu configuración.', '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)', + 'budget_or_budgets' => 'presupuesto(s)', + 'budgets_with_limits' => 'presupuesto(s) con el importe configurado', + 'rule_or_rules' => 'regla(s)', 'rulegroup_or_groups' => 'rule group(s)', - 'setting_must_confirm_account' => 'Account confirmation', - 'setting_must_confirm_account_explain' => 'When this setting is enabled, users must activate their account before it can be used.', '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.', - 'setting_send_email_notifications' => 'Send email notifications', - 'setting_send_email_explain' => 'Firefly III can send you email notifications about certain events. They will be sent to :site_owner. This email address can be set in the .env file.', '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', + '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', // split a transaction: - 'transaction_meta_data' => 'Transaction meta-data', - 'transaction_dates' => 'Transaction dates', 'splits' => 'Splits', - 'split_title_withdrawal' => 'Split your new withdrawal', - 'split_intro_one_withdrawal' => 'Firefly supports the "splitting" of a withdrawal.', - 'split_intro_two_withdrawal' => 'It means that the amount of money you\'ve spent is divided between several destination expense accounts, budgets or categories.', - 'split_intro_three_withdrawal' => 'For example: you could split your :total groceries so you pay :split_one from your "daily groceries" budget and :split_two from your "cigarettes" budget.', - 'split_table_intro_withdrawal' => 'Split your withdrawal in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_withdrawal' => 'Store splitted withdrawal', - 'update_splitted_withdrawal' => 'Update splitted withdrawal', - 'split_title_deposit' => 'Split your new deposit', - 'split_intro_one_deposit' => 'Firefly supports the "splitting" of a deposit.', - 'split_intro_two_deposit' => 'It means that the amount of money you\'ve earned is divided between several source revenue accounts or categories.', - 'split_intro_three_deposit' => 'For example: you could split your :total salary so you get :split_one as your base salary and :split_two as a reimbursment for expenses made.', - 'split_table_intro_deposit' => 'Split your deposit in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_deposit' => 'Store splitted deposit', - 'split_title_transfer' => 'Split your new transfer', - 'split_intro_one_transfer' => 'Firefly supports the "splitting" of a transfer.', - 'split_intro_two_transfer' => 'It means that the amount of money you\'re moving is divided between several categories or piggy banks.', - 'split_intro_three_transfer' => 'For example: you could split your :total move so you get :split_one in one piggy bank and :split_two in another.', - 'split_table_intro_transfer' => 'Split your transfer in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_transfer' => 'Store splitted transfer', 'add_another_split' => 'Add another split', 'split-transactions' => 'Split transactions', - 'split-new-transaction' => 'Split a new transaction', 'do_split' => 'Do a split', 'split_this_withdrawal' => 'Split this withdrawal', 'split_this_deposit' => 'Split this deposit', @@ -973,18 +948,18 @@ return [ 'no_edit_multiple_left' => 'You have selected no valid transactions to edit.', // import bread crumbs and titles: - 'import' => 'Import', - 'import_data' => 'Import data', + 'import' => 'Importar', + 'import_data' => 'Importar datos', // import index page: - 'import_index_title' => 'Import data into Firefly III', - 'import_index_sub_title' => 'Index', + 'import_index_title' => 'Importar datos a Firefly III', + 'import_index_sub_title' => 'Índice', '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', + 'import_index_start' => 'Iniciar importación', // supported file types: 'import_file_type_csv' => 'CSV (comma separated values)', @@ -994,18 +969,18 @@ return [ '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_bread_crumb' => 'Estado de la importación', + 'import_status_sub_title' => 'Estado de la importación', '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_title' => 'La importación está lista para empezar', '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_start' => 'Iniciar la importación', '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_title' => 'La importación se está ejecutando', 'import_status_running_placeholder' => 'Please hold for an update...', - 'import_status_errors_title' => 'Errors during the import', + 'import_status_errors_title' => 'Errores durante la importación', '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', @@ -1016,9 +991,6 @@ return [ 'import_status_finished_job' => 'The transactions imported can be found in tag :tag.', 'import_with_key' => 'Import with key \':key\'', - // different states: - 'import_status_job_running' => 'The import is underway. Please be patient...', - // sandstorm.io errors and messages: 'sandstorm_not_available' => 'This function is not available when you are using Firefly III within a Sandstorm.io environment.', @@ -1036,18 +1008,18 @@ return [ '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_budgets_title_default' => 'Vamos a crear un presupuesto', + 'no_budgets_intro_default' => 'Todavía no tienes presupuestos. Los presupuestos se usan para organizar tus gastos en grupos, a los que puedes asignar un tope para limitarlos.', + 'no_budgets_imperative_default' => 'Los presupuestos son las herramientas básicas de la gestión financiera. Vamos a crear uno ahora:', + 'no_budgets_create_default' => 'Crear un presupuesto', + 'no_categories_title_default' => '¡Vamos a crear una categoría!', + 'no_categories_intro_default' => 'Todavía no tienes categorías. Las categorías se utilizan para ajustar sus transacciones y etiquetarlas con su categoría designada.', + 'no_categories_imperative_default' => 'Las categorías se crean automáticamente al crear transacciones, pero también puedes crearlas manualmente. Vamos a crear una:', + 'no_categories_create_default' => 'Crear una categoría', + 'no_tags_title_default' => '¡Vamos a crear una etiqueta!', + 'no_tags_intro_default' => 'Todavía no tienes etiquetas. Las etiquetas se utilizan para ajustar tus transacciones y etiquetarlas con palabras clave específicas.', + 'no_tags_imperative_default' => 'Las etiquetas se crean automáticamente al crear transacciones, pero también puedes crearlas manualmente. Vamos a crear una:', + 'no_tags_create_default' => 'Crear etiqueta', '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:', @@ -1061,13 +1033,13 @@ return [ '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_intro_default' => 'Aún no tienes huchas. Puedes crear huchas para dividir tus ahorros y hacer un seguimiento de para qué estás ahorrando.', '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_bills_title_default' => '¡Vamos a crear una factura!', + 'no_bills_intro_default' => 'Aún no tienes facturas. Puedes crear facturas para realizar un seguimiento de los gastos periódicos, como el alquiler o un seguro.', + 'no_bills_imperative_default' => '¿Tienes facturas periódicas? Crea una factura y haz un seguimiento de tus pagos:', + 'no_bills_create_default' => 'Crear una factura', -]; \ No newline at end of file +]; diff --git a/resources/lang/es_ES/form.php b/resources/lang/es_ES/form.php index 6692bba2ad..3837e72573 100644 --- a/resources/lang/es_ES/form.php +++ b/resources/lang/es_ES/form.php @@ -14,63 +14,63 @@ declare(strict_types=1); return [ // new user: - 'bank_name' => 'Bank name', - 'bank_balance' => 'Balance', - 'savings_balance' => 'Savings balance', - 'credit_card_limit' => 'Credit card limit', - 'automatch' => 'Match automatically', - 'skip' => 'Skip', - 'name' => 'Name', - 'active' => 'Active', - 'amount_min' => 'Minimum amount', - 'amount_max' => 'Maximum amount', + 'bank_name' => 'Banco', + 'bank_balance' => 'Saldo', + 'savings_balance' => 'Salgo de ahorro', + 'credit_card_limit' => 'Límite de la tarjeta de crédito', + 'automatch' => 'Coinciden automáticamente', + 'skip' => 'Saltar', + 'name' => 'Nombre', + 'active' => 'Activo', + 'amount_min' => 'Importe mínimo', + 'amount_max' => 'Importe máximo', 'match' => 'Matches on', - 'repeat_freq' => 'Repeats', - 'journal_currency_id' => 'Currency', - 'currency_id' => 'Currency', - 'attachments' => 'Attachments', - 'journal_amount' => 'Amount', + 'repeat_freq' => 'Repetición', + 'journal_currency_id' => 'Divisa', + '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' => 'Verify password security', - 'account_from_id' => 'From account', - 'account_to_id' => 'To account', - 'source_account' => 'Source account', - 'destination_account' => 'Destination account', + '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)', 'asset_destination_account' => 'Asset account (destination)', 'asset_source_account' => 'Asset account (source)', - 'journal_description' => 'Description', - 'note' => 'Notes', + 'journal_description' => 'Descripción', + 'note' => 'Notas', 'split_journal' => 'Split this transaction', 'split_journal_explanation' => 'Split this transaction in multiple parts', - 'currency' => 'Currency', - 'account_id' => 'Asset account', - 'budget_id' => 'Budget', - 'openingBalance' => 'Opening balance', - 'tagMode' => 'Tag mode', - 'tagPosition' => 'Tag location', - 'virtualBalance' => 'Virtual balance', - 'longitude_latitude' => 'Location', - 'targetamount' => 'Target amount', - 'accountRole' => 'Account role', - 'openingBalanceDate' => 'Opening balance date', - 'ccType' => 'Credit card payment plan', - 'ccMonthlyPaymentDate' => 'Credit card monthly payment date', - 'piggy_bank_id' => 'Piggy bank', - 'returnHere' => 'Return here', - 'returnHereExplanation' => 'After storing, return here to create another one.', - 'returnHereUpdateExplanation' => 'After updating, return here.', - 'description' => 'Description', - 'expense_account' => 'Expense account', - 'revenue_account' => 'Revenue account', - 'decimal_places' => 'Decimal places', - 'exchange_rate_instruction' => 'Foreign currencies', + 'currency' => 'Divisa', + 'account_id' => 'Cuenta', + 'budget_id' => 'Presupuesto', + 'openingBalance' => 'Saldo inicial', + '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', + 'ccType' => 'Plan de pagos con tarjeta de crédito', + 'ccMonthlyPaymentDate' => 'Fecha de pago mensual de la tarjeta de crédito', + 'piggy_bank_id' => 'Hucha', + 'returnHere' => 'Volver aquí', + 'returnHereExplanation' => 'Después de guardar, vuelve aquí para crear otro.', + 'returnHereUpdateExplanation' => 'Después de actualizar, vuelve aquí.', + 'description' => 'Descripción', + 'expense_account' => 'Cuenta de gastos', + 'revenue_account' => 'Cuenta de ingresos', + 'decimal_places' => 'Lugares decimales', + 'exchange_rate_instruction' => 'Monedas extranjeras', 'exchanged_amount' => 'Exchanged amount', - 'source_amount' => 'Amount (source)', - 'destination_amount' => 'Amount (destination)', + 'source_amount' => 'Importe (origen)', + 'destination_amount' => 'Importe (destino)', 'native_amount' => 'Native amount', 'revenue_account_source' => 'Revenue account (source)', @@ -78,63 +78,65 @@ return [ 'destination_account_expense' => 'Destination account (expense account)', 'destination_account_asset' => 'Destination account (asset account)', 'source_account_revenue' => 'Source account (revenue account)', - 'type' => 'Type', + 'type' => 'Tipo', 'convert_Withdrawal' => 'Convert withdrawal', - 'convert_Deposit' => 'Convert deposit', - 'convert_Transfer' => 'Convert transfer', + 'convert_Deposit' => 'Convertir depósito', + 'convert_Transfer' => 'Convertir transferencia', - 'amount' => 'Amount', - 'date' => 'Date', - 'interest_date' => 'Interest date', - 'book_date' => 'Book date', - 'process_date' => 'Processing date', - 'category' => 'Category', - 'tags' => 'Tags', - 'deletePermanently' => 'Delete permanently', - 'cancel' => 'Cancel', + 'amount' => 'Importe', + 'date' => 'Fecha', + 'interest_date' => 'Fecha de interés', + 'book_date' => 'Fecha de registro', + 'process_date' => 'Fecha de procesamiento', + 'category' => 'Categoría', + 'tags' => 'Etiquetas', + 'deletePermanently' => 'Borrar permanentemente', + 'cancel' => 'Cancelar', 'targetdate' => 'Target date', - 'tag' => 'Tag', + 'tag' => 'Etiqueta', 'under' => 'Under', - 'symbol' => 'Symbol', - 'code' => 'Code', + 'symbol' => 'Símbolo', + 'code' => 'Código', 'iban' => 'IBAN', - 'accountNumber' => 'Account number', - 'has_headers' => 'Headers', - 'date_format' => 'Date format', + 'accountNumber' => 'Número de cuenta', + 'creditCardNumber' => 'Número de la tarjeta de crédito', + 'has_headers' => 'Encabezados', + 'date_format' => 'Formato de fecha', 'specifix' => 'Bank- or file specific fixes', - 'attachments[]' => 'Attachments', - 'store_new_withdrawal' => 'Store new withdrawal', - 'store_new_deposit' => 'Store new deposit', - 'store_new_transfer' => 'Store new transfer', - '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', - 'mime' => 'Mime type', - 'size' => 'Size', - 'trigger' => 'Trigger', - 'stop_processing' => 'Stop processing', - 'start_date' => 'Start of range', - 'end_date' => 'End of range', + 'attachments[]' => 'Adjuntos', + 'store_new_withdrawal' => 'Guardar rueva retirada de efectivo', + 'store_new_deposit' => 'Guardar nuevo depósito', + 'store_new_transfer' => 'Guardar nueva transferencia', + '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', + 'mime' => 'Tipo Mime', + 'size' => 'Tamaño', + 'trigger' => 'Disparador', + 'stop_processing' => 'Detener el procesamiento', + 'start_date' => 'Inicio del rango', + 'end_date' => 'Final del rango', 'export_start_range' => 'Start of export range', 'export_end_range' => 'End of export range', - 'export_format' => 'File format', - 'include_attachments' => 'Include uploaded attachments', - 'include_old_uploads' => 'Include imported data', + 'export_format' => 'Formato del archivo', + 'include_attachments' => 'Incluir archivos adjuntos subidos', + 'include_old_uploads' => 'Incluir datos importados', 'accounts' => 'Export transactions from these accounts', 'delete_account' => 'Delete account ":name"', 'delete_bill' => 'Delete bill ":name"', 'delete_budget' => 'Delete budget ":name"', 'delete_category' => 'Delete category ":name"', - 'delete_currency' => 'Delete currency ":name"', - 'delete_journal' => 'Delete transaction with description ":description"', - 'delete_attachment' => 'Delete attachment ":name"', - 'delete_rule' => 'Delete rule ":title"', - 'delete_rule_group' => 'Delete rule group ":title"', + 'delete_currency' => 'Eliminar divisa ":name"', + 'delete_journal' => 'Eliminar la transacción con descripción ":description"', + 'delete_attachment' => 'Eliminar adjunto ":name"', + 'delete_rule' => 'Eliminar regla ":title"', + 'delete_rule_group' => 'Eliminar grupo de reglas ":title"', + 'delete_link_type' => 'Eliminar tipo de enlace ":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' => 'Are you sure you want to delete the bill named ":name"?', @@ -147,11 +149,14 @@ return [ 'journal_areYouSure' => 'Are you sure you want to delete the transaction described ":description"?', 'mass_journal_are_you_sure' => 'Are you sure you want to delete these transactions?', 'tag_areYouSure' => 'Are you sure you want to delete the tag ":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.', @@ -159,23 +164,23 @@ return [ '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', + 'email' => 'Correo electrónico', + 'password' => 'Contraseña', + 'password_confirmation' => 'Contraseña (otra vez)', + 'blocked' => '¿Está bloqueado?', + 'blocked_code' => 'Razón del bloqueo', // admin - 'domain' => 'Domain', - 'single_user_mode' => 'Single user mode', - 'must_confirm_account' => 'New users must activate account', - 'is_demo_site' => 'Is demo site', + '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', // import - 'import_file' => 'Import file', - 'configuration_file' => 'Configuration file', + 'import_file' => 'Importar archivo', + 'configuration_file' => 'Archivo de configuración', 'import_file_type' => 'Import file type', 'csv_comma' => 'A comma (,)', 'csv_semicolon' => 'A semicolon (;)', @@ -189,4 +194,7 @@ return [ 'payment_date' => 'Payment date', 'invoice_date' => 'Invoice date', 'internal_reference' => 'Internal reference', -]; \ No newline at end of file + + 'inward' => 'Inward description', + 'outward' => 'Outward description', +]; diff --git a/resources/lang/es_ES/help.php b/resources/lang/es_ES/help.php index 0f77f62304..f630f2f78e 100644 --- a/resources/lang/es_ES/help.php +++ b/resources/lang/es_ES/help.php @@ -14,22 +14,22 @@ declare(strict_types=1); return [ // tour! - 'main-content-title' => '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', -]; \ No newline at end of file + 'main-content-title' => 'Bienvenido a Firefly III', + 'main-content-text' => 'Hazte un favor y sigue esta breve guía para asegurarte de que sabes manejarte en el sistema.', + 'sidebar-toggle-title' => 'Barra lateral para crear items', + 'sidebar-toggle-text' => 'Ocultos bajo el icono más (+) encontrará botones para crear items nuevos. Cuentas, transacciones, ¡de todo!', + 'account-menu-title' => 'Todas sus cuentas', + 'account-menu-text' => 'Aquí puede encontrar todas las cuentas que ha creado.', + 'budget-menu-title' => 'Presupuestos', + 'budget-menu-text' => 'Utilice esta página para organizar sus finanzas y limitar el gasto.', + 'report-menu-title' => 'Informes', + 'report-menu-text' => 'Comprueba esto cuando quieras tener una visión general de tus finanzas.', + 'transaction-menu-title' => 'Transacciones', + 'transaction-menu-text' => 'Aquí encontrarás todas las transacciones que has creado.', + 'option-menu-title' => 'Opciones', + 'option-menu-text' => 'Esto se explica por sí solo.', + 'main-content-end-title' => '¡Fin!', + 'main-content-end-text' => 'Recuerde que cada página tiene un pequeño signo de interrogación en la parte superior derecha. Haz clic en él para obtener ayuda sobre la página en la que estás.', + 'index' => 'índice', + 'home' => 'inicio', +]; diff --git a/resources/lang/es_ES/intro.php b/resources/lang/es_ES/intro.php index e945adcec8..dc1c7ed940 100644 --- a/resources/lang/es_ES/intro.php +++ b/resources/lang/es_ES/intro.php @@ -11,25 +11,25 @@ declare(strict_types=1); return [ // index - 'index_intro' => '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.', + 'index_intro' => 'Bienvenido a la página de índice de Firefly III. Por favor tómate tu tiempo para revisar esta guía y que puedas hacerte una idea de cómo funciona Firefly III.', + 'index_accounts-chart' => 'Este gráfico muestra el saldo actual de tus cuentas. Puedes seleccionar las cuentas que se muestran en él desde tus preferencias.', + 'index_box_out_holder' => 'Esta pequeña caja y las cajas a continuación te darán una visión rápida de tu situación financiera.', + 'index_help' => 'Si alguna vez necesitas ayuda en una página o formulario, pulsa este botón.', + 'index_outro' => 'La mayoría de las páginas de Firefly III comenzarán con una pequeña introducción como ésta. Por favor, ponte en contacto conmigo si tienes preguntas o comentarios. ¡Disfruta!', + 'index_sidebar-toggle' => 'Para crear nuevas transacciones, cuentas u otros elementos, utiliza el menú bajo este icono.', // 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.', + 'accounts_create_iban' => 'Indica un IBAN válido en tus cuentas. Esto facilitará la importación de datos en el futuro.', + 'accounts_create_asset_opening_balance' => 'Las cuentas pueden tener un "saldo de apertura", que indica el saldo inicial de esta cuenta en Firefly.', + 'accounts_create_asset_currency' => 'Firefly III admite múltiples divisas. Las cuentas tienen una divisa principal, que debes indicar aquí.', + 'accounts_create_asset_virtual' => 'A veces puede ayudar el darle a tu cuenta un balance virtual: una cantidad extra que se añade o resta siempre del balance real.', // 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_intro' => 'Los presupuestos se utilizan para administrar sus finanzas y son una de las funciones básicas de Firefly III.', + 'budgets_index_set_budget' => 'Fija tu presupuesto total para cada período, de tal forma que Firefly pueda indicarte si has presupuestado todo el dinero disponible.', + 'budgets_index_see_expenses_bar' => 'Gastar dinero irá llenando poco a poco esta barra.', + '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.', // reports (index) @@ -44,17 +44,17 @@ return [ '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 or multiple categories.', + '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 you how your expenses and income per category.', + 'reports_report_category_incomeAndExpensesChart' => 'This chart shows your expenses and income per category.', - 'reports_report_tag_intro' => 'This report will give you insight in or multiple tags.', + '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 you how your expenses and income per tag.', + 'reports_report_tag_incomeAndExpensesChart' => 'This chart shows your expenses and income per tag.', - 'reports_report_budget_intro' => 'This report will give you insight in or multiple budgets.', - 'reports_report_budget_pieCharts' => 'These charts will give you insight in expenses and income per budget or per account.', - 'reports_report_budget_incomeAndExpensesChart' => 'This chart shows you how your expenses and income per budget.', + '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.', @@ -118,4 +118,4 @@ return [ // 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/es_ES/list.php b/resources/lang/es_ES/list.php index a4c8c55d78..8e2b50c0f9 100644 --- a/resources/lang/es_ES/list.php +++ b/resources/lang/es_ES/list.php @@ -12,80 +12,78 @@ 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', - 'confirmed_from' => 'Confirmado desde', - 'registered_from' => 'Registrado desde', - 'blocked_code' => 'Bloque de código', - 'domain' => 'Dominio', - 'registration_attempts' => 'Intentos de registro', - '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', -]; \ No newline at end of file + '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', +]; diff --git a/resources/lang/es_ES/pagination.php b/resources/lang/es_ES/pagination.php index da56bb0d58..db77bd210e 100644 --- a/resources/lang/es_ES/pagination.php +++ b/resources/lang/es_ES/pagination.php @@ -16,4 +16,4 @@ return [ 'previous' => '« Anterior', 'next' => 'Siguiente »', -]; \ No newline at end of file +]; diff --git a/resources/lang/es_ES/passwords.php b/resources/lang/es_ES/passwords.php index 851c0ebaf7..dc97a3f602 100644 --- a/resources/lang/es_ES/passwords.php +++ b/resources/lang/es_ES/passwords.php @@ -18,4 +18,4 @@ return [ 'sent' => 'Te enviamos un correo con el link para reestablecer tu contraseña!', 'reset' => 'Tu contraseña fue reestablecida!', 'blocked' => 'Buen intento.', -]; \ No newline at end of file +]; diff --git a/resources/lang/es_ES/validation.php b/resources/lang/es_ES/validation.php index cf55f8a024..c81b390e7f 100644 --- a/resources/lang/es_ES/validation.php +++ b/resources/lang/es_ES/validation.php @@ -12,16 +12,15 @@ declare(strict_types=1); */ return [ - 'iban' => 'This is not a valid CBU.', + 'iban' => 'Este no es un IBAN válido.', 'unique_account_number_for_user' => 'Parece que este número de cuenta ya está en uso.', 'deleted_user' => 'Debido a restricciones de seguridad, no se puede registrar utilizando esta dirección de correo electrónico.', - 'rule_trigger_value' => 'Este valor es válido para el disparador seleccionado.', - 'rule_action_value' => 'Este valor es inválido para la acción seleccionado.', - 'invalid_domain' => 'Debido a restricciones de seguridad, no se puede registrar utilizando este dominio.', - 'file_already_attached' => 'Archivo ":name" ya ha sido añadido para este objeto.', + 'rule_trigger_value' => 'Este valor es incorrecto para el disparador seleccionado.', + 'rule_action_value' => 'Este valor es incorrecto para la acción seleccionada.', + 'file_already_attached' => 'El archivo ":name" ya ha sido añadido a este objeto.', 'file_attached' => 'Archivo subido correctamente ": nombre".', - 'file_invalid_mime' => 'Archivo ":name" es de tipo": mime" que no es aceptado como una nueva carga.', - 'file_too_large' => 'Archivo ":name" es demasiado grande.', + 'file_invalid_mime' => 'El archivo ":name" es de tipo ": mime", el cual no se acepta.', + 'file_too_large' => 'El archivo ":name" es demasiado grande.', 'belongs_to_user' => 'El valor de :attribute es desconocido', 'accepted' => 'El :attribute debe ser aceptado.', 'bic' => 'Esto no es un BIC válido.', @@ -57,38 +56,38 @@ return [ 'json' => 'El campo :attribute debe ser una cadena JSON válida.', 'max.numeric' => 'El campo :attribute no puede ser mayor que :max.', 'max.file' => 'El campo :attribute no puede ser mayor :max de kilobytes.', - 'max.string' => 'The :attribute may not be greater than :max characters.', - 'max.array' => 'The :attribute may not have more than :max items.', - 'mimes' => 'The :attribute must be a file of type: :values.', - 'min.numeric' => 'The :attribute must be at least :min.', - 'min.file' => 'The :attribute must be at least :min kilobytes.', - 'min.string' => 'The :attribute must be at least :min characters.', - 'min.array' => 'The :attribute must have at least :min items.', - 'not_in' => 'The selected :attribute is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values is present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', - 'size.numeric' => 'The :attribute must be :size.', - 'size.file' => 'The :attribute must be :size kilobytes.', - 'size.string' => 'The :attribute must be :size characters.', - 'size.array' => 'The :attribute must contain :size items.', - 'unique' => 'The :attribute has already been taken.', - 'string' => 'The :attribute must be a string.', - 'url' => 'The :attribute format is invalid.', - 'timezone' => 'The :attribute must be a valid zone.', - '2fa_code' => 'The :attribute field is invalid.', - '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 + 'max.string' => 'El campo :attribute debe contener menos de :max caracteres.', + 'max.array' => 'El campo :attribute debe contener al menos :max elementos.', + 'mimes' => 'El campo :attribute debe ser un archivo de tipo :values.', + 'min.numeric' => 'El campo :attribute debe ser al menos :min.', + 'min.file' => 'El campo :attribute debe ser al menos :min kilobytes.', + 'min.string' => 'El campo :attribute debe contener al menos :min caracteres.', + 'min.array' => 'El campo :attribute debe tener al menos :min elementos.', + 'not_in' => 'El campo :attribute seleccionado es incorrecto.', + 'numeric' => 'El campo :attribute debe ser un número.', + 'regex' => 'El formato del campo :attribute no es válido.', + 'required' => 'El campo :attribute es obligatorio.', + 'required_if' => 'El campo :attribute es obligatorio cuando el campo :other es :value.', + 'required_unless' => 'El campo :attribute es obligatorio a menos que :other se encuentre en :values.', + 'required_with' => 'El campo :attribute es obligatorio cuando :values está presente.', + 'required_with_all' => 'El campo :attribute es obligatorio cuando :values está presente.', + 'required_without' => 'El campo :attribute es obligatorio cuando :values no está presente.', + 'required_without_all' => 'El campo :attribute es obligatorio cuando ningún campo :values está presente.', + 'same' => 'El campo atributo :attribute y :other deben coincidir.', + 'size.numeric' => 'El tamaño de :attribute debe ser :size.', + 'size.file' => 'El tamaño de :attribute debe ser :size kilobytes.', + 'size.string' => 'El campo :attribute debe tener :size caracteres.', + 'size.array' => 'El campo :attribute debe contener :size elementos.', + 'unique' => 'El elemento :attribute ya está en uso.', + 'string' => 'El campo :atribute debe ser un texto.', + 'url' => 'El formato del campo :attribute no es válido.', + 'timezone' => 'El campo :attribute debe contener una zona válida.', + '2fa_code' => 'El campo :attribute no es válido.', + 'dimensions' => 'Las dimensiones de la imagen :attribute son incorrectas.', + 'distinct' => 'El campo :attribute tiene un valor duplicado.', + 'file' => 'El campo :attribute debe ser un fichero.', + 'in_array' => 'El campo :attribute no existe en :other.', + 'present' => 'El campo :attribute debe estar presente.', + 'amount_zero' => 'La cantidad total no puede ser cero', + 'secure_password' => 'Esta contraseña no es segura. Por favor inténtalo de nuevo. Para más información, visita https://goo.gl/NCh2tN', +]; diff --git a/resources/lang/fr_FR/auth.php b/resources/lang/fr_FR/auth.php index 2e8e1c503f..67482eb063 100644 --- a/resources/lang/fr_FR/auth.php +++ b/resources/lang/fr_FR/auth.php @@ -27,4 +27,4 @@ return [ 'failed' => 'Ces identifiants n\'ont aucune correspondance.', 'throttle' => 'Trop de tentatives de connexion. Veuillez essayer à nouveau dans :seconds secondes.', -]; \ No newline at end of file +]; diff --git a/resources/lang/fr_FR/breadcrumbs.php b/resources/lang/fr_FR/breadcrumbs.php index ef1952431c..b94f581512 100644 --- a/resources/lang/fr_FR/breadcrumbs.php +++ b/resources/lang/fr_FR/breadcrumbs.php @@ -13,31 +13,32 @@ declare(strict_types=1); */ return [ - 'home' => 'Accueil', - 'edit_currency' => 'Modifier la devise "%name"', - 'delete_currency' => 'Supprimer la devise ":name"', - 'newPiggyBank' => 'Créer une nouvelle tirelire', - 'edit_piggyBank' => 'Modifier la tirelire ":name"', - 'preferences' => 'Préférences', - 'profile' => 'Profil', - 'changePassword' => 'Modifier le mot de passe', - 'bills' => 'Factures', - 'newBill' => 'Nouvelle facture', - 'edit_bill' => 'Editer la facture : ":name"', - 'delete_bill' => 'Supprimer la facture ":name"', - 'reports' => 'Rapport', - 'search_result' => 'Search results for ":query"', - 'withdrawal_list' => 'Dépenses', - 'deposit_list' => 'Revenu, salaire et versements', - 'transfer_list' => 'Virements', - 'transfers_list' => 'Virements', - 'create_withdrawal' => 'Créer un nouveau retrait', - 'create_deposit' => 'Créer un nouveau versement', - 'create_transfer' => 'Creer un nouveau virement', - 'edit_journal' => 'Éditer la transaction ":description"', - 'delete_journal' => 'Supprimer la transaction ":description"', - 'tags' => 'Mots-clés', - 'createTag' => 'Créer un nouveau tag', - 'edit_tag' => 'Éditer le tag ":tag"', - 'delete_tag' => 'Supprimer le tag ":tag"', -]; \ No newline at end of file + 'home' => 'Accueil', + 'edit_currency' => 'Modifier la devise "%name"', + 'delete_currency' => 'Supprimer la devise ":name"', + 'newPiggyBank' => 'Créer une nouvelle tirelire', + 'edit_piggyBank' => 'Modifier la tirelire ":name"', + 'preferences' => 'Préférences', + 'profile' => 'Profil', + 'changePassword' => 'Modifier le mot de passe', + 'bills' => 'Factures', + 'newBill' => 'Nouvelle facture', + 'edit_bill' => 'Editer la facture : ":name"', + 'delete_bill' => 'Supprimer la facture ":name"', + 'reports' => 'Rapport', + 'search_result' => 'Résultats de recherche pour ":query"', + 'withdrawal_list' => 'Dépenses', + 'deposit_list' => 'Revenu, salaire et versements', + 'transfer_list' => 'Virements', + 'transfers_list' => 'Virements', + 'create_withdrawal' => 'Créer un nouveau retrait', + 'create_deposit' => 'Créer un nouveau versement', + 'create_transfer' => 'Creer un nouveau virement', + 'edit_journal' => 'Éditer la transaction ":description"', + 'delete_journal' => 'Supprimer la transaction ":description"', + 'tags' => 'Mots-clés', + 'createTag' => 'Créer un nouveau tag', + 'edit_tag' => 'Éditer le tag ":tag"', + 'delete_tag' => 'Supprimer le tag ":tag"', + 'delete_journal_link' => 'Supprimer le lien entre les transactions', +]; diff --git a/resources/lang/fr_FR/config.php b/resources/lang/fr_FR/config.php index 989a496b74..846407e08a 100644 --- a/resources/lang/fr_FR/config.php +++ b/resources/lang/fr_FR/config.php @@ -22,4 +22,4 @@ return [ 'year' => '%Y', 'half_year' => '%B %Y', -]; \ No newline at end of file +]; diff --git a/resources/lang/fr_FR/csv.php b/resources/lang/fr_FR/csv.php index ac03875f19..2c5ef5b3e6 100644 --- a/resources/lang/fr_FR/csv.php +++ b/resources/lang/fr_FR/csv.php @@ -14,36 +14,36 @@ declare(strict_types=1); return [ // initial config - 'initial_title' => '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', + 'initial_title' => 'Importer la configuration (1/3) - Configuration de l\'importation CSV basique', + 'initial_text' => 'Pour pouvoir importer votre fichier correctement, veuillez validez les options ci-dessous.', + 'initial_box' => 'Options d’importation CSV basique', + 'initial_box_title' => 'Options d’importation CSV basique', + 'initial_header_help' => 'Cochez cette case si la première ligne de votre fichier CSV contient les entêtes des colonnes.', + 'initial_date_help' => 'Le format de la date et de l’heure dans votre fichier CSV. Utiliser le format comme indiqué sur cette page. La valeur par défaut va analyser les dates ressemblant à ceci : :dateExample.', + 'initial_delimiter_help' => 'Choisissez le délimiteur de champ qui est utilisé dans votre fichier d’entrée. Si vous n’êtes pas certain, la virgule est l’option la plus sûre.', + 'initial_import_account_help' => 'Si votre fichier CSV ne contient AUCUNE information concernant vos compte(s) actif, utilisez cette liste déroulante pour choisir à quel compte les opérations contenues dans le CSV font référence.', + 'initial_submit' => 'Passez à l’étape 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.', + 'roles_title' => 'Importer la configuration (1/3) - Définir le rôle de chaque colonne', + 'roles_text' => 'Chaque colonne de votre fichier CSV contient certaines données. Veuillez indiquer quel type de données, l’importateur doit attendre. L’option de « mapper » les données signifie que vous allez lier chaque entrée trouvée dans la colonne à une valeur dans votre base de données. Souvent une colonne est la colonne contenant l’IBAN du compte opposé. Qui peut être facilement adapté aux IBAN déjà présents dans votre base de données.', + 'roles_table' => 'Tableau', + 'roles_column_name' => 'Nom de colonne', + 'roles_column_example' => 'Données d’exemple de colonne', + 'roles_column_role' => 'Signification des données de colonne', + 'roles_do_map_value' => 'Mapper ces valeurs', + 'roles_column' => 'Colonne', + 'roles_no_example_data' => 'Pas de données disponibles', + 'roles_submit' => 'Passez à l’étape 3/3', + 'roles_warning' => 'La moindre des choses, c\'est de marquer une colonne comme colonne-montant. Il est conseillé de sélectionner également une colonne pour la description, la date et le compte opposé.', // map data - 'map_title' => 'Import setup (3/3) - Connect import data to Firefly III data', + 'map_title' => 'Importer la configuration (3/3) - Connecter l\'importation des données aux données de Firefly III', 'map_text' => 'Dans les tableaux suivants, la valeur gauche vous montre des informations trouvées dans votre fichier CSV téléchargé. C’est votre rôle de mapper cette valeur, si possible, une valeur déjà présente dans votre base de données. Firefly s’en tiendra à ce mappage. Si il n’y a pas de valeur correspondante, ou vous ne souhaitez pas la valeur spécifique de la carte, ne sélectionnez rien.', - 'map_field_value' => 'Field value', - 'map_field_mapped_to' => 'Mapped to', - 'map_do_not_map' => '(do not map)', - 'map_submit' => 'Start the import', + 'map_field_value' => 'Valeur du champ', + 'map_field_mapped_to' => 'Mappé à', + 'map_do_not_map' => '(ne pas mapper)', + 'map_submit' => 'Démarrer l\'importation', // map things. 'column__ignore' => '(ignorer cette colonne)', @@ -73,11 +73,11 @@ return [ 'column_opposing-name' => 'Compte destination (nom)', 'column_rabo-debet-credit' => 'Indicateur spécifique débit/crédit à Rabobank', 'column_ing-debet-credit' => 'Indicateur spécifique débit/crédit à ING', - 'column_sepa-ct-id' => 'SEPA Credit Transfer end-to-end ID', - 'column_sepa-ct-op' => 'SEPA Credit Transfer opposing account', + 'column_sepa-ct-id' => 'SEPA Transfert Crédit ID de bout en bout', + 'column_sepa-ct-op' => 'SEPA Transfert Crédit compte opposé', 'column_sepa-db' => 'SEPA débit immédiat', 'column_tags-comma' => 'Tags (séparé par des virgules)', - 'column_tags-space' => 'Tags(séparé par des espaces)', + 'column_tags-space' => 'Tags (séparé par des espaces)', 'column_account-number' => 'Compte d’actif (numéro de compte)', 'column_opposing-number' => 'Compte destination (numéro de compte)', -]; \ No newline at end of file +]; diff --git a/resources/lang/fr_FR/demo.php b/resources/lang/fr_FR/demo.php index 5ef3b853d3..fbb7aaa450 100644 --- a/resources/lang/fr_FR/demo.php +++ b/resources/lang/fr_FR/demo.php @@ -13,7 +13,7 @@ return [ 'no_demo_text' => 'Désolé, il n’y a aucun texte supplémentaire de démonstration ou d\'explication pour cette page.', 'see_help_icon' => 'Cependant, l\'icône située dans le coin supérieur droit peut vous en dire plus.', 'index' => 'Bienvenue chez Firefly III ! Sur cette page, vous obtenez un aperçu rapide de vos finances. Pour plus d’informations, consultez comptes → Comptes d’actif et, bien sûr, les pages des Budgets et des rapports. Ou juste jetez un coup d’œil et voyez où vous vous retrouvez.', - '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.', + 'accounts-index' => 'Les comptes d’actifs sont vos comptes bancaires personnels. Les comptes de dépenses sont des comptes où vous dépensez de l’argent, comme les magasins et les amis. Les comptes de recettes sont des comptes où vous recevez de l’argent, comme votre travail, le gouvernement ou d’autres sources de revenu. Sur cette page, vous pouvez les modifier ou les supprimer.', 'budgets-index' => 'Cette page vous présente un aperçu de vos budgets. La barre du haut affiche le montant disponible à budgétiser. Cela peut être personnalisé pour toute période en cliquant sur le montant sur la droite. Le montant que vous avez réellement dépensé s’affiche dans la barre ci-dessous. Visualisez ainsi les dépenses budgétisées et votre prévisionnel.', 'reports-index-start' => 'Firefly III prend en charge quatre types de rapports. Apprenez-en plus à leur sujet en cliquant sur l\'icône située dans le coin supérieur droit.', 'reports-index-examples' => 'N’oubliez pas de consultez ces exemples : un aperçu financier mensuel, une vue d’ensemble financière annuelle ainsi qu’une présentation du budget.', @@ -23,4 +23,4 @@ return [ 'import-index' => 'Bien sûr, n’importe quel fichier CSV peut être importé dans Firefly III ', 'import-configure-security' => 'Pour des raisons de sécurité, votre téléchargement a été remplacé par un fichier local.', 'import-configure-configuration' => 'La configuration que vous voyez ci-dessous est correcte pour le fichier local.', -]; \ No newline at end of file +]; diff --git a/resources/lang/fr_FR/firefly.php b/resources/lang/fr_FR/firefly.php index 923d9f639d..3add5d33fb 100644 --- a/resources/lang/fr_FR/firefly.php +++ b/resources/lang/fr_FR/firefly.php @@ -13,7 +13,6 @@ declare(strict_types=1); return [ // general stuff: - 'language_incomplete' => 'traduction incomplète', 'close' => 'Fermer', 'actions' => 'Actions', 'edit' => 'Modifier', @@ -28,12 +27,7 @@ return [ 'to' => 'A', 'showEverything' => 'Tout Afficher', 'never' => 'Jamais', - 'search_results_for' => 'Résultats de recherche pour ":query"', 'no_results_for_empty_search' => 'Votre recherche était vide, rien n’a été trouvé.', - 'bounced_error' => 'Le message envoyé à :email a été rejeté, donc pas d\'accès pour vous.', - 'deleted_error' => 'Ces informations d\'identification ne sont pas présentes dans nos données.', - 'general_blocked_error' => 'Votre compte a été désactivé, vous ne pouvez plus vous connecter.', - 'expired_error' => 'Votre compte a expiré et ne peut plus être utilisé.', 'removed_amount' => 'Supprimé :amount', 'added_amount' => 'Ajouté :amount', 'asset_account_role_help' => 'Toutes options supplémentaires résultant de votre choix peut être réglée plus tard.', @@ -56,7 +50,6 @@ return [ 'flash_error_multiple' => 'Il y a une erreur|Il y a :count errors', 'net_worth' => 'Valeur nette', 'route_has_no_help' => 'Il n\'y a pas d\'aide pour cette page.', - 'help_may_not_be_your_language' => 'Ce texte d’aide est en anglais. Il n’est pas encore disponible dans votre langue', 'two_factor_welcome' => 'Bonjour, :user !', 'two_factor_enter_code' => 'Pour continuer, veuillez entrer votre code d’authentification à deux facteurs. Votre application peut la générer pour vous.', 'two_factor_code_here' => 'Entrez votre code ici', @@ -70,9 +63,6 @@ return [ 'two_factor_lost_fix_owner' => 'Dans le cas contraire, contactez le propriétaire du site par courriel : site_owner et demandez leur de réinitialiser votre authentification à deux facteurs.', 'warning_much_data' => ':days de données peuvent prendre un certain temps à charger.', 'registered' => 'Vous avez été enregistré avec succès !', - 'tagbalancingAct' => 'Balancing act', - 'tagadvancePayment' => 'Acompte', - 'tagnothing' => '', 'Default asset account' => 'Compte d’actif par défaut', 'no_budget_pointer' => 'Vous semblez n’avoir encore aucun budget. Vous devez en créer sur la page des budgets. Les budgets peuvent vous aider à garder une trace des dépenses.', 'Savings account' => 'Compte d’épargne', @@ -82,40 +72,33 @@ return [ 'user_id_is' => 'Votre identifiant d’utilisateur est :user', 'field_supports_markdown' => 'Ce champ prend en charge la syntaxe Markdown.', 'need_more_help' => 'Si vous désirez plus de renseignements sur l\'utilisation de Firefly III, merci d\'ouvrir un ticket sur 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.', - 'nothing_to_display' => 'Il n’y a aucune transaction à afficher', + 'reenable_intro_text' => 'Vous pouvez également réactiver le guide d\'introduction.', + 'intro_boxes_after_refresh' => 'Les boîtes d\'introduction réapparaîtront lorsque vous actualiserez la page.', 'show_all_no_filter' => 'Montrer toutes les transactions sans les classer par date.', 'expenses_by_category' => 'Dépenses par catégorie', 'expenses_by_budget' => 'Dépenses par budget', 'income_by_category' => 'Revenu par catégorie', - 'expenses_by_asset_account' => 'Expenses by asset account', - 'expenses_by_expense_account' => 'Expenses by expense account', + 'expenses_by_asset_account' => 'Dépenses par compte d’actif', + 'expenses_by_expense_account' => 'Dépenses par compte de dépenses', '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' => '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_change_demo' => 'Vous ne pouvez pas modifier le mot de passe du compte de démonstration.', - 'cannot_delete_demo' => 'Vous ne pouvez pas supprimer le compte de démonstration.', + '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', - 'per_period' => 'Par période', - 'all_periods' => 'Toutes les périodes', 'current_period' => 'Période en cours', - '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"', - 'budget_in_period_breadcrumb' => 'Entre :start et :end', + '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.', + 'budget_in_period' => 'Toutes les transactions pour le budget ":name" entre :start et :end', + 'chart_budget_in_period' => 'Graphique pour toutes les transactions pour le budget ":name" entre :start et :end', + 'chart_account_in_period' => 'Graphique pour toutes les transactions pour le compte ":name" entre :start et :end', + 'chart_category_in_period' => 'Graphique pour toutes les transactions pour la catégorie ":name" entre :start et :end', + 'chart_category_all' => 'Graphique pour toutes les transactions pour la catégorie ":name"', 'clone_withdrawal' => 'Cloner ce retrait', 'clone_deposit' => 'Cloner ce dépôt', 'clone_transfer' => 'Cloner ce transfert', - 'transaction_journal_other_options' => 'Autres options', 'multi_select_no_selection' => 'Aucun selectionnez', 'multi_select_all_selected' => 'Tous sélectionnés', 'multi_select_filter_placeholder' => 'Rechercher..', @@ -139,43 +122,31 @@ return [ 'all_journals_for_tag' => 'Toutes les transactions pour le tag ":tag"', 'title_transfer_between' => 'Tous les transferts entre :start et :end', 'all_journals_for_category' => 'Toutes les transactions pour la catégorie :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', + 'all_journals_for_budget' => 'Toutes les transactions pour le budget :name', + 'chart_all_journals_for_budget' => 'Graphique pour toutes les transactions pour le budget :name', + 'journals_in_period_for_category' => 'Toutes les transactions pour la catégorie :name entre :start et :end', + 'journals_in_period_for_tag' => 'Toutes les transactions de balise :tag entre :start et :end', + 'not_available_demo_user' => 'La fonctionnalité que vous essayez d’accéder n’est pas disponible pour les utilisateurs de la démo.', + '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', // search 'search' => 'Rechercher', - '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 ...', + 'search_found_transactions' => 'Nombre de transactions trouvées :', + 'general_search_error' => 'Une erreur s’est produite lors de la recherche. S’il vous plaît vérifiez les fichiers de log pour plus d’informations.', + 'search_box' => 'Chercher', + '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 ...', // repeat frequencies: - 'repeat_freq_yearly' => 'yearly', + 'repeat_freq_yearly' => 'annuellement', 'repeat_freq_monthly' => 'mensuel', 'weekly' => 'hebdomadaire', 'quarterly' => 'trimestriel', 'half-year' => 'semestriel', 'yearly' => 'annuel', - // account confirmation: - 'confirm_account_header' => 'Merci de vérifier votre compte', - 'confirm_account_intro' => 'Un courriel a été envoyé à l’adresse utilisée lors de votre inscription. Merci de vous y référer pour obtenir des instructions supplémentaires. Si vous n’avez pas reçu ce message, Firefly peut vous l\'envoyer de nouveau.', - 'confirm_account_resend_email' => 'M’envoyer le message de confirmation nécessaire pour activer mon compte.', - 'account_is_confirmed' => 'Votre compte a été validé !', - 'invalid_activation_code' => 'Il semble que le code que vous utilisez n’est pas valide ou a expiré.', - 'confirm_account_is_resent_header' => 'La confirmation a été renvoyée', - 'confirm_account_is_resent_text' => 'Le message de confirmation a été renvoyé. Si vous n’avez toujours pas reçu le message de confirmation, veuillez prendre contact avec le propriétaire du site à :owner ou vérifiez les logs pour voir ce qui s’est mal passé.', - 'confirm_account_is_resent_go_home' => 'Aller à la page d’accueil de Firefly', - 'confirm_account_not_resent_header' => 'Quelque chose s\'est mal passé :(', - 'confirm_account_not_resent_intro' => 'Le message de confirmation n\'a pas été renvoyé. Si vous continuez à ne pas recevoir le message de confirmation, veuillez communiquer avec le propriétaire du site au : propriétaire. Vous pourriez avoir essayé de vous renvoyer le message d’activation trop souvent. Vous pouvez demander à Firefly III de vous renvoyer le message de confirmation toutes les heures.', - 'confirm_account_not_resent_go_home' => 'Aller à la page d’accueil de Firefly', // export data: 'import_and_export' => 'Importer et Exporter', @@ -205,7 +176,6 @@ return [ 'export_status_created_zip_file' => 'Fichier zip créé!', 'export_status_finished' => 'L\'export s\'est terminé avec succès ! Yay !', 'export_data_please_wait' => 'Veuillez patienter...', - 'attachment_explanation' => 'Le fichier appelé \':attachment_name\' (#:attachment_id) était initialement envoyé à :type \': description\' (#:journal_id) en date du :date pour un montant de :amount.', // rules 'rules' => 'Règles', @@ -258,57 +228,71 @@ return [ 'warning_transaction_subset' => 'Pour des raisons de performances cette liste est limitée à :max_num_transactions et peut n\'afficher qu\'une partie des opérations correspondantes', 'warning_no_matching_transactions' => 'Aucunes opérations correspondantes trouvées. Veuillez noter que pour des raisons de performances, seule les dernières :num_transactions opérations ont été vérifiées.', 'warning_no_valid_triggers' => 'Aucun déclencheurs valide fourni.', - '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.', + 'apply_rule_selection' => 'Appliquer la règle ":title" à une sélection de vos transactions', + 'apply_rule_selection_intro' => 'Les règles comme ":title" ne s\'appliquent normalement qu\'aux transactions nouvelles ou mises à jour, mais vous pouvez dire à Firefly III de l’exécuter sur une sélection de vos transactions existantes. Cela peut être utile lorsque vous avez mis à jour une règle et vous avez besoin que les modifications soit appliqué à l’ensemble de vos autres transactions.', 'include_transactions_from_accounts' => 'Iclure les opérations depuis ces comptes', - 'applied_rule_selection' => 'Rule ":title" has been applied to your selection.', + 'applied_rule_selection' => 'La règle ":title" a été appliqué à votre sélection.', 'execute' => 'Executer', - '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.', + 'apply_rule_group_selection' => 'Appliquer le groupe de règles ":title" à une sélection de vos transactions', + 'apply_rule_group_selection_intro' => 'Les groupes de règles comme ":titre" ne s\'appliquent normalement qu\'aux transactions nouvelles ou mises à jour, mais vous pouvez dire à Firefly III d\'exécuter toutes les règles de ce groupe sur une sélection de vos transactions existantes. Cela peut être utile lorsque vous avez mis à jour un groupe de règles et que vous avez besoin des modifications à appliquer à toutes vos autres transactions.', + 'applied_rule_group_selection' => 'Le groupe de règles ":title" a été appliqué à votre sélection.', // actions and triggers 'rule_trigger_user_action' => 'L\'action de l’utilisateur est ": trigger_value"', - 'rule_trigger_from_account_starts' => 'Le compte source commence par ":trigger_value"', - 'rule_trigger_from_account_ends' => 'Le compte source se termine par ":trigger_value"', - 'rule_trigger_from_account_is' => 'Le compte source est ":trigger_value"', - 'rule_trigger_from_account_contains' => 'Le compte source contient ":trigger_value"', - 'rule_trigger_to_account_starts' => 'Le compte de destination commence par ":trigger_value"', - 'rule_trigger_to_account_ends' => 'Le compte de destination se termine par ":trigger_value"', - 'rule_trigger_to_account_is' => 'Le compte de destination est ":trigger_value"', - 'rule_trigger_to_account_contains' => 'Le compte de destination contient ":trigger_value"', - 'rule_trigger_transaction_type' => 'L\'opération est du type ":trigger_value"', - 'rule_trigger_category_is' => 'Category is ":trigger_value"', - 'rule_trigger_amount_less' => 'Le montant est inférieur à :trigger_value', - 'rule_trigger_amount_exactly' => 'Le montant est :trigger_value', - 'rule_trigger_amount_more' => 'Le montant est supérieur à :trigger_value', - 'rule_trigger_description_starts' => 'La description commence par ":trigger_value"', - 'rule_trigger_description_ends' => 'La description se termine par ":trigger_value"', - 'rule_trigger_description_contains' => 'La description contient ":trigger_value"', - 'rule_trigger_description_is' => 'La description est ":trigger_value"', 'rule_trigger_from_account_starts_choice' => 'Le compte source commence par..', + 'rule_trigger_from_account_starts' => 'Le compte source commence par ":trigger_value"', 'rule_trigger_from_account_ends_choice' => 'Le compte source se termine par..', + 'rule_trigger_from_account_ends' => 'Le compte source se termine par ":trigger_value"', 'rule_trigger_from_account_is_choice' => 'Le compte source est..', + 'rule_trigger_from_account_is' => 'Le compte source est ":trigger_value"', 'rule_trigger_from_account_contains_choice' => 'Le compte source contient..', + 'rule_trigger_from_account_contains' => 'Le compte source contient ":trigger_value"', 'rule_trigger_to_account_starts_choice' => 'Le compte de destination commence par..', + 'rule_trigger_to_account_starts' => 'Le compte de destination commence par ":trigger_value"', 'rule_trigger_to_account_ends_choice' => 'Compte de destination se terminant par..', + 'rule_trigger_to_account_ends' => 'Le compte de destination se termine par ":trigger_value"', 'rule_trigger_to_account_is_choice' => 'Le compte de destination est..', + 'rule_trigger_to_account_is' => 'Le compte de destination est ":trigger_value"', 'rule_trigger_to_account_contains_choice' => 'Le compte de destination est..', + 'rule_trigger_to_account_contains' => 'Le compte de destination contient ":trigger_value"', 'rule_trigger_transaction_type_choice' => 'L\'opération est du type..', + 'rule_trigger_transaction_type' => 'L\'opération est du type ":trigger_value"', + 'rule_trigger_category_is_choice' => 'La catégorie est..', + 'rule_trigger_category_is' => 'La catégorie est ":trigger_value"', 'rule_trigger_amount_less_choice' => 'Le montant est inférieur à..', + 'rule_trigger_amount_less' => 'Le montant est inférieur à :trigger_value', 'rule_trigger_amount_exactly_choice' => 'Le montant est..', + 'rule_trigger_amount_exactly' => 'Le montant est :trigger_value', 'rule_trigger_amount_more_choice' => 'Le montant est supérieur à..', + 'rule_trigger_amount_more' => 'Le montant est supérieur à :trigger_value', 'rule_trigger_description_starts_choice' => 'Le description commence par..', + 'rule_trigger_description_starts' => 'La description commence par ":trigger_value"', 'rule_trigger_description_ends_choice' => 'La description se termine par..', + 'rule_trigger_description_ends' => 'La description se termine par ":trigger_value"', 'rule_trigger_description_contains_choice' => 'La description contient..', + 'rule_trigger_description_contains' => 'La description contient ":trigger_value"', 'rule_trigger_description_is_choice' => 'La description est..', - '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_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_tag_is_choice' => '(A) le tag est..', + 'rule_trigger_tag_is' => 'A tag is ":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', 'rule_trigger_update_journal' => 'Lorsqu’une transaction est mise à jour', + 'rule_trigger_has_no_category_choice' => 'N\'a pas de catégorie', + 'rule_trigger_has_no_category' => 'La transaction n\'a pas de catégorie', + 'rule_trigger_has_any_category_choice' => 'À une catégorie', + '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_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_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"', @@ -329,10 +313,10 @@ return [ 'rule_action_set_description_choice' => 'Définir la description à..', 'rule_action_append_description_choice' => 'Suffixer la description avec..', 'rule_action_prepend_description_choice' => 'Préfixer la description avec..', - 'rule_action_set_source_account_choice' => 'Set source account to...', - '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', + 'rule_action_set_source_account_choice' => 'Définissez le compte source à...', + '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', // tags 'store_new_tag' => 'Créer un nouveau tag', @@ -340,6 +324,8 @@ return [ 'no_location_set' => 'Aucun emplacement défini.', 'meta_data' => 'Meta-données', 'location' => 'Emplacement', + 'without_date' => 'Sans date', + 'result' => 'Résultat', // preferences 'pref_home_screen_accounts' => 'Comptes de l’écran d’accueil', @@ -370,23 +356,23 @@ return [ 'pref_two_factor_auth_remove_will_disable' => '(cela désactivera également l\'authentification à deux facteurs)', 'pref_save_settings' => 'Enregistrer les paramètres', 'saved_preferences' => 'Préférences enregistrées!', - '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', + 'preferences_general' => 'Général', + 'preferences_frontpage' => 'Écran d\'accueil', + 'preferences_security' => 'Sécurité', + 'preferences_layout' => 'Mise en Page', + 'pref_home_show_deposits' => 'Afficher les dépôts sur l\'écran d\'accueil', + 'pref_home_show_deposits_info' => 'L\'écran d\'accueil affiche déjà vos comptes de dépenses. Devrait-il aussi afficher vos comptes de revenus?', + 'pref_home_do_show_deposits' => 'Oui, montrez-les', + 'successful_count' => 'dont :count avec succès', 'transaction_page_size_title' => 'Taille de la page', 'transaction_page_size_help' => 'N’importe quelle liste de transactions montre au plus ce nombre de transactions', 'transaction_page_size_label' => 'Taille de la page', 'between_dates' => '(:start et :end)', 'pref_optional_fields_transaction' => 'Champs optionnels pour les 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.', + 'pref_optional_fields_transaction_help' => 'Par défaut, tous les champs ne sont pas activés lors de la création d\'une nouvelle transaction (en raison du désordre). Ci-dessous, vous pouvez activer ces champs si vous pensez qu\'ils pourraient vous être utiles. Bien sûr, tout domaine désactivé, mais déjà rempli, sera visible quel que soit le paramètre.', 'optional_tj_date_fields' => 'Champ date', 'optional_tj_business_fields' => 'Champs professionnels', - 'optional_tj_attachment_fields' => 'Attachment fields', + 'optional_tj_attachment_fields' => 'Champs de pièces jointes', 'pref_optional_tj_interest_date' => 'Date des intérêts', 'pref_optional_tj_book_date' => 'Date de réservation', 'pref_optional_tj_process_date' => 'Date de traitement', @@ -397,7 +383,7 @@ return [ 'pref_optional_tj_notes' => 'Notes', 'pref_optional_tj_attachments' => 'Pièces jointes', 'optional_field_meta_dates' => 'Dates', - 'optional_field_meta_business' => 'Business', + 'optional_field_meta_business' => 'Commerce', 'optional_field_attachments' => 'Pièces jointes', 'optional_field_meta_data' => 'Métadonnées facultatives', @@ -418,16 +404,16 @@ return [ 'password_changed' => 'Mot de passe modifié!', 'should_change' => 'L’idée est de changer votre mot de passe.', 'invalid_password' => 'Mot de passe incorrect!', - '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.', + 'what_is_pw_security' => 'Qu\'est-ce que "vérifier la sécurité du mot de passe" ?', + 'secure_pw_title' => 'Comment choisir un mot de passe sécurisé', + 'secure_pw_history' => 'En août 2017, le réputé chercheur en sécurité Troy Hunt a publié une liste de 306 millions de mots de passe volés. Ces mots de passe ont été volés lors de cambriolages à des entreprises comme LinkedIn, Adobe et NeoPets (et bien d’autres).', + 'secure_pw_check_box' => 'En cochant la case, Firefly III enverra l\'empreinte SHA1 de votre mot de passe au site Web de Troy Hunt pour voir si c’est sur la liste. Cela vous empêchera d\'utiliser des mots de passe dangereux comme cela est recommandé dans les dernières NIST Special Publication à ce sujet.', + 'secure_pw_sha1' => 'Mais je pensais que SHA1 était cassé ?', + 'secure_pw_hash_speed' => 'Oui, mais pas dans ce contexte. Comme vous pouvez le lire sur le site Web détaillant comment ils ont cassé SHA1, c’est maintenant légèrement plus facile de trouver une « collision » : une autre chaîne qui aboutit à la même empreinte SHA1. Maintenant, cela prend seulement 10 000 ans, à l’aide d’une machine mono-GPU.', + 'secure_pw_hash_security' => 'Cette collision ne serait pas égale à votre mot de passe, et ne serait pas utile sur (un site comme) Firefly III. Cette application n\'utilise pas SHA1 pour la vérification du mot de passe. Il est donc sûr de cocher cette case. Votre mot de passe est haché et envoyé par HTTPS.', + 'secure_pw_should' => 'Dois-je cocher la case ?', + 'secure_pw_long_password' => 'Si vous venez de générer un long mot de passe unique pour Firefly III à l\'aide d\'un type de générateur de mot de passe : no.', + 'secure_pw_short' => 'Si vous venez d\'entrer le mot de passe que vous utilisez toujours : S\'il vous plaît, oui.', // attachments @@ -449,38 +435,38 @@ return [ 'title_transfers' => 'Transferts', // 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' => 'If you convert this withdrawal into a transfer, :amount will be transferred from :sourceName to a new asset account, instead of being paid to :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', + 'convert_is_already_type_Withdrawal' => 'Cette transaction est déjà un retrait', + 'convert_is_already_type_Deposit' => 'Cette transaction est déjà un dépôt', + 'convert_is_already_type_Transfer' => 'Cette transaction est déjà un transfert', + 'convert_to_Withdrawal' => 'Convertir ":description" vers un retrait', + 'convert_to_Deposit' => 'Convertir ":description" vers un dépôt', + 'convert_to_Transfer' => 'Convertir ":description" vers un transfert', + 'convert_options_WithdrawalDeposit' => 'Convertir un retrait en dépôt', + 'convert_options_WithdrawalTransfer' => 'Convertir un retrait en transfert', + 'convert_options_DepositTransfer' => 'Convertir un dépôt en transfert', + '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', + 'convert_Deposit_to_transfer' => 'Convertir ce dépôt en transfert', + 'convert_Transfer_to_deposit' => 'Convertir ce transfert en dépôt', + 'convert_Transfer_to_withdrawal' => 'Convertir ce transfert en retrait', + 'convert_please_set_revenue_source' => 'Veuillez choisir le compte de recettes d\'où proviendra l’argent.', + 'convert_please_set_asset_destination' => 'Veuillez choisir le compte d\'actifs auquel l\'argent sera versé.', + 'convert_please_set_expense_destination' => 'Veuillez choisir le compte de dépense auquel l\'argent sera versé.', + 'convert_please_set_asset_source' => 'Veuillez choisir le compte d’actif d\'où proviendra l’argent.', + 'convert_explanation_withdrawal_deposit' => 'Si vous convertissez ce retrait en dépôt, :amount sera déposé dans :sourceName au lieu de le retirer.', + 'convert_explanation_withdrawal_transfer' => 'Si vous convertissez ce retrait en transfert, :amount sera transféré de :sourceName vers un nouveau compte d\'actif, au lieu d\'être payé à :DestinationName .', + 'convert_explanation_deposit_withdrawal' => 'Si vous convertissez ce dépôt dans un retrait :amount sera supprimé de :destinationName au lieu d\'y être ajouté.', + 'convert_explanation_deposit_transfer' => 'Si vous convertissez ce dépôt en transfert, :amount sera transféré d\'un compte d\'actif de votre choix en : destinationName.', + 'convert_explanation_transfer_withdrawal' => 'Si vous convertissez ce transfert en retrait, le montant passera de :sourceName à une nouvelle destination comme une dépense, au lieu de :destinationName en tant que transfert.', + 'convert_explanation_transfer_deposit' => 'Si vous convertissez ce transfert en dépôt, :amount sera déposé dans le compte :destinationName au lieu d\'y être transféré.', + 'converted_to_Withdrawal' => 'La transaction a été convertie en retrait', + 'converted_to_Deposit' => 'La transaction a été convertie en dépôt', + 'converted_to_Transfer' => 'La transaction a été convertie en transfert', // create new stuff: @@ -523,7 +509,6 @@ return [ 'createBudget' => 'Nouveau budget', 'inactiveBudgets' => 'Budgets inactifs', 'without_budget_between' => 'Opérations non budgetisées entre le :start et le :end', - 'budget_in_month' => ':name en :month', 'delete_budget' => 'Supprimer le budget ":name"', 'deleted_budget' => 'Budget ":name" supprimé', 'edit_budget' => 'Modifier le budget ":name"', @@ -531,10 +516,10 @@ return [ 'update_amount' => 'Mettre à jour le montant', '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' => 'Period navigator', + 'budget_period_navigator' => 'Navigateur d\'époque', // bills: - 'matching_on' => 'Matching on', + 'matching_on' => 'Correspond à', 'between_amounts' => 'entre :low et :high.', 'repeats' => 'Répétitions', 'connected_journals' => 'Opérations liées', @@ -553,11 +538,11 @@ return [ 'cannot_scan_inactive_bill' => 'Les factures inactives ne peuvent pas être analysées.', 'rescanned_bill' => 'Réanalyser tout.', 'average_bill_amount_year' => 'Montant moyen des factures ( :year)', - 'average_bill_amount_overall' => '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', + 'average_bill_amount_overall' => 'Montant moyen de la facture (global)', + 'not_or_not_yet' => 'Pas du tout (pas encore)', + 'not_expected_period' => 'Cette période n\'est pas prévu', + 'bill_is_active' => 'Facture en cours', + 'bill_will_automatch' => 'La facture sera automatiquement liée aux transactions correspondantes', // accounts: 'details_for_asset' => 'Détails pour le compte d’actif ":name"', 'details_for_expense' => 'Détail du compte de dépenses ":name"', @@ -591,15 +576,13 @@ return [ 'stored_new_account' => 'Nouveau compte ":name" créé !', 'updated_account' => 'Nom du compte ":name"', 'credit_card_options' => 'Cartes de crédit', - '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', - 'from_to' => 'From :start to :end', - 'from_to_breadcrumb' => 'from :start to :end', - 'account_default_currency' => 'If you select another currency, new transactions from this account will have this currency pre-selected.', + 'no_transactions_account' => 'Il n\'y a pas de transactions (dans cette période) pour le compte d\'actif ":name".', + 'no_data_for_chart' => 'Il n\'y a pas assez d\'informations (pour le moment) pour générer ce graphique.', + 'select_more_than_one_account' => 'Veuillez sélectionner plus d\'un compte', + 'select_more_than_one_category' => 'Veuillez sélectionner plus d\'une catégorie', + 'select_more_than_one_budget' => 'Veuillez sélectionner plus d\'un budget', + 'select_more_than_one_tag' => 'Veuillez sélectionner plus d\'un tag', + 'account_default_currency' => 'Si vous sélectionnez une autre monnaie, les nouvelles transactions de ce compte auront cette monnaie pré-sélectionnées.', // categories: 'new_category' => 'Nouvelle catégorie', @@ -614,7 +597,7 @@ return [ 'delete_category' => 'Supprimer la catégorie ":name"', 'deleted_category' => 'Catégorie ":name" supprimée', 'store_category' => 'Créer une nouvelle catgorie', - 'stored_category' => 'Stored new category ":name"', + 'stored_category' => 'Nouvelle catégorie stockée ":name"', 'without_category_between' => 'Sans catégorie entre :start et :end', // transactions: @@ -632,32 +615,35 @@ return [ 'deleted_transfer' => 'Opération ":name" correctement supprimée', 'stored_journal' => 'Opération créée avec succès ":description"', 'select_transactions' => 'Sélectionner des opérations', - 'stop_selection' => 'Stop selecting transactions', + 'stop_selection' => 'Arrêter de sélectionner les transactions', 'edit_selected' => 'Modifier la sélection', 'delete_selected' => 'Supprimer la sélection', 'mass_delete_journals' => 'Supprimer un certain nombre de transactions', 'mass_edit_journals' => 'Modifier un certain nombre d’opérations', 'cannot_edit_other_fields' => 'Vous ne peut pas modifier en masse d\'autres champs que ceux ici, car il n’y a pas de place pour tous les montrer. S’il vous plaît suivez le lien et modifiez les par un par un, si vous devez modifier ces champs.', - 'perm-delete-many' => 'Deleting many items in one go can be very disruptive. Please be cautious.', + 'perm-delete-many' => 'Supprimer de nombreux éléments en une seule fois peut être très problématique. Soyez prudent.', '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_savingAsset' => 'Comptes d\'épargne', + 'opt_group_sharedAsset' => 'Comptes d\'actifs partagés', + 'opt_group_ccAsset' => 'Cartes de crédit', // new user: 'welcome' => 'Bienvenue sur Firefly !', 'submit' => 'Soumettre', 'getting_started' => 'Mise en route', - '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.', + 'to_get_started' => 'Il est bon de voir que vous avez installé Firefly III avec succès. Pour commencer avec cet outil, entrez le nom de votre banque et le solde de votre compte courant principal. Ne vous inquiétez pas encore si vous avez plusieurs comptes. Vous pouvez les ajouter plus tard. C\'est juste que Firefly III a besoin de quelque chose pour commencer.', + 'savings_balance_text' => 'Firefly III créera automatiquement un compte d\'épargne pour vous. Par défaut, il n\'y aura pas d\'argent dans votre compte d\'épargne, mais si vous dites à Firefly III, le solde sera stocké en tant que tel.', + 'finish_up_new_user' => 'C\'est tout ! Vous pouvez continuer en appuyant sur Envoyer. Vous passerez à l\'index de Firefly III.', 'stored_new_accounts_new_user' => 'Super ! Vos nouveaux comptes ont été créé.', // home page: 'yourAccounts' => 'Vos comptes', 'budgetsAndSpending' => 'Budgets et dépenses', 'savings' => 'Épargne', - 'markAsSavingsToContinue' => 'Marquez votre compte d’actif comme "Compte d\'épargne" pour remplir ce panneau', - 'createPiggyToContinue' => 'Créer des tirelires pour remplir ce panneau.', 'newWithdrawal' => 'Nouvelle dépense', 'newDeposit' => 'Nouveau dépôt', 'newTransfer' => 'Nouveau transfert', @@ -665,8 +651,6 @@ return [ 'moneyOut' => 'Argent sortant', 'billsToPay' => 'Factures à payer', 'billsPaid' => 'Factures payées', - 'divided' => 'divisé', - 'toDivide' => 'Restant à dépenser', // menu and titles, should be recycled as often as possible: 'currency' => 'Devise', @@ -711,125 +695,111 @@ return [ 'errors' => 'Erreurs', // 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', + 'report_default' => 'Rapport financier par défaut entre :start et :end', + 'report_audit' => 'Aperçu de l\'historique des transactions entre :start et :end', + 'report_category' => 'Rapport de catégorie entre :start et :end', + 'report_budget' => 'Rapport du budget entre :start et :end', + 'report_tag' => 'Marquer le rapport entre :start and :end', 'quick_link_reports' => 'Liens rapides', 'quick_link_default_report' => 'Rapport financier par défaut', 'quick_link_audit_report' => 'Historique des transactions', 'report_this_month_quick' => 'Mois en cours, tous les comptes', 'report_this_year_quick' => 'Année en cours, tous les comptes', 'report_this_fiscal_year_quick' => 'Année fiscale en cours, tous les comptes', - 'report_all_time_quick' => 'All-time, all accounts', + 'report_all_time_quick' => 'Tous les temps, tous les comptes', 'reports_can_bookmark' => 'N’oubliez pas que les rapports peuvent être mis en signet.', 'incomeVsExpenses' => 'Revenus vs dépenses', 'accountBalances' => 'Solde du compte', - 'balanceStartOfYear' => 'Solde au début de l\'année', - 'balanceEndOfYear' => 'Solde à la fin de l\'année', - 'balanceStartOfMonth' => 'Solde au début du mois', - 'balanceEndOfMonth' => 'Solde à la fin du mois', 'balanceStart' => 'Solde au début de la période', 'balanceEnd' => 'Solde à la fin de la période', - 'reportsOwnAccounts' => 'Rapport pour vos propres comptes', - 'reportsOwnAccountsAndShared' => 'Rapport pour vos comptes et ceux partagés', - 'splitByAccount' => 'Split by account', - 'balancedByTransfersAndTags' => 'Balanced by transfers and tags', - 'coveredWithTags' => 'Covered with tags', - 'leftUnbalanced' => 'Left unbalanced', - 'expectedBalance' => 'Solde attendu', - 'outsideOfBudgets' => 'Outside of budgets', + 'splitByAccount' => 'Divisé par compte', + 'coveredWithTags' => 'Recouvert de tags', + 'leftUnbalanced' => 'Restant déséquilibré', 'leftInBudget' => 'Budget restant', 'sumOfSums' => 'Montant des sommes', 'noCategory' => '(aucune catégorie)', - 'notCharged' => 'Not charged (yet)', + 'notCharged' => 'Pas encore chargé', 'inactive' => 'Désactivé', 'active' => 'Actif', 'difference' => 'Différence', - 'in' => 'In', - 'out' => 'Out', - 'topX' => 'top :number', - 'show_full_list' => 'Show entire list', - 'show_only_top' => 'Show only top :number', - 'sum_of_year' => 'Total sur l’année', - 'sum_of_years' => 'Total des années', - 'average_of_year' => 'Moyenne sur l\'année', - 'average_of_years' => 'Average of years', - 'categories_earned_in_year' => 'Catégories (selon le revenu)', - 'categories_spent_in_year' => 'Catégories (par dépenses)', + 'in' => 'Dans', + 'out' => 'Sorti', + 'topX' => 'en haut :number', + 'show_full_list' => 'Afficher la liste complète', + 'show_only_top' => 'Afficher uniquement en haut :number', 'report_type' => 'Type de rapport', 'report_type_default' => 'Rapport financier par défaut', 'report_type_audit' => 'Historique des transactions', - 'report_type_category' => 'Category report', - 'report_type_budget' => 'Budget report', - 'report_type_tag' => 'Tag report', - 'report_type_meta-history' => 'Vue d’ensemble des budgets, des catégories et des factures', + 'report_type_category' => 'Rapport par catégories', + 'report_type_budget' => 'Rapport du budget', + 'report_type_tag' => 'Rapport de tag', 'more_info_help' => 'Plus d’informations sur ces types de rapports se trouvent dans les pages d’aide. Appuyez sur l’icône ( ?) dans le coin supérieur droit.', 'report_included_accounts' => 'Comptes inclus', 'report_date_range' => 'Intervalle de dates', 'report_preset_ranges' => 'Pré-configurer les étendues', 'shared' => 'Partagé', 'fiscal_year' => 'Année fiscale', - 'income_entry' => 'Income from account ":name" between :start and :end', + 'income_entry' => 'Revenus du compte ":name" entre :start et :end', 'expense_entry' => 'Dépenses du compte ":name" entre le :start et le :end', 'category_entry' => 'Dépenses dans la catégorie ":name" entre le :start et le :end', 'budget_spent_amount' => 'Dépenses dans le budget ":budget" entre le :start et le :end', 'balance_amount' => 'Dépenses dans le budget ":budget" payé depuis le compte ":account" entre le :start et le :end', - 'no_audit_activity' => 'No activity was recorded on account :account_name between :start and :end.', - 'audit_end_balance' => 'Account balance of :account_name at the end of :end was: :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', + 'no_audit_activity' => 'Aucune activité n\'a été enregistrée sur le compte :account_name entre :start et :end.', + 'audit_end_balance' => 'Solde du compte de :account_name à la fin de :end était: :balance', + 'reports_extra_options' => 'Options supplémentaires', + 'report_has_no_extra_options' => 'Ce rapport n\'a pas d\'options supplémentaires', + 'reports_submit' => 'Afficher le rapport', + 'end_after_start_date' => 'La date de fin du rapport doit être postérieure à la date de début.', + 'select_category' => 'Sélectionner la/les catégorie(s)', + 'select_budget' => 'Sélectionnez le(s) budget(s).', + 'select_tag' => 'Sélectionnez le(s) tag(s).', + 'income_per_category' => 'Revenu par catégorie', + 'expense_per_category' => 'Dépenses par catégorie', + 'expense_per_budget' => 'Dépenses par budget', + 'income_per_account' => 'Revenu par compte', + 'expense_per_account' => 'Dépenses par compte', + 'expense_per_tag' => 'Dépenses par tag', + 'income_per_tag' => 'Revenu par tag', + 'include_expense_not_in_budget' => 'Frais inclus non compris dans le(s) budget(s) sélectionné(s)', + 'include_expense_not_in_account' => 'Frais inclus non compris dans le(s) compte(s) sélectionné(s)', + 'include_expense_not_in_category' => 'Les dépenses incluses ne sont pas dans la (les) catégorie(s) sélectionnée(s)', + 'include_income_not_in_category' => 'Les revenus inclus ne sont pas dans la (les) catégorie(s) sélectionnée(s)', + 'include_income_not_in_account' => 'Revenus inclus non compris dans le(s) compte(s) sélectionné(s)', + 'include_income_not_in_tags' => 'Les revenus inclus ne sont pas dans la (les) catégorie(s) sélectionnée(s)', + 'include_expense_not_in_tags' => 'Les dépenses incluses ne sont pas dans le(s) tag(s) sélectionnée(s)', + 'everything_else' => 'Tout le reste', + 'income_and_expenses' => 'Recettes et dépenses', + 'spent_average' => 'Dépensé (moyenne)', + 'income_average' => 'Revenu (moyenne)', + 'transaction_count' => 'Nombre de transactions', + 'average_spending_per_account' => 'Dépenses moyennes par compte', + 'average_income_per_account' => 'Revenu moyen par compte', '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', + 'sum_of_period' => 'Somme pour la période', + 'average_in_period' => 'Moyenne pour la période', + 'account_role_defaultAsset' => 'Compte d\'actif par défaut', + 'account_role_sharedAsset' => 'Compte d\'actif partagé', + 'account_role_savingAsset' => 'Compte d’épargne', + 'account_role_ccAsset' => 'Carte de crédit', + 'budget_chart_click' => 'Cliquez sur le nom du budget dans le tableau ci-dessus pour voir un graphique.', + 'category_chart_click' => 'Cliquez sur un nom de catégorie dans le tableau ci-dessus pour voir un graphique.', + // charts: - 'chart' => 'Chart', - 'dayOfMonth' => 'Jour du mois', + 'chart' => 'Diagramme', 'month' => 'Mois', 'budget' => 'Budget', 'spent' => 'Dépensé', - 'spent_in_budget' => 'Spent in budget', - 'left_to_spend' => 'Left to spend', + 'spent_in_budget' => 'Dépensé dans le budget', + 'left_to_spend' => 'Restant à dépenser', 'earned' => 'Gagné', - 'overspent' => 'Overspent', + 'overspent' => 'Trop dépensé', 'left' => 'Gauche', 'no_budget' => '(pas de budget)', - 'max-amount' => 'Maximum amount', - 'min-amount' => 'Minumum amount', - 'journal-amount' => 'Current bill entry', + 'max-amount' => 'Montant maximum', + 'min-amount' => 'Montant minimum', + 'journal-amount' => 'Entrée de facture courante', 'name' => 'Nom', 'date' => 'Date', 'paid' => 'Payé', @@ -837,73 +807,63 @@ return [ 'day' => 'Jour', 'budgeted' => 'Budgétisé', 'period' => 'Période', - 'balance' => 'Balance', - 'summary' => 'Summary', - 'sum' => 'Sum', - 'average' => 'Average', - 'balanceFor' => 'Balance for :name', + 'balance' => 'Solde', + 'sum' => 'Somme', + 'average' => 'Moyenne', + 'balanceFor' => 'Balance pour :name', // piggy banks: - 'add_money_to_piggy' => 'Add money to piggy bank ":name"', + 'add_money_to_piggy' => 'Ajouter de l’argent à la tirelire ":name"', 'piggy_bank' => 'Tirelire', - 'new_piggy_bank' => 'New piggy bank', + 'new_piggy_bank' => 'Nouvelle tirelire', 'store_piggy_bank' => 'Créer une nouvelle tirelire', 'stored_piggy_bank' => 'Créer une nouvelle tirelire ":name"', 'account_status' => 'Statut du compte', - 'left_for_piggy_banks' => 'Left for piggy banks', + 'left_for_piggy_banks' => 'Reste pour les tirelires', 'sum_of_piggy_banks' => 'Somme des tirelires', - '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', + 'saved_so_far' => 'Enregistré jusqu\'à présent', + 'left_to_save' => 'Reste à sauver', + 'suggested_amount' => 'Montant mensuel suggéré à enregistrer', + '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.', - 'remove' => 'Remove', - 'max_amount_add' => 'Le montant maximum que vous pouvez ajouter est', - 'max_amount_remove' => 'Le montant maximum que vous pouvez supprimer est', - 'update_piggy_button' => 'Update piggy bank', - 'update_piggy_title' => 'Update piggy bank ":name"', - 'updated_piggy_bank' => 'Updated piggy bank ":name"', - 'details' => 'Détails', - 'events' => 'Evènements', - 'target_amount' => 'Montant cible', - 'start_date' => 'Date de début', - 'target_date' => 'Date cible', - 'no_target_date' => 'Aucune date butoir', - 'todo' => 'to do', - 'table' => 'Table', - 'piggy_bank_not_exists' => 'Piggy bank no longer exists.', - 'add_any_amount_to_piggy' => 'Add money to this piggy bank to reach your target of :amount.', - 'add_set_amount_to_piggy' => 'Add :amount to fill this piggy bank on :date', - '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' => 'Tirelire ":name" supprimée', - 'added_amount_to_piggy' => 'Added :amount to ":name"', - 'removed_amount_from_piggy' => 'Removed :amount from ":name"', - 'cannot_remove_amount_piggy' => 'Could not remove :amount from ":name".', + 'remove' => 'Enlever', + 'max_amount_add' => 'Le montant maximum que vous pouvez ajouter est', + 'max_amount_remove' => 'Le montant maximum que vous pouvez supprimer est', + 'update_piggy_button' => 'Mise à jour tirelire', + 'update_piggy_title' => 'Mise à jour de tirelire ":name"', + 'updated_piggy_bank' => 'Mise à jour de la tirelire ":name"', + 'details' => 'Détails', + 'events' => 'Evènements', + 'target_amount' => 'Montant cible', + 'start_date' => 'Date de début', + 'target_date' => 'Date cible', + 'no_target_date' => 'Aucune date butoir', + 'table' => 'Tableau', + 'delete_piggy_bank' => 'Supprimer la tirelire ":name"', + 'cannot_add_amount_piggy' => 'Impossible d\'ajouter :amount à ":name".', + 'cannot_remove_from_piggy' => 'Impossible de supprimer :amount à ":name".', + 'deleted_piggy_bank' => 'Tirelire ":name" supprimée', + 'added_amount_to_piggy' => 'Ajouté :amount à ":name"', + 'removed_amount_from_piggy' => 'Supprimé :amount du ":name"', // tags - 'regular_tag' => 'Just a regular tag.', - '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', - 'edit_tag' => 'Modifier le tag ":tag"', - 'updated_tag' => 'Updated tag ":tag"', - 'created_tag' => 'Tag ":tag" has been created!', - 'no_year' => 'No year set', - 'no_month' => 'No month set', - 'tag_title_nothing' => 'Tags par défaut', - 'tag_title_balancingAct' => 'Balancing act tags', - 'tag_title_advancePayment' => 'Tags de paiement anticipé', + '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', + 'edit_tag' => 'Modifier le tag ":tag"', + 'updated_tag' => 'Mise à jour de la balise ": tag"', + 'created_tag' => 'Tag ":tag" a été créé !', - 'transaction_journal_information' => 'Transaction information', - 'transaction_journal_meta' => 'Meta information', - 'total_amount' => 'Total amount', - 'number_of_decimals' => 'Number of decimals', + 'transaction_journal_information' => 'Informations sur les transactions', + 'transaction_journal_meta' => 'Méta informations', + 'total_amount' => 'Montant total', + 'number_of_decimals' => 'Nombre de décimales', // administration 'administration' => 'Administration', @@ -911,58 +871,73 @@ return [ 'list_all_users' => 'Tous les utilisateurs', 'all_users' => 'Tous les utilisateurs', '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', + 'firefly_instance_configuration' => 'Options de configuration pour Firefly III', + 'setting_single_user_mode' => 'Mode utilisateur unique', + 'setting_single_user_mode_explain' => 'Par défaut, Firefly III accepte uniquement un (1) enregistrement : vous. Il s\'agit d\'une mesure de sécurité qui empêche les autres d\'utiliser votre instance, à moins que vous ne les autorisiez. Les enregistrements futurs sont bloqués. Lorsque vous désactivez cette case, d\'autres personnes peuvent utiliser votre instance aussi bien, en supposant qu\'elles puissent l\'atteindre (quand il est connecté à Internet).', + 'store_configuration' => 'Configuration de la boutique', + 'single_user_administration' => 'Gestion de l\'utilisateur pour :email', + 'edit_user' => 'Modifier l\'utilisateur :email', + 'hidden_fields_preferences' => 'Tous les champs ne sont pas visibles dès maintenant. Vous devez les activer dans vos paramètres.', + 'user_data_information' => 'Données utilisateur', + 'user_information' => 'Informations utilisateur', + 'total_size' => 'taille totale', 'budget_or_budgets' => 'budget(s)', - 'budgets_with_limits' => 'budget(s) with configured amount', - 'rule_or_rules' => 'rule(s)', - 'rulegroup_or_groups' => 'rule group(s)', - 'setting_must_confirm_account' => 'Account confirmation', - 'setting_must_confirm_account_explain' => 'When this setting is enabled, users must activate their account before it can be used.', - '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.', - 'setting_send_email_notifications' => 'Send email notifications', - 'setting_send_email_explain' => 'Firefly III can send you email notifications about certain events. They will be sent to :site_owner. This email address can be set in the .env file.', - 'block_code_bounced' => 'Email message(s) bounced', - 'block_code_expired' => 'Demo account expired', - 'no_block_code' => 'No reason for block or user not blocked', + 'budgets_with_limits' => 'budget(s) avec montant configuré', + 'rule_or_rules' => 'règle(s)', + 'rulegroup_or_groups' => 'groupe(s) de règles', + 'configuration_updated' => 'La configuration a été mise à jour', + 'setting_is_demo_site' => 'Site de démonstration', + 'setting_is_demo_site_explain' => 'Si vous cochez cette case, cette installation se comportera comme si c\'était le site de démonstration, ce qui peut engendrer des effets secondaires étranges.', + '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é', + // 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', + '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.', + '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', // split a transaction: - 'transaction_meta_data' => 'Transaction meta-data', - 'transaction_dates' => 'Date de l\'opération', 'splits' => 'Splits', - 'split_title_withdrawal' => 'Split your new withdrawal', - 'split_intro_one_withdrawal' => 'Firefly supports the "splitting" of a withdrawal.', - 'split_intro_two_withdrawal' => 'Cela signifie que le montant d’argent que vous avez dépensé est réparti entre plusieurs budgets, catégories ou comptes de revenus.', - 'split_intro_three_withdrawal' => 'For example: you could split your :total groceries so you pay :split_one from your "daily groceries" budget and :split_two from your "cigarettes" budget.', - 'split_table_intro_withdrawal' => 'Split your withdrawal in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_withdrawal' => 'Store splitted withdrawal', - 'update_splitted_withdrawal' => 'Update splitted withdrawal', - 'split_title_deposit' => 'Split your new deposit', - 'split_intro_one_deposit' => 'Firefly supports the "splitting" of a deposit.', - 'split_intro_two_deposit' => 'Cela signifie que le montant d’argent que vous avez gagné est réparti entre plusieurs catégories ou comptes de revenus source.', - 'split_intro_three_deposit' => 'Par exemple : vous pouvez fractionner votre salaire de :total donc vous obtenez :split_one comme votre salaire de base et :split_two comme un remboursement des dépenses faites.', - 'split_table_intro_deposit' => 'Split your deposit in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_deposit' => 'Store splitted deposit', - 'split_title_transfer' => 'Split your new transfer', - 'split_intro_one_transfer' => 'Firefly supports the "splitting" of a transfer.', - 'split_intro_two_transfer' => 'Cela signifie que le montant d’argent que vous déplacez est divisé entre plusieurs catégories ou tirelires.', - 'split_intro_three_transfer' => 'For example: you could split your :total move so you get :split_one in one piggy bank and :split_two in another.', - 'split_table_intro_transfer' => 'Split your transfer in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_transfer' => 'Store splitted transfer', 'add_another_split' => 'Add another split', 'split-transactions' => 'Split transactions', - 'split-new-transaction' => 'Split a new transaction', 'do_split' => 'Do a split', 'split_this_withdrawal' => 'Split this withdrawal', 'split_this_deposit' => 'Split this deposit', @@ -974,14 +949,14 @@ return [ // import bread crumbs and titles: 'import' => 'Import', - 'import_data' => 'Import data', + 'import_data' => 'Importer des données', // import index page: - 'import_index_title' => 'Import data into Firefly III', + '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_index_file' => 'Select your file', + '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', @@ -1016,9 +991,6 @@ return [ 'import_status_finished_job' => 'The transactions imported can be found in tag :tag.', 'import_with_key' => 'Import with key \':key\'', - // different states: - 'import_status_job_running' => 'The import is underway. Please be patient...', - // sandstorm.io errors and messages: 'sandstorm_not_available' => 'This function is not available when you are using Firefly III within a Sandstorm.io environment.', @@ -1047,7 +1019,7 @@ return [ '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_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:', @@ -1070,4 +1042,4 @@ return [ 'no_bills_create_default' => 'Create a bill', -]; \ No newline at end of file +]; diff --git a/resources/lang/fr_FR/form.php b/resources/lang/fr_FR/form.php index 8451d35d30..8fbad6245f 100644 --- a/resources/lang/fr_FR/form.php +++ b/resources/lang/fr_FR/form.php @@ -34,7 +34,7 @@ return [ 'journal_source_account_name' => 'Compte de recettes (source)', 'journal_source_account_id' => 'Compte d’actif (source)', 'BIC' => 'Code BIC', - 'verify_password' => 'Verify password security', + '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', @@ -57,36 +57,36 @@ return [ 'targetamount' => 'Montant cible', 'accountRole' => 'Rôle du compte', 'openingBalanceDate' => 'Date du solde initial', - 'ccType' => 'Credit card payment plan', - 'ccMonthlyPaymentDate' => 'Credit card monthly payment date', + 'ccType' => 'Plan de paiement de carte de crédit', + 'ccMonthlyPaymentDate' => 'Date de paiement mensuelle de carte de crédit', 'piggy_bank_id' => 'Tirelire', - 'returnHere' => 'Return here', + 'returnHere' => 'Retourner ici', 'returnHereExplanation' => 'Après enregistrement, revenir ici pour en créer un nouveau.', 'returnHereUpdateExplanation' => 'Après mise à jour, revenir ici.', 'description' => 'Description', 'expense_account' => 'Compte de dépenses', 'revenue_account' => 'Compte de recettes', - 'decimal_places' => 'Decimal places', + 'decimal_places' => 'Chiffres après la virgule', 'exchange_rate_instruction' => 'Devises étrangères', - 'exchanged_amount' => 'Exchanged amount', + 'exchanged_amount' => 'Montant échangé', 'source_amount' => 'Montant (source)', 'destination_amount' => 'Montant (destination)', - 'native_amount' => 'Native amount', + 'native_amount' => 'Montant natif', - '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)', - 'source_account_revenue' => 'Source account (revenue account)', + '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)', + 'source_account_revenue' => 'Compte source (compte recettes)', 'type' => 'Type', - 'convert_Withdrawal' => 'Convert withdrawal', - 'convert_Deposit' => 'Convert deposit', - 'convert_Transfer' => 'Convert transfer', + 'convert_Withdrawal' => 'Convertir le retrait', + 'convert_Deposit' => 'Convertir le dépôt', + 'convert_Transfer' => 'Convertir le transfert', 'amount' => 'Montant', 'date' => 'Date', - 'interest_date' => 'Interest date', + 'interest_date' => 'Date de l’intérêt', 'book_date' => 'Date de réservation', 'process_date' => 'Date de traitement', 'category' => 'Catégorie', @@ -100,9 +100,10 @@ return [ 'code' => 'Code', 'iban' => 'Numéro IBAN', 'accountNumber' => 'N° de compte', + 'creditCardNumber' => 'Credit card number', 'has_headers' => 'Entêtes ', 'date_format' => 'Format de la date', - 'specifix' => 'Bank- or file specific fixes', + 'specifix' => 'Banque - ou déposer des corrections spécifiques', 'attachments[]' => 'Pièces jointes', 'store_new_withdrawal' => 'Enregistrer un nouveau retrait', 'store_new_deposit' => 'Enregistrer un nouveau dépôt', @@ -135,6 +136,7 @@ return [ 'delete_attachment' => 'Supprimer la pièce jointe ":name"', '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"', '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" ?', @@ -147,11 +149,14 @@ return [ 'journal_areYouSure' => 'Êtes-vous sûr de vouloir supprimer la description de l\'opération ":description" ?', 'mass_journal_are_you_sure' => 'Êtes-vous sûr de que vouloir supprimer ces opérations ?', 'tag_areYouSure' => 'Êtes-vous sûr de vouloir supprimer le tag ":tag" ?', + 'journal_link_areYouSure' => 'Êtes-vous sûr de vouloir supprimer le lien entre :source et :destination?', + 'linkType_areYouSure' => 'Êtes-vous sûr de vouloir supprimer le type de lien ":name" (":inward" / ":outward") ?', 'permDeleteWarning' => 'Supprimer quelque chose dans Firefly est permanent et ne peut pas être annulé.', 'mass_make_selection' => 'Vous pouvez toujours empêcher des éléments d’être supprimés en décochant la case à cocher.', 'delete_all_permanently' => 'Supprimer la selection définitivement', 'update_all_journals' => 'Mettre à jour ces opérations', 'also_delete_transactions' => 'La seule opération liée à ce compte sera aussi supprimée.|Les :count opérations liées à ce compte seront aussi supprimées.', + 'also_delete_connections' => 'La seule transaction liée à ce type de lien perdra cette connexion. | Toutes les transactions :count liées à ce type de lien perdront leur connexion.', 'also_delete_rules' => 'La seule règle liée à ce groupe de règles sera aussi supprimée.|Les :count règles liées à ce groupe de règles seront aussi supprimées.', 'also_delete_piggyBanks' => 'La seule tirelire liée à ce compte sera aussi supprimée.|Les :count tirelires liées à ce compte seront aussi supprimées.', 'bill_keep_transactions' => 'La seule opération liée à cette facture ne sera pas supprimée.|Les :count opérations liées à cette facture ne seront pas supprimées.', @@ -189,4 +194,7 @@ return [ 'payment_date' => 'Date de paiement', 'invoice_date' => 'Date de facturation', 'internal_reference' => 'Référence interne', -]; \ No newline at end of file + + 'inward' => 'Description vers l’intérieur', + 'outward' => 'Description de l’extérieur', +]; diff --git a/resources/lang/fr_FR/help.php b/resources/lang/fr_FR/help.php index 8ff8379c9b..0f23bd7edd 100644 --- a/resources/lang/fr_FR/help.php +++ b/resources/lang/fr_FR/help.php @@ -32,4 +32,4 @@ return [ 'main-content-end-text' => 'N\'oubliez pas que chaque page a un petit point d\'interrogation en haut à droite. Cliquez dessus pour obtenir de l\'aide concernant la page actuelle.', 'index' => 'index', 'home' => 'accueil', -]; \ No newline at end of file +]; diff --git a/resources/lang/fr_FR/intro.php b/resources/lang/fr_FR/intro.php index e945adcec8..0999619431 100644 --- a/resources/lang/fr_FR/intro.php +++ b/resources/lang/fr_FR/intro.php @@ -11,7 +11,7 @@ declare(strict_types=1); return [ // index - 'index_intro' => '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_intro' => 'Bienvenue sur la page index de Firefly III. Veuillez prendre le temps de parcourir l\'introduction pour comprendre comment Firefly III fonctionne.', '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.', @@ -44,17 +44,17 @@ return [ '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 or multiple categories.', + '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 you how your expenses and income per category.', + 'reports_report_category_incomeAndExpensesChart' => 'This chart shows your expenses and income per category.', - 'reports_report_tag_intro' => 'This report will give you insight in or multiple tags.', + '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 you how your expenses and income per tag.', + 'reports_report_tag_incomeAndExpensesChart' => 'This chart shows your expenses and income per tag.', - 'reports_report_budget_intro' => 'This report will give you insight in or multiple budgets.', - 'reports_report_budget_pieCharts' => 'These charts will give you insight in expenses and income per budget or per account.', - 'reports_report_budget_incomeAndExpensesChart' => 'This chart shows you how your expenses and income per budget.', + '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.', @@ -70,7 +70,7 @@ return [ '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_name' => 'Quel est votre objectif ? Un nouveau divan, une caméra, de l\'argent pour les urgences ?', 'piggy-banks_create_date' => 'You can set a target date or a deadline for your piggy bank.', // show piggy @@ -118,4 +118,4 @@ return [ // 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/fr_FR/list.php b/resources/lang/fr_FR/list.php index 003c518d2b..4df06cea40 100644 --- a/resources/lang/fr_FR/list.php +++ b/resources/lang/fr_FR/list.php @@ -12,80 +12,78 @@ 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' => 'Next expected match', - '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', - 'confirmed_from' => 'Confirmed from', - 'registered_from' => 'Inscrit depuis le', - 'blocked_code' => 'Code de blocage', - 'domain' => 'Domaine', - 'registration_attempts' => 'Registration attempts', - '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' => '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' => 'Nombre de règles et de groupes de règles', - 'tags_count' => 'Number of tags', -]; \ No newline at end of file + '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', +]; diff --git a/resources/lang/fr_FR/pagination.php b/resources/lang/fr_FR/pagination.php index 1b9097ee0e..7d1b7f8bf6 100644 --- a/resources/lang/fr_FR/pagination.php +++ b/resources/lang/fr_FR/pagination.php @@ -16,4 +16,4 @@ return [ 'previous' => '« Précédent', 'next' => 'Suivant »', -]; \ No newline at end of file +]; diff --git a/resources/lang/fr_FR/passwords.php b/resources/lang/fr_FR/passwords.php index 72521478b3..e14a1018c8 100644 --- a/resources/lang/fr_FR/passwords.php +++ b/resources/lang/fr_FR/passwords.php @@ -18,4 +18,4 @@ return [ 'sent' => 'Nous vous avons envoyé par e-mail un lien de réinitialisation de votre mot de passe !', 'reset' => 'Votre mot de passe a été réinitialisé !', 'blocked' => 'Bien essayé cependant.', -]; \ No newline at end of file +]; diff --git a/resources/lang/fr_FR/validation.php b/resources/lang/fr_FR/validation.php index 7328b1530a..10dcb26b8a 100644 --- a/resources/lang/fr_FR/validation.php +++ b/resources/lang/fr_FR/validation.php @@ -17,7 +17,6 @@ return [ 'deleted_user' => 'Compte tenu des contraintes de sécurité, vous ne pouvez pas vous inscrire en utilisant cette adresse e-mail.', 'rule_trigger_value' => 'Cette valeur n’est pas valide pour le déclencheur sélectionné.', 'rule_action_value' => 'Cette valeur n’est pas valide pour l’action sélectionnée.', - 'invalid_domain' => 'Compte tenu des contraintes de sécurité, vous ne pouvez pas vous enregistrer depuis ce domaine.', 'file_already_attached' => 'Le fichier téléchargé ":name" est déjà attaché à cet objet.', 'file_attached' => 'Envoi du fichier ":name" avec succès.', 'file_invalid_mime' => 'Le fichier ":name" est du type ":mime" ce qui n\'est pas accepté pour un nouvel envoi.', @@ -90,5 +89,5 @@ return [ 'in_array' => 'Le champ :attribute n\'existe pas dans :other.', 'present' => 'Le champs :attribute doit être rempli.', 'amount_zero' => 'Le montant total ne peut pas être zéro', - '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 + 'secure_password' => 'Ce n’est pas un mot de passe sécurisé. S’il vous plaît essayer de nouveau. Pour plus d’informations, visitez https://goo.gl/NCh2tN', +]; diff --git a/resources/lang/nl_NL/auth.php b/resources/lang/nl_NL/auth.php index 8c31982497..b89dee9b5b 100644 --- a/resources/lang/nl_NL/auth.php +++ b/resources/lang/nl_NL/auth.php @@ -27,4 +27,4 @@ return [ 'failed' => 'Deze gegevens zijn niet correct.', 'throttle' => 'Te veel inlogpogingen. Probeer opnieuw in: seconden seconden.', -]; \ No newline at end of file +]; diff --git a/resources/lang/nl_NL/breadcrumbs.php b/resources/lang/nl_NL/breadcrumbs.php index 198dee2ba8..16694da0ea 100644 --- a/resources/lang/nl_NL/breadcrumbs.php +++ b/resources/lang/nl_NL/breadcrumbs.php @@ -13,31 +13,32 @@ declare(strict_types=1); */ return [ - 'home' => 'Home', - 'edit_currency' => 'Wijzig valuta ":name"', - 'delete_currency' => 'Verwijder valuta ":name"', - 'newPiggyBank' => 'Nieuw spaarpotje', - 'edit_piggyBank' => 'Wijzig spaarpotje ":name"', - 'preferences' => 'Voorkeuren', - 'profile' => 'Profiel', - 'changePassword' => 'Verander je wachtwoord', - 'bills' => 'Contracten', - 'newBill' => 'Nieuw contract', - 'edit_bill' => 'Wijzig contract ":name"', - 'delete_bill' => 'Verwijder contract ":name"', - 'reports' => 'Overzichten', - 'search_result' => 'Zoekresultaten voor ":query"', - 'withdrawal_list' => 'Uitgaven', - 'deposit_list' => 'Inkomsten', - 'transfer_list' => 'Overschrijvingen', - 'transfers_list' => 'Overschrijvingen', - 'create_withdrawal' => 'Sla nieuwe uitgave op', - 'create_deposit' => 'Sla nieuwe inkomsten op', - 'create_transfer' => 'Sla nieuwe overschrijving op', - 'edit_journal' => 'Wijzig transactie ":description"', - 'delete_journal' => 'Verwijder transactie ":description"', - 'tags' => 'Tags', - 'createTag' => 'Maak nieuwe tag', - 'edit_tag' => 'Wijzig tag ":tag"', - 'delete_tag' => 'Verwijder tag ":tag"', -]; \ No newline at end of file + 'home' => 'Home', + 'edit_currency' => 'Wijzig valuta ":name"', + 'delete_currency' => 'Verwijder valuta ":name"', + 'newPiggyBank' => 'Nieuw spaarpotje', + 'edit_piggyBank' => 'Wijzig spaarpotje ":name"', + 'preferences' => 'Voorkeuren', + 'profile' => 'Profiel', + 'changePassword' => 'Verander je wachtwoord', + 'bills' => 'Contracten', + 'newBill' => 'Nieuw contract', + 'edit_bill' => 'Wijzig contract ":name"', + 'delete_bill' => 'Verwijder contract ":name"', + 'reports' => 'Overzichten', + 'search_result' => 'Zoekresultaten voor ":query"', + 'withdrawal_list' => 'Uitgaven', + 'deposit_list' => 'Inkomsten', + 'transfer_list' => 'Overschrijvingen', + 'transfers_list' => 'Overschrijvingen', + 'create_withdrawal' => 'Sla nieuwe uitgave op', + 'create_deposit' => 'Sla nieuwe inkomsten op', + 'create_transfer' => 'Sla nieuwe overschrijving op', + 'edit_journal' => 'Wijzig transactie ":description"', + 'delete_journal' => 'Verwijder transactie ":description"', + 'tags' => 'Tags', + 'createTag' => 'Maak nieuwe tag', + 'edit_tag' => 'Wijzig tag ":tag"', + 'delete_tag' => 'Verwijder tag ":tag"', + 'delete_journal_link' => 'Verwijder koppeling tussen transacties', +]; diff --git a/resources/lang/nl_NL/config.php b/resources/lang/nl_NL/config.php index 574ef549ad..c69f3c6fb3 100644 --- a/resources/lang/nl_NL/config.php +++ b/resources/lang/nl_NL/config.php @@ -22,4 +22,4 @@ return [ 'year' => '%Y', 'half_year' => '%B %Y', -]; \ No newline at end of file +]; diff --git a/resources/lang/nl_NL/csv.php b/resources/lang/nl_NL/csv.php index debe7a0139..be68315716 100644 --- a/resources/lang/nl_NL/csv.php +++ b/resources/lang/nl_NL/csv.php @@ -80,4 +80,4 @@ return [ 'column_tags-space' => 'Tags (spatiegescheiden)', 'column_account-number' => 'Betaalrekening (rekeningnummer)', 'column_opposing-number' => 'Tegenrekening (rekeningnummer)', -]; \ No newline at end of file +]; diff --git a/resources/lang/nl_NL/demo.php b/resources/lang/nl_NL/demo.php index cf4cd9258a..01aa680497 100644 --- a/resources/lang/nl_NL/demo.php +++ b/resources/lang/nl_NL/demo.php @@ -15,12 +15,12 @@ return [ 'index' => 'Welkom bij Firefly III! Op deze pagina krijg je een overzicht van je financiën. Meer diepgaande informatie vindt je onder Rekeningen →Betaalrekeningen en natuurlijk onder Budgetten- en Overzichten. Klik gerust rond en en kijk waar je terecht komt.', 'accounts-index' => 'Betaalrekeningen zijn je persoonlijke bankrekeningen. Crediteuren zijn rekeningen waar jij geld uit geeft, zoals bij winkels of aan vrienden. Debiteuren zijn rekeningen waar jij geld van krijgt, zoals je werk, de overheid of andere bronnen van inkomsten. Op deze pagina kan je ze wijzigen of verwijderen.', 'budgets-index' => 'Op deze pagina zie je je budgetten. De bovenste balk is het bedrag dat je kan gaan budgetteren. Dat kan je zelf aanpassen door op het bedrag te klikken. Wat je daadwerkelijk hebt uitgegeven zie je in de balk er onder. Daar weer onder zie je elk budget en wat je er voor gebudgetteerd hebt.', - '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 + 'reports-index-start' => 'Firefly III ondersteunt vier soorten rapporten. Je kan meer over ze lezen door op het -icoontje te klikken (rechtsboven).', + 'reports-index-examples' => 'Bekijk eens deze voorbeelden: een maandelijks financieel overzicht, een jaarlijks financieel overzicht en een budgetrapport.', + 'currencies-index' => 'Firefly ondersteunt meerdere valuta\'s. Hoewel het standaard de Euro is kan je ook kiezen voor de US dollar of een van de vele anderen. Er is een kleine selectie valuta meegeleverd maar je kan je eigen valuta toevoegen. Het veranderen van de standaardvaluta verandert de bestaande transacties niet: Firefly III ondersteunt het gebruik van meerdere valuta op hetzelfde moment.', + 'transactions-index' => 'Deze uitgaven, inkomsten en overschrijvingen zijn niet heel fantasierijk. Ze zijn automatisch gegenereerd.', + 'piggy-banks-index' => 'Zoals je kan zien zijn er drie spaarpotjes. Gebruik de plus- en minknoppen om het bedrag in de spaarpotjes te veranderen. Klik op de naam van het spaarpotje om er de geschiedenis van te zien.', + 'import-index' => 'Uiteraard kan je elk CSV bestand importeren in Firefly III ', + 'import-configure-security' => 'Uit veiligheidsoverwegingen is je upload vervangen door een lokaal bestand.', + 'import-configure-configuration' => 'Deze configuratie is correct voor het lokale bestand.', +]; diff --git a/resources/lang/nl_NL/firefly.php b/resources/lang/nl_NL/firefly.php index a6313d9440..40ad56db52 100644 --- a/resources/lang/nl_NL/firefly.php +++ b/resources/lang/nl_NL/firefly.php @@ -13,7 +13,6 @@ declare(strict_types=1); return [ // general stuff: - 'language_incomplete' => 'onvolledige vertaling', 'close' => 'Sluiten', 'actions' => 'Acties', 'edit' => 'Wijzig', @@ -28,12 +27,7 @@ return [ 'to' => 'Tot', 'showEverything' => 'Laat alles zien', 'never' => 'Nooit', - 'search_results_for' => 'Zoekresultaten voor ":query"', 'no_results_for_empty_search' => 'Je zoekopdracht was leeg, dus niets werd gevonden.', - 'bounced_error' => 'Het emailtje naar :email kwam nooit aan.', - 'deleted_error' => 'Deze gegevens zijn niet correct.', - 'general_blocked_error' => 'Je account is uitgeschakeld, je kan helaas niet inloggen.', - 'expired_error' => 'Je account is verlopen en kan niet meer worden gebruikt.', 'removed_amount' => ':amount weggehaald', 'added_amount' => ':amount toegevoegd', 'asset_account_role_help' => 'Voorkeuren die voortkomen uit je keuze hier kan je later aangeven.', @@ -56,7 +50,6 @@ return [ 'flash_error_multiple' => 'Er is één fout|Er zijn :count fouten', 'net_worth' => 'Kapitaal', 'route_has_no_help' => 'Er is geen hulptekst voor deze pagina.', - 'help_may_not_be_your_language' => 'Deze hulptekst is in het Engels. Ze is nog niet beschikbaar in het Nederlands', 'two_factor_welcome' => 'Hoi :user!', 'two_factor_enter_code' => 'Vul je authenticatiecode in. Je authenticatieapplicatie kan deze voor je genereren.', 'two_factor_code_here' => 'Code', @@ -70,9 +63,6 @@ return [ 'two_factor_lost_fix_owner' => 'Zo niet, stuur dan een e-mail naar :site_owner en vraag of ze je authenticatie in twee stappen willen resetten.', 'warning_much_data' => 'Het kan even duren voor :days dagen aan gegevens geladen zijn.', 'registered' => 'Je bent geregistreerd!', - 'tagbalancingAct' => 'Balancerende tag', - 'tagadvancePayment' => 'Vooruitbetaalde tag', - 'tagnothing' => '', 'Default asset account' => 'Standaard betaalrekening', 'no_budget_pointer' => 'Je hebt nog geen budgetten. Maak er een aantal op de budgetten-pagina. Met budgetten kan je je uitgaven beter bijhouden.', 'Savings account' => 'Spaarrekening', @@ -84,7 +74,6 @@ return [ 'need_more_help' => 'Als je meer hulp nodig hebt met Firefly III, open dan een ticket op Github.', 'reenable_intro_text' => 'Je kan de introductie-popupjes ook weer aan zetten.', 'intro_boxes_after_refresh' => 'De introductie-popupjes komen tevoorschijn als je de pagina opnieuw laadt.', - 'nothing_to_display' => 'Er zijn hier geen transacties te zien', 'show_all_no_filter' => 'Laat alle transacties zien, zonder te groeperen op datum.', 'expenses_by_category' => 'Uitgaven per categorie', 'expenses_by_budget' => 'Uitgaven per budget', @@ -98,11 +87,7 @@ return [ '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_change_demo' => 'Je kan het wachtwoord van de demonstratie-account niet wijzigen.', - 'cannot_delete_demo' => 'Je kan de demonstratie-account niet verwijderen.', 'cannot_reset_demo_user' => 'Je kan het wachtwoord van de demonstratie-account niet resetten', - 'per_period' => 'Per periode', - 'all_periods' => 'Alle perioden', '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.', @@ -111,11 +96,9 @@ return [ 'chart_account_in_period' => 'Grafiek voor alle transacties voor rekening ":name" tussen :start en :end', 'chart_category_in_period' => 'Grafiek voor alle transacties voor categorie ":name" tussen :start en :end', 'chart_category_all' => 'Grafiek voor alle transacties voor categorie ":name"', - 'budget_in_period_breadcrumb' => 'Tussen :start en :end', 'clone_withdrawal' => 'Kopieer deze uitgave', 'clone_deposit' => 'Kopieer deze inkomsten', 'clone_transfer' => 'Kopieer deze overschrijving', - 'transaction_journal_other_options' => 'Andere opties', 'multi_select_no_selection' => 'Niets geselecteerd', 'multi_select_all_selected' => 'Alles geselecteerd', 'multi_select_filter_placeholder' => 'Vinden..', @@ -164,18 +147,6 @@ return [ 'quarterly' => 'elk kwartaal', 'half-year' => 'elk half jaar', 'yearly' => 'elk jaar', - // account confirmation: - 'confirm_account_header' => 'Bevestig je account', - 'confirm_account_intro' => 'TIjdens het registreren heb je een mailtje gehad. Kijk daar in voor instructies. Als je het mailtje niet hebt gehad, kan Firefly je een nieuwe sturen.', - 'confirm_account_resend_email' => 'Stuur me het bevestigingsmailtje dat ik nodig heb om mijn account te activeren.', - 'account_is_confirmed' => 'Je account is geactiveerd!', - 'invalid_activation_code' => 'Het lijkt er op dat de code die je gebruikt niet geldig is (of wellicht verlopen).', - 'confirm_account_is_resent_header' => 'De bevestiging is verstuurd', - 'confirm_account_is_resent_text' => 'De bevestiging is opnieuw verstuurd. Als je hem nu nog niet krijgt, stuur dan zelf een mailtje naar :owner of kijk in de logboeken om te zien wat er is fout gegaan.', - 'confirm_account_is_resent_go_home' => 'Ga naar de index van Firefly', - 'confirm_account_not_resent_header' => 'Er ging iets fout :(', - 'confirm_account_not_resent_intro' => 'Het bevestigingsmailtje is niet verstuurd. Als je het bevestigingsmailtje nog niet hebt gehad, neem dan even contact op met :owner.Het kan zijn dat je het bevestigingsmailtje te vaak laat versturen. Je kan dit slechts één keer per uur laten doen.', - 'confirm_account_not_resent_go_home' => 'Ga naar de index van Firefly', // export data: 'import_and_export' => 'Import en export', @@ -205,7 +176,6 @@ return [ 'export_status_created_zip_file' => 'Zipbestand gemaakt!', 'export_status_finished' => 'Klaar met exportbestand! Hoera!', 'export_data_please_wait' => 'Een ogenblik geduld...', - 'attachment_explanation' => 'Het bestand \':attachment_name\' (#:attachment_id) werd oorspronkelijk geüpload naar (Engels) :type \':description\' (#:journal_id), met datum :date en bedrag :amount.', // rules 'rules' => 'Regels', @@ -269,46 +239,60 @@ return [ // actions and triggers 'rule_trigger_user_action' => 'Gebruikersactie is ":trigger_value"', - 'rule_trigger_from_account_starts' => 'Bronrekeningnaam begint met ":trigger_value"', - 'rule_trigger_from_account_ends' => 'Bronrekeningnaam eindigt op ":trigger_value"', - 'rule_trigger_from_account_is' => 'Bronrekeningnaam is ":trigger_value"', - 'rule_trigger_from_account_contains' => 'Bronrekeningnaam bevat ":trigger_value"', - 'rule_trigger_to_account_starts' => 'Doelrekeningnaam begint met ":trigger_value"', - 'rule_trigger_to_account_ends' => 'Doelrekeningnaam eindigt op ":trigger_value"', - 'rule_trigger_to_account_is' => 'Doelrekeningnaam is ":trigger_value"', - 'rule_trigger_to_account_contains' => 'Doelrekeningnaam bevat ":trigger_value"', - 'rule_trigger_transaction_type' => 'Transactiesoort is ":trigger_value" (Engels)', - 'rule_trigger_category_is' => 'Categorie is ":trigger_value"', - 'rule_trigger_amount_less' => 'Bedrag is minder dan :trigger_value', - 'rule_trigger_amount_exactly' => 'Bedrag is :trigger_value', - 'rule_trigger_amount_more' => 'Bedrag is meer dan :trigger_value', - 'rule_trigger_description_starts' => 'Omschrijving begint met ":trigger_value"', - 'rule_trigger_description_ends' => 'Omschrijving eindigt op ":trigger_value"', - 'rule_trigger_description_contains' => 'Omschrijving bevat ":trigger_value"', - 'rule_trigger_description_is' => 'Omschrijving is ":trigger_value"', 'rule_trigger_from_account_starts_choice' => 'Bronrekening naam begint met..', + 'rule_trigger_from_account_starts' => 'Bronrekeningnaam begint met ":trigger_value"', 'rule_trigger_from_account_ends_choice' => 'Bronrekening eindigt op..', + 'rule_trigger_from_account_ends' => 'Bronrekeningnaam eindigt op ":trigger_value"', 'rule_trigger_from_account_is_choice' => 'Bronrekening is..', + 'rule_trigger_from_account_is' => 'Bronrekeningnaam is ":trigger_value"', 'rule_trigger_from_account_contains_choice' => 'Bronrekening bevat..', + 'rule_trigger_from_account_contains' => 'Bronrekeningnaam bevat ":trigger_value"', 'rule_trigger_to_account_starts_choice' => 'Doelrekeningnaam begint met..', + 'rule_trigger_to_account_starts' => 'Doelrekeningnaam begint met ":trigger_value"', 'rule_trigger_to_account_ends_choice' => 'Doelrekeningnaam eindigt op..', + 'rule_trigger_to_account_ends' => 'Doelrekeningnaam eindigt op ":trigger_value"', 'rule_trigger_to_account_is_choice' => 'Doelrekeningnaam is..', + 'rule_trigger_to_account_is' => 'Doelrekeningnaam is ":trigger_value"', 'rule_trigger_to_account_contains_choice' => 'Doelrekeningnaam bevat..', + 'rule_trigger_to_account_contains' => 'Doelrekeningnaam bevat ":trigger_value"', 'rule_trigger_transaction_type_choice' => 'Transactietype is..', - 'rule_trigger_amount_less_choice' => 'Bedrag is minder dan..', - 'rule_trigger_amount_exactly_choice' => 'Bedrag is..', - 'rule_trigger_amount_more_choice' => 'Bedrag is meer dan..', - 'rule_trigger_description_starts_choice' => 'Omschrijving begint met..', - 'rule_trigger_description_ends_choice' => 'Omschrijving eindigt op..', - 'rule_trigger_description_contains_choice' => 'Omschrijving bevat..', - 'rule_trigger_description_is_choice' => 'Omschrijving is..', + 'rule_trigger_transaction_type' => 'Transactiesoort is ":trigger_value" (Engels)', 'rule_trigger_category_is_choice' => 'Categorie is..', + 'rule_trigger_category_is' => 'Categorie is ":trigger_value"', + 'rule_trigger_amount_less_choice' => 'Bedrag is minder dan..', + 'rule_trigger_amount_less' => 'Bedrag is minder dan :trigger_value', + 'rule_trigger_amount_exactly_choice' => 'Bedrag is..', + 'rule_trigger_amount_exactly' => 'Bedrag is :trigger_value', + 'rule_trigger_amount_more_choice' => 'Bedrag is meer dan..', + 'rule_trigger_amount_more' => 'Bedrag is meer dan :trigger_value', + 'rule_trigger_description_starts_choice' => 'Omschrijving begint met..', + 'rule_trigger_description_starts' => 'Omschrijving begint met ":trigger_value"', + 'rule_trigger_description_ends_choice' => 'Omschrijving eindigt op..', + 'rule_trigger_description_ends' => 'Omschrijving eindigt op ":trigger_value"', + 'rule_trigger_description_contains_choice' => 'Omschrijving bevat..', + 'rule_trigger_description_contains' => 'Omschrijving bevat ":trigger_value"', + 'rule_trigger_description_is_choice' => 'Omschrijving is..', + 'rule_trigger_description_is' => 'Omschrijving is ":trigger_value"', 'rule_trigger_budget_is_choice' => 'Budget is..', + 'rule_trigger_budget_is' => 'Budget is ":trigger_value"', 'rule_trigger_tag_is_choice' => '(Een) tag is..', + 'rule_trigger_tag_is' => 'Een tag is ":trigger_value"', 'rule_trigger_has_attachments_choice' => 'Heeft minstens zoveel bijlagen', 'rule_trigger_has_attachments' => 'Heeft minstens :trigger_value bijlage(n)', 'rule_trigger_store_journal' => 'Als een transactie wordt gemaakt', 'rule_trigger_update_journal' => 'Als een transactie wordt bijgewerkt', + 'rule_trigger_has_no_category_choice' => 'Heeft geen categorie', + 'rule_trigger_has_no_category' => 'Transactie heeft geen categorie', + 'rule_trigger_has_any_category_choice' => 'Heeft een (welke dan ook) categorie', + 'rule_trigger_has_any_category' => 'Transactie heeft een (welke dan ook) categorie', + 'rule_trigger_has_no_budget_choice' => 'Heeft geen budget', + 'rule_trigger_has_no_budget' => 'Transactie heeft geen budget', + 'rule_trigger_has_any_budget_choice' => 'Heeft een (welke dan ook) budget', + 'rule_trigger_has_any_budget' => 'Transactie heeft een (welke dan ook) budget', + 'rule_trigger_has_no_tag_choice' => 'Heeft geen tag(s)', + 'rule_trigger_has_no_tag' => 'Transactie heeft geen tag(s)', + 'rule_trigger_has_any_tag_choice' => 'Heeft een of meer tags', + 'rule_trigger_has_any_tag' => 'Transactie heeft een of meer tags', 'rule_action_set_category' => 'Verander categorie naar ":action_value"', 'rule_action_clear_category' => 'Maak categorie-veld leeg', 'rule_action_set_budget' => 'Sla op onder budget ":action_value"', @@ -340,6 +324,8 @@ return [ 'no_location_set' => 'Zonder plaats', 'meta_data' => 'Metagegevens', 'location' => 'Plaats', + 'without_date' => 'Zonder datum', + 'result' => 'Resultaat', // preferences 'pref_home_screen_accounts' => 'Voorpaginarekeningen', @@ -523,7 +509,6 @@ return [ 'createBudget' => 'Maak nieuw budget', 'inactiveBudgets' => 'Inactieve budgetten', 'without_budget_between' => 'Transacties zonder budget tussen :start en :end', - 'budget_in_month' => ':name in :month', 'delete_budget' => 'Verwijder budget ":name"', 'deleted_budget' => 'Budget ":name" verwijderd', 'edit_budget' => 'Wijzig budget ":name"', @@ -597,8 +582,6 @@ return [ 'select_more_than_one_category' => 'Selecteer meer dan één categorie', 'select_more_than_one_budget' => 'Selecteer meer dan één budget', 'select_more_than_one_tag' => 'Selecteer meer dan één tag', - 'from_to' => 'Van :start tot en met :end', - 'from_to_breadcrumb' => 'van :start tot en met :end', 'account_default_currency' => 'Nieuwe transacties van deze betaalrekening krijgen automatisch deze valuta.', // categories: @@ -641,6 +624,11 @@ return [ 'perm-delete-many' => 'Veel items in één keer verwijderen kan zeer storend zijn. Wees voorzichtig.', 'mass_deleted_transactions_success' => 'Verwijder :amount transactie(s).', 'mass_edited_transactions_success' => 'Wijzig :amount transactie(s)', + 'opt_group_no_account_type' => '(geen rekeningtype)', + 'opt_group_defaultAsset' => 'Standaard betaalrekeningen', + 'opt_group_savingAsset' => 'Spaarrekeningen', + 'opt_group_sharedAsset' => 'Gedeelde betaalrekeningen', + 'opt_group_ccAsset' => 'Creditcards', // new user: @@ -656,8 +644,6 @@ return [ 'yourAccounts' => 'Je betaalrekeningen', 'budgetsAndSpending' => 'Budgetten en uitgaven', 'savings' => 'Sparen', - 'markAsSavingsToContinue' => 'Om hier wat te zien stel je je betaalrekeningen in als "spaarrekening".', - 'createPiggyToContinue' => 'Maak spaarpotjes om hier iets te zien.', 'newWithdrawal' => 'Nieuwe uitgave', 'newDeposit' => 'Nieuwe inkomsten', 'newTransfer' => 'Nieuwe overschrijving', @@ -665,8 +651,6 @@ return [ 'moneyOut' => 'Uitgaven', 'billsToPay' => 'Openstaande contracten', 'billsPaid' => 'Betaalde contracten', - 'divided' => 'verdeeld', - 'toDivide' => 'te verdelen', // menu and titles, should be recycled as often as possible: 'currency' => 'Valuta', @@ -726,20 +710,11 @@ return [ 'reports_can_bookmark' => 'Je kan rapporten aan je favorieten toevoegen.', 'incomeVsExpenses' => 'Inkomsten tegenover uitgaven', 'accountBalances' => 'Rekeningsaldi', - 'balanceStartOfYear' => 'Saldo aan het begin van het jaar', - 'balanceEndOfYear' => 'Saldo aan het einde van het jaar', - 'balanceStartOfMonth' => 'Saldo aan het begin van de maand', - 'balanceEndOfMonth' => 'Saldo aan het einde van de maand', 'balanceStart' => 'Saldo aan het begin van de periode', 'balanceEnd' => 'Saldo aan het einde van de periode', - 'reportsOwnAccounts' => 'Overzichten voor je eigen betaalrekeningen', - 'reportsOwnAccountsAndShared' => 'Overzichten voor je eigen betaalrekeningen en gedeelde rekeningen', 'splitByAccount' => 'Per betaalrekening', - 'balancedByTransfersAndTags' => 'Gecorrigeerd met overschrijvingen en tags', 'coveredWithTags' => 'Gecorrigeerd met tags', 'leftUnbalanced' => 'Ongecorrigeerd', - 'expectedBalance' => 'Verwacht saldo', - 'outsideOfBudgets' => 'Buiten budgetten', 'leftInBudget' => 'Over van budget', 'sumOfSums' => 'Alles bij elkaar', 'noCategory' => '(zonder categorie)', @@ -752,19 +727,12 @@ return [ 'topX' => 'top :number', 'show_full_list' => 'Laat hele lijst zien', 'show_only_top' => 'Alleen top :number', - 'sum_of_year' => 'Som van jaar', - 'sum_of_years' => 'Som van jaren', - 'average_of_year' => 'Gemiddelde in jaar', - 'average_of_years' => 'Gemiddelde in jaren', - 'categories_earned_in_year' => 'Categorieën (inkomsten)', - 'categories_spent_in_year' => 'Categorieën (uitgaven)', 'report_type' => 'Rapporttype', 'report_type_default' => 'Standard financieel rapport', 'report_type_audit' => 'Transactiehistorie-overzicht (audit)', 'report_type_category' => 'Categorierapport', 'report_type_budget' => 'Budgetrapport', 'report_type_tag' => 'Tagrapport', - 'report_type_meta-history' => 'Overzicht van categorieën, budgetten en contracten', 'more_info_help' => 'Meer informatie over deze rapporten vind je in de hulppagina\'s. Klik daarvoor op het (?) icoontje rechtsboven.', 'report_included_accounts' => 'Accounts in rapport', 'report_date_range' => 'Datumbereik', @@ -814,10 +782,12 @@ return [ 'account_role_sharedAsset' => 'Gedeelde betaalrekening', 'account_role_savingAsset' => 'Spaarrekening', 'account_role_ccAsset' => 'Credit card', + 'budget_chart_click' => 'Klik op een budgetnaam in de tabel hierboven om een ​​grafiek te zien.', + 'category_chart_click' => 'Klik op een categorienaam in de tabel hierboven om een ​​grafiek te zien.', + // charts: 'chart' => 'Diagram', - 'dayOfMonth' => 'Dag vd maand', 'month' => 'Maand', 'budget' => 'Budget', 'spent' => 'Uitgegeven', @@ -838,7 +808,6 @@ return [ 'budgeted' => 'Gebudgetteerd', 'period' => 'Periode', 'balance' => 'Saldo', - 'summary' => 'Samenvatting', 'sum' => 'Som', 'average' => 'Gemiddeld', 'balanceFor' => 'Saldo op :name', @@ -858,47 +827,38 @@ return [ 'add_money_to_piggy_title' => 'Stop geld in spaarpotje ":name"', 'remove_money_from_piggy_title' => 'Haal geld uit spaarpotje ":name"', 'add' => 'Toevoegen', + 'no_money_for_piggy' => 'Er is geen geld voor dit spaarpotje.', - 'remove' => 'Verwijderen', - 'max_amount_add' => 'Hooguit toe te voegen', - 'max_amount_remove' => 'Hooguit te verwijderen', - 'update_piggy_button' => 'Wijzig spaarpotje', - 'update_piggy_title' => 'Wijzig spaarpotje ":name"', - 'updated_piggy_bank' => 'Spaarpotje ":name" geüpdatet', - 'details' => 'Details', - 'events' => 'Gebeurtenissen', - 'target_amount' => 'Doelbedrag', - 'start_date' => 'Startdatum', - 'target_date' => 'Doeldatum', - 'no_target_date' => 'Geen doeldatum', - 'todo' => 'te doen', - 'table' => 'Tabel', - 'piggy_bank_not_exists' => 'Dit spaarpotje bestaat niet meer.', - 'add_any_amount_to_piggy' => 'Stop geld in dit spaarpotje om het doel van :amount te halen.', - 'add_set_amount_to_piggy' => 'Stop voor :date :amount in dit spaarpotje om hem op tijd te vullen.', - 'delete_piggy_bank' => 'Verwijder spaarpotje ":name"', - 'cannot_add_amount_piggy' => 'Kon bedrag :amount niet aan ":name" toevoegen.', - 'cannot_remove_from_piggy' => 'Kon bedrag :amount niet weghalen uit ":name".', - 'deleted_piggy_bank' => 'Spaarpotje ":name" verwijderd', - 'added_amount_to_piggy' => ':amount aan ":name" toegevoegd', - 'removed_amount_from_piggy' => ':amount uit ":name" gehaald', - 'cannot_remove_amount_piggy' => 'Kon :amount niet uit ":name" halen.', + 'remove' => 'Verwijderen', + 'max_amount_add' => 'Hooguit toe te voegen', + 'max_amount_remove' => 'Hooguit te verwijderen', + 'update_piggy_button' => 'Wijzig spaarpotje', + 'update_piggy_title' => 'Wijzig spaarpotje ":name"', + 'updated_piggy_bank' => 'Spaarpotje ":name" geüpdatet', + 'details' => 'Details', + 'events' => 'Gebeurtenissen', + 'target_amount' => 'Doelbedrag', + 'start_date' => 'Startdatum', + 'target_date' => 'Doeldatum', + 'no_target_date' => 'Geen doeldatum', + 'table' => 'Tabel', + 'delete_piggy_bank' => 'Verwijder spaarpotje ":name"', + 'cannot_add_amount_piggy' => 'Kon bedrag :amount niet aan ":name" toevoegen.', + 'cannot_remove_from_piggy' => 'Kon bedrag :amount niet weghalen uit ":name".', + 'deleted_piggy_bank' => 'Spaarpotje ":name" verwijderd', + 'added_amount_to_piggy' => ':amount aan ":name" toegevoegd', + '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', - 'edit_tag' => 'Wijzig tag ":tag"', - 'updated_tag' => 'Tag ":tag" geüpdatet', - 'created_tag' => 'Tag ":tag" opgeslagen!', - 'no_year' => 'Zonder jaar', - 'no_month' => 'Zonder maand', - 'tag_title_nothing' => 'Standaard tags', - 'tag_title_balancingAct' => 'Balancerende tags', - 'tag_title_advancePayment' => 'Vooruitbetaalde 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', + 'edit_tag' => 'Wijzig tag ":tag"', + 'updated_tag' => 'Tag ":tag" geüpdatet', + 'created_tag' => 'Tag ":tag" opgeslagen!', 'transaction_journal_information' => 'Transactieinformatie', 'transaction_journal_meta' => 'Metainformatie', @@ -925,44 +885,59 @@ return [ 'budgets_with_limits' => 'budget(ten) met een ingesteld bedrag', 'rule_or_rules' => 'regel(s)', 'rulegroup_or_groups' => 'regelgroep(en)', - 'setting_must_confirm_account' => 'Accountbevestiging', - 'setting_must_confirm_account_explain' => 'Als je dit aanzet moeten gebruikers hun account activeren voor dat-ie werkt.', 'configuration_updated' => 'De configuratie is bijgewerkt', 'setting_is_demo_site' => 'Demo website', 'setting_is_demo_site_explain' => 'Als je dit aanzet doet jouw installatie alsof het een demo-site is, en dat kan problemen opleveren.', - 'setting_send_email_notifications' => 'Stuur e-mail notificaties', - 'setting_send_email_explain' => 'Firefly III kan je email notificaties sturen over allerhande zaken. Deze worden gestuurd naar :site_owner. Dat e-mailadres kan je instellen in het .env-bestand.', 'block_code_bounced' => 'Email kwam niet aan', 'block_code_expired' => 'Demo-account verlopen', 'no_block_code' => 'Geen reden of gebruiker niet geblokkeerd', + // links + 'journal_link_configuration' => 'Instellingen voor transactiekoppelingen', + 'create_new_link_type' => 'Maak nieuw koppeltype', + 'store_new_link_type' => 'Sla nieuw koppeltype op', + 'update_link_type' => 'Update koppeltype', + 'edit_link_type' => 'Wijzig linktype ":name"', + 'updated_link_type' => 'Koppeltype ":name" gewijzigd', + 'delete_link_type' => 'Koppeltype ":name" verwijderen', + 'deleted_link_type' => 'Koppeltype ":name" verwijderd', + 'stored_new_link_type' => 'Koppeltype ":name" opgeslagen', + 'cannot_edit_link_type' => 'Kan koppeltype ":name" niet wijzigen', + 'link_type_help_name' => 'Bijv. "Dupliceert"', + 'link_type_help_inward' => 'Bijv. "dupliceert"', + 'link_type_help_outward' => 'Bijv. "is duplicaat van"', + 'save_connections_by_moving' => 'Sla de link tussen deze transactie(s) op door ze te op te slaan onder een ander linktype:', + 'do_not_save_connection' => '(gooi ook koppelingen weg)', + 'link_transaction' => 'Koppel transactie', + 'link_to_other_transaction' => 'Koppel deze transactie aan een andere transactie', + 'select_transaction_to_link' => 'Selecteer een transactie om deze transactie aan te koppelen', + 'this_transaction' => 'Deze transactie', + '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.', + 'journals_linked' => 'De transacties zijn gekoppeld.', + 'journals_error_linked' => 'Deze transacties zijn al gekoppeld.', + 'journal_links' => 'Transactiekoppelingen', + 'this_withdrawal' => 'Deze uitgave', + 'this_deposit' => 'Deze inkomsten', + 'this_transfer' => 'Deze overschrijving', + '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', // split a transaction: - 'transaction_meta_data' => 'Transactie meta-data', - 'transaction_dates' => 'Transactie data', 'splits' => 'Splitten', - 'split_title_withdrawal' => 'Splits je nieuwe uitgave', - 'split_intro_one_withdrawal' => 'Firefly kan een uitgave "splitsen".', - 'split_intro_two_withdrawal' => 'Dat betekent dat de uitgave die je maakt wordt verdeeld over verschillende doelrekeningen, budgetten of categorieën.', - 'split_intro_three_withdrawal' => 'Je kan bijvoorbeeld je boodschappen van :total verdelen zodat :split_one uit je boodschappenbudget komt, en :split_two uit je sigarettenbudget.', - 'split_table_intro_withdrawal' => 'Split je uitgave in zoveel stukken als je maar wilt. Standaard is je uitgave niet gesplitst; er is maar één "split". Voeg hieronder zoveel splits toe als je wilt. Denk er aan dat je niet afwijkt van het totaalbedrag. Als je dat wel doet zal Firefly je waarschuwen maar niet corrigeren.', - 'store_splitted_withdrawal' => 'Sla gesplitste uitgave op', - 'update_splitted_withdrawal' => 'Gesplitste uitgave updaten', - 'split_title_deposit' => 'Splits je nieuwe inkomsten', - 'split_intro_one_deposit' => 'Firefly kan inkomsten "splitsen".', - 'split_intro_two_deposit' => 'Dat betekent dat de inkomsten die je krijgt wordt verdeeld over verschillende doelrekeningen of categorieën.', - 'split_intro_three_deposit' => 'Je kan bijvoorbeeld je salaris van :total verdelen zodat :split_one wordt opgeslagen als je basissalaris, en :split_two als declaratieteruggave.', - 'split_table_intro_deposit' => 'Split je inkomsten in zoveel stukken als je maar wilt. Standaard zijn je inkomsten niet gesplitst; er is maar één "split". Voeg hieronder zoveel splits toe als je wilt. Denk er aan dat je niet afwijkt van het totaalbedrag. Als je dat wel doet zal Firefly je waarschuwen maar niet corrigeren.', - 'store_splitted_deposit' => 'Sla gesplitse inkomsten op', - 'split_title_transfer' => 'Splits je nieuwe overschrijving', - 'split_intro_one_transfer' => 'Firefly kan overschrijvingen "splitsen".', - 'split_intro_two_transfer' => 'Dat betekent dat de uitgave die je maakt wordt verdeeld over verschillende categorieën of spaarpotjes.', - 'split_intro_three_transfer' => 'Je kan bijvoorbeeld je overschrijving van :total verdelen zodat :split_one in het ene spaarpotje terecht komt, en :split_two in het andere spaarpotje.', - 'split_table_intro_transfer' => 'Split je overschrijving in zoveel stukken als je maar wilt. Standaard is je overschrijving niet gesplitst; er is maar één "split". Voeg hieronder zoveel splits toe als je wilt. Denk er aan dat je niet afwijkt van het totaalbedrag. Als je dat wel doet zal Firefly je waarschuwen maar niet corrigeren.', - 'store_splitted_transfer' => 'Sla gesplitste overschrijving op', 'add_another_split' => 'Voeg een split toe', 'split-transactions' => 'Split transacties', - 'split-new-transaction' => 'Split een nieuwe transactie', 'do_split' => 'Splits', 'split_this_withdrawal' => 'Splits deze uitgave', 'split_this_deposit' => 'Splits deze inkomsten', @@ -1016,9 +991,6 @@ return [ 'import_status_finished_job' => 'De geimporteerde transacties kan je vinden onder tag :tag.', 'import_with_key' => 'Import met code \':key\'', - // different states: - 'import_status_job_running' => 'Het importeren is bezig. Een moment...', - // sandstorm.io errors and messages: 'sandstorm_not_available' => 'Deze functie werkt niet als je Firefly III gebruikt in combinatie met Sandstorm.IO.', @@ -1070,4 +1042,4 @@ return [ 'no_bills_create_default' => 'Maak een contract', -]; \ No newline at end of file +]; diff --git a/resources/lang/nl_NL/form.php b/resources/lang/nl_NL/form.php index e3f2cb50b2..5c0a9b962c 100644 --- a/resources/lang/nl_NL/form.php +++ b/resources/lang/nl_NL/form.php @@ -100,6 +100,7 @@ return [ 'code' => 'Code', 'iban' => 'IBAN', 'accountNumber' => 'Rekeningnummer', + 'creditCardNumber' => 'Creditcardnummer', 'has_headers' => 'Kolomnamen op de eerste rij?', 'date_format' => 'Datumformaat', 'specifix' => 'Bank- or of bestandsspecifieke opties', @@ -135,6 +136,7 @@ return [ 'delete_attachment' => 'Verwijder bijlage ":name"', 'delete_rule' => 'Verwijder regel ":title"', 'delete_rule_group' => 'Verwijder regelgroep ":title"', + 'delete_link_type' => 'Verwijder linktype ":name"', '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?', @@ -147,11 +149,14 @@ return [ 'journal_areYouSure' => 'Weet je zeker dat je de transactie met naam ":description" wilt verwijderen?', 'mass_journal_are_you_sure' => 'Weet je zeker dat je al deze transacties wilt verwijderen?', 'tag_areYouSure' => 'Weet je zeker dat je de tag met naam ":tag" wilt verwijderen?', + 'journal_link_areYouSure' => 'Weet je zeker dat je de koppeling tussen :source en :destination wilt verwijderen?', + 'linkType_areYouSure' => 'Weet je zeker dat je linktype ":name" (":inward" / ":outward") wilt verwijderen?', 'permDeleteWarning' => 'Dingen verwijderen uit Firefly is permanent en kan niet ongedaan gemaakt worden.', 'mass_make_selection' => 'Je kan items alsnog redden van de ondergang door het vinkje weg te halen.', 'delete_all_permanently' => 'Verwijder geselecteerde items permanent', 'update_all_journals' => 'Wijzig deze transacties', 'also_delete_transactions' => 'Ook de enige transactie verbonden aan deze rekening wordt verwijderd.|Ook alle :count transacties verbonden aan deze rekening worden verwijderd.', + 'also_delete_connections' => 'De enige transactie gelinkt met dit linktype zal deze verbinding verliezen. | Alle :count transacties met dit linktype zullen deze verbinding verliezen.', 'also_delete_rules' => 'De enige regel in deze regelgroep wordt ook verwijderd.|Alle :count regels in deze regelgroep worden ook verwijderd.', 'also_delete_piggyBanks' => 'Ook het spaarpotje verbonden aan deze rekening wordt verwijderd.|Ook alle :count spaarpotjes verbonden aan deze rekening worden verwijderd.', 'bill_keep_transactions' => 'De transactie verbonden aan dit contract blijft bewaard.|De :count transacties verbonden aan dit contract blijven bewaard.', @@ -189,4 +194,7 @@ return [ 'payment_date' => 'Betalingsdatum', 'invoice_date' => 'Factuurdatum', 'internal_reference' => 'Interne verwijzing', -]; \ No newline at end of file + + 'inward' => 'Binnenwaartse beschrijving', + 'outward' => 'Buitenwaartse beschrijving', +]; diff --git a/resources/lang/nl_NL/help.php b/resources/lang/nl_NL/help.php index 217e867804..e60d763a5f 100644 --- a/resources/lang/nl_NL/help.php +++ b/resources/lang/nl_NL/help.php @@ -32,4 +32,4 @@ return [ 'main-content-end-text' => 'Elke pagina heeft een vraagtekentje rechtsboven. Gebruik deze voor meer hulp. Veel plezier!', 'index' => 'index', 'home' => 'home', -]; \ No newline at end of file +]; diff --git a/resources/lang/nl_NL/intro.php b/resources/lang/nl_NL/intro.php index e945adcec8..34c26c0755 100644 --- a/resources/lang/nl_NL/intro.php +++ b/resources/lang/nl_NL/intro.php @@ -11,111 +11,111 @@ declare(strict_types=1); return [ // index - 'index_intro' => '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.', + 'index_intro' => 'Welkom op de homepage van Firefly III. Neem even de tijd voor deze introductie zodat je Firefly III leert kennen.', + 'index_accounts-chart' => 'Deze grafiek toont het saldo van je betaalrekening(en). Welke rekeningen zichtbaar zijn kan je aangeven bij de instellingen.', + 'index_box_out_holder' => 'Dit vakje en de vakjes er naast geven een snel overzicht van je financiële situatie.', + 'index_help' => 'Als je ooit hulp nodig hebt, klik dan hier.', + 'index_outro' => 'De meeste pagina\'s in Firefly III beginnen met een kleine rondleiding zoals deze. Zoek me op als je vragen of commentaar hebt. Veel plezier!', + 'index_sidebar-toggle' => 'Nieuwe transacties, rekeningen en andere dingen maak je met het menu onder deze knop.', // 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.', + 'accounts_create_iban' => 'Geef je rekeningen een geldige IBAN. Dat scheelt met importeren van data.', + 'accounts_create_asset_opening_balance' => 'Betaalrekeningen kunnen een startsaldo hebben, waarmee het begin van deze rekening in Firefly wordt aangegeven.', + 'accounts_create_asset_currency' => 'Firefly III ondersteunt meerdere valuta. Hier stel je de valuta in van je betaalrekening.', + 'accounts_create_asset_virtual' => 'Soms is het handig om je betaalrekening een virtueel saldo te geven: een extra bedrag dat altijd bij het daadwerkelijke saldo wordt opgeteld.', // 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.', + 'budgets_index_intro' => 'Budgetten worden gebruikt om je financiën te beheren en vormen een van de kernfuncties van Firefly III.', + 'budgets_index_set_budget' => 'Stel je totale budget voor elke periode in, zodat Firefly je kan vertellen of je alle beschikbare geld hebt gebudgetteerd.', + 'budgets_index_see_expenses_bar' => 'Het besteden van geld zal deze balk langzaam vullen.', + '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.', // 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_index_intro' => 'Gebruik deze rapporten om gedetailleerde inzicht in je financiën te krijgen.', + 'reports_index_inputReportType' => 'Kies een rapporttype. Bekijk de helppagina\'s om te zien wat elk rapport laat zien.', + 'reports_index_inputAccountsSelect' => 'Je kunt naar keuze betaalrekeningen meenemen (of niet).', + 'reports_index_inputDateRange' => 'Kies zelf een datumbereik: van een dag tot tien jaar.', + 'reports_index_extra-options-box' => 'Sommige rapporten bieden extra filters en opties. Kies een rapporttype en kijk of hier iets verandert.', // 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_default_intro' => 'Dit rapport geeft je een snel en uitgebreid overzicht van je financiën. Laat het me weten als je hier dingen mist!', + 'reports_report_audit_intro' => 'Dit rapport geeft je gedetailleerde inzichten in je betaalrekeningen.', + 'reports_report_audit_optionsBox' => 'Gebruik deze vinkjes om voor jou interessante kolommen te laten zien of te verbergen.', - 'reports_report_category_intro' => 'This report will give you insight in 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 you how your expenses and income per category.', + 'reports_report_category_intro' => 'Dit rapport geeft je inzicht in één of meerdere categorieën.', + 'reports_report_category_pieCharts' => 'Deze grafieken geven je inzicht in de uitgaven en inkomsten per categorie of per rekening.', + 'reports_report_category_incomeAndExpensesChart' => 'Deze grafiek toont je uitgaven en inkomsten per categorie.', - 'reports_report_tag_intro' => 'This report will give you insight in 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 you how your expenses and income per tag.', + 'reports_report_tag_intro' => 'Dit rapport geeft je inzicht in één of meerdere tags.', + 'reports_report_tag_pieCharts' => 'Deze grafieken geven je inzicht in de uitgaven en inkomsten per tag, rekening, categorie of budget.', + 'reports_report_tag_incomeAndExpensesChart' => 'Deze grafiek toont je uitgaven en inkomsten per tag.', - 'reports_report_budget_intro' => 'This report will give you insight in or multiple budgets.', - 'reports_report_budget_pieCharts' => 'These charts will give you insight in expenses and income per budget or per account.', - 'reports_report_budget_incomeAndExpensesChart' => 'This chart shows you how your expenses and income per budget.', + 'reports_report_budget_intro' => 'Dit rapport geeft je inzicht in één of meerdere budgetten.', + 'reports_report_budget_pieCharts' => 'Deze grafieken geven je inzicht in de uitgaven en inkomsten per budget of per rekening.', + 'reports_report_budget_incomeAndExpensesChart' => 'Deze grafiek toont je uitgaven 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.', + 'transactions_create_switch_box' => 'Gebruik deze knoppen om snel van transactietype te wisselen.', + 'transactions_create_ffInput_category' => 'Je kan in dit veld vrij typen. Eerder gemaakte categorieën komen als suggestie naar boven.', + 'transactions_create_withdrawal_ffInput_budget' => 'Link je uitgave aan een budget voor een beter financieel overzicht.', + 'transactions_create_withdrawal_currency_dropdown_amount' => 'Gebruik deze dropdown als je uitgave in een andere valuta is.', + 'transactions_create_deposit_currency_dropdown_amount' => 'Gebruik deze dropdown als je inkomsten in een andere valuta zijn.', + 'transactions_create_transfer_ffInput_piggy_bank_id' => 'Selecteer een spaarpotje en link deze overschrijving aan je spaargeld.', // 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.', + 'piggy-banks_index_saved' => 'Dit veld laat zien hoeveel geld er in elk spaarpotje zit.', + 'piggy-banks_index_button' => 'Naast deze balk zitten twee knoppen (+ en -) om geld aan je spaarpotje toe te voegen, of er uit te halen.', + 'piggy-banks_index_accountStatus' => 'Voor elke betaalrekening met minstens één spaarpotje zie je hier de status.', // 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.', + 'piggy-banks_create_name' => 'Wat is je doel? Een nieuwe zithoek, een camera of geld voor noodgevallen?', + 'piggy-banks_create_date' => 'Je kan een doeldatum of een deadline voor je spaarpot instellen.', // 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.', + 'piggy-banks_show_piggyChart' => 'Deze grafiek toont de geschiedenis van dit spaarpotje.', + 'piggy-banks_show_piggyDetails' => 'Enkele details over je spaarpotje', + 'piggy-banks_show_piggyEvents' => 'Eventuele stortingen (van en naar) worden hier ook vermeld.', // 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.', + 'bills_index_paid_in_period' => 'Dit veld geeft aan wanneer het contract het laatst is betaald.', + 'bills_index_expected_in_period' => 'Dit veld geeft aan voor elk contract of en wanneer je hem weer moet betalen.', // 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.', + 'bills_show_billInfo' => 'Deze tabel bevat wat algemene informatie over dit contract.', + 'bills_show_billButtons' => 'Gebruik deze knop om oude transacties opnieuw te scannen, zodat ze aan dit contract worden gekoppeld.', + 'bills_show_billChart' => 'Deze grafiek toont de transacties gekoppeld aan dit contract.', // 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.', + 'bills_create_name' => 'Gebruik een beschrijvende naam zoals "huur" of "zorgverzekering".', + 'bills_create_match' => 'Om transacties te koppelen gebruik je termen uit de transacties of de bijbehorende crediteur. Alle termen moeten overeen komen.', + 'bills_create_amount_min_holder' => 'Stel ook een minimum- en maximumbedrag in.', + 'bills_create_repeat_freq_holder' => 'De meeste contracten herhalen maandelijks, maar dat kan je eventueel veranderen.', + 'bills_create_skip_holder' => 'Als een contract elke twee weken herhaalt, zet je het "skip"-veld op 1 om elke andere week over te slaan.', // 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!', + 'rules_index_intro' => 'In Firefly III kan je regels maken die automagisch op transacties worden toegepast.', + 'rules_index_new_rule_group' => 'Je kan regels combineren in groepen voor makkelijker beheer.', + 'rules_index_new_rule' => 'Maak zoveel regels als je wilt.', + 'rules_index_prio_buttons' => 'Zet ze in elke willekeurige volgorde.', + 'rules_index_test_buttons' => 'Je kan je regels testen of toepassen op bestaande transacties.', + 'rules_index_rule-triggers' => 'Regels hebben "triggers" en "acties" die je kan sorteren met drag-en-drop.', + 'rules_index_outro' => 'Check ook de helppagina\'s met het (?)-icoontje rechtsboven!', // 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.', + 'rules_create_mandatory' => 'Kies een beschrijvende titel en wanneer de regel af moet gaan.', + 'rules_create_ruletriggerholder' => 'Voeg zoveel triggers toe als je wilt, maar denk er aan dat ALLE triggers moeten matchen voor de acties worden uitgevoerd.', + 'rules_create_test_rule_triggers' => 'Gebruik deze knop om te zien welke bestaande transacties overeen zouden komen.', + 'rules_create_actions' => 'Stel zoveel acties in als je wilt.', // preferences - 'preferences_index_tabs' => 'More options are available behind these tabs.', + 'preferences_index_tabs' => 'Meer opties zijn beschikbaar achter deze tabbladen.', // 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.', + 'currencies_index_intro' => 'Firefly III ondersteunt meerdere valuta, die je op deze pagina kunt wijzigen.', + 'currencies_index_default' => 'Firefly III heeft één standaardvaluta. Je kan natuurlijk altijd wisselen met deze knoppen.', // create currency - 'currencies_create_code' => 'This code should be ISO compliant (Google it for your new currency).', -]; \ No newline at end of file + 'currencies_create_code' => 'Deze code moet ISO-compatibel zijn (Google die code voor je nieuwe valuta).', +]; diff --git a/resources/lang/nl_NL/list.php b/resources/lang/nl_NL/list.php index 3efab736fa..6c5ced7dfe 100644 --- a/resources/lang/nl_NL/list.php +++ b/resources/lang/nl_NL/list.php @@ -12,80 +12,78 @@ 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', - 'confirmed_from' => 'Bevestigd vanaf', - 'registered_from' => 'Geregistreerd vanaf', - 'blocked_code' => 'Reden voor blokkade', - 'domain' => 'Domein', - 'registration_attempts' => 'Registratiepogingen', - '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', -]; \ No newline at end of file + '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', +]; diff --git a/resources/lang/nl_NL/pagination.php b/resources/lang/nl_NL/pagination.php index cb5dc72622..82de8727a0 100644 --- a/resources/lang/nl_NL/pagination.php +++ b/resources/lang/nl_NL/pagination.php @@ -16,4 +16,4 @@ return [ 'previous' => '« Vorige', 'next' => 'Volgende »', -]; \ No newline at end of file +]; diff --git a/resources/lang/nl_NL/passwords.php b/resources/lang/nl_NL/passwords.php index ff60efa891..83ed725b7d 100644 --- a/resources/lang/nl_NL/passwords.php +++ b/resources/lang/nl_NL/passwords.php @@ -18,4 +18,4 @@ return [ 'sent' => 'Je krijgt een mailtje met een linkje om je wachtwoord te herstellen!', 'reset' => 'Je wachtwoord is hersteld!', 'blocked' => 'Leuk geprobeerd wel.', -]; \ No newline at end of file +]; diff --git a/resources/lang/nl_NL/validation.php b/resources/lang/nl_NL/validation.php index 043065ff1b..de20c75a0c 100644 --- a/resources/lang/nl_NL/validation.php +++ b/resources/lang/nl_NL/validation.php @@ -17,7 +17,6 @@ return [ 'deleted_user' => 'Je kan je niet registreren met dit e-mailadres.', 'rule_trigger_value' => 'Deze waarde is niet geldig voor de geselecteerde trigger.', 'rule_action_value' => 'Deze waarde is niet geldig voor de geselecteerde actie.', - 'invalid_domain' => 'Kan niet registereren vanaf dit domein.', 'file_already_attached' => 'Het geuploade bestand ":name" is al gelinkt aan deze transactie.', 'file_attached' => 'Bestand met naam ":name" is met succes geuploaded.', 'file_invalid_mime' => 'Bestand ":name" is van het type ":mime", en die kan je niet uploaden.', @@ -91,4 +90,4 @@ return [ 'present' => 'Het :attribute veld moet aanwezig zijn.', 'amount_zero' => 'Het totaalbedrag kan niet nul zijn', 'secure_password' => 'Dit is geen sterk wachtwoord. Probeer het nog een keer. Zie ook: https://goo.gl/NCh2tN', -]; \ No newline at end of file +]; diff --git a/resources/lang/pl_PL/auth.php b/resources/lang/pl_PL/auth.php index ff4b564aee..a743bd1901 100644 --- a/resources/lang/pl_PL/auth.php +++ b/resources/lang/pl_PL/auth.php @@ -27,4 +27,4 @@ return [ 'failed' => 'Te poświadczenia nie zgadzają się z naszymi danymi.', 'throttle' => 'Zbyt wiele prób logowania. Spróbuj ponownie za :seconds sekund.', -]; \ No newline at end of file +]; diff --git a/resources/lang/pl_PL/breadcrumbs.php b/resources/lang/pl_PL/breadcrumbs.php index e9f8069e2c..52019feac2 100644 --- a/resources/lang/pl_PL/breadcrumbs.php +++ b/resources/lang/pl_PL/breadcrumbs.php @@ -13,31 +13,32 @@ declare(strict_types=1); */ return [ - 'home' => 'Strona główna', - 'edit_currency' => 'Modyfikuj walutę ":name"', - 'delete_currency' => 'Usuń walutę ":name"', - 'newPiggyBank' => 'Utwórz nową skarbonkę', - 'edit_piggyBank' => 'Modyfikuj skarbonkę ":name"', - 'preferences' => 'Preferencje', - 'profile' => 'Profil', - 'changePassword' => 'Zmień swoje hasło', - 'bills' => 'Rachunki', - 'newBill' => 'Nowy rachunek', - 'edit_bill' => 'Modyfikuj rachunek ":name"', - 'delete_bill' => 'Usuń rachunek ":name"', - 'reports' => 'Raporty', - 'search_result' => 'Search results for ":query"', - 'withdrawal_list' => 'Wydatki', - 'deposit_list' => 'Przychody, dochody oraz depozyty', - 'transfer_list' => 'Transfery', - 'transfers_list' => 'Transfery', - 'create_withdrawal' => 'Utwórz nową wypłatę', - 'create_deposit' => 'Utwórz nową wpłatę', - 'create_transfer' => 'Utwórz nowy transfer', - 'edit_journal' => 'Modyfikuj transakcję ":description"', - 'delete_journal' => 'Usuń transakcję ":description"', - 'tags' => 'Tagi', - 'createTag' => 'Utwórz nowy tag', - 'edit_tag' => 'Modyfikuj tag ":tag"', - 'delete_tag' => 'Usuń tag ":tag"', -]; \ No newline at end of file + 'home' => 'Strona główna', + 'edit_currency' => 'Modyfikuj walutę ":name"', + 'delete_currency' => 'Usuń walutę ":name"', + 'newPiggyBank' => 'Utwórz nową skarbonkę', + 'edit_piggyBank' => 'Modyfikuj skarbonkę ":name"', + 'preferences' => 'Preferencje', + 'profile' => 'Profil', + 'changePassword' => 'Zmień swoje hasło', + 'bills' => 'Rachunki', + 'newBill' => 'Nowy rachunek', + 'edit_bill' => 'Modyfikuj rachunek ":name"', + 'delete_bill' => 'Usuń rachunek ":name"', + 'reports' => 'Raporty', + 'search_result' => 'Wyniki wyszukiwania dla ":query"', + 'withdrawal_list' => 'Wydatki', + 'deposit_list' => 'Przychody, dochody oraz depozyty', + 'transfer_list' => 'Transfery', + 'transfers_list' => 'Transfery', + 'create_withdrawal' => 'Utwórz nową wypłatę', + 'create_deposit' => 'Utwórz nową wpłatę', + 'create_transfer' => 'Utwórz nowy transfer', + 'edit_journal' => 'Modyfikuj transakcję ":description"', + 'delete_journal' => 'Usuń transakcję ":description"', + 'tags' => 'Tagi', + 'createTag' => 'Utwórz nowy tag', + 'edit_tag' => 'Modyfikuj tag ":tag"', + 'delete_tag' => 'Usuń tag ":tag"', + 'delete_journal_link' => 'Usuń powiązanie między transakcjami', +]; diff --git a/resources/lang/pl_PL/config.php b/resources/lang/pl_PL/config.php index 1e88ed4078..526668d33e 100644 --- a/resources/lang/pl_PL/config.php +++ b/resources/lang/pl_PL/config.php @@ -15,11 +15,11 @@ return [ 'locale' => 'pl, Polish, polski, pl_PL, pl_PL.utf8, pl_PL.UTF-8', 'month' => '%B %Y', 'month_and_day' => '%e %B %Y', - 'date_time' => '%B %e, %Y, @ %T', + 'date_time' => '%e %B %Y o %T', 'specific_day' => '%e %B %Y', 'week_in_year' => 'Tydzień %W, %Y', 'quarter_of_year' => '%B %Y', 'year' => '%Y', 'half_year' => '%B %Y', -]; \ No newline at end of file +]; diff --git a/resources/lang/pl_PL/csv.php b/resources/lang/pl_PL/csv.php index b6cea58e05..2bfdd059a3 100644 --- a/resources/lang/pl_PL/csv.php +++ b/resources/lang/pl_PL/csv.php @@ -33,7 +33,7 @@ return [ 'roles_column_role' => 'Znaczenie danych w kolumnie', 'roles_do_map_value' => 'Zmapuj te wartości', 'roles_column' => 'Kolumna', - 'roles_no_example_data' => 'Brak dostępnych danych przykładowych', + 'roles_no_example_data' => 'Brak przykładowych danych', 'roles_submit' => 'Przejdź do kroku 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.', @@ -80,4 +80,4 @@ return [ 'column_tags-space' => 'Tagi (oddzielone spacjami)', 'column_account-number' => 'Konto aktywów (numer konta)', 'column_opposing-number' => 'Opposing account (account number)', -]; \ No newline at end of file +]; diff --git a/resources/lang/pl_PL/demo.php b/resources/lang/pl_PL/demo.php index 84446f6be6..0ffd1b88bf 100644 --- a/resources/lang/pl_PL/demo.php +++ b/resources/lang/pl_PL/demo.php @@ -23,4 +23,4 @@ return [ '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' => 'Konfiguracja, która widzisz poniżej jest prawidłowa dla lokalnego pliku.', -]; \ No newline at end of file +]; diff --git a/resources/lang/pl_PL/firefly.php b/resources/lang/pl_PL/firefly.php index ea8ad49c15..432e2ab1ec 100644 --- a/resources/lang/pl_PL/firefly.php +++ b/resources/lang/pl_PL/firefly.php @@ -13,7 +13,6 @@ declare(strict_types=1); return [ // general stuff: - 'language_incomplete' => 'niepełne tłumaczenie', 'close' => 'Zamknij', 'actions' => 'Akcje', 'edit' => 'Modyfikuj', @@ -28,15 +27,10 @@ return [ 'to' => 'Do', 'showEverything' => 'Pokaż wszystko', 'never' => 'Nigdy', - 'search_results_for' => 'Wyniki wyszukiwania dla ":query"', - 'no_results_for_empty_search' => 'Your search was empty, so nothing was found.', - 'bounced_error' => 'Wiadomość wysłana na adres :email została odrzucona, więc nie ma dostępu dla Ciebie.', - 'deleted_error' => 'Te poświadczenia nie zgadzają się z naszymi danymi.', - 'general_blocked_error' => 'Twoje konto zostało zablokowane. Dlatego nie możesz się zalogować.', - 'expired_error' => 'Twoje konto wygasło i nie może być dalej używane.', + 'no_results_for_empty_search' => 'Twoje zapytanie były puste, wiec nic nie zostało znalezione.', 'removed_amount' => 'Usunięto :amount', 'added_amount' => 'Dodano :amount', - 'asset_account_role_help' => 'Any extra options resulting from your choice can be set later.', + 'asset_account_role_help' => 'Dodatkowe opcje wynikające z Twojego wyboru można ustawić później.', 'Opening balance' => 'Bilans otwarcia', 'create_new_stuff' => 'Utwórz nowe rzeczy', 'new_withdrawal' => 'Nowa wypłata', @@ -55,86 +49,75 @@ return [ 'flash_info_multiple' => 'Jest jedna wiadomość|Jest :count wiadomości', 'flash_error_multiple' => 'Jest jeden błąd|Jest :count błędów', 'net_worth' => 'Wartość netto', - 'route_has_no_help' => 'There is no help for this route.', - 'help_may_not_be_your_language' => 'This help text is in English. It is not yet available in your language', + 'route_has_no_help' => 'Brak pomocy dla tej strony.', 'two_factor_welcome' => 'Witaj, :user!', 'two_factor_enter_code' => 'Aby kontynuować, wprowadź kod uwierzytelniania dwuskładnikowego. Twoja aplikacja może wygenerować go dla Ciebie.', 'two_factor_code_here' => 'Wprowadź tutaj kod', 'two_factor_title' => 'Weryfikacja dwuskładnikowa', 'authenticate' => 'Uwierzytelnij', - 'two_factor_forgot_title' => 'Lost two factor authentication', - 'two_factor_forgot' => 'I forgot my two-factor thing.', + 'two_factor_forgot_title' => 'Utracone uwierzytelnianie dwuskładnikowe', + 'two_factor_forgot' => 'Zapomniałem mojego uwierzytelnienia dwuskładnikowego.', 'two_factor_lost_header' => 'Straciłeś uwierzytelnianie dwuskładnikowe?', - 'two_factor_lost_intro' => 'Unfortunately, this is not something you can reset from the web interface. You have two choices.', - 'two_factor_lost_fix_self' => 'If you run your own instance of Firefly III, check the logs in storage/logs for instructions.', - 'two_factor_lost_fix_owner' => 'Otherwise, email the site owner, :site_owner and ask them to reset your two factor authentication.', - 'warning_much_data' => 'Załadowanie :days dni danych może trochę potrwać.', + 'two_factor_lost_intro' => 'Niestety to nie jest coś, co można zresetować z poziomu strony www. Masz dwie możliwości.', + 'two_factor_lost_fix_self' => 'Jeśli jesteś właścicielem tej instalacji Firefly III, sprawdź pliki w katalogu storage/logs aby uzyskać instrukcje.', + 'two_factor_lost_fix_owner' => 'W przeciwnym razie, powiadom właściciela strony, :site_owner i poproś go o zresetowanie Twojego uwierzytelnienia dwuskładnikowego.', + 'warning_much_data' => 'Załadowanie danych z :days dni może trochę potrwać.', 'registered' => 'Zarejestrowałeś się pomyślnie!', - 'tagbalancingAct' => 'Balancing act', - 'tagadvancePayment' => 'Advance payment', - 'tagnothing' => '', 'Default asset account' => 'Domyślne konto aktywów', 'no_budget_pointer' => 'Wygląda na to że nie masz jeszcze budżetów. Powinieneś utworzyć kilka na stronie budżety. Budżety mogą Ci pomóc śledzić wydatki.', 'Savings account' => 'Konto oszczędnościowe', 'Credit card' => 'Karta kredytowa', 'source_accounts' => 'Konto(a) źródłowe', 'destination_accounts' => 'Konto(a) docelowe', - 'user_id_is' => 'Twój id użytkownika to :user', - 'field_supports_markdown' => 'To pole obsługuje 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.', - 'nothing_to_display' => 'There are no transactions to show you', + 'user_id_is' => 'Twój identyfikator użytkownika to :user', + 'field_supports_markdown' => 'To pole obsługuje Markdown.', + 'need_more_help' => 'Jeśli potrzebujesz dodatkowej pomocy w korzystaniu z Firefly III, proszę opisz go w zgłoszeniu na Githubie.', + 'reenable_intro_text' => 'Możesz także ponownie włączyć samouczek.', + 'intro_boxes_after_refresh' => 'Samouczek pojawi się po odświeżeniu strony.', 'show_all_no_filter' => 'Pokaż wszystkie transakcje bez grupowania ich według daty.', 'expenses_by_category' => 'Wydatki wg kategorii', 'expenses_by_budget' => 'Wydatki wg budżetu', 'income_by_category' => 'Dochody wg kategorii', - '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.', + 'expenses_by_asset_account' => 'Wydatki wg kont aktywów', + 'expenses_by_expense_account' => 'Wydatki wg kont wydatków', + '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' => 'Total sum', + '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' => 'Left to spend according to budgeting', - 'cannot_change_demo' => 'Nie można zmienić hasła do konta demonstracyjnego.', - 'cannot_delete_demo' => 'Nie możesz usunąć konta demonstracyjnego.', + 'left_in_budget_limit' => 'Możliwe do wydania wg budżetu', 'cannot_reset_demo_user' => 'Nie można zresetować hasła do konta demonstracyjnego', - 'per_period' => 'Za okres', - 'all_periods' => 'Wszystkie okresy', '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.', - '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"', - 'budget_in_period_breadcrumb' => 'Między :start i :end', + 'budget_in_period' => 'Wszystkie transakcje dla budżetu ":name" od :start do :end', + 'chart_budget_in_period' => 'Wykres wszystkich transakcji dla budżetu ":name" od :start do :end', + 'chart_account_in_period' => 'Wykres wszystkich transakcji dla konta ":name" od :start do :end', + 'chart_category_in_period' => 'Wykres wszystkich transakcji dla kategorii ":name" od :start do :end', + 'chart_category_all' => 'Wykres wszystkich transakcji dla kategorii ":name"', 'clone_withdrawal' => 'Zduplikuj tę wypłatę', 'clone_deposit' => 'Zduplikuj tą wpłatę', 'clone_transfer' => 'Zduplikuj ten transfer', - 'transaction_journal_other_options' => 'Inne opcje', 'multi_select_no_selection' => 'Nie wybrano', 'multi_select_all_selected' => 'Wybrano wszystko', - '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', + 'multi_select_filter_placeholder' => 'Znajdź...', + 'between_dates_breadcrumb' => 'Pomiędzy :start and :end', + 'all_journals_without_budget' => 'Wszystkie transakcje bez budżetu', + 'journals_without_budget' => 'Transakcje bez budżetu', + 'all_journals_without_category' => 'Wszystkie transakcje bez kategorii', 'journals_without_category' => 'Transakcje bez kategorii', 'all_journals_for_account' => 'Wszystkie transakcje dla konta :name', 'chart_all_journals_for_account' => 'Wykres wszystkich transakcji dla konta :name', 'journals_in_period_for_account' => 'Wszystkie transakcje dla konta :name od :start do :end', - 'transferred' => 'Transferred', + 'transferred' => 'Przesłano', 'all_withdrawal' => 'Wszystkie wydatki', 'all_transactions' => 'Wszystkie transakcje', - 'title_withdrawal_between' => 'All expenses between :start and :end', + 'title_withdrawal_between' => 'Wszystkie wydatki do :start do :koniec', 'all_deposit' => 'Wszystkie przychody', - 'title_deposit_between' => 'All revenue between :start and :end', + 'title_deposit_between' => 'Wszystkie przychody do :start do :end', 'all_transfers' => 'Wszystkie transfery', - 'title_transfers_between' => 'All transfers between :start and :end', + 'title_transfers_between' => 'Wszystkie transfery od :start do :end', 'all_transfer' => 'Wszystkie transfery', 'all_journals_for_tag' => 'Wszystkie transakcje dla tagu ":tag"', 'title_transfer_between' => 'Wszystkie transfery od :start do :end', @@ -144,18 +127,18 @@ return [ 'journals_in_period_for_category' => 'Wszystkie transakcje dla kategorii :name od :start do :end', 'journals_in_period_for_tag' => 'Wszystkie transakcje dla tagu :name od :start do :end', 'not_available_demo_user' => 'Funkcja, do której próbujesz uzyskać dostęp nie jest dostępna dla użytkowników demo.', - '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.', + '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', // search 'search' => 'Szukaj', - '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 ...', + 'search_found_transactions' => 'Liczba znalezionych transakcji:', + 'general_search_error' => 'Wystąpił błąd podczas wyszukiwania. Aby uzyskać więcej informacji proszę sprawdzić logi aplikacji.', + 'search_box' => 'Szukaj', + '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...', // repeat frequencies: 'repeat_freq_yearly' => 'rocznie', @@ -164,18 +147,6 @@ return [ 'quarterly' => 'kwartalnie', 'half-year' => 'co pół roku', 'yearly' => 'rocznie', - // account confirmation: - 'confirm_account_header' => 'Proszę potwierdzić swoje konto', - 'confirm_account_intro' => 'Wiadomość e-mail została wysłana na adres, którego użyłeś podczas rejestracji. Sprawdź ją proszę w celu otrzymania dalszych instrukcji. Jeśli nie otrzymałeś tej wiadomości, możesz ją wysłać ponownie z Firefly.', - 'confirm_account_resend_email' => 'Send me the confirmation message I need to activate my account.', - 'account_is_confirmed' => 'Twoje konto zostało potwierdzone!', - 'invalid_activation_code' => 'Wygląda na to że kod którego używasz jest nieprawidłowy lub wygasł.', - 'confirm_account_is_resent_header' => 'The confirmation has been resent', - 'confirm_account_is_resent_text' => 'The confirmation message has been resent. If you still did not receive the confirmation message, please contact the site owner at :owner or check the log files to see what went wrong.', - 'confirm_account_is_resent_go_home' => 'Przejdź do strony głównej Firefly', - 'confirm_account_not_resent_header' => 'Coś poszło nie tak :(', - 'confirm_account_not_resent_intro' => 'The confirmation message has been not resent. If you still did not receive the confirmation message, please contact the site owner at :owner instead. Possibly, you have tried to resend the activation message too often. You can have Firefly III try to resend the confirmation message every hour.', - 'confirm_account_not_resent_go_home' => 'Przejdź do strony głównej Firefly', // export data: 'import_and_export' => 'Import / eksport', @@ -205,7 +176,6 @@ return [ 'export_status_created_zip_file' => 'Utworzono plik zip!', 'export_status_finished' => 'Eksport został pomyślnie zakończony! Yay!', 'export_data_please_wait' => 'Proszę czekać...', - 'attachment_explanation' => 'The file called \':attachment_name\' (#:attachment_id) was originally uploaded to :type \':description\' (#:journal_id) dated :date for the amount of :amount.', // rules 'rules' => 'Reguły', @@ -229,7 +199,7 @@ return [ 'move_rule_group_down' => 'Przenieś grupę reguł w dół', 'save_rules_by_moving' => 'Zapisz te reguły, przenosząc je do innej grupy reguł:', 'make_new_rule' => 'Utwórz nową regułę w grupie reguł ":title"', - 'rule_help_stop_processing' => 'Gdy zaznaczysz ten checkbox, kolejne reguły w tej grupie nie będą wykonywane.', + 'rule_help_stop_processing' => 'Gdy zaznaczysz to pole, kolejne reguły w tej grupie nie będą wykonywane.', 'rule_help_active' => 'Nieaktywne reguły nigdy nie zostaną uruchomione.', 'stored_new_rule' => 'Zapisano regułę o nazwie ":title"', 'deleted_rule' => 'Usunięto regułę o nazwie ":title"', @@ -244,71 +214,85 @@ return [ 'default_rule_action_prepend' => 'Kupił świat od ', 'default_rule_action_set_category' => 'Duże wydatki', 'trigger' => 'Wyzwalacz', - 'trigger_value' => 'Trigger on value', + 'trigger_value' => 'Uruchom dla wartości', 'stop_processing_other_triggers' => 'Zatrzymaj przetwarzanie innych wyzwalaczy', 'add_rule_trigger' => 'Dodaj nowy wyzwalacz', 'action' => 'Akcja', - 'action_value' => 'Action value', + 'action_value' => 'Wartość akcji', 'stop_executing_other_actions' => 'Zatrzymaj wykonywanie innych akcji', 'add_rule_action' => 'Dodaj nową akcję', 'edit_rule' => 'Modyfikuj regułę ":title"', 'delete_rule' => 'Usuń regułę ":title"', 'update_rule' => 'Modyfikuj regułę', - 'test_rule_triggers' => 'Zobacz dopasowane transakcje', - '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.', + 'test_rule_triggers' => 'Zobacz pasujące transakcje', + 'warning_transaction_subset' => 'Ze względów wydajnościowych ta lista ograniczona jest do :max_num_transactions i może zawierać tylko niektóre z pasujących transakcji', + 'warning_no_matching_transactions' => 'Nie znaleziono pasujących transakcji. Należy pamiętać, że ze względów wydajnościowych sprawdzono ostatnie :num_transactions transakcji.', 'warning_no_valid_triggers' => 'Nie dostarczono prawidłowych wyzwalaczy.', - '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.', + 'apply_rule_selection' => 'Zastosuj regułę ":title" do niektórych swoich transakcji', + 'apply_rule_selection_intro' => 'Reguły takie jak ":title" są zwykle stosowane tylko do nowych lub modyfikowanych transakcji, ale możesz powiedzieć Firefly III aby uruchomił ją dla istniejących transakcji. Może to być przydatne, gdy zmodyfikowałeś regułę i potrzebujesz zastosować zmiany dla wszystkich pozostałych transakcji.', 'include_transactions_from_accounts' => 'Uwzględnij transakcje z tych kont', - 'applied_rule_selection' => 'Rule ":title" has been applied to your selection.', + 'applied_rule_selection' => 'Reguła ":title" została zastosowana do Twojego wyboru.', 'execute' => 'Wykonaj', - '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.', + 'apply_rule_group_selection' => 'Zastosuj grupę reguł ":title" do niektórych swoich transakcji', + 'apply_rule_group_selection_intro' => 'GRupy reguł takie jak ":title" są zwykle stosowane tylko do nowych lub modyfikowanych transakcji, ale możesz powiedzieć Firefly III aby uruchomił ją dla istniejących transakcji. Może to być przydatne, gdy zmodyfikowałeś grupę reguł i potrzebujesz zastosować zmiany dla wszystkich pozostałych transakcji.', + 'applied_rule_group_selection' => 'Grupa reguł ":title" została zastosowana do Twojego wyboru.', // actions and triggers 'rule_trigger_user_action' => 'Akcją użytkownika jest ":trigger_value"', - 'rule_trigger_from_account_starts' => 'Konto źródłowe się zaczyna od ":trigger_value"', - 'rule_trigger_from_account_ends' => 'Konto źródłowe się kończy na ":trigger_value"', - 'rule_trigger_from_account_is' => 'Kontem źródłowym jest ":trigger_value"', - 'rule_trigger_from_account_contains' => 'Konto źródłowe zawiera ":trigger_value"', - 'rule_trigger_to_account_starts' => 'Konto docelowe się zaczyna od ":trigger_value"', - 'rule_trigger_to_account_ends' => 'Konto docelowe się kończy na ":trigger_value"', - 'rule_trigger_to_account_is' => 'Kontem docelowym jest ":trigger_value"', - 'rule_trigger_to_account_contains' => 'Konto docelowe zawiera ":trigger_value"', - 'rule_trigger_transaction_type' => 'Transakcja jest typu ":trigger_value"', - 'rule_trigger_category_is' => 'Category is ":trigger_value"', - 'rule_trigger_amount_less' => 'Kwota jest mniejsza niż :trigger_value', - 'rule_trigger_amount_exactly' => 'Kwota jest równa :trigger_value', - 'rule_trigger_amount_more' => 'Kwota jest większa niż :trigger_value', - 'rule_trigger_description_starts' => 'Opis się zaczyna od ":trigger_value"', - 'rule_trigger_description_ends' => 'Opis się kończy na ":trigger_value"', - 'rule_trigger_description_contains' => 'Opis zawiera ":trigger_value"', - 'rule_trigger_description_is' => 'Opis jest ":trigger_value"', 'rule_trigger_from_account_starts_choice' => 'Konto źródłowe się zaczyna od..', + 'rule_trigger_from_account_starts' => 'Konto źródłowe się zaczyna od ":trigger_value"', 'rule_trigger_from_account_ends_choice' => 'Konto źródłowe się kończy na..', + 'rule_trigger_from_account_ends' => 'Konto źródłowe się kończy na ":trigger_value"', 'rule_trigger_from_account_is_choice' => 'Kontem źródłowym jest..', + 'rule_trigger_from_account_is' => 'Konto źródłowe to ":trigger_value"', 'rule_trigger_from_account_contains_choice' => 'Konto źródłowe zawiera..', + 'rule_trigger_from_account_contains' => 'Konto źródłowe zawiera ":trigger_value"', 'rule_trigger_to_account_starts_choice' => 'Konto docelowe zaczyna się od..', + 'rule_trigger_to_account_starts' => 'Konto docelowe się zaczyna od ":trigger_value"', 'rule_trigger_to_account_ends_choice' => 'Konto docelowe kończy się na..', - 'rule_trigger_to_account_is_choice' => 'Konto docelowe jest..', + 'rule_trigger_to_account_ends' => 'Konto docelowe się kończy na ":trigger_value"', + 'rule_trigger_to_account_is_choice' => 'Konto docelowe to..', + 'rule_trigger_to_account_is' => 'Konto docelowe to ":trigger_value"', 'rule_trigger_to_account_contains_choice' => 'Konto docelowe zawiera..', + 'rule_trigger_to_account_contains' => 'Konto docelowe zawiera ":trigger_value"', 'rule_trigger_transaction_type_choice' => 'Transakcja jest typu..', + 'rule_trigger_transaction_type' => 'Transakcja jest typu ":trigger_value"', + 'rule_trigger_category_is_choice' => 'Kategoria to..', + 'rule_trigger_category_is' => 'Kategoria to ":trigger_value"', 'rule_trigger_amount_less_choice' => 'Kwota jest mniejsza niż..', - 'rule_trigger_amount_exactly_choice' => 'Kwota jest..', + 'rule_trigger_amount_less' => 'Kwota jest mniejsza niż :trigger_value', + 'rule_trigger_amount_exactly_choice' => 'Kwota jest równa..', + 'rule_trigger_amount_exactly' => 'Kwota jest równa :trigger_value', 'rule_trigger_amount_more_choice' => 'Kwota jest większa niż..', - 'rule_trigger_description_starts_choice' => 'Opis rozpoczyna się od..', + 'rule_trigger_amount_more' => 'Kwota jest większa niż :trigger_value', + 'rule_trigger_description_starts_choice' => 'Opis zaczyna się od..', + 'rule_trigger_description_starts' => 'Opis się zaczyna od ":trigger_value"', 'rule_trigger_description_ends_choice' => 'Opis kończy się na..', + 'rule_trigger_description_ends' => 'Opis się kończy na ":trigger_value"', 'rule_trigger_description_contains_choice' => 'Opis zawiera..', - 'rule_trigger_description_is_choice' => 'Opis jest..', - 'rule_trigger_category_is_choice' => 'Kategoria jest..', - 'rule_trigger_budget_is_choice' => 'Budżet jest..', - 'rule_trigger_tag_is_choice' => 'Tag jest..', - 'rule_trigger_has_attachments_choice' => 'Has at least this many attachments', - 'rule_trigger_has_attachments' => 'Has at least :trigger_value attachment(s)', + 'rule_trigger_description_contains' => 'Opis zawiera ":trigger_value"', + 'rule_trigger_description_is_choice' => 'Opis to..', + 'rule_trigger_description_is' => 'Opis to ":trigger_value"', + 'rule_trigger_budget_is_choice' => 'Budżet to..', + 'rule_trigger_budget_is' => 'Budżet to ":trigger_value"', + 'rule_trigger_tag_is_choice' => 'Tag to..', + 'rule_trigger_tag_is' => 'Tag to ":trigger_value"', + 'rule_trigger_has_attachments_choice' => 'Ma co najmniej podaną liczbę załączników', + 'rule_trigger_has_attachments' => 'Ma co najmniej :trigger_value załącznik(ów)', 'rule_trigger_store_journal' => 'Po utworzeniu transakcji', 'rule_trigger_update_journal' => 'Po zmodyfikowaniu transakcji', + 'rule_trigger_has_no_category_choice' => 'Brak kategorii', + 'rule_trigger_has_no_category' => 'Transakcje bez kategorii', + 'rule_trigger_has_any_category_choice' => 'Ma (dowolną) kategorię', + 'rule_trigger_has_any_category' => 'Transakcja ma (dowolną) kategorię', + 'rule_trigger_has_no_budget_choice' => 'Brak budżetu', + 'rule_trigger_has_no_budget' => 'Transakcja bez budżetu', + 'rule_trigger_has_any_budget_choice' => 'Ma (dowolny) budżet', + 'rule_trigger_has_any_budget' => 'Transakcja ma (dowolny) budżet', + 'rule_trigger_has_no_tag_choice' => 'Brak tagów', + 'rule_trigger_has_no_tag' => 'Transakcja bez tagów', + 'rule_trigger_has_any_tag_choice' => 'Ma (dowolny) tag (lub kilka)', + 'rule_trigger_has_any_tag' => 'Transakcja ma (dowolny) tag (lub kilka)', 'rule_action_set_category' => 'Ustaw kategorię na ":action_value"', 'rule_action_clear_category' => 'Wyczyść kategorię', 'rule_action_set_budget' => 'Ustaw budżet na ":action_value"', @@ -321,7 +305,7 @@ return [ 'rule_action_prepend_description' => 'Poprzedź opis wartością ":action_value"', 'rule_action_set_category_choice' => 'Ustaw kategorię na..', 'rule_action_clear_category_choice' => 'Wyczyść wszystkie kategorie', - 'rule_action_set_budget_choice' => 'Ustaw budżetu na..', + 'rule_action_set_budget_choice' => 'Ustaw budżet na..', 'rule_action_clear_budget_choice' => 'Wyczyść wszystkie budżety', 'rule_action_add_tag_choice' => 'Dodaj tag..', 'rule_action_remove_tag_choice' => 'Usuń tag..', @@ -335,11 +319,13 @@ return [ 'rule_action_set_destination_account' => 'Ustaw konto docelowe na :action_value', // tags - 'store_new_tag' => 'Zapisz nowy tag', + 'store_new_tag' => 'Zachowaj nowy tag', 'update_tag' => 'Zmodyfikuj tag', 'no_location_set' => 'Nie ustawiono lokalizacji.', 'meta_data' => 'Metadane', 'location' => 'Lokalizacja', + 'without_date' => 'Bez daty', + 'result' => 'Wynik', // preferences 'pref_home_screen_accounts' => 'Konta na stronie domowej', @@ -359,12 +345,12 @@ return [ 'pref_custom_fiscal_year_help' => 'W krajach, w których rok podatkowy nie zaczyna się 1 stycznia i nie kończy 31 grudnia, możesz włączyć tą opcję oraz podać początek / koniec roku podatkowego', 'pref_fiscal_year_start_label' => 'Początek roku podatkowego', 'pref_two_factor_auth' => 'Weryfikacja dwuetapowa', - 'pref_two_factor_auth_help' => 'When you enable 2-step verification (also known as two-factor authentication), you add an extra layer of security to your account. You sign in with something you know (your password) and something you have (a verification code). Verification codes are generated by an application on your phone, such as Authy or Google Authenticator.', + 'pref_two_factor_auth_help' => 'Po włączeniu weryfikacji dwuetapowej (znanej również jako uwierzytelnianie dwuskładnikowe) dodajesz dodatkową warstwę zabezpieczeń do swojego konta. Logujesz się czymś, co znasz (hasło) i czymś masz coś (kod weryfikacyjny). Kody weryfikacyjne generowane są przez aplikację w telefonie, na przykład Authy lub Google Authenticator.', 'pref_enable_two_factor_auth' => 'Włącz weryfikację dwuetapową', 'pref_two_factor_auth_disabled' => 'Kod weryfikacji dwuetapowej został usunięty i wyłączony', 'pref_two_factor_auth_remove_it' => 'Nie zapomnij usunąć konta z aplikacji uwierzytelniajcej!', 'pref_two_factor_auth_code' => 'Zweryfikuj kod', - 'pref_two_factor_auth_code_help' => 'Scan the QR code with an application on your phone such as Authy or Google Authenticator and enter the generated code.', + 'pref_two_factor_auth_code_help' => 'Zeskanuj kod QR za pomocą aplikacji w telefonie, takiej jak Authy lub Google Authenticator i wprowadź wygenerowany kod.', 'pref_two_factor_auth_reset_code' => 'Zresetuj kod weryfikacyjny', 'pref_two_factor_auth_remove_code' => 'Usuń kod weryfikacyjny', 'pref_two_factor_auth_remove_will_disable' => '(to również wyłączy uwierzytelnianie dwuskładnikowe)', @@ -383,21 +369,21 @@ return [ 'transaction_page_size_label' => 'Rozmiar strony', 'between_dates' => '(:start i :end)', 'pref_optional_fields_transaction' => 'Opcjonalne pola dla transakcji', - '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.', + 'pref_optional_fields_transaction_help' => 'Domyślnie nie wszystkie pola są aktywne podczas tworzenia nowej transakcji (aby uniknąć bałaganu). Poniżej możesz włączyć te pola, jeśli uważasz, że mogą one być przydatne dla Ciebie. Oczywiście każde pole, które jest wyłączone, ale już wypełnione, będzie widoczne niezależnie od ustawienia.', 'optional_tj_date_fields' => 'Pola dat', 'optional_tj_business_fields' => 'Pola biznesowe', 'optional_tj_attachment_fields' => 'Pola załączników', - 'pref_optional_tj_interest_date' => 'Interest date', + 'pref_optional_tj_interest_date' => 'Data odsetek', 'pref_optional_tj_book_date' => 'Data księgowania', - 'pref_optional_tj_process_date' => 'Processing date', + 'pref_optional_tj_process_date' => 'Data przetworzenia', 'pref_optional_tj_due_date' => 'Termin realizacji', 'pref_optional_tj_payment_date' => 'Data płatności', 'pref_optional_tj_invoice_date' => 'Data faktury', - 'pref_optional_tj_internal_reference' => 'Internal reference', + 'pref_optional_tj_internal_reference' => 'Wewnętrzny numer', 'pref_optional_tj_notes' => 'Notatki', 'pref_optional_tj_attachments' => 'Załączniki', 'optional_field_meta_dates' => 'Daty', - 'optional_field_meta_business' => 'Business', + 'optional_field_meta_business' => 'Biznesowe', 'optional_field_attachments' => 'Załączniki', 'optional_field_meta_data' => 'Opcjonalne metadane', @@ -414,20 +400,20 @@ return [ 'password' => 'Hasło', 'are_you_sure' => 'Jesteś pewny? Nie możesz tego cofnąć.', 'delete_account_button' => 'USUŃ swoje konto', - 'invalid_current_password' => 'Nieprawidłowe hasło bieżące!', + 'invalid_current_password' => 'Nieprawidłowe bieżące hasło!', 'password_changed' => 'Hasło zostało zmienione!', 'should_change' => 'Chodzi o to, aby zmienić swoje hasło.', 'invalid_password' => 'Nieprawidłowe hasło!', - '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.', + 'what_is_pw_security' => 'Co to jest "Sprawdź bezpieczeństwo hasła"?', + 'secure_pw_title' => 'Jak wybrać bezpieczne hasło', + 'secure_pw_history' => 'W sierpniu 2017 r. znany analityk ds. bezpieczeństwa Troy Hunt opublikował listę 306 milionów skradzionych haseł. Hasła zostały skradzione podczas włamań w firmach takich jak LinkedIn, Adobe i NeoPets (i wiele innych).', + 'secure_pw_check_box' => 'Zaznaczając pole, Firefly III wysyła skrót SHA1 Twojego hasła do strony internetowej Troy Hunt, aby sprawdzić, czy znajduje się na liście. To powstrzyma Cię przed używaniem niebezpiecznych haseł, co jest zalecane w najnowszej specjalnej publikacji Narodowy Instytut Standaryzacji i Technologii (NIST) na ten temat.', + 'secure_pw_sha1' => 'Myślałem, że SHA1 zostało złamane?', + 'secure_pw_hash_speed' => 'Tak, ale nie w tym kontekście. Jak można przeczytać na stronie z wyszczególnieniem sposobu ich złamania SHA1, teraz jest nieco łatwiej znaleźć "kolizję": inny ciąg znaków, który prowadzi do tego samego skrótu SHA1. Teraz trwa to tylko 10 000 lat przy użyciu maszyny z jedną kartą graficzną.', + 'secure_pw_hash_security' => 'Ta kolizja nie byłaby równa Twojemu hasłu ani nie byłaby użyteczna na stronie takiej jak Firefly III. Ta aplikacja nie używa algorytmu SHA1 do weryfikacji hasła. Można więc bezpiecznie zaznaczyć to pole. Twoje hasło jest skracane (mieszane, hashowane) i wysyłane szyfrowanym połączeniem (HTTPS).', + '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ę.', // attachments @@ -472,12 +458,12 @@ return [ 'convert_please_set_asset_destination' => 'Proszę wybierz konto aktywów, do którego będą wychodzić pieniądze.', 'convert_please_set_expense_destination' => 'Proszę wybierz konto wydatków, do którego będą wychodzić pieniądze.', 'convert_please_set_asset_source' => 'Proszę wybierz konto aktywów, z którego będą przychodzić pieniądze.', - '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' => 'If you convert this withdrawal into a transfer, :amount will be transferred from :sourceName to a new asset account, instead of being paid to :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.', + 'convert_explanation_withdrawal_deposit' => 'Jeśli przekonwertujesz tę wypłatę na wpłatę, kwota :amount zostanie wpłacona na konto :sourceName zamiast wypłacona z niego.', + 'convert_explanation_withdrawal_transfer' => 'Jeśli przekonwertujesz tę wypłatę na transfer, kwota :amount zostanie przelana z konta :sourceName na nowe konto aktywów zamiast płatności dla :destinationName.', + 'convert_explanation_deposit_withdrawal' => 'Jeśli przekonwertujesz tę wpłatę na wypłatę, kwota :amount zostanie wypłacone z konta :destinationName zamiast wpłacone na nie.', + 'convert_explanation_deposit_transfer' => 'Jeśli przekonwertujesz tę wpłatę na transfer, kwota :amount zostanie przelana z konta aktywów, które wybierzesz na konto :destinationName.', + 'convert_explanation_transfer_withdrawal' => 'Jeśli przekonwertujesz ten transfer na wypłatę, kwota :amount zostanie przelana z konta :sourceName na nowe konto docelowe jako wydatek, zamiast dla :destinationName jako transfer.', + 'convert_explanation_transfer_deposit' => 'Jeśli przekonwertujesz ten transfer na wpłatę, kwota :amount zostanie zarejestrowana jako wpłata na konto :destinationName, zamiast transferowana na nie.', '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', @@ -498,13 +484,13 @@ return [ 'store_currency' => 'Zapisz nową walutę', 'update_currency' => 'Modyfikuj walutę', 'new_default_currency' => ':name jest teraz domyślną walutą.', - 'cannot_delete_currency' => 'Nie można usunąć :name, ponieważ jest on nadal używany.', + 'cannot_delete_currency' => 'Nie można usunąć waluty :name, ponieważ jest ona nadal używana.', 'deleted_currency' => 'Waluta :name została usunięta', 'created_currency' => 'Waluta :name została utworzona', 'updated_currency' => 'Waluta :name została zmodyfikowana', 'ask_site_owner' => 'Poproś :owner aby dodał, usunął lub zmodyfikował waluty.', 'currencies_intro' => 'Firefly III obsługuje różne waluty, które można ustawić i włączyć tutaj.', - 'make_default_currency' => 'ustaw domyślną', + 'make_default_currency' => 'ustaw jako domyślną', 'default_currency' => 'domyślna', // forms: @@ -523,7 +509,6 @@ return [ 'createBudget' => 'Nowy budżet', 'inactiveBudgets' => 'Nieaktywne budżety', 'without_budget_between' => 'Transakcje bez budżetu między :start i :end', - 'budget_in_month' => ':name w :month', 'delete_budget' => 'Usuń budżet ":name"', 'deleted_budget' => 'Usunięto budżet ":name"', 'edit_budget' => 'Modyfikuj budżet ":name"', @@ -534,7 +519,7 @@ return [ 'budget_period_navigator' => 'Period navigator', // bills: - 'matching_on' => 'Matching on', + 'matching_on' => 'Pasuje do', 'between_amounts' => 'między :low i :high.', 'repeats' => 'Powtarza się', 'connected_journals' => 'Powiązane transakcje', @@ -545,7 +530,7 @@ return [ 'deleted_bill' => 'Usunięto rachunek ":name"', 'edit_bill' => 'Modyfikuj rachunek ":name"', 'more' => 'Więcej', - 'rescan_old' => 'Rescan old transactions', + 'rescan_old' => 'Przeskanuj stare transakcje', 'update_bill' => 'Aktualizuj rachunek', 'updated_bill' => 'Zaktualizowano rachunek ":name"', 'store_new_bill' => 'Zapisz nowy rachunek', @@ -554,10 +539,10 @@ return [ 'rescanned_bill' => 'Zeskanowano wszystko.', 'average_bill_amount_year' => 'Średnia kwota rachunku (:year)', 'average_bill_amount_overall' => 'Średnia kwota rachunku (ogólnie)', - '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', + 'not_or_not_yet' => 'Nie (jeszcze)', + 'not_expected_period' => 'Nie oczekiwany w tym okresie', + 'bill_is_active' => 'Rachunek jest aktywny', + 'bill_will_automatch' => 'Rachunek będzie automatycznie powiązany z pasującymi transakcjami', // accounts: 'details_for_asset' => 'Szczegóły konta aktywów ":name"', 'details_for_expense' => 'Szczegóły konta wydatków ":name"', @@ -597,9 +582,7 @@ return [ 'select_more_than_one_category' => 'Proszę wybierz więcej niż jedną kategorię', 'select_more_than_one_budget' => 'Proszę wybierz więcej niż jeden budżet', 'select_more_than_one_tag' => 'Proszę wybierz więcej niż jeden tag', - 'from_to' => 'Od :start do :end', - 'from_to_breadcrumb' => 'od :start do :end', - 'account_default_currency' => 'If you select another currency, new transactions from this account will have this currency pre-selected.', + 'account_default_currency' => 'Jeśli wybierzesz inną walutę, nowe transakcje z tego konta będą miały tę walutę wstępnie wybraną.', // categories: 'new_category' => 'Nowa kategoria', @@ -632,15 +615,20 @@ return [ 'deleted_transfer' => 'Pomyślnie usunięto transfer ":description"', 'stored_journal' => 'Pomyślnie utworzono nową transakcję ":description"', 'select_transactions' => 'Wybierz transakcje', - 'stop_selection' => 'Stop selecting transactions', + 'stop_selection' => 'Przestań wybierać transakcje', 'edit_selected' => 'Modyfikuj zaznaczone', 'delete_selected' => 'Usuń zaznaczone', 'mass_delete_journals' => 'Usuń wiele transakcji', 'mass_edit_journals' => 'Modyfikuj wiele transakcji', - '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.', + 'cannot_edit_other_fields' => 'Nie możesz masowo modyfikować innych pól niż te tutaj, ponieważ nie ma miejsca, aby je pokazać. Proszę użyć ikony edycji i edytować je jedno po drugim, jeśli chcesz edytować te pola.', + 'perm-delete-many' => 'Usuwanie wielu elementów jednocześnie może być bardzo destrukcyjne. Proszę zachować ostrożność.', 'mass_deleted_transactions_success' => 'Usunięto :amount transakcję(i).', 'mass_edited_transactions_success' => 'Zaktualizowano :amount transakcję(i)', + 'opt_group_no_account_type' => '(brak typu konta)', + 'opt_group_defaultAsset' => 'Domyślne konta aktywów', + 'opt_group_savingAsset' => 'Konta oszczędnościowe', + 'opt_group_sharedAsset' => 'Współdzielone konta aktywów', + 'opt_group_ccAsset' => 'Karty kredytowe', // new user: @@ -656,8 +644,6 @@ return [ 'yourAccounts' => 'Twoje konta', 'budgetsAndSpending' => 'Budżety i wydatki', 'savings' => 'Oszczędności', - 'markAsSavingsToContinue' => 'Mark your asset accounts as "Savings account" to fill this panel', - 'createPiggyToContinue' => 'Utwórz skarbonki aby wypełnić ten panel.', 'newWithdrawal' => 'Nowy wydatek', 'newDeposit' => 'Nowa wpłata', 'newTransfer' => 'Nowy transfer', @@ -665,8 +651,6 @@ return [ 'moneyOut' => 'Obciążenia', 'billsToPay' => 'Rachunki do zapłacenia', 'billsPaid' => 'Zapłacone rachunki', - 'divided' => 'podzielone', - 'toDivide' => 'left to divide', // menu and titles, should be recycled as often as possible: 'currency' => 'Waluta', @@ -703,7 +687,7 @@ return [ 'no' => 'Nie', 'amount' => 'Kwota', 'overview' => 'Przegląd', - 'saveOnAccount' => 'Save on account', + 'saveOnAccount' => 'Oszczędzaj na koncie', 'unknown' => 'Nieznane', 'daily' => 'Dziennie', 'monthly' => 'Miesięcznie', @@ -713,33 +697,24 @@ return [ // reports: 'report_default' => 'Domyślny raport finansowy między :start i :end', 'report_audit' => 'Przegląd historii transakcji między :start i :end', - 'report_category' => 'Raport kategorii między :start i :end', - 'report_budget' => 'Raport budżetów między :start i :end', - 'report_tag' => 'Tag report between :start and :end', + 'report_category' => 'Raport kategorii między :start a :end', + 'report_budget' => 'Raport budżetów między :start a :end', + 'report_tag' => 'Raport tagów między :start a :end', 'quick_link_reports' => 'Szybkie linki', 'quick_link_default_report' => 'Domyślny raport finansowy', 'quick_link_audit_report' => 'Przegląd historii transakcji', 'report_this_month_quick' => 'Bieżący miesiąc, wszystkie konta', 'report_this_year_quick' => 'Bieżący rok, wszystkie konta', 'report_this_fiscal_year_quick' => 'Bieżący rok podatkowy, wszystkie konta', - 'report_all_time_quick' => 'All-time, all accounts', - 'reports_can_bookmark' => 'Remember that reports can be bookmarked.', + 'report_all_time_quick' => 'Cały czas, wszystkie konta', + 'reports_can_bookmark' => 'Pamiętaj, że raporty można dodać do zakładek.', 'incomeVsExpenses' => 'Dochody a wydatki', 'accountBalances' => 'Salda kont', - 'balanceStartOfYear' => 'Saldo na początku roku', - 'balanceEndOfYear' => 'Saldo na końcu roku', - 'balanceStartOfMonth' => 'Saldo na początku miesiąca', - 'balanceEndOfMonth' => 'Saldo na końcu miesiąca', 'balanceStart' => 'Saldo na początku okresu', 'balanceEnd' => 'Saldo na końcu okresu', - 'reportsOwnAccounts' => 'Raporty dla własnych kont', - 'reportsOwnAccountsAndShared' => 'Reports for your own accounts and shared accounts', 'splitByAccount' => 'Split by account', - 'balancedByTransfersAndTags' => 'Balanced by transfers and tags', 'coveredWithTags' => 'Covered with tags', 'leftUnbalanced' => 'Left unbalanced', - 'expectedBalance' => 'Przewidywane saldo', - 'outsideOfBudgets' => 'Poza budżetami', 'leftInBudget' => 'Pozostało w budżecie', 'sumOfSums' => 'Suma sum', 'noCategory' => '(bez kategorii)', @@ -752,19 +727,12 @@ return [ 'topX' => 'top :number', 'show_full_list' => 'Pokaż całą listę', 'show_only_top' => 'Show only top :number', - 'sum_of_year' => 'Sum of year', - 'sum_of_years' => 'Sum of years', - 'average_of_year' => 'Average of year', - 'average_of_years' => 'Average of years', - 'categories_earned_in_year' => 'Kategorie (wg przychodów)', - 'categories_spent_in_year' => 'Kategorie (wg wydatków)', 'report_type' => 'Typ raportu', 'report_type_default' => 'Domyślny raport finansowy', 'report_type_audit' => 'Przegląd historii transakcji (audyt)', 'report_type_category' => 'Raport kategorii', 'report_type_budget' => 'Raport budżetów', 'report_type_tag' => 'Raport tagów', - 'report_type_meta-history' => 'Przegląd kategorii, budżetów i rachunków', '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' => 'Uwzględnione konta', 'report_date_range' => 'Zakres dat', @@ -785,20 +753,20 @@ return [ 'select_category' => 'Wybierz kategorię(e)', 'select_budget' => 'Wybierz budżet(y).', 'select_tag' => 'Wybierz tag(i).', - 'income_per_category' => 'Dochód wg kategorii', - 'expense_per_category' => 'Wydatek wg kategorii', - 'expense_per_budget' => 'Wydatek wg budżetu', - 'income_per_account' => 'Dochód wg konta', - 'expense_per_account' => 'Wydatek wg konta', - 'expense_per_tag' => 'Wydatek wg tagu', - 'income_per_tag' => 'Przychód wg tagu', - '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)', + 'income_per_category' => 'Dochody wg kategorii', + 'expense_per_category' => 'Wydatki wg kategorii', + 'expense_per_budget' => 'Wydatki wg budżetu', + 'income_per_account' => 'Dochody wg konta', + 'expense_per_account' => 'Wydatki wg konta', + 'expense_per_tag' => 'Wydatki wg tagu', + 'income_per_tag' => 'Dochody wg tagu', + 'include_expense_not_in_budget' => 'Uwzględnij wydatki spoza wybranych budżetów', + 'include_expense_not_in_account' => 'Uwzględnij wydatki spoza wybranych kont', + 'include_expense_not_in_category' => 'Uwzględnij wydatki spoza wybranych kategorii', + 'include_income_not_in_category' => 'Uwzględnij przychody spoza wybranych kategorii', + 'include_income_not_in_account' => 'Uwzględnij przychody spoza wybranych kont', + 'include_income_not_in_tags' => 'Uwzględnij przychody spoza wybranych tagów', + 'include_expense_not_in_tags' => 'Uwzględnij wydatki spoza wybranych tagów', 'everything_else' => 'Wszystko inne', 'income_and_expenses' => 'Dochody i wydatki', 'spent_average' => 'Wydano (średnia)', @@ -814,22 +782,24 @@ return [ 'account_role_sharedAsset' => 'Współdzielone konto aktywów', 'account_role_savingAsset' => 'Konto oszczędnościowe', 'account_role_ccAsset' => 'Karta kredytowa', + 'budget_chart_click' => 'Please click on a budget name in the table above to see a chart.', + 'category_chart_click' => 'Please click on a category name in the table above to see a chart.', + // charts: 'chart' => 'Wykres', - 'dayOfMonth' => 'Dzień miesiąca', 'month' => 'Miesiąc', 'budget' => 'Budżet', 'spent' => 'Wydano', 'spent_in_budget' => 'Wydano w budżecie', 'left_to_spend' => 'Pozostało do wydania', - 'earned' => 'Zarobione', + 'earned' => 'Zarobiono', 'overspent' => 'Przepłacono', 'left' => 'Pozostało', 'no_budget' => '(bez budżetu)', 'max-amount' => 'Maksymalna kwota', 'min-amount' => 'Minimalna kwota', - 'journal-amount' => 'Current bill entry', + 'journal-amount' => 'Faktyczna kwota', 'name' => 'Nazwa', 'date' => 'Data', 'paid' => 'Zpłacone', @@ -838,7 +808,6 @@ return [ 'budgeted' => 'Zabudżetowano', 'period' => 'Okres', 'balance' => 'Saldo', - 'summary' => 'Podsumowanie', 'sum' => 'Suma', 'average' => 'Średno', 'balanceFor' => 'Saldo dla :name', @@ -846,59 +815,50 @@ return [ // piggy banks: 'add_money_to_piggy' => 'Dodaj pieniądze do skarbonki ":name"', 'piggy_bank' => 'Skarbonka', - 'new_piggy_bank' => 'New piggy bank', + 'new_piggy_bank' => 'Nowa skarbonka', 'store_piggy_bank' => 'Zapisz nową skarbonkę', 'stored_piggy_bank' => 'Zapisz nową skarbonkę ":name"', 'account_status' => 'Status konta', - 'left_for_piggy_banks' => 'Left for piggy banks', - 'sum_of_piggy_banks' => 'Sum of piggy banks', + 'left_for_piggy_banks' => 'Dostępne dla skarbonek', + 'sum_of_piggy_banks' => 'Suma skarbonek', 'saved_so_far' => 'Zaoszczędzono do tej pory', 'left_to_save' => 'Pozostało do zaoszczędzenia', - 'suggested_amount' => 'Suggested monthly amount to save', + 'suggested_amount' => 'Sugerowana miesięczna kwota do odłożenia', 'add_money_to_piggy_title' => 'Dodaj pieniądze do skarbonki ":name"', 'remove_money_from_piggy_title' => 'Usuń pieniądze ze skarbonki ":name"', 'add' => 'Dodaj', + 'no_money_for_piggy' => 'Nie masz pieniędzy, które mógłbyś umieścić w tej skarbonce.', - 'remove' => 'Usuń', - 'max_amount_add' => 'Maksymalną kwotą, którą możesz dodać jest', - 'max_amount_remove' => 'Maksymalną kwotą, którą możesz usunąć jest', - 'update_piggy_button' => 'Aktualizuj skarbonkę', - 'update_piggy_title' => 'Aktualizuj skarbonkę ":name"', - 'updated_piggy_bank' => 'Zaktualizowano skarbonkę ":name"', - 'details' => 'Szczegóły', - 'events' => 'Zdarzenia', - 'target_amount' => 'Kwota docelowa', - 'start_date' => 'Data rozpoczęcia', - 'target_date' => 'Data docelowa', - 'no_target_date' => 'No target date', - 'todo' => 'do wykonania', - 'table' => 'Tabela', - 'piggy_bank_not_exists' => 'Skarbonka już nie istnieje.', - 'add_any_amount_to_piggy' => 'Dodaj pieniądze do skarbonki aby osiągnąć twój cel w kwocie :amount.', - 'add_set_amount_to_piggy' => 'Add :amount to fill this piggy bank on :date', - 'delete_piggy_bank' => 'Usuń skarbonkę ":name"', - 'cannot_add_amount_piggy' => 'Nie można dodać :amount do ":name".', - 'cannot_remove_from_piggy' => 'Could not remove :amount from ":name".', - 'deleted_piggy_bank' => 'Usunięto skarbonkę ":name"', - 'added_amount_to_piggy' => 'Added :amount to ":name"', - 'removed_amount_from_piggy' => 'Removed :amount from ":name"', - 'cannot_remove_amount_piggy' => 'Could not remove :amount from ":name".', + 'remove' => 'Usuń', + 'max_amount_add' => 'Maksymalną kwotą, którą możesz dodać jest', + 'max_amount_remove' => 'Maksymalną kwotą, którą możesz usunąć jest', + 'update_piggy_button' => 'Aktualizuj skarbonkę', + 'update_piggy_title' => 'Aktualizuj skarbonkę ":name"', + 'updated_piggy_bank' => 'Zaktualizowano skarbonkę ":name"', + 'details' => 'Szczegóły', + 'events' => 'Zdarzenia', + 'target_amount' => 'Kwota docelowa', + 'start_date' => 'Data rozpoczęcia', + 'target_date' => 'Data docelowa', + 'no_target_date' => 'Brak daty docelowej', + 'table' => 'Tabela', + 'delete_piggy_bank' => 'Usuń skarbonkę ":name"', + 'cannot_add_amount_piggy' => 'Nie można dodać :amount do ":name".', + 'cannot_remove_from_piggy' => 'Nie można usunąć :amount z ":name".', + 'deleted_piggy_bank' => 'Usunięto skarbonkę ":name"', + 'added_amount_to_piggy' => 'Dodano :amount do ":name"', + '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', - 'edit_tag' => 'Modyfikuj tag ":tag"', - 'updated_tag' => 'Zaktualizowano tag ":tag"', - 'created_tag' => 'Tag ":tag" został utworzony!', - 'no_year' => 'Nie ustawiono roku', - 'no_month' => 'Nie ustawiono miesiąca', - 'tag_title_nothing' => 'Domyślne tagi', - 'tag_title_balancingAct' => 'Balancing act tags', - 'tag_title_advancePayment' => 'Advance payment 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', + 'edit_tag' => 'Modyfikuj tag ":tag"', + 'updated_tag' => 'Zaktualizowano tag ":tag"', + 'created_tag' => 'Tag ":tag" został utworzony!', 'transaction_journal_information' => 'Informacje o transakcji', 'transaction_journal_meta' => 'Meta informacje', @@ -913,56 +873,71 @@ return [ 'instance_configuration' => 'Konfiguracja', 'firefly_instance_configuration' => 'Opcje konfiguracji dla Firefly III', 'setting_single_user_mode' => 'Tryb pojedynczego użytkownika', - '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).', + 'setting_single_user_mode_explain' => 'Domyślnie, Firefly III pozwala na jednego (1) użytkownika: Ciebie. Jest to środek bezpieczeństwa uniemożliwiający innym używanie Twojej instalacji, chyba że im pozwolisz. Kolejne rejestracje są zablokowane. Jeżeli odznaczysz to pole, inne osoby będą mogły używać Twojej instalacji Firefly III (zakładając, że jest ona dostępna w Internecie).', 'store_configuration' => 'Zapisz konfigurację', 'single_user_administration' => 'User administration for :email', 'edit_user' => 'Modyfikuj użytkownika :email', - 'hidden_fields_preferences' => 'Not all fields are visible right now. You must enable them in your settings.', + 'hidden_fields_preferences' => 'Nie wszystkie pola są teraz widoczne. Należy je włączyć w ustawieniach.', 'user_data_information' => 'Dane użytkownika', 'user_information' => 'Informacja o użytkowniku', 'total_size' => 'łączny rozmiar', 'budget_or_budgets' => 'budżet(y)', - 'budgets_with_limits' => 'budget(s) with configured amount', + 'budgets_with_limits' => 'budżet(y) z określoną kwotą', 'rule_or_rules' => 'reguła(y)', 'rulegroup_or_groups' => 'grupa(y) reguł', - 'setting_must_confirm_account' => 'Potwierdzenie konta', - 'setting_must_confirm_account_explain' => 'When this setting is enabled, users must activate their account before it can be used.', 'configuration_updated' => 'Konfiguracja została zaktualizowana', 'setting_is_demo_site' => 'Strona demonstracyjna', - '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.', - 'setting_send_email_notifications' => 'Wyślij powiadomienia emailem', - 'setting_send_email_explain' => 'Firefly III can send you email notifications about certain events. They will be sent to :site_owner. This email address can be set in the .env file.', - 'block_code_bounced' => 'Email message(s) bounced', + 'setting_is_demo_site_explain' => 'Jeśli zaznaczysz to pole, ta instalacja będzie zachowywać się jak witryna demonstracyjna, co może mieć dziwne efekty uboczne.', + 'block_code_bounced' => 'Odrzucony e-mail potwierdzający', 'block_code_expired' => 'Demonstracyjne konto wygasło', - 'no_block_code' => 'No reason for block or user not blocked', + 'no_block_code' => 'Brak powody blokady lub użytkownik niezablokowany', + // 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' => 'Powiąż transakcje', + 'link_to_other_transaction' => 'Powiąż aktualną transakcję z inną transakcją', + 'select_transaction_to_link' => 'Wybierz transakcję, którą chcesz powiązać z tą transakcją', + 'this_transaction' => 'Ta transakcja', + '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.', + 'journals_error_linked' => 'Wybrane transakcje są już powiązane.', + 'journal_links' => 'Powiązane transakcje', + 'this_withdrawal' => 'Ta wypłata', + 'this_deposit' => 'Ta wpłata', + 'this_transfer' => 'Ten transfer', + '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', // split a transaction: - 'transaction_meta_data' => 'Transaction meta-data', - 'transaction_dates' => 'Daty transakcji', 'splits' => 'Podziały', - 'split_title_withdrawal' => 'Podziel swoją nową wypłatę', - 'split_intro_one_withdrawal' => 'Firefly obsługuje "dzielenie" wypłaty.', - 'split_intro_two_withdrawal' => 'Oznacza to, że ilość pieniędzy, które wydałeś jest podzielona między kilka kont wypłat, budżetów lub kategorii.', - 'split_intro_three_withdrawal' => 'For example: you could split your :total groceries so you pay :split_one from your "daily groceries" budget and :split_two from your "cigarettes" budget.', - 'split_table_intro_withdrawal' => 'Split your withdrawal in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_withdrawal' => 'Zachowaj podzieloną wypłatę', - 'update_splitted_withdrawal' => 'Aktualizuj podzieloną wypłatę', - 'split_title_deposit' => 'Podziel swoją nową wpłatę', - 'split_intro_one_deposit' => 'Firefly supports the "splitting" of a deposit.', - 'split_intro_two_deposit' => 'It means that the amount of money you\'ve earned is divided between several source revenue accounts or categories.', - 'split_intro_three_deposit' => 'For example: you could split your :total salary so you get :split_one as your base salary and :split_two as a reimbursment for expenses made.', - 'split_table_intro_deposit' => 'Split your deposit in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_deposit' => 'Zachowaj podzieloną wpłatę', - 'split_title_transfer' => 'Podziel swój nowy transfer', - 'split_intro_one_transfer' => 'Firefly supports the "splitting" of a transfer.', - 'split_intro_two_transfer' => 'It means that the amount of money you\'re moving is divided between several categories or piggy banks.', - 'split_intro_three_transfer' => 'For example: you could split your :total move so you get :split_one in one piggy bank and :split_two in another.', - 'split_table_intro_transfer' => 'Split your transfer in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_transfer' => 'Zachowaj podzielony transfer', 'add_another_split' => 'Dodaj kolejny podział', 'split-transactions' => 'Podziel transakcję', - 'split-new-transaction' => 'Podziel nową transakcję', 'do_split' => 'Podziel', 'split_this_withdrawal' => 'Podziel tą wypłatę', 'split_this_deposit' => 'Podziel tą wpłatę', @@ -977,48 +952,45 @@ return [ 'import_data' => 'Importuj dane', // import index page: - 'import_index_title' => 'Import data into Firefly III', + 'import_index_title' => 'Importuj dane do Firefly III', 'import_index_sub_title' => 'Indeks', - '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' => 'Witamy w procedurze importu Firefly III. Istnieje kilka sposobów importowania danych do Firefly III.', + 'import_index_intro' => 'Ta procedura pomoże Ci zaimportować pliki z Twojego banku do Firefly III. Proszę sprawdzić stronę pomocy w prawym górnym rogu.', 'import_index_file' => 'Wybierz swój plik', - '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_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', // supported file types: 'import_file_type_csv' => 'CSV (wartości oddzielone przecinkami)', // 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' => 'Skonfiguruj swój importowany plik', + 'import_config_bread_crumb' => 'Skonfiguruj swój plik', // import status page: 'import_status_bread_crumb' => 'Status importu', 'import_status_sub_title' => 'Status importu', - 'import_status_wait_title' => 'Please hold...', - 'import_status_wait_text' => 'This box will disappear in a moment.', + 'import_status_wait_title' => 'Proszę czekać...', + 'import_status_wait_text' => 'To pole za chwilę zniknie.', 'import_status_ready_title' => 'Import jest gotowy do uruchomienia', - '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_text' => 'Import jest gotowy do uruchomienia. Wszystkie potrzebne ustawienia zostały skonfigurowane. Pobierz proszę plik konfiguracyjny. Pomoże Ci on gdy import nie pójdzie zgodnie z planem. Aby rzeczywiście uruchomić import, można wykonać następujące polecenie w konsoli lub uruchomić importowanie z poziomu strony www. W zależności od konfiguracji, import przez konsolę da Ci więcej informacji zwrotnych.', 'import_status_ready_config' => 'Pobierz konfigurację', - '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_status_ready_start' => 'Rozpocznij Importowanie', + 'import_status_ready_share' => 'Rozważ proszę pobranie swojej konfiguracji i udostępnienie jej w centrum konfiguracji importu. Pozwoli to innym użytkownikom Firefly III łatwo importować swoje pliki.', + 'import_status_running_title' => 'Importowanie jest uruchomione', + 'import_status_running_placeholder' => 'Proszę czekać na aktualizację...', + 'import_status_errors_title' => 'Błędy podczas importowania', + 'import_status_errors_single' => 'Wystąpił błąd podczas importowania. Nie wydaje się być krytyczny.', + 'import_status_errors_multi' => 'Wystąpiły błędy podczas importowania. Nie wydają się być śmiertelne.', + 'import_status_fatal_title' => 'Wystąpił krytyczny błąd', + 'import_status_fatal_text' => 'Wystąpił błąd krytyczny, którego procedura importu nie naprawić. Proszę sprawdzić wyjaśnienia na czerwono poniżej.', + 'import_status_fatal_more' => 'Jeśli przekroczono limitu czasu, import zostanie zatrzymany w połowie. W przypadku niektórych konfiguracji serwerów, jedynie serwer przestał odpowiadać podczas gdy importowanie nadal działa w tle. Aby to sprawdzić, należy sprawdzić pliki dziennika. Jeśli problem będzie się powtarzał, zamiast tego, należy rozważyć Importowanie poprzez konsolę.', + '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_with_key' => 'Import z kluczem \':key\'', - // different states: - 'import_status_job_running' => 'Import jest w toku. Proszę o cierpliwość...', - // sandstorm.io errors and messages: 'sandstorm_not_available' => 'Ta funkcja nie jest dostępna, gdy używasz Firefly III w środowisku Sandstorm.io.', @@ -1061,8 +1033,8 @@ return [ 'no_transactions_imperative_transfers' => 'Have you moved some money around? Then you should write it down:', 'no_transactions_create_transfers' => 'Utwórz transfer', 'no_piggies_title_default' => 'Stwórzmy skarbonkę!', - '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_intro_default' => 'Nie posiadasz jeszcze żadnych skarbonek. Możesz stworzyć skarbonki aby dzielić swoje oszczędności i śledzić na co oszczędzasz.', + 'no_piggies_imperative_default' => 'Oszczędzasz pieniądze na coś? Utwórz skarbonkę i śledź:', 'no_piggies_create_default' => 'Utwórz nową skarbonkę', 'no_bills_title_default' => 'Stwórzmy rachunek!', 'no_bills_intro_default' => 'You have no bills yet. You can create bills to keep track of regular expenses, like your rent of insurance.', @@ -1070,4 +1042,4 @@ return [ 'no_bills_create_default' => 'Utwórz rachunek', -]; \ No newline at end of file +]; diff --git a/resources/lang/pl_PL/form.php b/resources/lang/pl_PL/form.php index fe143cc460..08f14827ea 100644 --- a/resources/lang/pl_PL/form.php +++ b/resources/lang/pl_PL/form.php @@ -34,7 +34,7 @@ return [ 'journal_source_account_name' => 'Konto przychodów (źródło)', 'journal_source_account_id' => 'Konto aktywów (źródło)', 'BIC' => 'BIC', - 'verify_password' => 'Verify password security', + 'verify_password' => 'Sprawdź bezpieczeństwo hasła', 'account_from_id' => 'Z konta', 'account_to_id' => 'Na konto', 'source_account' => 'Konto źródłowe', @@ -58,20 +58,20 @@ return [ 'accountRole' => 'Rola konta', 'openingBalanceDate' => 'Data salda otwarcia', 'ccType' => 'Plan płatności kartą kredytową', - 'ccMonthlyPaymentDate' => 'Credit card monthly payment date', + 'ccMonthlyPaymentDate' => 'Miesięczny termin spłaty karty kredytowej', 'piggy_bank_id' => 'Skarbonka', 'returnHere' => 'Wróć tutaj', - 'returnHereExplanation' => 'After storing, return here to create another one.', + 'returnHereExplanation' => 'Po zapisaniu, wrócić tutaj.', 'returnHereUpdateExplanation' => 'Po aktualizacji, wróć tutaj.', 'description' => 'Opis', 'expense_account' => 'Konto wydatków', 'revenue_account' => 'Konto przychodów', 'decimal_places' => 'Miejsca dziesiętne', - 'exchange_rate_instruction' => 'Foreign currencies', - 'exchanged_amount' => 'Exchanged amount', - 'source_amount' => 'Amount (source)', - 'destination_amount' => 'Amount (destination)', - 'native_amount' => 'Native amount', + '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', 'revenue_account_source' => 'Konto przychodów (źródło)', 'source_account_asset' => 'Konto źródłowe (konto aktywów)', @@ -86,9 +86,9 @@ return [ 'amount' => 'Kwota', 'date' => 'Data', - 'interest_date' => 'Interest date', + 'interest_date' => 'Data odsetek', 'book_date' => 'Data księgowania', - 'process_date' => 'Processing date', + 'process_date' => 'Data przetworzenia', 'category' => 'Kategoria', 'tags' => 'Tagi', 'deletePermanently' => 'Usuń trwale', @@ -100,6 +100,7 @@ return [ 'code' => 'Kod', 'iban' => 'IBAN', 'accountNumber' => 'Numer konta', + 'creditCardNumber' => 'Numer karty kredytowej', 'has_headers' => 'Nagłówki', 'date_format' => 'Format daty', 'specifix' => 'Bank- or file specific fixes', @@ -135,6 +136,7 @@ return [ 'delete_attachment' => 'Usuń załącznik ":name"', 'delete_rule' => 'Usuń regułę ":title"', 'delete_rule_group' => 'Usuń grupę reguł ":title"', + 'delete_link_type' => 'Delete link type ":name"', '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"?', @@ -147,11 +149,14 @@ return [ 'journal_areYouSure' => 'Czy na pewno chcesz usunąć transakcję opisaną ":description"?', 'mass_journal_are_you_sure' => 'Czy na pewno chcesz usunąć te transakcje?', 'tag_areYouSure' => 'Czy na pewno chcesz usunąć tag ":tag"?', + 'journal_link_areYouSure' => 'Czy na pewno chcesz usunąć powiązanie między :source a :destination?', + 'linkType_areYouSure' => 'Are you sure you want to delete the link type ":name" (":inward" / ":outward")?', 'permDeleteWarning' => 'Usuwanie rzeczy z Firefly jest trwałe i nie można tego cofnąć.', 'mass_make_selection' => 'You can still prevent items from being deleted by removing the checkbox.', 'delete_all_permanently' => 'Trwale usuń zaznaczone', 'update_all_journals' => 'Zmodyfikuj te transakcje', '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.', @@ -188,5 +193,8 @@ return [ 'due_date' => 'Termin realizacji', 'payment_date' => 'Data płatności', 'invoice_date' => 'Data faktury', - 'internal_reference' => 'Internal reference', -]; \ No newline at end of file + 'internal_reference' => 'Wewnętrzny numer', + + 'inward' => 'Inward description', + 'outward' => 'Outward description', +]; diff --git a/resources/lang/pl_PL/help.php b/resources/lang/pl_PL/help.php index 49f482feda..1715bbe160 100644 --- a/resources/lang/pl_PL/help.php +++ b/resources/lang/pl_PL/help.php @@ -32,4 +32,4 @@ return [ 'main-content-end-text' => 'Pamiętaj, że każda strona ma małą ikonkę ze znakiem zapytania w prawym górnym rogu. Kliknij ją aby otrzymać dodatkowe informacje o stronie, na której się znajdujesz.', 'index' => 'indeks', 'home' => 'początek', -]; \ No newline at end of file +]; diff --git a/resources/lang/pl_PL/intro.php b/resources/lang/pl_PL/intro.php index e945adcec8..02a0eead23 100644 --- a/resources/lang/pl_PL/intro.php +++ b/resources/lang/pl_PL/intro.php @@ -44,17 +44,17 @@ return [ '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 or multiple categories.', + '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 you how your expenses and income per category.', + 'reports_report_category_incomeAndExpensesChart' => 'This chart shows your expenses and income per category.', - 'reports_report_tag_intro' => 'This report will give you insight in or multiple tags.', + '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 you how your expenses and income per tag.', + 'reports_report_tag_incomeAndExpensesChart' => 'This chart shows your expenses and income per tag.', - 'reports_report_budget_intro' => 'This report will give you insight in or multiple budgets.', - 'reports_report_budget_pieCharts' => 'These charts will give you insight in expenses and income per budget or per account.', - 'reports_report_budget_incomeAndExpensesChart' => 'This chart shows you how your expenses and income per budget.', + '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.', @@ -118,4 +118,4 @@ return [ // 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/pl_PL/list.php b/resources/lang/pl_PL/list.php index c8b2e9d464..f4604f245d 100644 --- a/resources/lang/pl_PL/list.php +++ b/resources/lang/pl_PL/list.php @@ -12,80 +12,78 @@ 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' => 'Internal reference', - 'date' => 'Data', - 'interest_date' => 'Stopa procentowa', - 'book_date' => 'Data księgowania', - 'process_date' => 'Processing date', - 'due_date' => 'Termin realizacji', - 'payment_date' => 'Data płatności', - 'invoice_date' => 'Data faktury', - 'interal_reference' => 'Internal reference', - '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' => 'Registered at', - 'is_activated' => 'Jest aktywny', - 'is_blocked' => 'Jest zablokowany', - 'is_admin' => 'Jest administratorem', - 'has_two_factor' => 'Ma dwustopniową autoryzację', - 'confirmed_from' => 'Potwierdzone z', - 'registered_from' => 'Registered from', - 'blocked_code' => 'Block code', - 'domain' => 'Domena', - 'registration_attempts' => 'Próby rejestracji', - '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', -]; \ No newline at end of file + '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', +]; diff --git a/resources/lang/pl_PL/pagination.php b/resources/lang/pl_PL/pagination.php index c240761f0f..478654dd97 100644 --- a/resources/lang/pl_PL/pagination.php +++ b/resources/lang/pl_PL/pagination.php @@ -16,4 +16,4 @@ return [ 'previous' => '« Poprzednia', 'next' => 'Następna »', -]; \ No newline at end of file +]; diff --git a/resources/lang/pl_PL/passwords.php b/resources/lang/pl_PL/passwords.php index 248c68b5fd..519a6ccd14 100644 --- a/resources/lang/pl_PL/passwords.php +++ b/resources/lang/pl_PL/passwords.php @@ -18,4 +18,4 @@ return [ 'sent' => 'Wysłaliśmy link do resetowania hasła na twój adres email!', 'reset' => 'Twoje hasło zostało zresetowane!', 'blocked' => 'Przynajmniej próbowałeś.', -]; \ No newline at end of file +]; diff --git a/resources/lang/pl_PL/validation.php b/resources/lang/pl_PL/validation.php index 6d99bdde25..84e7df6be6 100644 --- a/resources/lang/pl_PL/validation.php +++ b/resources/lang/pl_PL/validation.php @@ -17,7 +17,6 @@ return [ 'deleted_user' => 'Ze względu na zabezpieczenia nie możesz się zarejestrować używając tego adresu e-mail.', 'rule_trigger_value' => 'Ta wartość jest nieprawidłowa dla wybranego wyzwalacza.', 'rule_action_value' => 'Ta wartość jest nieprawidłowa dla wybranej akcji.', - 'invalid_domain' => 'Ze względu na zabezpieczenia nie możesz się zarejestrować z tej domeny.', 'file_already_attached' => 'Przesłany plik ":name" jest już dołączony do tego obiektu.', 'file_attached' => 'Pomyślnie wgrano plik ":name".', 'file_invalid_mime' => 'Plik ":name" jest typu ":mime", który nie jest akceptowany jako nowy plik do przekazania.', @@ -41,7 +40,7 @@ return [ 'between.string' => ':attribute musi zawierać pomiędzy :min a :max znaków.', 'between.array' => ':attribute musi zawierać pomiędzy :min a :max elementów.', 'boolean' => 'Pole :attribute musi być prawdą albo fałszem.', - 'confirmed' => 'The :attribute confirmation does not match.', + 'confirmed' => 'Pole :attribute i jego potwierdzenie nie pasują do siebie.', 'date' => ':attribute nie jest prawidłową datą.', 'date_format' => ':attribute rożni się od formatu :format.', 'different' => ':attribute oraz :other muszą się różnić.', @@ -90,5 +89,5 @@ return [ 'in_array' => 'Pole :attribute nie istnieje w :other.', 'present' => 'Pole :attribute musi być obecne.', 'amount_zero' => 'Całkowita kwota nie może być zerem', - '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 + 'secure_password' => 'To nie jest bezpieczne hasło. Proszę spróbować ponownie. Aby uzyskać więcej informacji odwiedź https://goo.gl/NCh2tN', +]; diff --git a/resources/lang/pt_BR/auth.php b/resources/lang/pt_BR/auth.php index a6d1e98e31..5345cea939 100644 --- a/resources/lang/pt_BR/auth.php +++ b/resources/lang/pt_BR/auth.php @@ -27,4 +27,4 @@ return [ 'failed' => 'Essas credenciais não correspondem aos nossos registros.', 'throttle' => 'Muitas tentativas de login. Por favor, tente novamente em :seconds segundos.', -]; \ No newline at end of file +]; diff --git a/resources/lang/pt_BR/breadcrumbs.php b/resources/lang/pt_BR/breadcrumbs.php index d88bc12f6f..1a97cb2988 100644 --- a/resources/lang/pt_BR/breadcrumbs.php +++ b/resources/lang/pt_BR/breadcrumbs.php @@ -13,31 +13,32 @@ declare(strict_types=1); */ return [ - 'home' => 'Início', - 'edit_currency' => 'Editar moeda ":name"', - 'delete_currency' => 'Excluir moeda ":moeda"', - 'newPiggyBank' => 'Criar um novo cofrinho', - 'edit_piggyBank' => 'Editar cofrinho ":name"', - 'preferences' => 'Preferências', - 'profile' => 'Perfil', - 'changePassword' => 'Alterar sua senha', - 'bills' => 'Faturas', - 'newBill' => 'Nova fatura', - 'edit_bill' => 'Editar fatura ":name"', - 'delete_bill' => 'Apagar fatura ":name"', - 'reports' => 'Relatórios', - 'search_result' => 'Search results for ":query"', - 'withdrawal_list' => 'Despesas', - 'deposit_list' => 'Receitas, renda e depósitos', - 'transfer_list' => 'Transferências', - 'transfers_list' => 'Transferências', - 'create_withdrawal' => 'Criar uma nova retirada', - 'create_deposit' => 'Criar um novo depósito', - 'create_transfer' => 'Criar nova transferência', - 'edit_journal' => 'Editar transação ":description"', - 'delete_journal' => 'Apagar transação ":description"', - 'tags' => 'Etiquetas', - 'createTag' => 'Criar nova etiqueta', - 'edit_tag' => 'Editar etiqueta ":tag"', - 'delete_tag' => 'Apagar etiqueta ":tag"', -]; \ No newline at end of file + 'home' => 'Início', + 'edit_currency' => 'Editar moeda ":name"', + 'delete_currency' => 'Excluir moeda ":moeda"', + 'newPiggyBank' => 'Criar um novo cofrinho', + 'edit_piggyBank' => 'Editar cofrinho ":name"', + 'preferences' => 'Preferências', + 'profile' => 'Perfil', + 'changePassword' => 'Alterar sua senha', + 'bills' => 'Faturas', + 'newBill' => 'Nova fatura', + 'edit_bill' => 'Editar fatura ":name"', + 'delete_bill' => 'Apagar fatura ":name"', + 'reports' => 'Relatórios', + 'search_result' => 'Search results for ":query"', + 'withdrawal_list' => 'Despesas', + 'deposit_list' => 'Receitas, renda e depósitos', + 'transfer_list' => 'Transferências', + 'transfers_list' => 'Transferências', + 'create_withdrawal' => 'Criar uma nova retirada', + 'create_deposit' => 'Criar um novo depósito', + 'create_transfer' => 'Criar nova transferência', + 'edit_journal' => 'Editar transação ":description"', + 'delete_journal' => 'Apagar transação ":description"', + 'tags' => 'Etiquetas', + 'createTag' => 'Criar nova etiqueta', + 'edit_tag' => 'Editar etiqueta ":tag"', + 'delete_tag' => 'Apagar etiqueta ":tag"', + 'delete_journal_link' => 'Delete link between transactions', +]; diff --git a/resources/lang/pt_BR/config.php b/resources/lang/pt_BR/config.php index 11368605f7..396ead4031 100644 --- a/resources/lang/pt_BR/config.php +++ b/resources/lang/pt_BR/config.php @@ -22,4 +22,4 @@ return [ 'year' => '%Y', 'half_year' => '%B %Y', -]; \ No newline at end of file +]; diff --git a/resources/lang/pt_BR/csv.php b/resources/lang/pt_BR/csv.php index 2853590877..830d7cd73f 100644 --- a/resources/lang/pt_BR/csv.php +++ b/resources/lang/pt_BR/csv.php @@ -80,4 +80,4 @@ return [ 'column_tags-space' => 'Tags (separadas por espaço)', 'column_account-number' => 'Conta de ativo (número da conta)', 'column_opposing-number' => 'Conta Contrária (número da conta)', -]; \ No newline at end of file +]; diff --git a/resources/lang/pt_BR/demo.php b/resources/lang/pt_BR/demo.php index 9ff797eb29..749f6d09b1 100644 --- a/resources/lang/pt_BR/demo.php +++ b/resources/lang/pt_BR/demo.php @@ -23,4 +23,4 @@ return [ 'import-index' => 'Claro, qualquer arquivo .CSV pode ser importado em Firefly III ', 'import-configure-security' => 'Por questões de segurança, seu upload foi substituído por um arquivo local.', 'import-configure-configuration' => 'A configuração que você vê abaixo é a correta para o arquivo local.', -]; \ No newline at end of file +]; diff --git a/resources/lang/pt_BR/firefly.php b/resources/lang/pt_BR/firefly.php index e8903e2baf..12bf305bd5 100644 --- a/resources/lang/pt_BR/firefly.php +++ b/resources/lang/pt_BR/firefly.php @@ -13,7 +13,6 @@ declare(strict_types=1); return [ // general stuff: - 'language_incomplete' => 'tradução incompleta', 'close' => 'Fechar', 'actions' => 'Ações', 'edit' => 'Editar', @@ -28,12 +27,7 @@ return [ 'to' => 'Até', 'showEverything' => 'Mostrar tudo', 'never' => 'Nunca', - 'search_results_for' => 'Pesquisar resultados por ":query"', 'no_results_for_empty_search' => 'Your search was empty, so nothing was found.', - 'bounced_error' => 'A mensagem enviado para :email ressaltado, não tem acesso para você.', - 'deleted_error' => 'Estas credenciais não correspondem aos nossos registros.', - 'general_blocked_error' => 'Sua conta foi desativada, você não pode entrar.', - 'expired_error' => 'Sua conta expirou e não pode mais ser usada.', 'removed_amount' => ':amount removido', 'added_amount' => ':amount adicionada', 'asset_account_role_help' => 'Quaisquer opções extras resultantes da sua escolha pode ser definido mais tarde.', @@ -56,7 +50,6 @@ return [ 'flash_error_multiple' => 'Houve um erro|Houve :count erros', 'net_worth' => 'Valor Líquido', 'route_has_no_help' => 'Não existe ajuda para esta rota.', - 'help_may_not_be_your_language' => 'Este texto de ajuda é em inglês. Ainda não está disponível em seu idioma', 'two_factor_welcome' => 'Olá, :user!', 'two_factor_enter_code' => 'Para continuar, por favor, digite seu código de autenticação em duas etapas. Seu aplicativo pode gerá-lo para você.', 'two_factor_code_here' => 'Insira o código aqui', @@ -70,9 +63,6 @@ return [ 'two_factor_lost_fix_owner' => 'Caso contrário, o proprietário do site :site_owner e peça para redefinir a sua autenticação de duas etapas.', 'warning_much_data' => ':days dias de dados podem demorar um pouco para carregar.', 'registered' => 'Você se registrou com sucesso!', - 'tagbalancingAct' => 'Saldo', - 'tagadvancePayment' => 'Pagamento antecipado', - 'tagnothing' => '', 'Default asset account' => 'Conta padrão', 'no_budget_pointer' => 'Parece que não há orçamentos ainda. Você deve criar alguns na página orçamentos. Orçamentos podem ajudá-lo a manter o controle de despesas.', 'Savings account' => 'Conta poupança', @@ -84,7 +74,6 @@ return [ '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.', - 'nothing_to_display' => 'There are no transactions to show you', 'show_all_no_filter' => 'Show all transactions without grouping them by date.', 'expenses_by_category' => 'Despesa por categoria', 'expenses_by_budget' => 'Despesas pelo orçamento', @@ -98,11 +87,7 @@ return [ '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_change_demo' => 'You cannot change the password of the demonstration account.', - 'cannot_delete_demo' => 'You cannot remove the demonstration account.', 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', - 'per_period' => 'Per period', - 'all_periods' => 'All periods', '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.', @@ -111,11 +96,9 @@ return [ '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"', - 'budget_in_period_breadcrumb' => 'Between :start and :end', 'clone_withdrawal' => 'Clone this withdrawal', 'clone_deposit' => 'Clone this deposit', 'clone_transfer' => 'Clone this transfer', - 'transaction_journal_other_options' => 'Other options', 'multi_select_no_selection' => 'None selected', 'multi_select_all_selected' => 'All selected', 'multi_select_filter_placeholder' => 'Find..', @@ -164,18 +147,6 @@ return [ 'quarterly' => 'trimestral', 'half-year' => 'metade de cada ano', 'yearly' => 'anual', - // account confirmation: - 'confirm_account_header' => 'Por favor, confirme sua conta', - 'confirm_account_intro' => 'Um e-mail foi enviado para o endereço que você usou durante o seu registro. Por favor confira-o para mais instruções. Se não recebeu esta mensagem, podemos enviá-lo novamente.', - 'confirm_account_resend_email' => 'Envie-me a mensagem de confirmação para eu ativar minha conta.', - 'account_is_confirmed' => 'Sua conta foi confirmada!', - 'invalid_activation_code' => 'Parece que você está usando o código não é válido ou expirado.', - 'confirm_account_is_resent_header' => 'A confirmação foi reenviada', - 'confirm_account_is_resent_text' => 'A mensagem de confirmação foi reenviada. Se ainda não receber a mensagem de confirmação, entre em contato com o proprietário do site em :owner ou verifique os arquivos de log para ver o que deu errado.', - 'confirm_account_is_resent_go_home' => 'Vá para a página de índice do Firefly', - 'confirm_account_not_resent_header' => 'Algo deu errado :(', - 'confirm_account_not_resent_intro' => 'A mensagem de confirmação não foi reenviada. Se ainda não recebeu a mensagem de confirmação, entre em contato com o proprietário do site através do email :owner. Possivelmente, você já tentou reenviar a mensagem de ativação, muitas vezes. Firefly III tentará reenviar a mensagem de confirmação a cada hora.', - 'confirm_account_not_resent_go_home' => 'Vá para a página de índice do Firefly', // export data: 'import_and_export' => 'Importar / Exportar', @@ -205,7 +176,6 @@ return [ 'export_status_created_zip_file' => 'Criado um arquivo zip!', 'export_status_finished' => 'Exportação terminou com sucesso! Yay!', 'export_data_please_wait' => 'Por favor aguarde...', - 'attachment_explanation' => 'O arquivo chamado \':attachment_name\' (#:attachment_id) foi originalmente enviado para: tipo \':description\' (#:journal_id) datado em :date para a quantia de :amount.', // rules 'rules' => 'Regras', @@ -269,46 +239,60 @@ return [ // actions and triggers 'rule_trigger_user_action' => 'Ação do usuário é ":trigger_value"', - 'rule_trigger_from_account_starts' => 'Conta de origem começa com ":trigger_value"', - 'rule_trigger_from_account_ends' => 'Conta de origem termina com ":trigger_value"', - 'rule_trigger_from_account_is' => 'É da conta de origem ":trigger_value"', - 'rule_trigger_from_account_contains' => 'Conta de origem contém ":trigger_value"', - 'rule_trigger_to_account_starts' => 'Conta destino começa com ":trigger_value"', - 'rule_trigger_to_account_ends' => 'Conta destino termina com ":trigger_value"', - 'rule_trigger_to_account_is' => 'Conta de destino é ":trigger_value"', - 'rule_trigger_to_account_contains' => 'Conta de destino contém ":trigger_value"', - 'rule_trigger_transaction_type' => 'Transação é do tipo ":trigger_value"', - 'rule_trigger_category_is' => 'Category is ":trigger_value"', - 'rule_trigger_amount_less' => 'Quantia é inferior :trigger_value', - 'rule_trigger_amount_exactly' => 'Quantia é: trigger_value', - 'rule_trigger_amount_more' => 'Quantia é mais de :trigger_value', - 'rule_trigger_description_starts' => 'Descrição começa com ":trigger_value"', - 'rule_trigger_description_ends' => 'Descrição termina com ":trigger_value"', - 'rule_trigger_description_contains' => 'Descrição contém ":trigger_value"', - 'rule_trigger_description_is' => 'Descrição é ":trigger_value"', 'rule_trigger_from_account_starts_choice' => 'Conta de origem começa com..', + 'rule_trigger_from_account_starts' => 'Conta de origem começa com ":trigger_value"', 'rule_trigger_from_account_ends_choice' => 'Conta de origem termina com..', + 'rule_trigger_from_account_ends' => 'Conta de origem termina com ":trigger_value"', 'rule_trigger_from_account_is_choice' => 'Conta de origem é..', + 'rule_trigger_from_account_is' => 'É da conta de origem ":trigger_value"', 'rule_trigger_from_account_contains_choice' => 'Conta de origem contém..', + 'rule_trigger_from_account_contains' => 'Conta de origem contém ":trigger_value"', 'rule_trigger_to_account_starts_choice' => 'Conta de destino começa com..', + 'rule_trigger_to_account_starts' => 'Conta destino começa com ":trigger_value"', 'rule_trigger_to_account_ends_choice' => 'Conta de destino termina com..', + 'rule_trigger_to_account_ends' => 'Conta destino termina com ":trigger_value"', 'rule_trigger_to_account_is_choice' => 'Conta de destino é..', + 'rule_trigger_to_account_is' => 'Conta de destino é ":trigger_value"', 'rule_trigger_to_account_contains_choice' => 'Conta de destino contém..', + 'rule_trigger_to_account_contains' => 'Conta de destino contém ":trigger_value"', 'rule_trigger_transaction_type_choice' => 'Transação é do tipo..', - 'rule_trigger_amount_less_choice' => 'Quantia é inferior a..', - 'rule_trigger_amount_exactly_choice' => 'Quantia é..', - 'rule_trigger_amount_more_choice' => 'Quantia é mais do que..', - 'rule_trigger_description_starts_choice' => 'Descrição começa com..', - 'rule_trigger_description_ends_choice' => 'Descrição termina com..', - 'rule_trigger_description_contains_choice' => 'Descrição contém..', - 'rule_trigger_description_is_choice' => 'Descrição é..', + 'rule_trigger_transaction_type' => 'Transação é do tipo ":trigger_value"', 'rule_trigger_category_is_choice' => 'Category is..', + 'rule_trigger_category_is' => 'Category is ":trigger_value"', + 'rule_trigger_amount_less_choice' => 'Quantia é inferior a..', + 'rule_trigger_amount_less' => 'Quantia é inferior :trigger_value', + 'rule_trigger_amount_exactly_choice' => 'Quantia é..', + 'rule_trigger_amount_exactly' => 'Quantia é: trigger_value', + 'rule_trigger_amount_more_choice' => 'Quantia é mais do que..', + 'rule_trigger_amount_more' => 'Quantia é mais de :trigger_value', + 'rule_trigger_description_starts_choice' => 'Descrição começa com..', + 'rule_trigger_description_starts' => 'Descrição começa com ":trigger_value"', + 'rule_trigger_description_ends_choice' => 'Descrição termina com..', + 'rule_trigger_description_ends' => 'Descrição termina com ":trigger_value"', + 'rule_trigger_description_contains_choice' => 'Descrição contém..', + 'rule_trigger_description_contains' => 'Descrição contém ":trigger_value"', + 'rule_trigger_description_is_choice' => 'Descrição é..', + 'rule_trigger_description_is' => 'Descrição é ":trigger_value"', 'rule_trigger_budget_is_choice' => 'Budget is..', + 'rule_trigger_budget_is' => 'Budget is ":trigger_value"', 'rule_trigger_tag_is_choice' => '(A) tag is..', + 'rule_trigger_tag_is' => 'A tag is ":trigger_value"', '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_trigger_has_no_category_choice' => 'Has no category', + 'rule_trigger_has_no_category' => 'Transaction has no category', + 'rule_trigger_has_any_category_choice' => 'Has a (any) category', + 'rule_trigger_has_any_category' => 'Transaction has a (any) category', + 'rule_trigger_has_no_budget_choice' => 'Has no budget', + 'rule_trigger_has_no_budget' => 'Transaction has no budget', + 'rule_trigger_has_any_budget_choice' => 'Has a (any) budget', + 'rule_trigger_has_any_budget' => 'Transaction has a (any) budget', + 'rule_trigger_has_no_tag_choice' => 'Has no tag(s)', + 'rule_trigger_has_no_tag' => 'Transaction has no 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_action_set_category' => 'Definir categoria para ":action_value"', 'rule_action_clear_category' => 'Limpar categoria', 'rule_action_set_budget' => 'Definir orçamento para ":action_value"', @@ -340,6 +324,8 @@ return [ 'no_location_set' => 'Nenhuma localização.', 'meta_data' => 'Meta dados', 'location' => 'Localização', + 'without_date' => 'Without date', + 'result' => 'Result', // preferences 'pref_home_screen_accounts' => 'Conta da tela inicial', @@ -523,7 +509,6 @@ return [ 'createBudget' => 'Novo orçamento', 'inactiveBudgets' => 'Orçamentos inativos', 'without_budget_between' => 'Transações sem um orçamento entre :start e :end', - 'budget_in_month' => ':name no :month', 'delete_budget' => 'Excluir orçamento ":name"', 'deleted_budget' => 'Orçamento ":name" excluído', 'edit_budget' => 'Editar orçamento ":name"', @@ -597,8 +582,6 @@ return [ 'select_more_than_one_category' => 'Por favor, selecione mais de uma categoria', 'select_more_than_one_budget' => 'Please select more than one budget', 'select_more_than_one_tag' => 'Please select more than one tag', - 'from_to' => 'From :start to :end', - 'from_to_breadcrumb' => 'from :start to :end', 'account_default_currency' => 'If you select another currency, new transactions from this account will have this currency pre-selected.', // categories: @@ -641,6 +624,11 @@ return [ 'perm-delete-many' => 'Exclusão de muitos itens de uma só vez pode ser muito perturbador. Por favor, seja cauteloso.', 'mass_deleted_transactions_success' => 'Excluído :amount de transação(ões).', 'mass_edited_transactions_success' => 'Atualizado :amount de transação(ões)', + 'opt_group_no_account_type' => '(no account type)', + 'opt_group_defaultAsset' => 'Default asset accounts', + 'opt_group_savingAsset' => 'Savings accounts', + 'opt_group_sharedAsset' => 'Shared asset accounts', + 'opt_group_ccAsset' => 'Credit cards', // new user: @@ -656,8 +644,6 @@ return [ 'yourAccounts' => 'Suas contas', 'budgetsAndSpending' => 'Orçamentos e despesas', 'savings' => 'Poupanças', - 'markAsSavingsToContinue' => 'Marque suas contas de activo como "Poupança" para preencher este painel', - 'createPiggyToContinue' => 'Crie cofrinhos para preencher este painel.', 'newWithdrawal' => 'Nova despesa', 'newDeposit' => 'Novo depósito', 'newTransfer' => 'Nova transferência', @@ -665,8 +651,6 @@ return [ 'moneyOut' => 'Dinheiro sai', 'billsToPay' => 'Faturas a pagar', 'billsPaid' => 'Faturas pagas', - 'divided' => 'dividida', - 'toDivide' => 'esquerda para dividir', // menu and titles, should be recycled as often as possible: 'currency' => 'Moeda', @@ -726,20 +710,11 @@ return [ 'reports_can_bookmark' => 'Lembre-se que relatórios podem ser marcados.', 'incomeVsExpenses' => 'Renda vs. Despesas', 'accountBalances' => 'Saldos de Contas', - 'balanceStartOfYear' => 'Saldo no início do ano', - 'balanceEndOfYear' => 'Saldo no final do ano', - 'balanceStartOfMonth' => 'Saldo no início do mês', - 'balanceEndOfMonth' => 'Saldo no final do mês', 'balanceStart' => 'Saldo no início do período', 'balanceEnd' => 'Saldo no final do período', - 'reportsOwnAccounts' => 'Relatórios para suas próprias contas', - 'reportsOwnAccountsAndShared' => 'Relatórios para suas próprias contas e contas compartilhadas', 'splitByAccount' => 'Dividir por conta', - 'balancedByTransfersAndTags' => 'Balanço por transferências e tags', 'coveredWithTags' => 'Coberto com tags', 'leftUnbalanced' => 'Deixar desequilibrado', - 'expectedBalance' => 'Saldo Experado', - 'outsideOfBudgets' => 'Fora do orçamento', 'leftInBudget' => 'Deixou no orçamento', 'sumOfSums' => 'Soma dos montantes', 'noCategory' => '(sem categoria)', @@ -752,19 +727,12 @@ return [ 'topX' => 'topo :number', 'show_full_list' => 'Mostrar a lista inteira', 'show_only_top' => 'Show only top :number', - 'sum_of_year' => 'Soma do ano', - 'sum_of_years' => 'Soma dos anos', - 'average_of_year' => 'Média do ano', - 'average_of_years' => 'Média dos anos', - 'categories_earned_in_year' => 'Categorias (por lucro)', - 'categories_spent_in_year' => 'Categorias (por gastos)', 'report_type' => 'Tipo de relatório', 'report_type_default' => 'Relatório financeiro padrão', 'report_type_audit' => 'Visão geral do histórico de transação (auditoria)', 'report_type_category' => 'Relatório por Categorias', 'report_type_budget' => 'Budget report', 'report_type_tag' => 'Tag report', - 'report_type_meta-history' => 'Visão geral de categorias, orçamentos e faturas', 'more_info_help' => 'Mais informações sobre esses tipos de relatórios podem ser encontradas nas páginas de ajuda. Pressione o ícone (?) no canto superior direito.', 'report_included_accounts' => 'Contas incluídas', 'report_date_range' => 'Período', @@ -814,10 +782,12 @@ return [ 'account_role_sharedAsset' => 'Shared asset account', 'account_role_savingAsset' => 'Savings account', 'account_role_ccAsset' => 'Credit card', + 'budget_chart_click' => 'Please click on a budget name in the table above to see a chart.', + 'category_chart_click' => 'Please click on a category name in the table above to see a chart.', + // charts: 'chart' => 'Gráfico', - 'dayOfMonth' => 'Dia do mês', 'month' => 'Mês', 'budget' => 'Orçamento', 'spent' => 'Gasto', @@ -838,7 +808,6 @@ return [ 'budgeted' => 'Orçado', 'period' => 'Período', 'balance' => 'Saldo', - 'summary' => 'Sumário', 'sum' => 'Soma', 'average' => 'Média', 'balanceFor' => 'Saldo para ":name"', @@ -858,47 +827,38 @@ return [ 'add_money_to_piggy_title' => 'Adicionar dinheiro ao cofrinho ":name"', 'remove_money_from_piggy_title' => 'Retire o dinheiro do cofrinho ":name"', 'add' => 'Adicionar', + 'no_money_for_piggy' => 'You have no money to put in this piggy bank.', - 'remove' => 'Remover', - 'max_amount_add' => 'É a quantidade máxima que você pode adicionar é', - 'max_amount_remove' => 'É a quantidade máxima que você pode remover é', - 'update_piggy_button' => 'Atualizar cofrinho', - 'update_piggy_title' => 'Atualizar cofrinho ":name"', - 'updated_piggy_bank' => 'Cofrinho ":name" atualizado', - 'details' => 'Detalhes', - 'events' => 'Eventos', - 'target_amount' => 'Valor alvo', - 'start_date' => 'Data de Início', - 'target_date' => 'Data Alvo', - 'no_target_date' => 'Nenhum data', - 'todo' => 'A fazer', - 'table' => 'Tabela', - 'piggy_bank_not_exists' => 'Cofrinho não existe mais.', - 'add_any_amount_to_piggy' => 'Adicionar dinheiro a este cofrinho para atingir sua meta de :amount.', - 'add_set_amount_to_piggy' => 'Adicionar :amount para encher este cofrinho em :date', - 'delete_piggy_bank' => 'Apagar cofrinho ":name"', - 'cannot_add_amount_piggy' => 'Não foi possível adicionar :amount a ":name".', - 'cannot_remove_from_piggy' => 'Could not remove :amount from ":name".', - 'deleted_piggy_bank' => 'Apagar cofrinho ":name"', - 'added_amount_to_piggy' => 'Adicionado :amount de ":name"', - 'removed_amount_from_piggy' => 'Removido :amount de ":name"', - 'cannot_remove_amount_piggy' => 'Não foi possível remover :amount de ":name".', + 'remove' => 'Remover', + 'max_amount_add' => 'É a quantidade máxima que você pode adicionar é', + 'max_amount_remove' => 'É a quantidade máxima que você pode remover é', + 'update_piggy_button' => 'Atualizar cofrinho', + 'update_piggy_title' => 'Atualizar cofrinho ":name"', + 'updated_piggy_bank' => 'Cofrinho ":name" atualizado', + 'details' => 'Detalhes', + 'events' => 'Eventos', + 'target_amount' => 'Valor alvo', + 'start_date' => 'Data de Início', + 'target_date' => 'Data Alvo', + 'no_target_date' => 'Nenhum data', + 'table' => 'Tabela', + 'delete_piggy_bank' => 'Apagar cofrinho ":name"', + 'cannot_add_amount_piggy' => 'Não foi possível adicionar :amount a ":name".', + 'cannot_remove_from_piggy' => 'Could not remove :amount from ":name".', + 'deleted_piggy_bank' => 'Apagar cofrinho ":name"', + 'added_amount_to_piggy' => 'Adicionado :amount de ":name"', + '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', - 'edit_tag' => 'Editar tag ":tag"', - 'updated_tag' => 'Tag atualizada ":tag"', - 'created_tag' => 'Tag ":tag" foi criada!', - 'no_year' => 'Nenhum ano definido', - 'no_month' => 'Nenhum mês definido', - 'tag_title_nothing' => 'Tags padrões', - 'tag_title_balancingAct' => 'Saldo das tags', - 'tag_title_advancePayment' => 'Tags de pagamento do adiantamento', + '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', + 'edit_tag' => 'Editar tag ":tag"', + 'updated_tag' => 'Tag atualizada ":tag"', + 'created_tag' => 'Tag ":tag" foi criada!', 'transaction_journal_information' => 'Informação da transação', 'transaction_journal_meta' => 'Meta-informação', @@ -925,44 +885,59 @@ return [ 'budgets_with_limits' => 'budget(s) com quantidade configurada', 'rule_or_rules' => 'regra(s)', 'rulegroup_or_groups' => 'grupo(s) de regra', - 'setting_must_confirm_account' => 'Confirmação de conta', - 'setting_must_confirm_account_explain' => 'When this setting is enabled, users must activate their account before it can be used.', 'configuration_updated' => 'A configuração foi atualizada', 'setting_is_demo_site' => 'Site demo', '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.', - 'setting_send_email_notifications' => 'Send email notifications', - 'setting_send_email_explain' => 'Firefly III can send you email notifications about certain events. They will be sent to :site_owner. This email address can be set in the .env file.', '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', + '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', // split a transaction: - 'transaction_meta_data' => 'Dados de transação', - 'transaction_dates' => 'Data de transação', 'splits' => 'Divide-se', - 'split_title_withdrawal' => 'Dividir sua nova retirada', - 'split_intro_one_withdrawal' => 'Firefly suporta a "divisão" de uma retirada.', - 'split_intro_two_withdrawal' => 'Isso significa que a quantidade de dinheiro que você gastou será dividida entre várias contas de despesas do destino, orçamentos ou categorias.', - 'split_intro_three_withdrawal' => 'Por exemplo: você pode dividir seu :total de mantimentos de modo que você pague :split_one de seu orçamento diário de mantimentos e :split_two do seu orçamento para "cigarros".', - 'split_table_intro_withdrawal' => 'Dividi sua retirada em tantas coisas quanto quiser. Por padrão, a transação não será dividida, há apenas uma entrada. Adicione muitas divisões como desejar, abaixo. Lembre-se de que você não deve se desviar do seu montante total. Se o fizeres, Firefly irá avisá-lo mas não corrigirá.', - 'store_splitted_withdrawal' => 'Armazenar retirada dividida', - 'update_splitted_withdrawal' => 'Atualização de retirada dividida', - 'split_title_deposit' => 'Dividir seu novo depósito', - 'split_intro_one_deposit' => 'Firefly suporta a "divisão" de um depósito.', - 'split_intro_two_deposit' => 'Isso significa que a quantidade de dinheiro que você ganhou será dividida entre várias contas de receitas de fonte ou categorias.', - 'split_intro_three_deposit' => 'Por exemplo: você pode dividir seu :total salário para que você obtenha :split_one como seu salário-base e :split_two como um reembolso para alguma despesa.', - 'split_table_intro_deposit' => 'Dividi seu depósito em tantas coisas quanto quiser. Por padrão, a transação não será dividida, há apenas uma entrada. Adicione muitas divisões como desejar, abaixo. Lembre-se de que você não deve se desviar do seu montante total. Se o fizeres, Firefly irá avisá-lo mas não corrigirá.', - 'store_splitted_deposit' => 'Armazenar depósito dividido', - 'split_title_transfer' => 'Dividir sua nova transferência', - 'split_intro_one_transfer' => 'Firefly suporta a "divisão" de uma transferência.', - 'split_intro_two_transfer' => 'Isso significa que a quantidade de dinheiro que você está movendo será dividida entre várias categorias ou cofrinhos.', - 'split_intro_three_transfer' => 'Por exemplo: você pode dividir sua movimentação :total , para que você obtenha :split_one em um cofrinho e :split_two em outro.', - 'split_table_intro_transfer' => 'Dividi sua transferência em tantas coisas quanto quiser. Por padrão, a transação não será dividida, há apenas uma entrada. Adicione muitas divisões como desejar, abaixo. Lembre-se de que você não deve se desviar do seu montante total. Se o fizeres, Firefly irá avisá-lo mas não corrigirá.', - 'store_splitted_transfer' => 'Armazenar transferência dividida', 'add_another_split' => 'Adicionar outra divisão', 'split-transactions' => 'Dividir transações', - 'split-new-transaction' => 'Dividir uma nova transação', 'do_split' => 'Fazer uma divisão', 'split_this_withdrawal' => 'Dividir esta retirada', 'split_this_deposit' => 'Dividir este depósito', @@ -1016,9 +991,6 @@ return [ 'import_status_finished_job' => 'The transactions imported can be found in tag :tag.', 'import_with_key' => 'Importação com chave \':key\'', - // different states: - 'import_status_job_running' => 'The import is underway. Please be patient...', - // sandstorm.io errors and messages: 'sandstorm_not_available' => 'This function is not available when you are using Firefly III within a Sandstorm.io environment.', @@ -1070,4 +1042,4 @@ return [ 'no_bills_create_default' => 'Create a bill', -]; \ No newline at end of file +]; diff --git a/resources/lang/pt_BR/form.php b/resources/lang/pt_BR/form.php index 3e08364ffd..f2e1a12925 100644 --- a/resources/lang/pt_BR/form.php +++ b/resources/lang/pt_BR/form.php @@ -100,6 +100,7 @@ return [ 'code' => 'Código', 'iban' => 'IBAN', 'accountNumber' => 'Número de conta', + 'creditCardNumber' => 'Credit card number', 'has_headers' => 'Cabeçalhos', 'date_format' => 'Formato da Data', 'specifix' => 'Banco- ou arquivo específico corrigídos', @@ -135,6 +136,7 @@ return [ 'delete_attachment' => 'Apagar anexo ":name"', 'delete_rule' => 'Excluir regra ":title"', 'delete_rule_group' => 'Exclua o grupo de regras ":title"', + 'delete_link_type' => 'Delete link type ":name"', '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"?', @@ -147,11 +149,14 @@ return [ 'journal_areYouSure' => 'Tem certeza que deseja excluir a transação descrita ":description"?', 'mass_journal_are_you_sure' => 'Tem a certeza que pretende apagar estas transações?', 'tag_areYouSure' => 'Você tem certeza que quer apagar a tag ":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' => 'Exclusão de dados do Firely são permanentes e não podem ser desfeitos.', 'mass_make_selection' => 'Você ainda pode evitar que itens sejam excluídos, removendo a caixa de seleção.', 'delete_all_permanently' => 'Exclua os selecionados permanentemente', 'update_all_journals' => 'Atualizar essas transações', 'also_delete_transactions' => 'A única transação ligada a essa conta será excluída também.|Todas as :count transações ligadas a esta conta serão excluídas também.', + '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' => 'A única regra que ligado a este grupo de regras será excluída também.|Todos as :count regras ligadas a este grupo de regras serão excluídas também.', 'also_delete_piggyBanks' => 'O único cofrinho conectado a essa conta será excluído também.|Todos os :count cofrinhos conectados a esta conta serão excluídos também.', 'bill_keep_transactions' => 'A única transação a esta conta não será excluída.|Todos as :count transações conectadas a esta fatura não serão excluídos.', @@ -189,4 +194,7 @@ return [ 'payment_date' => 'Data de pagamento', 'invoice_date' => 'Data da Fatura', 'internal_reference' => 'Referência interna', -]; \ No newline at end of file + + 'inward' => 'Inward description', + 'outward' => 'Outward description', +]; diff --git a/resources/lang/pt_BR/help.php b/resources/lang/pt_BR/help.php index bfd33e8fd4..92805b87ec 100644 --- a/resources/lang/pt_BR/help.php +++ b/resources/lang/pt_BR/help.php @@ -32,4 +32,4 @@ return [ 'main-content-end-text' => 'Lembre-se que cada página tem um pequeno ponto de interrogação na parte superior direita. Clique nele para obter ajuda sobre a página que você está.', 'index' => 'índice', 'home' => 'casa', -]; \ No newline at end of file +]; diff --git a/resources/lang/pt_BR/intro.php b/resources/lang/pt_BR/intro.php index e945adcec8..02a0eead23 100644 --- a/resources/lang/pt_BR/intro.php +++ b/resources/lang/pt_BR/intro.php @@ -44,17 +44,17 @@ return [ '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 or multiple categories.', + '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 you how your expenses and income per category.', + 'reports_report_category_incomeAndExpensesChart' => 'This chart shows your expenses and income per category.', - 'reports_report_tag_intro' => 'This report will give you insight in or multiple tags.', + '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 you how your expenses and income per tag.', + 'reports_report_tag_incomeAndExpensesChart' => 'This chart shows your expenses and income per tag.', - 'reports_report_budget_intro' => 'This report will give you insight in or multiple budgets.', - 'reports_report_budget_pieCharts' => 'These charts will give you insight in expenses and income per budget or per account.', - 'reports_report_budget_incomeAndExpensesChart' => 'This chart shows you how your expenses and income per budget.', + '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.', @@ -118,4 +118,4 @@ return [ // 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/pt_BR/list.php b/resources/lang/pt_BR/list.php index 6e92a81437..a0cf6f88fb 100644 --- a/resources/lang/pt_BR/list.php +++ b/resources/lang/pt_BR/list.php @@ -12,80 +12,78 @@ 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', - 'confirmed_from' => 'Confirmado de', - 'registered_from' => 'Registrado de', - 'blocked_code' => 'Bloco de código', - 'domain' => 'Domínio', - 'registration_attempts' => 'Tentativas de registo', - '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', -]; \ No newline at end of file + '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', +]; diff --git a/resources/lang/pt_BR/pagination.php b/resources/lang/pt_BR/pagination.php index b6069c775d..12485a0c33 100644 --- a/resources/lang/pt_BR/pagination.php +++ b/resources/lang/pt_BR/pagination.php @@ -16,4 +16,4 @@ return [ 'previous' => '« Anterior', 'next' => 'Próximo »', -]; \ No newline at end of file +]; diff --git a/resources/lang/pt_BR/passwords.php b/resources/lang/pt_BR/passwords.php index c12bf24e16..a0e3322c53 100644 --- a/resources/lang/pt_BR/passwords.php +++ b/resources/lang/pt_BR/passwords.php @@ -18,4 +18,4 @@ return [ 'sent' => 'Nós te enviamos um email com um link para trocar a senha!', 'reset' => 'Sua senha foi redefinida!', 'blocked' => 'Boa tentativa.', -]; \ No newline at end of file +]; diff --git a/resources/lang/pt_BR/validation.php b/resources/lang/pt_BR/validation.php index ecf55dc8e6..aec145511e 100644 --- a/resources/lang/pt_BR/validation.php +++ b/resources/lang/pt_BR/validation.php @@ -17,7 +17,6 @@ return [ 'deleted_user' => 'Devido a restrições de segurança, você não pode registrar usando este endereço de e-mail.', 'rule_trigger_value' => 'Este valor é inválido para o disparo selecionado.', 'rule_action_value' => 'Este valor é inválido para a ação selecionada.', - 'invalid_domain' => 'Devido a restrições de segurança, você não pode registrar deste domínio.', 'file_already_attached' => 'Arquivo ":name" carregado já está anexado para este objeto.', 'file_attached' => 'Arquivo carregado com sucesso ":name".', 'file_invalid_mime' => 'Arquivo ":name" é do tipo ":mime" que não é aceito como um novo upload.', @@ -91,4 +90,4 @@ return [ 'present' => 'O campo :attribute deve estar presente.', 'amount_zero' => 'A quantidade total não pode ser 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/lang/ru_RU/auth.php b/resources/lang/ru_RU/auth.php index 36b29dc87b..4f36be028b 100644 --- a/resources/lang/ru_RU/auth.php +++ b/resources/lang/ru_RU/auth.php @@ -27,4 +27,4 @@ return [ 'failed' => 'Неправильный адрес электронной почты или пароль.', 'throttle' => 'Слишком много попыток входа. Пожалуйста, попробуйте снова через :seconds секунд.', -]; \ No newline at end of file +]; diff --git a/resources/lang/ru_RU/breadcrumbs.php b/resources/lang/ru_RU/breadcrumbs.php index bad2440086..7cd631ef0c 100644 --- a/resources/lang/ru_RU/breadcrumbs.php +++ b/resources/lang/ru_RU/breadcrumbs.php @@ -13,31 +13,32 @@ declare(strict_types=1); */ return [ - 'home' => 'Главная', - 'edit_currency' => 'Редактирование валюты ":name"', - 'delete_currency' => 'Удаление валюты ":name"', - 'newPiggyBank' => 'Создание новой копилки', - 'edit_piggyBank' => 'Редактирование копилки ":name"', - 'preferences' => 'Настройки', - 'profile' => 'Профиль', - 'changePassword' => 'Изменение вашего пароля', - 'bills' => 'Счета к оплате', - 'newBill' => 'Новый счёт к оплате', - 'edit_bill' => 'Редактирование счёта к оплате ":name"', - 'delete_bill' => 'Удаление счёта к оплате ":name"', - 'reports' => 'Отчёты', - 'search_result' => 'Результаты поиска для ":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"', -]; \ No newline at end of file + 'home' => 'Главная', + 'edit_currency' => 'Редактирование валюты ":name"', + 'delete_currency' => 'Удаление валюты ":name"', + 'newPiggyBank' => 'Создание новой копилки', + 'edit_piggyBank' => 'Редактирование копилки ":name"', + 'preferences' => 'Настройки', + 'profile' => 'Профиль', + 'changePassword' => 'Изменение вашего пароля', + 'bills' => 'Счета к оплате', + 'newBill' => 'Новый счёт к оплате', + 'edit_bill' => 'Редактирование счёта к оплате ":name"', + 'delete_bill' => 'Удаление счёта к оплате ":name"', + 'reports' => 'Отчёты', + 'search_result' => 'Результаты поиска для ":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' => 'Удалить связь между транзакциями', +]; diff --git a/resources/lang/ru_RU/config.php b/resources/lang/ru_RU/config.php index b540bc9c7e..3c5e033366 100644 --- a/resources/lang/ru_RU/config.php +++ b/resources/lang/ru_RU/config.php @@ -22,4 +22,4 @@ return [ 'year' => '%Y', 'half_year' => '%B %Y', -]; \ No newline at end of file +]; diff --git a/resources/lang/ru_RU/csv.php b/resources/lang/ru_RU/csv.php index 599cb9171f..1b3c320594 100644 --- a/resources/lang/ru_RU/csv.php +++ b/resources/lang/ru_RU/csv.php @@ -80,4 +80,4 @@ return [ 'column_tags-space' => 'Tags (space separated)', 'column_account-number' => 'Asset account (account number)', 'column_opposing-number' => 'Opposing account (account number)', -]; \ No newline at end of file +]; diff --git a/resources/lang/ru_RU/demo.php b/resources/lang/ru_RU/demo.php index 91b0d75915..57e9277cdb 100644 --- a/resources/lang/ru_RU/demo.php +++ b/resources/lang/ru_RU/demo.php @@ -23,4 +23,4 @@ return [ '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/ru_RU/firefly.php b/resources/lang/ru_RU/firefly.php index 1782df7c43..0deba64ef5 100644 --- a/resources/lang/ru_RU/firefly.php +++ b/resources/lang/ru_RU/firefly.php @@ -13,7 +13,6 @@ declare(strict_types=1); return [ // general stuff: - 'language_incomplete' => 'незавершённый перевод', 'close' => 'Закрыть', 'actions' => 'Действия', 'edit' => 'Изменить', @@ -28,12 +27,7 @@ return [ 'to' => 'Куда', 'showEverything' => 'Показать всё', 'never' => 'Никогда', - 'search_results_for' => 'Результаты поиска по запросу ":query"', 'no_results_for_empty_search' => 'Результатов не найдено.', - 'bounced_error' => 'Сообщение, отправленное на :email было "отбито", доступ запрещен.', - 'deleted_error' => 'Введенные вами данные не найдены в нашей базе.', - 'general_blocked_error' => 'Ваш аккаунт был отключен, так что вы не можете войти.', - 'expired_error' => 'Your account has expired, and can no longer be used.', 'removed_amount' => 'Снято :amount', 'added_amount' => 'Добавлено :amount', 'asset_account_role_help' => 'Any extra options resulting from your choice can be set later.', @@ -56,7 +50,6 @@ return [ 'flash_error_multiple' => 'There is one error|There are :count errors', 'net_worth' => 'Net worth', 'route_has_no_help' => 'There is no help for this route.', - 'help_may_not_be_your_language' => 'This help text is in English. It is not yet available in your language', 'two_factor_welcome' => 'Привет, :user!', 'two_factor_enter_code' => 'To continue, please enter your two factor authentication code. Your application can generate it for you.', 'two_factor_code_here' => 'Enter code here', @@ -70,9 +63,6 @@ return [ 'two_factor_lost_fix_owner' => 'Otherwise, email the site owner, :site_owner and ask them to reset your two factor authentication.', 'warning_much_data' => ':days days of data may take a while to load.', 'registered' => 'You have registered successfully!', - 'tagbalancingAct' => 'Balancing act', - 'tagadvancePayment' => 'Авансовый платеж', - 'tagnothing' => '', 'Default asset account' => 'Счёт по умолчанию', 'no_budget_pointer' => 'You seem to have no budgets yet. You should create some on the budgets-page. Budgets can help you keep track of expenses.', 'Savings account' => 'Сберегательный счет', @@ -84,7 +74,6 @@ return [ '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.', - 'nothing_to_display' => 'There are no transactions to show you', 'show_all_no_filter' => 'Показать все транзакции без группировки по датам.', 'expenses_by_category' => 'Расходы по категориям', 'expenses_by_budget' => 'Расходы по бюджетам', @@ -98,11 +87,7 @@ return [ '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_change_demo' => 'Невозможно сменить пароль демонстрационной учетной записи.', - 'cannot_delete_demo' => 'Вы не можете удалить демонстрационную учетную запись.', 'cannot_reset_demo_user' => 'Невозможно сбросить пароль демонстрационной учетной записи', - 'per_period' => 'За период', - 'all_periods' => 'Все периоды', 'current_period' => 'Текущий период', 'show_the_current_period_and_overview' => 'Показать текущий период и обзор', 'pref_languages_locale' => 'Для корректной работы с языками, отличными от английского, ваша операционная система должна отдавать корректную информацию о локали. Если это не так, валюты, даты и суммы могут отображаться некорректно.', @@ -111,11 +96,9 @@ return [ '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"', - 'budget_in_period_breadcrumb' => 'Между :start и :end', 'clone_withdrawal' => 'Clone this withdrawal', 'clone_deposit' => 'Clone this deposit', 'clone_transfer' => 'Клонировать этот трансфер', - 'transaction_journal_other_options' => 'Другие параметры', 'multi_select_no_selection' => 'Ничего не выбрано', 'multi_select_all_selected' => 'Все выбранные', 'multi_select_filter_placeholder' => 'Поиск..', @@ -164,18 +147,6 @@ return [ 'quarterly' => 'раз в квартал', 'half-year' => 'раз в полгода', 'yearly' => 'ежегодно', - // account confirmation: - 'confirm_account_header' => 'Please confirm your account', - 'confirm_account_intro' => 'An email has been sent to the address you used during your registration. Please check it out for further instructions. If you did not get this message, you can have Firefly send it again.', - 'confirm_account_resend_email' => 'Send me the confirmation message I need to activate my account.', - 'account_is_confirmed' => 'Your account has been confirmed!', - 'invalid_activation_code' => 'It seems the code you are using is not valid, or has expired.', - 'confirm_account_is_resent_header' => 'The confirmation has been resent', - 'confirm_account_is_resent_text' => 'The confirmation message has been resent. If you still did not receive the confirmation message, please contact the site owner at :owner or check the log files to see what went wrong.', - 'confirm_account_is_resent_go_home' => 'Go to the index page of Firefly', - 'confirm_account_not_resent_header' => 'Something went wrong :(', - 'confirm_account_not_resent_intro' => 'The confirmation message has been not resent. If you still did not receive the confirmation message, please contact the site owner at :owner instead. Possibly, you have tried to resend the activation message too often. You can have Firefly III try to resend the confirmation message every hour.', - 'confirm_account_not_resent_go_home' => 'Go to the index page of Firefly', // export data: 'import_and_export' => 'Импорт и экспорт', @@ -205,7 +176,6 @@ return [ 'export_status_created_zip_file' => 'Created a zip file!', 'export_status_finished' => 'Export has succesfully finished! Yay!', 'export_data_please_wait' => 'Подождите пожалуйста...', - 'attachment_explanation' => 'The file called \':attachment_name\' (#:attachment_id) was originally uploaded to :type \':description\' (#:journal_id) dated :date for the amount of :amount.', // rules 'rules' => 'Rules', @@ -269,46 +239,60 @@ return [ // actions and triggers 'rule_trigger_user_action' => 'User action is ":trigger_value"', - 'rule_trigger_from_account_starts' => 'Source account starts with ":trigger_value"', - 'rule_trigger_from_account_ends' => 'Source account ends with ":trigger_value"', - 'rule_trigger_from_account_is' => 'Source account is ":trigger_value"', - 'rule_trigger_from_account_contains' => 'Source 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' => 'Description starts with ":trigger_value"', - 'rule_trigger_description_ends' => 'Description ends with ":trigger_value"', - 'rule_trigger_description_contains' => 'Description contains ":trigger_value"', - 'rule_trigger_description_is' => 'Description is ":trigger_value"', 'rule_trigger_from_account_starts_choice' => 'Source account starts with..', + 'rule_trigger_from_account_starts' => 'Source account starts with ":trigger_value"', 'rule_trigger_from_account_ends_choice' => 'Source account ends with..', + 'rule_trigger_from_account_ends' => 'Source account ends with ":trigger_value"', 'rule_trigger_from_account_is_choice' => 'Source account is..', + 'rule_trigger_from_account_is' => 'Source account is ":trigger_value"', 'rule_trigger_from_account_contains_choice' => 'Source account contains..', + 'rule_trigger_from_account_contains' => 'Source account contains ":trigger_value"', 'rule_trigger_to_account_starts_choice' => 'Destination account starts with..', + 'rule_trigger_to_account_starts' => 'Destination account starts with ":trigger_value"', 'rule_trigger_to_account_ends_choice' => 'Destination account ends with..', + 'rule_trigger_to_account_ends' => 'Destination account ends with ":trigger_value"', 'rule_trigger_to_account_is_choice' => 'Destination account is..', + 'rule_trigger_to_account_is' => 'Destination account is ":trigger_value"', 'rule_trigger_to_account_contains_choice' => 'Destination account contains..', + 'rule_trigger_to_account_contains' => 'Destination account contains ":trigger_value"', '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' => 'Description starts with..', - 'rule_trigger_description_ends_choice' => 'Description ends with..', - 'rule_trigger_description_contains_choice' => 'Description contains..', - 'rule_trigger_description_is_choice' => 'Description is..', + 'rule_trigger_transaction_type' => 'Transaction is of type ":trigger_value"', 'rule_trigger_category_is_choice' => 'Category is..', + 'rule_trigger_category_is' => 'Category is ":trigger_value"', + 'rule_trigger_amount_less_choice' => 'Amount is less than..', + 'rule_trigger_amount_less' => 'Amount is less than :trigger_value', + 'rule_trigger_amount_exactly_choice' => 'Amount is..', + 'rule_trigger_amount_exactly' => 'Amount is :trigger_value', + 'rule_trigger_amount_more_choice' => 'Amount is more than..', + 'rule_trigger_amount_more' => 'Amount is more than :trigger_value', + 'rule_trigger_description_starts_choice' => 'Description starts with..', + 'rule_trigger_description_starts' => 'Description starts with ":trigger_value"', + 'rule_trigger_description_ends_choice' => 'Description ends with..', + 'rule_trigger_description_ends' => 'Description ends with ":trigger_value"', + 'rule_trigger_description_contains_choice' => 'Description contains..', + 'rule_trigger_description_contains' => 'Description contains ":trigger_value"', + 'rule_trigger_description_is_choice' => 'Description is..', + 'rule_trigger_description_is' => 'Description is ":trigger_value"', 'rule_trigger_budget_is_choice' => 'Budget is..', + 'rule_trigger_budget_is' => 'Budget is ":trigger_value"', 'rule_trigger_tag_is_choice' => '(A) tag is..', + 'rule_trigger_tag_is' => 'A tag is ":trigger_value"', '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_trigger_has_no_category_choice' => 'Has no category', + 'rule_trigger_has_no_category' => 'Transaction has no category', + 'rule_trigger_has_any_category_choice' => 'Has a (any) category', + 'rule_trigger_has_any_category' => 'Transaction has a (any) category', + 'rule_trigger_has_no_budget_choice' => 'Has no budget', + 'rule_trigger_has_no_budget' => 'Transaction has no budget', + 'rule_trigger_has_any_budget_choice' => 'Has a (any) budget', + 'rule_trigger_has_any_budget' => 'Transaction has a (any) budget', + 'rule_trigger_has_no_tag_choice' => 'Has no tag(s)', + 'rule_trigger_has_no_tag' => 'Transaction has no 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_action_set_category' => 'Set category to ":action_value"', 'rule_action_clear_category' => 'Clear category', 'rule_action_set_budget' => 'Set budget to ":action_value"', @@ -340,6 +324,8 @@ return [ 'no_location_set' => 'No location set.', 'meta_data' => 'Meta data', 'location' => 'Location', + 'without_date' => 'Without date', + 'result' => 'Result', // preferences 'pref_home_screen_accounts' => 'Счета, отображаемые в сводке', @@ -523,7 +509,6 @@ return [ 'createBudget' => 'New budget', 'inactiveBudgets' => 'Inactive budgets', 'without_budget_between' => 'Transactions without a budget between :start and :end', - 'budget_in_month' => ':name in :month', 'delete_budget' => 'Delete budget ":name"', 'deleted_budget' => 'Deleted budget ":name"', 'edit_budget' => 'Edit budget ":name"', @@ -597,8 +582,6 @@ return [ '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', - 'from_to' => 'From :start to :end', - 'from_to_breadcrumb' => 'from :start to :end', 'account_default_currency' => 'If you select another currency, new transactions from this account will have this currency pre-selected.', // categories: @@ -641,6 +624,11 @@ return [ '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)', + 'opt_group_no_account_type' => '(no account type)', + 'opt_group_defaultAsset' => 'Default asset accounts', + 'opt_group_savingAsset' => 'Savings accounts', + 'opt_group_sharedAsset' => 'Shared asset accounts', + 'opt_group_ccAsset' => 'Credit cards', // new user: @@ -656,8 +644,6 @@ return [ 'yourAccounts' => 'Ваши счета', 'budgetsAndSpending' => 'Бюджеты и расходы', 'savings' => 'Savings', - 'markAsSavingsToContinue' => 'Mark your asset accounts as "Savings account" to fill this panel', - 'createPiggyToContinue' => 'Create piggy banks to fill this panel.', 'newWithdrawal' => 'Новый расход', 'newDeposit' => 'Новый доход', 'newTransfer' => 'Новый перевод', @@ -665,8 +651,6 @@ return [ 'moneyOut' => 'Расходы', 'billsToPay' => 'Счета к оплате', 'billsPaid' => 'Оплаченные счета', - 'divided' => 'divided', - 'toDivide' => 'left to divide', // menu and titles, should be recycled as often as possible: 'currency' => 'Валюта', @@ -726,20 +710,11 @@ return [ 'reports_can_bookmark' => 'Remember that reports can be bookmarked.', 'incomeVsExpenses' => 'Income vs. expenses', 'accountBalances' => 'Account balances', - 'balanceStartOfYear' => 'Balance at start of year', - 'balanceEndOfYear' => 'Balance at end of year', - 'balanceStartOfMonth' => 'Balance at start of month', - 'balanceEndOfMonth' => 'Balance at end of month', 'balanceStart' => 'Balance at start of period', 'balanceEnd' => 'Balance at end of period', - 'reportsOwnAccounts' => 'Reports for your own accounts', - 'reportsOwnAccountsAndShared' => 'Reports for your own accounts and shared accounts', 'splitByAccount' => 'Split by account', - 'balancedByTransfersAndTags' => 'Balanced by transfers and tags', 'coveredWithTags' => 'Covered with tags', 'leftUnbalanced' => 'Left unbalanced', - 'expectedBalance' => 'Expected balance', - 'outsideOfBudgets' => 'Outside of budgets', 'leftInBudget' => 'Left in budget', 'sumOfSums' => 'Sum of sums', 'noCategory' => '(no category)', @@ -752,19 +727,12 @@ return [ 'topX' => 'top :number', 'show_full_list' => 'Show entire list', 'show_only_top' => 'Show only top :number', - 'sum_of_year' => 'Sum of year', - 'sum_of_years' => 'Sum of years', - 'average_of_year' => 'Average of year', - 'average_of_years' => 'Average of years', - 'categories_earned_in_year' => 'Categories (by earnings)', - 'categories_spent_in_year' => 'Categories (by spendings)', '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', - 'report_type_meta-history' => 'Categories, budgets and bills overview', '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', @@ -814,10 +782,12 @@ return [ 'account_role_sharedAsset' => 'Shared asset account', 'account_role_savingAsset' => 'Savings account', 'account_role_ccAsset' => 'Credit card', + 'budget_chart_click' => 'Please click on a budget name in the table above to see a chart.', + 'category_chart_click' => 'Please click on a category name in the table above to see a chart.', + // charts: 'chart' => 'Диаграмма', - 'dayOfMonth' => 'Day of the month', 'month' => 'Month', 'budget' => 'Budget', 'spent' => 'Spent', @@ -838,7 +808,6 @@ return [ 'budgeted' => 'Budgeted', 'period' => 'Period', 'balance' => 'Balance', - 'summary' => 'Summary', 'sum' => 'Sum', 'average' => 'Average', 'balanceFor' => 'Balance for :name', @@ -858,47 +827,38 @@ return [ 'add_money_to_piggy_title' => 'Add money to piggy bank ":name"', 'remove_money_from_piggy_title' => 'Remove money from piggy bank ":name"', 'add' => 'Add', + 'no_money_for_piggy' => 'You have no money to put in this piggy bank.', - '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' => 'Target date', - 'no_target_date' => 'No target date', - 'todo' => 'to do', - 'table' => 'Table', - 'piggy_bank_not_exists' => 'Piggy bank no longer exists.', - 'add_any_amount_to_piggy' => 'Add money to this piggy bank to reach your target of :amount.', - 'add_set_amount_to_piggy' => 'Add :amount to fill this piggy bank on :date', - '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"', - 'cannot_remove_amount_piggy' => 'Could not remove :amount from ":name".', + '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' => 'Target date', + 'no_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' => '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', - 'edit_tag' => 'Edit tag ":tag"', - 'updated_tag' => 'Updated tag ":tag"', - 'created_tag' => 'Tag ":tag" has been created!', - 'no_year' => 'No year set', - 'no_month' => 'No month set', - 'tag_title_nothing' => 'Default tags', - 'tag_title_balancingAct' => 'Balancing act tags', - 'tag_title_advancePayment' => 'Advance payment 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', + 'edit_tag' => 'Edit tag ":tag"', + 'updated_tag' => 'Updated tag ":tag"', + 'created_tag' => 'Tag ":tag" has been created!', 'transaction_journal_information' => 'Transaction information', 'transaction_journal_meta' => 'Meta information', @@ -925,44 +885,59 @@ return [ 'budgets_with_limits' => 'budget(s) with configured amount', 'rule_or_rules' => 'rule(s)', 'rulegroup_or_groups' => 'rule group(s)', - 'setting_must_confirm_account' => 'Account confirmation', - 'setting_must_confirm_account_explain' => 'When this setting is enabled, users must activate their account before it can be used.', '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.', - 'setting_send_email_notifications' => 'Send email notifications', - 'setting_send_email_explain' => 'Firefly III can send you email notifications about certain events. They will be sent to :site_owner. This email address can be set in the .env file.', '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', + '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', // split a transaction: - 'transaction_meta_data' => 'Transaction meta-data', - 'transaction_dates' => 'Transaction dates', 'splits' => 'Splits', - 'split_title_withdrawal' => 'Split your new withdrawal', - 'split_intro_one_withdrawal' => 'Firefly supports the "splitting" of a withdrawal.', - 'split_intro_two_withdrawal' => 'It means that the amount of money you\'ve spent is divided between several destination expense accounts, budgets or categories.', - 'split_intro_three_withdrawal' => 'For example: you could split your :total groceries so you pay :split_one from your "daily groceries" budget and :split_two from your "cigarettes" budget.', - 'split_table_intro_withdrawal' => 'Split your withdrawal in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_withdrawal' => 'Store splitted withdrawal', - 'update_splitted_withdrawal' => 'Update splitted withdrawal', - 'split_title_deposit' => 'Split your new deposit', - 'split_intro_one_deposit' => 'Firefly supports the "splitting" of a deposit.', - 'split_intro_two_deposit' => 'It means that the amount of money you\'ve earned is divided between several source revenue accounts or categories.', - 'split_intro_three_deposit' => 'For example: you could split your :total salary so you get :split_one as your base salary and :split_two as a reimbursment for expenses made.', - 'split_table_intro_deposit' => 'Split your deposit in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_deposit' => 'Store splitted deposit', - 'split_title_transfer' => 'Split your new transfer', - 'split_intro_one_transfer' => 'Firefly supports the "splitting" of a transfer.', - 'split_intro_two_transfer' => 'It means that the amount of money you\'re moving is divided between several categories or piggy banks.', - 'split_intro_three_transfer' => 'For example: you could split your :total move so you get :split_one in one piggy bank and :split_two in another.', - 'split_table_intro_transfer' => 'Split your transfer in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_transfer' => 'Store splitted transfer', 'add_another_split' => 'Add another split', 'split-transactions' => 'Split transactions', - 'split-new-transaction' => 'Split a new transaction', 'do_split' => 'Do a split', 'split_this_withdrawal' => 'Split this withdrawal', 'split_this_deposit' => 'Split this deposit', @@ -1016,9 +991,6 @@ return [ 'import_status_finished_job' => 'The transactions imported can be found in tag :tag.', 'import_with_key' => 'Import with key \':key\'', - // different states: - 'import_status_job_running' => 'The import is underway. Please be patient...', - // sandstorm.io errors and messages: 'sandstorm_not_available' => 'This function is not available when you are using Firefly III within a Sandstorm.io environment.', @@ -1070,4 +1042,4 @@ return [ 'no_bills_create_default' => 'Create a bill', -]; \ No newline at end of file +]; diff --git a/resources/lang/ru_RU/form.php b/resources/lang/ru_RU/form.php index ef3414b805..ef6703a722 100644 --- a/resources/lang/ru_RU/form.php +++ b/resources/lang/ru_RU/form.php @@ -100,6 +100,7 @@ return [ 'code' => 'Код', 'iban' => 'IBAN', 'accountNumber' => 'Номер счета', + 'creditCardNumber' => 'Credit card number', 'has_headers' => 'Заголовки', 'date_format' => 'Формат даты', 'specifix' => 'Bank- or file specific fixes', @@ -135,6 +136,7 @@ return [ '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' => 'Are you sure you want to delete the bill named ":name"?', @@ -147,11 +149,14 @@ return [ 'journal_areYouSure' => 'Are you sure you want to delete the transaction described ":description"?', 'mass_journal_are_you_sure' => 'Are you sure you want to delete these transactions?', 'tag_areYouSure' => 'Are you sure you want to delete the tag ":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.', @@ -189,4 +194,7 @@ return [ 'payment_date' => 'Payment date', 'invoice_date' => 'Invoice date', 'internal_reference' => 'Internal reference', -]; \ No newline at end of file + + 'inward' => 'Inward description', + 'outward' => 'Outward description', +]; diff --git a/resources/lang/ru_RU/help.php b/resources/lang/ru_RU/help.php index 248a46ca56..c1d78040c4 100644 --- a/resources/lang/ru_RU/help.php +++ b/resources/lang/ru_RU/help.php @@ -32,4 +32,4 @@ return [ 'main-content-end-text' => 'Помните, что в правом верхнем углу любой страницы есть небольшой знак вопроса. Нажмите на него, чтобы получить справку о той странице, на которой вы находитесь.', 'index' => 'оглавление', 'home' => 'главная', -]; \ No newline at end of file +]; diff --git a/resources/lang/ru_RU/intro.php b/resources/lang/ru_RU/intro.php index e945adcec8..02a0eead23 100644 --- a/resources/lang/ru_RU/intro.php +++ b/resources/lang/ru_RU/intro.php @@ -44,17 +44,17 @@ return [ '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 or multiple categories.', + '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 you how your expenses and income per category.', + 'reports_report_category_incomeAndExpensesChart' => 'This chart shows your expenses and income per category.', - 'reports_report_tag_intro' => 'This report will give you insight in or multiple tags.', + '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 you how your expenses and income per tag.', + 'reports_report_tag_incomeAndExpensesChart' => 'This chart shows your expenses and income per tag.', - 'reports_report_budget_intro' => 'This report will give you insight in or multiple budgets.', - 'reports_report_budget_pieCharts' => 'These charts will give you insight in expenses and income per budget or per account.', - 'reports_report_budget_incomeAndExpensesChart' => 'This chart shows you how your expenses and income per budget.', + '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.', @@ -118,4 +118,4 @@ return [ // 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/ru_RU/list.php b/resources/lang/ru_RU/list.php index 268929684b..5df2d54bf5 100644 --- a/resources/lang/ru_RU/list.php +++ b/resources/lang/ru_RU/list.php @@ -12,80 +12,78 @@ 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)?', - 'confirmed_from' => 'Confirmed from', - 'registered_from' => 'Registered from', - 'blocked_code' => 'Block code', - 'domain' => 'Домен', - 'registration_attempts' => 'Registration attempts', - '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' => 'Всего меток', -]; \ No newline at end of file + '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', +]; diff --git a/resources/lang/ru_RU/pagination.php b/resources/lang/ru_RU/pagination.php index 6de717808b..35797a8414 100644 --- a/resources/lang/ru_RU/pagination.php +++ b/resources/lang/ru_RU/pagination.php @@ -16,4 +16,4 @@ return [ 'previous' => '« Предыдущие', 'next' => 'Следующие »', -]; \ No newline at end of file +]; diff --git a/resources/lang/ru_RU/passwords.php b/resources/lang/ru_RU/passwords.php index 1153e9cd73..54df3b6a81 100644 --- a/resources/lang/ru_RU/passwords.php +++ b/resources/lang/ru_RU/passwords.php @@ -18,4 +18,4 @@ return [ 'sent' => 'Мы отправили ссылку для сброса пароля на ваш e-mail!', 'reset' => 'Ваш пароль был успешно сброшен!', 'blocked' => 'Это была хорошая попытка.', -]; \ No newline at end of file +]; diff --git a/resources/lang/ru_RU/validation.php b/resources/lang/ru_RU/validation.php index 5a8fa83725..8273315994 100644 --- a/resources/lang/ru_RU/validation.php +++ b/resources/lang/ru_RU/validation.php @@ -17,7 +17,6 @@ return [ 'deleted_user' => 'По соображениям безопасности, вы не можете зарегистрироваться, используя этот адрес электронной почты.', 'rule_trigger_value' => 'Это значение является недопустимым для выбранного триггера.', 'rule_action_value' => 'Это значение является недопустимым для выбранного действия.', - 'invalid_domain' => 'По соображениям безопасности, вы не можете зарегистрироваться, используя почту на указанном домене.', 'file_already_attached' => 'Загруженный файл ":name" уже прикреплён к этому объекту.', 'file_attached' => 'Файл ":name". успешно загружен.', 'file_invalid_mime' => 'Файл ":name" имеет тип ":mime". Загрузка файлов такого типа невозможна.', @@ -91,4 +90,4 @@ return [ '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/lang/sl_SI/auth.php b/resources/lang/sl_SI/auth.php index 59c683e316..f28aea4bd7 100644 --- a/resources/lang/sl_SI/auth.php +++ b/resources/lang/sl_SI/auth.php @@ -27,4 +27,4 @@ return [ 'failed' => 'Podatki se ne ujemajo s podatki v naši bazi.', 'throttle' => 'Prevečkrat ste se poskusili prijaviti. Poskusite ponovno čez :seconds sekunde.', -]; \ No newline at end of file +]; diff --git a/resources/lang/sl_SI/breadcrumbs.php b/resources/lang/sl_SI/breadcrumbs.php index da4ec880d5..9315ce140c 100644 --- a/resources/lang/sl_SI/breadcrumbs.php +++ b/resources/lang/sl_SI/breadcrumbs.php @@ -13,31 +13,32 @@ declare(strict_types=1); */ return [ - 'home' => 'Prva stran', - 'edit_currency' => 'uredi valuto ":name"', - 'delete_currency' => 'izbriši valuto ":name"', - 'newPiggyBank' => 'ustvari novega pujska', - 'edit_piggyBank' => 'uredi pujska za ":name"', - 'preferences' => 'nastavitve', - 'profile' => 'profil', - 'changePassword' => 'spremeni geslo', - 'bills' => 'Trajniki', - 'newBill' => 'nov trajnik', - 'edit_bill' => 'uredi trajnik ":name"', - 'delete_bill' => 'izbriši trajnik ":name"', - 'reports' => 'Poročila', - 'search_result' => 'Search results for ":query"', - 'withdrawal_list' => 'stroški', - 'deposit_list' => 'prihodki', - 'transfer_list' => 'prenosi', - 'transfers_list' => 'prenosi', - 'create_withdrawal' => 'ustvari nov odhodek', - 'create_deposit' => 'ustvari nov prihodek', - 'create_transfer' => 'ustvari nov prenos', - 'edit_journal' => 'uredi transakcijo ":description"', - 'delete_journal' => 'izbriši transakcijo ":description"', - 'tags' => 'značke', - 'createTag' => 'ustvari novo značko', - 'edit_tag' => 'uredi značko ":tag"', - 'delete_tag' => 'izbriši značko ":tag"', -]; \ No newline at end of file + 'home' => 'Prva stran', + 'edit_currency' => 'uredi valuto ":name"', + 'delete_currency' => 'izbriši valuto ":name"', + 'newPiggyBank' => 'ustvari novega pujska', + 'edit_piggyBank' => 'uredi pujska za ":name"', + 'preferences' => 'nastavitve', + 'profile' => 'profil', + 'changePassword' => 'spremeni geslo', + 'bills' => 'Trajniki', + 'newBill' => 'nov trajnik', + 'edit_bill' => 'uredi trajnik ":name"', + 'delete_bill' => 'izbriši trajnik ":name"', + 'reports' => 'Poročila', + 'search_result' => 'Search results for ":query"', + 'withdrawal_list' => 'stroški', + 'deposit_list' => 'prihodki', + 'transfer_list' => 'prenosi', + 'transfers_list' => 'prenosi', + 'create_withdrawal' => 'ustvari nov odhodek', + 'create_deposit' => 'ustvari nov prihodek', + 'create_transfer' => 'ustvari nov prenos', + 'edit_journal' => 'uredi transakcijo ":description"', + 'delete_journal' => 'izbriši transakcijo ":description"', + 'tags' => 'značke', + 'createTag' => 'ustvari novo značko', + 'edit_tag' => 'uredi značko ":tag"', + 'delete_tag' => 'izbriši značko ":tag"', + 'delete_journal_link' => 'Delete link between transactions', +]; diff --git a/resources/lang/sl_SI/config.php b/resources/lang/sl_SI/config.php index a648c5ed3f..42e845a6ee 100644 --- a/resources/lang/sl_SI/config.php +++ b/resources/lang/sl_SI/config.php @@ -22,4 +22,4 @@ return [ 'year' => '%Y', 'half_year' => '%B %Y', -]; \ No newline at end of file +]; diff --git a/resources/lang/sl_SI/csv.php b/resources/lang/sl_SI/csv.php index dc35628e17..aa1b9f0ddb 100644 --- a/resources/lang/sl_SI/csv.php +++ b/resources/lang/sl_SI/csv.php @@ -80,4 +80,4 @@ return [ 'column_tags-space' => 'značke (ločene s presledki)', 'column_account-number' => 'premoženjski račun (številka računa)', 'column_opposing-number' => 'protiračun (številka računa)', -]; \ No newline at end of file +]; diff --git a/resources/lang/sl_SI/demo.php b/resources/lang/sl_SI/demo.php index e6a07ca5c4..dca94a9aa7 100644 --- a/resources/lang/sl_SI/demo.php +++ b/resources/lang/sl_SI/demo.php @@ -24,4 +24,4 @@ Konti prihodkov so računi iz katerih dobivate denar, kot npr. vaš delodajalec, '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/sl_SI/firefly.php b/resources/lang/sl_SI/firefly.php index 7147f5c160..43311d999c 100644 --- a/resources/lang/sl_SI/firefly.php +++ b/resources/lang/sl_SI/firefly.php @@ -13,7 +13,6 @@ declare(strict_types=1); return [ // general stuff: - 'language_incomplete' => 'nepopoln prevod', 'close' => 'zapri', 'actions' => 'Actions', 'edit' => 'uredi', @@ -28,12 +27,7 @@ return [ 'to' => 'To', 'showEverything' => 'pokaži vse', 'never' => 'nikoli', - 'search_results_for' => 'rezultati iskanja za ":query"', 'no_results_for_empty_search' => 'Your search was empty, so nothing was found.', - 'bounced_error' => 'The message sent to :email bounced, so no access for you.', - 'deleted_error' => 'These credentials do not match our records.', - 'general_blocked_error' => 'Your account has been disabled, so you cannot login.', - 'expired_error' => 'Your account has expired, and can no longer be used.', 'removed_amount' => 'Removed :amount', 'added_amount' => 'Added :amount', 'asset_account_role_help' => 'Dodatne možnosti se lahko nastavljajo tudi kasneje.', @@ -56,7 +50,6 @@ return [ 'flash_error_multiple' => 'There is one error|There are :count errors', 'net_worth' => 'Net worth', 'route_has_no_help' => 'There is no help for this route.', - 'help_may_not_be_your_language' => 'This help text is in English. It is not yet available in your language', 'two_factor_welcome' => 'Hello, :user!', 'two_factor_enter_code' => 'To continue, please enter your two factor authentication code. Your application can generate it for you.', 'two_factor_code_here' => 'Enter code here', @@ -70,9 +63,6 @@ return [ 'two_factor_lost_fix_owner' => 'Otherwise, email the site owner, :site_owner and ask them to reset your two factor authentication.', 'warning_much_data' => ':days days of data may take a while to load.', 'registered' => 'You have registered successfully!', - 'tagbalancingAct' => 'Balancing act', - 'tagadvancePayment' => 'Advance payment', - 'tagnothing' => '', 'Default asset account' => 'privzeti premoženjski račun', 'no_budget_pointer' => 'Kot kaže niste definirali še nobenega budžeta. Budžete lahko ustvarite na strani budžeti>. Budžeti vam pomagajo držati pregled nad vašimi stroški.', 'Savings account' => 'Savings account', @@ -84,7 +74,6 @@ return [ '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.', - 'nothing_to_display' => 'There are no transactions to show you', 'show_all_no_filter' => 'Show all transactions without grouping them by date.', 'expenses_by_category' => 'stroški po kategorijah', 'expenses_by_budget' => 'stroški po budžetih', @@ -98,11 +87,7 @@ return [ '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_change_demo' => 'You cannot change the password of the demonstration account.', - 'cannot_delete_demo' => 'You cannot remove the demonstration account.', 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', - 'per_period' => 'Per period', - 'all_periods' => 'All periods', '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.', @@ -111,11 +96,9 @@ return [ '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"', - 'budget_in_period_breadcrumb' => 'Between :start and :end', 'clone_withdrawal' => 'Clone this withdrawal', 'clone_deposit' => 'Clone this deposit', 'clone_transfer' => 'Clone this transfer', - 'transaction_journal_other_options' => 'Other options', 'multi_select_no_selection' => 'None selected', 'multi_select_all_selected' => 'All selected', 'multi_select_filter_placeholder' => 'Find..', @@ -164,18 +147,6 @@ return [ 'quarterly' => 'quarterly', 'half-year' => 'every half year', 'yearly' => 'yearly', - // account confirmation: - 'confirm_account_header' => 'Please confirm your account', - 'confirm_account_intro' => 'An email has been sent to the address you used during your registration. Please check it out for further instructions. If you did not get this message, you can have Firefly send it again.', - 'confirm_account_resend_email' => 'Send me the confirmation message I need to activate my account.', - 'account_is_confirmed' => 'Your account has been confirmed!', - 'invalid_activation_code' => 'It seems the code you are using is not valid, or has expired.', - 'confirm_account_is_resent_header' => 'The confirmation has been resent', - 'confirm_account_is_resent_text' => 'The confirmation message has been resent. If you still did not receive the confirmation message, please contact the site owner at :owner or check the log files to see what went wrong.', - 'confirm_account_is_resent_go_home' => 'Go to the index page of Firefly', - 'confirm_account_not_resent_header' => 'Something went wrong :(', - 'confirm_account_not_resent_intro' => 'The confirmation message has been not resent. If you still did not receive the confirmation message, please contact the site owner at :owner instead. Possibly, you have tried to resend the activation message too often. You can have Firefly III try to resend the confirmation message every hour.', - 'confirm_account_not_resent_go_home' => 'Go to the index page of Firefly', // export data: 'import_and_export' => 'Import and export', @@ -205,7 +176,6 @@ return [ 'export_status_created_zip_file' => 'Created a zip file!', 'export_status_finished' => 'Export has succesfully finished! Yay!', 'export_data_please_wait' => 'Please wait...', - 'attachment_explanation' => 'The file called \':attachment_name\' (#:attachment_id) was originally uploaded to :type \':description\' (#:journal_id) dated :date for the amount of :amount.', // rules 'rules' => 'Rules', @@ -269,46 +239,60 @@ return [ // actions and triggers 'rule_trigger_user_action' => 'User action is ":trigger_value"', - 'rule_trigger_from_account_starts' => 'Source account starts with ":trigger_value"', - 'rule_trigger_from_account_ends' => 'Source account ends with ":trigger_value"', - 'rule_trigger_from_account_is' => 'Source account is ":trigger_value"', - 'rule_trigger_from_account_contains' => 'Source 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' => 'Description starts with ":trigger_value"', - 'rule_trigger_description_ends' => 'Description ends with ":trigger_value"', - 'rule_trigger_description_contains' => 'Description contains ":trigger_value"', - 'rule_trigger_description_is' => 'Description is ":trigger_value"', 'rule_trigger_from_account_starts_choice' => 'Source account starts with..', + 'rule_trigger_from_account_starts' => 'Source account starts with ":trigger_value"', 'rule_trigger_from_account_ends_choice' => 'Source account ends with..', + 'rule_trigger_from_account_ends' => 'Source account ends with ":trigger_value"', 'rule_trigger_from_account_is_choice' => 'Source account is..', + 'rule_trigger_from_account_is' => 'Source account is ":trigger_value"', 'rule_trigger_from_account_contains_choice' => 'Source account contains..', + 'rule_trigger_from_account_contains' => 'Source account contains ":trigger_value"', 'rule_trigger_to_account_starts_choice' => 'Destination account starts with..', + 'rule_trigger_to_account_starts' => 'Destination account starts with ":trigger_value"', 'rule_trigger_to_account_ends_choice' => 'Destination account ends with..', + 'rule_trigger_to_account_ends' => 'Destination account ends with ":trigger_value"', 'rule_trigger_to_account_is_choice' => 'Destination account is..', + 'rule_trigger_to_account_is' => 'Destination account is ":trigger_value"', 'rule_trigger_to_account_contains_choice' => 'Destination account contains..', + 'rule_trigger_to_account_contains' => 'Destination account contains ":trigger_value"', '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' => 'Description starts with..', - 'rule_trigger_description_ends_choice' => 'Description ends with..', - 'rule_trigger_description_contains_choice' => 'Description contains..', - 'rule_trigger_description_is_choice' => 'Description is..', + 'rule_trigger_transaction_type' => 'Transaction is of type ":trigger_value"', 'rule_trigger_category_is_choice' => 'Category is..', + 'rule_trigger_category_is' => 'Category is ":trigger_value"', + 'rule_trigger_amount_less_choice' => 'Amount is less than..', + 'rule_trigger_amount_less' => 'Amount is less than :trigger_value', + 'rule_trigger_amount_exactly_choice' => 'Amount is..', + 'rule_trigger_amount_exactly' => 'Amount is :trigger_value', + 'rule_trigger_amount_more_choice' => 'Amount is more than..', + 'rule_trigger_amount_more' => 'Amount is more than :trigger_value', + 'rule_trigger_description_starts_choice' => 'Description starts with..', + 'rule_trigger_description_starts' => 'Description starts with ":trigger_value"', + 'rule_trigger_description_ends_choice' => 'Description ends with..', + 'rule_trigger_description_ends' => 'Description ends with ":trigger_value"', + 'rule_trigger_description_contains_choice' => 'Description contains..', + 'rule_trigger_description_contains' => 'Description contains ":trigger_value"', + 'rule_trigger_description_is_choice' => 'Description is..', + 'rule_trigger_description_is' => 'Description is ":trigger_value"', 'rule_trigger_budget_is_choice' => 'Budget is..', + 'rule_trigger_budget_is' => 'Budget is ":trigger_value"', 'rule_trigger_tag_is_choice' => '(A) tag is..', + 'rule_trigger_tag_is' => 'A tag is ":trigger_value"', '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_trigger_has_no_category_choice' => 'Has no category', + 'rule_trigger_has_no_category' => 'Transaction has no category', + 'rule_trigger_has_any_category_choice' => 'Has a (any) category', + 'rule_trigger_has_any_category' => 'Transaction has a (any) category', + 'rule_trigger_has_no_budget_choice' => 'Has no budget', + 'rule_trigger_has_no_budget' => 'Transaction has no budget', + 'rule_trigger_has_any_budget_choice' => 'Has a (any) budget', + 'rule_trigger_has_any_budget' => 'Transaction has a (any) budget', + 'rule_trigger_has_no_tag_choice' => 'Has no tag(s)', + 'rule_trigger_has_no_tag' => 'Transaction has no 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_action_set_category' => 'Set category to ":action_value"', 'rule_action_clear_category' => 'Clear category', 'rule_action_set_budget' => 'Set budget to ":action_value"', @@ -340,6 +324,8 @@ return [ 'no_location_set' => 'No location set.', 'meta_data' => 'Meta data', 'location' => 'Location', + 'without_date' => 'Without date', + 'result' => 'Result', // preferences 'pref_home_screen_accounts' => 'Home screen accounts', @@ -523,7 +509,6 @@ return [ 'createBudget' => 'New budget', 'inactiveBudgets' => 'Inactive budgets', 'without_budget_between' => 'Transactions without a budget between :start and :end', - 'budget_in_month' => ':name in :month', 'delete_budget' => 'Delete budget ":name"', 'deleted_budget' => 'Deleted budget ":name"', 'edit_budget' => 'Edit budget ":name"', @@ -597,8 +582,6 @@ return [ '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', - 'from_to' => 'From :start to :end', - 'from_to_breadcrumb' => 'from :start to :end', 'account_default_currency' => 'If you select another currency, new transactions from this account will have this currency pre-selected.', // categories: @@ -641,6 +624,11 @@ return [ '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)', + 'opt_group_no_account_type' => '(no account type)', + 'opt_group_defaultAsset' => 'Default asset accounts', + 'opt_group_savingAsset' => 'Savings accounts', + 'opt_group_sharedAsset' => 'Shared asset accounts', + 'opt_group_ccAsset' => 'Credit cards', // new user: @@ -656,8 +644,6 @@ return [ 'yourAccounts' => 'Your accounts', 'budgetsAndSpending' => 'Budgets and spending', 'savings' => 'Savings', - 'markAsSavingsToContinue' => 'Označite ta premoženjski račun kot "varčevalni račun" da zapolnite ta okvir', - 'createPiggyToContinue' => 'Create piggy banks to fill this panel.', 'newWithdrawal' => 'New expense', 'newDeposit' => 'New deposit', 'newTransfer' => 'New transfer', @@ -665,8 +651,6 @@ return [ 'moneyOut' => 'Money out', 'billsToPay' => 'Bills to pay', 'billsPaid' => 'Bills paid', - 'divided' => 'divided', - 'toDivide' => 'left to divide', // menu and titles, should be recycled as often as possible: 'currency' => 'Currency', @@ -726,20 +710,11 @@ return [ 'reports_can_bookmark' => 'Remember that reports can be bookmarked.', 'incomeVsExpenses' => 'prihodki napram odhodkom', 'accountBalances' => 'Account balances', - 'balanceStartOfYear' => 'Balance at start of year', - 'balanceEndOfYear' => 'Balance at end of year', - 'balanceStartOfMonth' => 'Balance at start of month', - 'balanceEndOfMonth' => 'Balance at end of month', 'balanceStart' => 'Balance at start of period', 'balanceEnd' => 'Balance at end of period', - 'reportsOwnAccounts' => 'Reports for your own accounts', - 'reportsOwnAccountsAndShared' => 'Reports for your own accounts and shared accounts', 'splitByAccount' => 'Split by account', - 'balancedByTransfersAndTags' => 'Balanced by transfers and tags', 'coveredWithTags' => 'Covered with tags', 'leftUnbalanced' => 'Left unbalanced', - 'expectedBalance' => 'Expected balance', - 'outsideOfBudgets' => 'Outside of budgets', 'leftInBudget' => 'Left in budget', 'sumOfSums' => 'Sum of sums', 'noCategory' => '(no category)', @@ -752,19 +727,12 @@ return [ 'topX' => 'top :number', 'show_full_list' => 'Show entire list', 'show_only_top' => 'Show only top :number', - 'sum_of_year' => 'Sum of year', - 'sum_of_years' => 'Sum of years', - 'average_of_year' => 'Average of year', - 'average_of_years' => 'Average of years', - 'categories_earned_in_year' => 'Categories (by earnings)', - 'categories_spent_in_year' => 'Categories (by spendings)', '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', - 'report_type_meta-history' => 'Categories, budgets and bills overview', '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', @@ -814,10 +782,12 @@ return [ 'account_role_sharedAsset' => 'deljen premoženjski račun', 'account_role_savingAsset' => 'varčevalni račun', 'account_role_ccAsset' => 'kreditna kartica', + 'budget_chart_click' => 'Please click on a budget name in the table above to see a chart.', + 'category_chart_click' => 'Please click on a category name in the table above to see a chart.', + // charts: 'chart' => 'Chart', - 'dayOfMonth' => 'Day of the month', 'month' => 'Month', 'budget' => 'Budget', 'spent' => 'Spent', @@ -838,7 +808,6 @@ return [ 'budgeted' => 'Budgeted', 'period' => 'Period', 'balance' => 'Balance', - 'summary' => 'Summary', 'sum' => 'Sum', 'average' => 'Average', 'balanceFor' => 'Balance for :name', @@ -858,47 +827,38 @@ return [ 'add_money_to_piggy_title' => 'Add money to piggy bank ":name"', 'remove_money_from_piggy_title' => 'Remove money from piggy bank ":name"', 'add' => 'Add', + 'no_money_for_piggy' => 'You have no money to put in this piggy bank.', - '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' => 'Target date', - 'no_target_date' => 'No target date', - 'todo' => 'to do', - 'table' => 'Table', - 'piggy_bank_not_exists' => 'Piggy bank no longer exists.', - 'add_any_amount_to_piggy' => 'Add money to this piggy bank to reach your target of :amount.', - 'add_set_amount_to_piggy' => 'Add :amount to fill this piggy bank on :date', - '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"', - 'cannot_remove_amount_piggy' => 'Could not remove :amount from ":name".', + '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' => 'Target date', + 'no_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' => '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', - 'edit_tag' => 'Edit tag ":tag"', - 'updated_tag' => 'Updated tag ":tag"', - 'created_tag' => 'Tag ":tag" has been created!', - 'no_year' => 'No year set', - 'no_month' => 'No month set', - 'tag_title_nothing' => 'Default tags', - 'tag_title_balancingAct' => 'Balancing act tags', - 'tag_title_advancePayment' => 'Advance payment 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', + 'edit_tag' => 'Edit tag ":tag"', + 'updated_tag' => 'Updated tag ":tag"', + 'created_tag' => 'Tag ":tag" has been created!', 'transaction_journal_information' => 'Transaction information', 'transaction_journal_meta' => 'Meta information', @@ -925,44 +885,59 @@ return [ 'budgets_with_limits' => 'budget(s) with configured amount', 'rule_or_rules' => 'rule(s)', 'rulegroup_or_groups' => 'rule group(s)', - 'setting_must_confirm_account' => 'Account confirmation', - 'setting_must_confirm_account_explain' => 'When this setting is enabled, users must activate their account before it can be used.', '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.', - 'setting_send_email_notifications' => 'Send email notifications', - 'setting_send_email_explain' => 'Firefly III can send you email notifications about certain events. They will be sent to :site_owner. This email address can be set in the .env file.', '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', + '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', // split a transaction: - 'transaction_meta_data' => 'Transaction meta-data', - 'transaction_dates' => 'Transaction dates', 'splits' => 'Splits', - 'split_title_withdrawal' => 'Split your new withdrawal', - 'split_intro_one_withdrawal' => 'Firefly supports the "splitting" of a withdrawal.', - 'split_intro_two_withdrawal' => 'It means that the amount of money you\'ve spent is divided between several destination expense accounts, budgets or categories.', - 'split_intro_three_withdrawal' => 'For example: you could split your :total groceries so you pay :split_one from your "daily groceries" budget and :split_two from your "cigarettes" budget.', - 'split_table_intro_withdrawal' => 'Split your withdrawal in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_withdrawal' => 'Store splitted withdrawal', - 'update_splitted_withdrawal' => 'Update splitted withdrawal', - 'split_title_deposit' => 'Split your new deposit', - 'split_intro_one_deposit' => 'Firefly supports the "splitting" of a deposit.', - 'split_intro_two_deposit' => 'It means that the amount of money you\'ve earned is divided between several source revenue accounts or categories.', - 'split_intro_three_deposit' => 'For example: you could split your :total salary so you get :split_one as your base salary and :split_two as a reimbursment for expenses made.', - 'split_table_intro_deposit' => 'Split your deposit in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_deposit' => 'Store splitted deposit', - 'split_title_transfer' => 'Split your new transfer', - 'split_intro_one_transfer' => 'Firefly supports the "splitting" of a transfer.', - 'split_intro_two_transfer' => 'It means that the amount of money you\'re moving is divided between several categories or piggy banks.', - 'split_intro_three_transfer' => 'For example: you could split your :total move so you get :split_one in one piggy bank and :split_two in another.', - 'split_table_intro_transfer' => 'Split your transfer in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_transfer' => 'Store splitted transfer', 'add_another_split' => 'Add another split', 'split-transactions' => 'Split transactions', - 'split-new-transaction' => 'Split a new transaction', 'do_split' => 'Do a split', 'split_this_withdrawal' => 'Split this withdrawal', 'split_this_deposit' => 'Split this deposit', @@ -1016,9 +991,6 @@ return [ 'import_status_finished_job' => 'The transactions imported can be found in tag :tag.', 'import_with_key' => 'Import with key \':key\'', - // different states: - 'import_status_job_running' => 'The import is underway. Please be patient...', - // sandstorm.io errors and messages: 'sandstorm_not_available' => 'This function is not available when you are using Firefly III within a Sandstorm.io environment.', @@ -1070,4 +1042,4 @@ return [ 'no_bills_create_default' => 'Create a bill', -]; \ No newline at end of file +]; diff --git a/resources/lang/sl_SI/form.php b/resources/lang/sl_SI/form.php index f85aa1cde4..c3930e8f0a 100644 --- a/resources/lang/sl_SI/form.php +++ b/resources/lang/sl_SI/form.php @@ -100,6 +100,7 @@ return [ 'code' => 'Code', 'iban' => 'IBAN', 'accountNumber' => 'Account number', + 'creditCardNumber' => 'Credit card number', 'has_headers' => 'Headers', 'date_format' => 'Date format', 'specifix' => 'Bank- or file specific fixes', @@ -135,6 +136,7 @@ return [ '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' => 'Are you sure you want to delete the bill named ":name"?', @@ -147,11 +149,14 @@ return [ 'journal_areYouSure' => 'Are you sure you want to delete the transaction described ":description"?', 'mass_journal_are_you_sure' => 'Are you sure you want to delete these transactions?', 'tag_areYouSure' => 'Are you sure you want to delete the tag ":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.', @@ -189,4 +194,7 @@ return [ 'payment_date' => 'Payment date', 'invoice_date' => 'Invoice date', 'internal_reference' => 'Internal reference', -]; \ No newline at end of file + + 'inward' => 'Inward description', + 'outward' => 'Outward description', +]; diff --git a/resources/lang/sl_SI/help.php b/resources/lang/sl_SI/help.php index d9b1d8d381..8ccfb5e470 100644 --- a/resources/lang/sl_SI/help.php +++ b/resources/lang/sl_SI/help.php @@ -32,4 +32,4 @@ return [ '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', -]; \ No newline at end of file +]; diff --git a/resources/lang/sl_SI/intro.php b/resources/lang/sl_SI/intro.php index e945adcec8..02a0eead23 100644 --- a/resources/lang/sl_SI/intro.php +++ b/resources/lang/sl_SI/intro.php @@ -44,17 +44,17 @@ return [ '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 or multiple categories.', + '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 you how your expenses and income per category.', + 'reports_report_category_incomeAndExpensesChart' => 'This chart shows your expenses and income per category.', - 'reports_report_tag_intro' => 'This report will give you insight in or multiple tags.', + '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 you how your expenses and income per tag.', + 'reports_report_tag_incomeAndExpensesChart' => 'This chart shows your expenses and income per tag.', - 'reports_report_budget_intro' => 'This report will give you insight in or multiple budgets.', - 'reports_report_budget_pieCharts' => 'These charts will give you insight in expenses and income per budget or per account.', - 'reports_report_budget_incomeAndExpensesChart' => 'This chart shows you how your expenses and income per budget.', + '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.', @@ -118,4 +118,4 @@ return [ // 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/sl_SI/list.php b/resources/lang/sl_SI/list.php index 3a7f3959b3..264d55d72a 100644 --- a/resources/lang/sl_SI/list.php +++ b/resources/lang/sl_SI/list.php @@ -12,80 +12,78 @@ 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', - 'confirmed_from' => 'Potrjen od', - 'registered_from' => 'Registriran', - 'blocked_code' => 'Koda vzroka blokade', - 'domain' => 'Domena', - 'registration_attempts' => 'Poskusov registriranja', - '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', -]; \ No newline at end of file + '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', +]; diff --git a/resources/lang/sl_SI/pagination.php b/resources/lang/sl_SI/pagination.php index 195d2fe50f..6ad8ba1520 100644 --- a/resources/lang/sl_SI/pagination.php +++ b/resources/lang/sl_SI/pagination.php @@ -16,4 +16,4 @@ return [ 'previous' => '« Prejšnja stran', 'next' => 'Naslednja stran »', -]; \ No newline at end of file +]; diff --git a/resources/lang/sl_SI/passwords.php b/resources/lang/sl_SI/passwords.php index 502ed29e20..5464c6a079 100644 --- a/resources/lang/sl_SI/passwords.php +++ b/resources/lang/sl_SI/passwords.php @@ -18,4 +18,4 @@ return [ 'sent' => 'Poslali smo vam povezavo za ponastavitev gesla!', 'reset' => 'Vaše geslo je bilo ponastavljeno!', 'blocked' => 'Dober poskus...', -]; \ No newline at end of file +]; diff --git a/resources/lang/sl_SI/validation.php b/resources/lang/sl_SI/validation.php index fff91fb426..5061b70f84 100644 --- a/resources/lang/sl_SI/validation.php +++ b/resources/lang/sl_SI/validation.php @@ -17,7 +17,6 @@ return [ 'deleted_user' => 'Iz varnostnih razlogov ne morete ustvariti uporabnika s takim e-poštnim naslovom.', 'rule_trigger_value' => 'Ta vrednost je neveljavna za izbrani sprožilec.', 'rule_action_value' => 'This value is invalid for the selected action.', - 'invalid_domain' => 'Due to security constraints, you cannot register from this domain.', 'file_already_attached' => 'Uploaded file ":name" is already attached to this object.', 'file_attached' => 'Succesfully uploaded file ":name".', 'file_invalid_mime' => 'File ":name" is of type ":mime" which is not accepted as a new upload.', @@ -91,4 +90,4 @@ return [ '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/lang/zh_TW/breadcrumbs.php b/resources/lang/zh_TW/breadcrumbs.php index 58c729fbbf..a99899ab8a 100644 --- a/resources/lang/zh_TW/breadcrumbs.php +++ b/resources/lang/zh_TW/breadcrumbs.php @@ -13,31 +13,32 @@ declare(strict_types=1); */ return [ - 'home' => '首頁', - '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"', + 'home' => '首頁', + '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/firefly.php b/resources/lang/zh_TW/firefly.php index 09cad74ff6..3ea696070e 100644 --- a/resources/lang/zh_TW/firefly.php +++ b/resources/lang/zh_TW/firefly.php @@ -13,7 +13,6 @@ declare(strict_types=1); return [ // general stuff: - 'language_incomplete' => '翻譯不完整', 'close' => '關閉', 'actions' => '操作', 'edit' => '編輯', @@ -28,12 +27,7 @@ return [ 'to' => '到', 'showEverything' => '全部顯示', 'never' => '從來沒有', - 'search_results_for' => '":query" 的搜尋結果', 'no_results_for_empty_search' => 'Your search was empty, so nothing was found.', - 'bounced_error' => '無法傳送電郵至 :email ,因此無法訪問。', - 'deleted_error' => '帳號或密碼錯誤。', - 'general_blocked_error' => '您的帳戶已被禁用,所以您不能登錄。', - 'expired_error' => '你的帳戶已過期,不能使用。', 'removed_amount' => '移除了 :amount', 'added_amount' => '添加了 :amount', 'asset_account_role_help' => '你可以稍後再設置其他選項。', @@ -56,7 +50,6 @@ return [ 'flash_error_multiple' => '出現了一個錯誤|出現了 :count 個錯誤', 'net_worth' => '淨值', 'route_has_no_help' => '目前還沒有說明。', - 'help_may_not_be_your_language' => '這個說明還沒有中文版本,將會顯示英文版本。', 'two_factor_welcome' => '哈囉, :user !', 'two_factor_enter_code' => '若要繼續,請輸入你的雙重身份驗證 (2FA) 應用程序內顯示的驗證代碼。', 'two_factor_code_here' => '在此輸入代碼', @@ -70,9 +63,6 @@ return [ 'two_factor_lost_fix_owner' => '否則,請電郵網站擁有者,:site_owner 並要求他們重置你的雙重身份驗證。', 'warning_much_data' => ':days 天的資料需要一點時間載入。', 'registered' => '您已成功註冊 !', - 'tagbalancingAct' => 'Balancing act', - 'tagadvancePayment' => 'Advance payment', - 'tagnothing' => '', 'Default asset account' => 'Default asset account', 'no_budget_pointer' => '你還沒有預算。你可以在預算頁來建立預算。預算可以幫助你跟蹤支出情況。', 'Savings account' => 'Savings account', @@ -84,7 +74,6 @@ return [ '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.', - 'nothing_to_display' => 'There are no transactions to show you', 'show_all_no_filter' => 'Show all transactions without grouping them by date.', 'expenses_by_category' => 'Expenses by category', 'expenses_by_budget' => 'Expenses by budget', @@ -98,11 +87,7 @@ return [ '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_change_demo' => 'You cannot change the password of the demonstration account.', - 'cannot_delete_demo' => 'You cannot remove the demonstration account.', 'cannot_reset_demo_user' => 'You cannot reset the password of the demonstration account', - 'per_period' => 'Per period', - 'all_periods' => 'All periods', '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.', @@ -111,11 +96,9 @@ return [ '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"', - 'budget_in_period_breadcrumb' => 'Between :start and :end', 'clone_withdrawal' => 'Clone this withdrawal', 'clone_deposit' => 'Clone this deposit', 'clone_transfer' => 'Clone this transfer', - 'transaction_journal_other_options' => 'Other options', 'multi_select_no_selection' => 'None selected', 'multi_select_all_selected' => 'All selected', 'multi_select_filter_placeholder' => 'Find..', @@ -164,18 +147,6 @@ return [ 'quarterly' => '每季', 'half-year' => '每半年', 'yearly' => '每年', - // account confirmation: - 'confirm_account_header' => '請確認你的帳戶', - 'confirm_account_intro' => 'An email has been sent to the address you used during your registration. Please check it out for further instructions. If you did not get this message, you can have Firefly send it again.', - 'confirm_account_resend_email' => 'Send me the confirmation message I need to activate my account.', - 'account_is_confirmed' => '你的帳戶已通過驗證。', - 'invalid_activation_code' => 'It seems the code you are using is not valid, or has expired.', - 'confirm_account_is_resent_header' => '已重新發送確認郵件', - 'confirm_account_is_resent_text' => 'The confirmation message has been resent. If you still did not receive the confirmation message, please contact the site owner at :owner or check the log files to see what went wrong.', - 'confirm_account_is_resent_go_home' => '轉到 Firefly 的首頁', - 'confirm_account_not_resent_header' => '有些事不對勁 :(', - 'confirm_account_not_resent_intro' => 'The confirmation message has been not resent. If you still did not receive the confirmation message, please contact the site owner at :owner instead. Possibly, you have tried to resend the activation message too often. You can have Firefly III try to resend the confirmation message every hour.', - 'confirm_account_not_resent_go_home' => '轉到 Firefly 的首頁', // export data: 'import_and_export' => '匯入與匯出', @@ -205,7 +176,6 @@ return [ 'export_status_created_zip_file' => 'Created a zip file!', 'export_status_finished' => 'Export has succesfully finished! Yay!', 'export_data_please_wait' => 'Please wait...', - 'attachment_explanation' => '檔案 \':attachment_name\' (#:attachment_id) 本來於 :date 上傳到 :type \':description\' (#:journal_id) ,而其金額為 :amount 。', // rules 'rules' => 'Rules', @@ -523,7 +493,6 @@ return [ 'createBudget' => 'New budget', 'inactiveBudgets' => 'Inactive budgets', 'without_budget_between' => 'Transactions without a budget between :start and :end', - 'budget_in_month' => ':name in :month', 'delete_budget' => 'Delete budget ":name"', 'deleted_budget' => 'Deleted budget ":name"', 'edit_budget' => 'Edit budget ":name"', @@ -597,8 +566,6 @@ return [ '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', - 'from_to' => 'From :start to :end', - 'from_to_breadcrumb' => 'from :start to :end', 'account_default_currency' => 'If you select another currency, new transactions from this account will have this currency pre-selected.', // categories: @@ -656,8 +623,6 @@ return [ 'yourAccounts' => 'Your accounts', 'budgetsAndSpending' => 'Budgets and spending', 'savings' => 'Savings', - 'markAsSavingsToContinue' => '將你的資產帳戶標記為 「儲蓄帳戶」 即可顯示在這裡', - 'createPiggyToContinue' => 'Create piggy banks to fill this panel.', 'newWithdrawal' => 'New expense', 'newDeposit' => 'New deposit', 'newTransfer' => 'New transfer', @@ -665,8 +630,6 @@ return [ 'moneyOut' => 'Money out', 'billsToPay' => '待付賬單', 'billsPaid' => '已付賬單', - 'divided' => 'divided', - 'toDivide' => 'left to divide', // menu and titles, should be recycled as often as possible: 'currency' => 'Currency', @@ -726,20 +689,11 @@ return [ 'reports_can_bookmark' => 'Remember that reports can be bookmarked.', 'incomeVsExpenses' => 'Income vs. expenses', 'accountBalances' => '帳戶餘額', - 'balanceStartOfYear' => '年初結餘', - 'balanceEndOfYear' => '年末結餘', - 'balanceStartOfMonth' => '月初結餘', - 'balanceEndOfMonth' => '月未結餘', 'balanceStart' => '期間之初的結餘', 'balanceEnd' => '期間之未的結餘', - 'reportsOwnAccounts' => 'Reports for your own accounts', - 'reportsOwnAccountsAndShared' => 'Reports for your own accounts and shared accounts', 'splitByAccount' => '以帳號來分割', - 'balancedByTransfersAndTags' => 'Balanced by transfers and tags', 'coveredWithTags' => 'Covered with tags', 'leftUnbalanced' => 'Left unbalanced', - 'expectedBalance' => '預期餘額', - 'outsideOfBudgets' => 'Outside of budgets', 'leftInBudget' => 'Left in budget', 'sumOfSums' => 'Sum of sums', 'noCategory' => '(no category)', @@ -752,19 +706,12 @@ return [ 'topX' => 'top :number', 'show_full_list' => 'Show entire list', 'show_only_top' => 'Show only top :number', - 'sum_of_year' => 'Sum of year', - 'sum_of_years' => 'Sum of years', - 'average_of_year' => 'Average of year', - 'average_of_years' => 'Average of years', - 'categories_earned_in_year' => 'Categories (by earnings)', - 'categories_spent_in_year' => 'Categories (by spendings)', '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', - 'report_type_meta-history' => '類別、 預算與賬單的概覽', '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', @@ -817,7 +764,6 @@ return [ // charts: 'chart' => 'Chart', - 'dayOfMonth' => 'Day of the month', 'month' => 'Month', 'budget' => 'Budget', 'spent' => 'Spent', @@ -838,7 +784,6 @@ return [ 'budgeted' => 'Budgeted', 'period' => 'Period', 'balance' => '餘額', - 'summary' => 'Summary', 'sum' => 'Sum', 'average' => 'Average', 'balanceFor' => ':name 的餘額', @@ -871,18 +816,13 @@ return [ 'start_date' => 'Start date', 'target_date' => '儲蓄目標日期', 'no_target_date' => '沒有儲蓄目標日期', - 'todo' => 'to do', 'table' => 'Table', - 'piggy_bank_not_exists' => 'Piggy bank no longer exists.', - 'add_any_amount_to_piggy' => 'Add money to this piggy bank to reach your target of :amount.', - 'add_set_amount_to_piggy' => 'Add :amount to fill this piggy bank on :date', '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"', - 'cannot_remove_amount_piggy' => 'Could not remove :amount from ":name".', // tags 'regular_tag' => '只是一個普通的標籤。', @@ -894,11 +834,6 @@ return [ 'edit_tag' => '編輯標籤 ":tag"', 'updated_tag' => '更新了標籤 ":tag"', 'created_tag' => '成功創建標籤 ":tag" !', - 'no_year' => 'No year set', - 'no_month' => 'No month set', - 'tag_title_nothing' => '預設標籤', - 'tag_title_balancingAct' => '抵銷行為標籤', - 'tag_title_advancePayment' => '預付款標籤', 'transaction_journal_information' => 'Transaction information', 'transaction_journal_meta' => 'Meta information', @@ -925,44 +860,51 @@ return [ 'budgets_with_limits' => 'budget(s) with configured amount', 'rule_or_rules' => 'rule(s)', 'rulegroup_or_groups' => 'rule group(s)', - 'setting_must_confirm_account' => 'Account confirmation', - 'setting_must_confirm_account_explain' => 'When this setting is enabled, users must activate their account before it can be used.', '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.', - 'setting_send_email_notifications' => 'Send email notifications', - 'setting_send_email_explain' => 'Firefly III can send you email notifications about certain events. They will be sent to :site_owner. This email address can be set in the .env file.', '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: - 'transaction_meta_data' => 'Transaction meta-data', - 'transaction_dates' => 'Transaction dates', 'splits' => '分割', - 'split_title_withdrawal' => '分割你的新提款', - 'split_intro_one_withdrawal' => 'Firefly 容許 "分割" 一個提款。', - 'split_intro_two_withdrawal' => 'It means that the amount of money you\'ve spent is divided between several destination expense accounts, budgets or categories.', - 'split_intro_three_withdrawal' => '例如:你可以分割你一共 :total 的日用品,所以你可以由你的「日用品」預算支付 :split_one 和由你的「香煙」預算中支付 :split_two 。', - 'split_table_intro_withdrawal' => 'Split your withdrawal in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_withdrawal' => 'Store splitted withdrawal', - 'update_splitted_withdrawal' => 'Update splitted withdrawal', - 'split_title_deposit' => 'Split your new deposit', - 'split_intro_one_deposit' => 'Firefly supports the "splitting" of a deposit.', - 'split_intro_two_deposit' => 'It means that the amount of money you\'ve earned is divided between several source revenue accounts or categories.', - 'split_intro_three_deposit' => 'For example: you could split your :total salary so you get :split_one as your base salary and :split_two as a reimbursment for expenses made.', - 'split_table_intro_deposit' => 'Split your deposit in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_deposit' => 'Store splitted deposit', - 'split_title_transfer' => 'Split your new transfer', - 'split_intro_one_transfer' => 'Firefly supports the "splitting" of a transfer.', - 'split_intro_two_transfer' => 'It means that the amount of money you\'re moving is divided between several categories or piggy banks.', - 'split_intro_three_transfer' => 'For example: you could split your :total move so you get :split_one in one piggy bank and :split_two in another.', - 'split_table_intro_transfer' => 'Split your transfer in as many things as you want. By default the transaction will not split, there is just one entry. Add as many splits as you want to, below. Remember that you should not deviate from your total amount. If you do, Firefly will warn you but not correct you.', - 'store_splitted_transfer' => 'Store splitted transfer', 'add_another_split' => 'Add another split', 'split-transactions' => 'Split transactions', - 'split-new-transaction' => 'Split a new transaction', 'do_split' => 'Do a split', 'split_this_withdrawal' => 'Split this withdrawal', 'split_this_deposit' => 'Split this deposit', @@ -1016,9 +958,6 @@ return [ 'import_status_finished_job' => 'The transactions imported can be found in tag :tag.', 'import_with_key' => '以鍵 \':key\' 作匯入', - // different states: - 'import_status_job_running' => 'The import is underway. Please be patient...', - // sandstorm.io errors and messages: 'sandstorm_not_available' => 'This function is not available when you are using Firefly III within a Sandstorm.io environment.', diff --git a/resources/lang/zh_TW/form.php b/resources/lang/zh_TW/form.php index d6e34d93a8..2889759d75 100644 --- a/resources/lang/zh_TW/form.php +++ b/resources/lang/zh_TW/form.php @@ -135,6 +135,7 @@ return [ '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" 嗎?', @@ -147,11 +148,14 @@ return [ '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.', @@ -189,4 +193,7 @@ return [ '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/intro.php b/resources/lang/zh_TW/intro.php index e945adcec8..c161cef362 100644 --- a/resources/lang/zh_TW/intro.php +++ b/resources/lang/zh_TW/intro.php @@ -44,17 +44,17 @@ return [ '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 or multiple categories.', + '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 you how your expenses and income per category.', + 'reports_report_category_incomeAndExpensesChart' => 'This chart shows your expenses and income per category.', - 'reports_report_tag_intro' => 'This report will give you insight in or multiple tags.', + '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 you how your expenses and income per tag.', + 'reports_report_tag_incomeAndExpensesChart' => 'This chart shows your expenses and income per tag.', - 'reports_report_budget_intro' => 'This report will give you insight in or multiple budgets.', - 'reports_report_budget_pieCharts' => 'These charts will give you insight in expenses and income per budget or per account.', - 'reports_report_budget_incomeAndExpensesChart' => 'This chart shows you how your expenses and income per budget.', + '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.', diff --git a/resources/lang/zh_TW/list.php b/resources/lang/zh_TW/list.php index e9e40f95be..60c67ed53a 100644 --- a/resources/lang/zh_TW/list.php +++ b/resources/lang/zh_TW/list.php @@ -78,14 +78,17 @@ return [ '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', + '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/views/accounts/edit.twig b/resources/views/accounts/edit.twig index 461a4402c7..e0b4ebf916 100644 --- a/resources/views/accounts/edit.twig +++ b/resources/views/accounts/edit.twig @@ -33,7 +33,11 @@
{{ ExpandedForm.text('iban') }} {{ ExpandedForm.text('BIC', null, {maxlength: 11}) }} - {{ ExpandedForm.text('accountNumber') }} + {% if preFilled.accountRole == 'ccAsset' %} + {{ ExpandedForm.text('accountNumber', null , {label:trans('form.creditCardNumber')}) }} + {% else %} + {{ ExpandedForm.text('accountNumber') }} + {% endif %} {% if account.accounttype.type == 'Default account' or account.accounttype.type == 'Asset account' %} diff --git a/resources/views/accounts/show.twig b/resources/views/accounts/show.twig index 7249618ff8..a176f0fcd6 100644 --- a/resources/views/accounts/show.twig +++ b/resources/views/accounts/show.twig @@ -88,14 +88,14 @@ {% include 'list.journals' with {sorting:true, hideBills:true, hideBudgets: true, hideCategories: true} %} {% if periods.count > 0 %}

- + {{ 'show_all_no_filter'|_ }}

{% else %}

- + {{ 'show_the_current_period_and_overview'|_ }} diff --git a/resources/views/admin/index.twig b/resources/views/admin/index.twig index 2edd7c681e..1de89abcc3 100644 --- a/resources/views/admin/index.twig +++ b/resources/views/admin/index.twig @@ -13,6 +13,7 @@

@@ -34,4 +35,6 @@ + + {% endblock %} diff --git a/resources/views/admin/link/create.twig b/resources/views/admin/link/create.twig new file mode 100644 index 0000000000..cb69f859df --- /dev/null +++ b/resources/views/admin/link/create.twig @@ -0,0 +1,44 @@ +{% extends "./layout/default" %} + +{% block breadcrumbs %} + {{ Breadcrumbs.renderIfExists(Route.getCurrentRoute.getName) }} +{% endblock %} + +{% block content %} + +
+ +
+
+
+
+

{{ 'mandatoryFields'|_ }}

+
+
+ {{ ExpandedForm.text('name', null, {helpText: trans('firefly.link_type_help_name')}) }} + {{ ExpandedForm.text('inward', null, {helpText: trans('firefly.link_type_help_inward')}) }} + {{ ExpandedForm.text('outward', null, {helpText: trans('firefly.link_type_help_outward')}) }} +
+
+
+
+ +
+
+

{{ 'options'|_ }}

+
+
+ {{ ExpandedForm.optionsList('create','link_type') }} +
+ +
+ +
+ +
+
+ + +{% endblock %} diff --git a/resources/views/admin/link/delete.twig b/resources/views/admin/link/delete.twig new file mode 100644 index 0000000000..7b94903ed9 --- /dev/null +++ b/resources/views/admin/link/delete.twig @@ -0,0 +1,53 @@ +{% extends "./layout/default" %} + +{% block breadcrumbs %} + {{ Breadcrumbs.renderIfExists(Route.getCurrentRoute.getName, linkType) }} +{% endblock %} + +{% block content %} + +
+ +
+
+
+
+

{{ trans('form.delete_link_type', {'name': linkType.name}) }}

+
+
+

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

+ +

+ {{ trans('form.linkType_areYouSure', {'name': linkType.name,'inward': linkType.inward,'outward': linkType.outward}) }} +

+ + {% if count > 0 %} +

+ {{ Lang.choice('form.also_delete_connections', count, {count: count}) }} +

+ {% endif %} + {% if count > 0 %} +

+ {{ 'save_connections_by_moving'|_ }} +

+ +

+ {{ Form.select('move_link_type_before_delete', moveTo, null, {class: 'form-control'}) }} +

+ {% else %} + + {% endif %} + +
+ +
+
+
+ +
+{% endblock %} diff --git a/resources/views/admin/link/edit.twig b/resources/views/admin/link/edit.twig new file mode 100644 index 0000000000..1bd8599f70 --- /dev/null +++ b/resources/views/admin/link/edit.twig @@ -0,0 +1,48 @@ +{% extends "./layout/default" %} + +{% block breadcrumbs %} + {{ Breadcrumbs.renderIfExists(Route.getCurrentRoute.getName, linkType) }} +{% endblock %} + +{% block content %} + + {{ Form.model(linkType, {'class' : 'form-horizontal','id' : 'update','url' : route('admin.links.update', linkType.id) } ) }} + + +
+
+
+
+

{{ 'mandatoryFields'|_ }}

+
+
+ {{ ExpandedForm.text('name', null, {helpText: trans('firefly.link_type_help_name')}) }} + {{ ExpandedForm.text('inward', null, {helpText: trans('firefly.link_type_help_inward')}) }} + {{ ExpandedForm.text('outward', null, {helpText: trans('firefly.link_type_help_outward')}) }} +
+
+
+
+ + +
+
+

{{ 'options'|_ }}

+
+
+ {{ ExpandedForm.optionsList('update','link_type') }} +
+ +
+ +
+ +
+ + + +{% endblock %} diff --git a/resources/views/admin/link/index.twig b/resources/views/admin/link/index.twig new file mode 100644 index 0000000000..2cc8338ef7 --- /dev/null +++ b/resources/views/admin/link/index.twig @@ -0,0 +1,66 @@ +{% extends "./layout/default" %} + +{% block breadcrumbs %} + {{ Breadcrumbs.renderIfExists }} +{% endblock %} +{% block content %} +
+
+
+
+

{{ 'journal_link_configuration'|_ }}

+
+
+ + + + + + + + + + + + {% for linkType in linkTypes %} + + + + + + + + {% endfor %} + +
{{ trans('list.name') }}{{ trans('list.number_of_transactions') }}
+ {% if linkType.editable %} +
+ + +
+ {% endif %} +
+ {{ linkType.name }} + + {{ linkType.inward }} + + {{ linkType.outward }} + + {{ linkType.journalCount }} +
+
+ +
+
+
+{% endblock %} + +{% block scripts %} + +{% endblock %} + +{% block styles %} + +{% endblock %} diff --git a/resources/views/admin/link/show.twig b/resources/views/admin/link/show.twig new file mode 100644 index 0000000000..813f53e534 --- /dev/null +++ b/resources/views/admin/link/show.twig @@ -0,0 +1,62 @@ +{% extends "./layout/default" %} + +{% block breadcrumbs %} + {{ Breadcrumbs.renderIfExists(Route.getCurrentRoute.getName, linkType) }} +{% endblock %} +{% block content %} +
+
+
+
+

{{ trans('firefly.overview_for_link', {name: linkType.name}) }}

+
+
+ + + + + + + + + + + + + {% for link in links %} + + + + + + + + + {% endfor %} + +
 Source transaction Link descriptionDestination transaction 
+
+ + +
+
+ {{ link.source.description }} + {{ journalAmount(link.source) }}{{ linkType.outward }} + {{ link.destination.description }} + + {{ journalAmount(link.destination) }} +
+
+
+
+
+ + +{% endblock %} +{% block scripts %} + +{% endblock %} + +{% block styles %} + +{% endblock %} diff --git a/resources/views/auth/login.twig b/resources/views/auth/login.twig index 88353375a6..8e925d16ba 100644 --- a/resources/views/auth/login.twig +++ b/resources/views/auth/login.twig @@ -17,7 +17,7 @@
@@ -29,7 +29,7 @@
diff --git a/resources/views/auth/two-factor.twig b/resources/views/auth/two-factor.twig index ea4275aae2..a02c30bf56 100644 --- a/resources/views/auth/two-factor.twig +++ b/resources/views/auth/two-factor.twig @@ -6,7 +6,7 @@
diff --git a/resources/views/budgets/income.twig b/resources/views/budgets/income.twig index 28904dc66d..50c80832f3 100644 --- a/resources/views/budgets/income.twig +++ b/resources/views/budgets/income.twig @@ -1,9 +1,9 @@