diff --git a/docker/apache-firefly.conf b/.deploy/docker/apache-firefly.conf similarity index 100% rename from docker/apache-firefly.conf rename to .deploy/docker/apache-firefly.conf diff --git a/docker/apache2.conf b/.deploy/docker/apache2.conf similarity index 100% rename from docker/apache2.conf rename to .deploy/docker/apache2.conf diff --git a/docker/docker.env b/.deploy/docker/docker.env similarity index 100% rename from docker/docker.env rename to .deploy/docker/docker.env diff --git a/docker/entrypoint.sh b/.deploy/docker/entrypoint.sh similarity index 100% rename from docker/entrypoint.sh rename to .deploy/docker/entrypoint.sh diff --git a/.deploy/kubernetes/firefly.yaml b/.deploy/kubernetes/firefly.yaml new file mode 100644 index 0000000000..b2e3d2c912 --- /dev/null +++ b/.deploy/kubernetes/firefly.yaml @@ -0,0 +1,82 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: mysql-pv-export-claim + labels: + app: firefly-local +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 20Gi +--- +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: mysql-pv-upload-claim + labels: + app: firefly-local +spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 20Gi +--- +apiVersion: apps/v1beta1 +kind: Deployment +metadata: + name: firefly-local + namespace: firefly + labels: + app: firefly-local +spec: + selector: + matchLabels: + app: firefly-local + template: + metadata: + labels: + app: firefly-local + spec: + containers: + - image: firefly-local + name: firefly-local + env: + - name: FF_APP_ENV + value: "local" + - name: FF_APP_KEY + value: "S0m3R@nd0mString0f32Ch@rsEx@ct1y" + - name: FF_DB_HOST + value: "172.17.0.9" + - name: FF_DB_NAME + value: "firefly_db" + - name: FF_DB_USER + value: "firefly_db" + - name: FF_DB_PASSWORD + value: "password" + volumeMounts: + - mountPath: "/var/www/firefly-iii/storage/export" + name: mysql-persistent-export + - mountPath: "/var/www/firefly-iii/storage/upload" + name: mysql-persistent-upload + imagePullPolicy: IfNotPresent + volumes: + - name: mysql-persistent-export + persistentVolumeClaim: + claimName: mysql-pv-export-claim + - name: mysql-persistent-upload + persistentVolumeClaim: + claimName: mysql-pv-upload-claim +--- +apiVersion: v1 +kind: Service +metadata: + name: firefly-local +spec: + ports: + - port: 80 + type: NodePort + selector: + app: firefly-local \ No newline at end of file diff --git a/.deploy/kubernetes/sql.yaml b/.deploy/kubernetes/sql.yaml new file mode 100644 index 0000000000..aae5f7d5cb --- /dev/null +++ b/.deploy/kubernetes/sql.yaml @@ -0,0 +1,49 @@ +apiVersion: v1 +kind: Secret +metadata: + name: sql-pass +type: Opaque +data: + password: cGFzc3dvcmQ= +--- +apiVersion: apps/v1beta1 +kind: Deployment +metadata: + name: mysql + namespace: firefly + labels: + app: mysql +spec: + selector: + matchLabels: + app: mysql + template: + metadata: + labels: + app: mysql + spec: + containers: + - image: mysql + imagePullPolicy: IfNotPresent + name: mysql + env: + - name: MYSQL_ROOT_PASSWORD + valueFrom: + secretKeyRef: + name: sql-pass + key: password + ports: + - containerPort: 3306 + name: mysql +--- +apiVersion: v1 +kind: Service +metadata: + name: mysql +spec: + ports: + - port: 3306 + type: NodePort + selector: + app: mysql + diff --git a/.env.docker b/.env.docker index 2ed1c88904..05f2035445 100644 --- a/.env.docker +++ b/.env.docker @@ -17,11 +17,14 @@ APP_KEY=${FF_APP_KEY} APP_URL=${APP_URL} TRUSTED_PROXIES=${TRUSTED_PROXIES} +# The log channel defines where your log entries go to. +LOG_CHANNEL=${LOG_CHANNEL} + # Database credentials. Make sure the database exists. I recommend a dedicated user for Firefly III # If you use SQLite, set connection to `sqlite` and remove the database, username and password settings. DB_CONNECTION=mysql DB_HOST=${FF_DB_HOST} -DB_PORT=3306 +DB_PORT=${FF_DB_PORT} DB_DATABASE=${FF_DB_NAME} DB_USERNAME=${FF_DB_USER} DB_PASSWORD=${FF_DB_PASSWORD} @@ -62,6 +65,11 @@ SEND_ERROR_MESSAGE=false # Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places. MAPBOX_API_KEY=${MAPBOX_API_KEY} +# Set a Fixer IO API key here (see https://fixer.io) to enable live currency exchange rates. +# Please note that this will only work for paid fixer.io accounts because they severly limited +# the free API up to the point where you might as well offer nothing. +FIXER_API_KEY=${FIXER_API_KEY} + # If you wish to track your own behavior over Firefly III, set a valid analytics tracker ID here. ANALYTICS_ID=${ANALYTICS_ID} @@ -79,7 +87,6 @@ REDIS_PASSWORD=null REDIS_PORT=6379 CACHE_PREFIX=firefly SEARCH_RESULT_LIMIT=50 -EXCHANGE_RATE_SERVICE=fixerio PUSHER_KEY= PUSHER_SECRET= PUSHER_ID= @@ -88,4 +95,4 @@ DEMO_PASSWORD= IS_DOCKER=true IS_SANDSTORM=false IS_HEROKU=false -TZ=${TZ} \ No newline at end of file +TZ=${TZ} diff --git a/.env.example b/.env.example index aa23f9660a..d8a506824c 100644 --- a/.env.example +++ b/.env.example @@ -21,8 +21,11 @@ TZ=UTC APP_URL=http://localhost TRUSTED_PROXIES= +# The log channel defines where your log entries go to. +LOG_CHANNEL=daily + # Database credentials. Make sure the database exists. I recommend a dedicated user for Firefly III -# If you use SQLite, set connection to `sqlite` and remove the database, username and password settings. +# For other database types, please see the FAQ: http://firefly-iii.readthedocs.io/en/latest/support/faq.html DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 @@ -66,6 +69,11 @@ SEND_ERROR_MESSAGE=true # Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places. MAPBOX_API_KEY= +# Set a Fixer IO API key here (see https://fixer.io) to enable live currency exchange rates. +# Please note that this will only work for paid fixer.io accounts because they severly limited +# the free API up to the point where you might as well offer nothing. +FIXER_API_KEY= + # If you wish to track your own behavior over Firefly III, set a valid analytics tracker ID here. ANALYTICS_ID= @@ -83,7 +91,6 @@ REDIS_PASSWORD=null REDIS_PORT=6379 CACHE_PREFIX=firefly SEARCH_RESULT_LIMIT=50 -EXCHANGE_RATE_SERVICE=fixerio PUSHER_KEY= PUSHER_SECRET= PUSHER_ID= diff --git a/.env.heroku b/.env.heroku index 9b16f9ab93..c798fc0a29 100644 --- a/.env.heroku +++ b/.env.heroku @@ -21,6 +21,9 @@ TZ=UTC APP_URL=http://localhost TRUSTED_PROXIES= +# The log channel defines where your log entries go to. +LOG_CHANNEL=syslog + # Database credentials. Make sure the database exists. I recommend a dedicated user for Firefly III # If you use SQLite, set connection to `sqlite` and remove the database, username and password settings. DB_CONNECTION=pgsql @@ -66,6 +69,11 @@ SEND_ERROR_MESSAGE=true # Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places. MAPBOX_API_KEY= +# Set a Fixer IO API key here (see https://fixer.io) to enable live currency exchange rates. +# Please note that this will only work for paid fixer.io accounts because they severly limited +# the free API up to the point where you might as well offer nothing. +FIXER_API_KEY= + # If you wish to track your own behavior over Firefly III, set a valid analytics tracker ID here. ANALYTICS_ID= @@ -83,7 +91,6 @@ REDIS_PASSWORD=null REDIS_PORT=6379 CACHE_PREFIX=firefly SEARCH_RESULT_LIMIT=50 -EXCHANGE_RATE_SERVICE=fixerio PUSHER_KEY= PUSHER_SECRET= PUSHER_ID= diff --git a/.env.sandstorm b/.env.sandstorm index 42c3108dac..9b3a8f8e86 100755 --- a/.env.sandstorm +++ b/.env.sandstorm @@ -21,6 +21,9 @@ TZ=UTC APP_URL=http://localhost TRUSTED_PROXIES= +# The log channel defines where your log entries go to. +LOG_CHANNEL=syslog + # Database credentials. Make sure the database exists. I recommend a dedicated user for Firefly III # If you use SQLite, set connection to `sqlite` and remove the database, username and password settings. DB_CONNECTION=mysql @@ -66,6 +69,11 @@ SEND_ERROR_MESSAGE=true # Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places. MAPBOX_API_KEY= +# Set a Fixer IO API key here (see https://fixer.io) to enable live currency exchange rates. +# Please note that this will only work for paid fixer.io accounts because they severly limited +# the free API up to the point where you might as well offer nothing. +FIXER_API_KEY= + # If you wish to track your own behavior over Firefly III, set a valid analytics tracker ID here. ANALYTICS_ID= @@ -83,7 +91,6 @@ REDIS_PASSWORD=null REDIS_PORT=6379 CACHE_PREFIX=firefly SEARCH_RESULT_LIMIT=50 -EXCHANGE_RATE_SERVICE=fixerio PUSHER_KEY= PUSHER_SECRET= PUSHER_ID= diff --git a/.env.testing b/.env.testing index 1b9f7ab7f2..04b6a2b328 100644 --- a/.env.testing +++ b/.env.testing @@ -1,33 +1,54 @@ +# You can leave this on "local". If you change it to production most console commands will ask for extra confirmation. +# Never set it to "testing". APP_ENV=testing + +# Set to true if you want to see debug information in error screens. APP_DEBUG=true -APP_NAME=FireflyIII + +# This should be your email address +SITE_OWNER=thegrumpydictator+testing@gmail.com + +# The encryption key for your database and sessions. Keep this very secure. +# If you generate a new one all existing data must be considered LOST. +# Change it to a string of exactly 32 chars or use command `php artisan key:generate` to generate it APP_KEY=TestTestTestTestTestTestTestTest -APP_LOG=daily -APP_LOG_LEVEL=debug -APP_URL=http://localhost -TRUSTED_PROXIES= + +# Change this value to your preferred time zone. +# Example: Europe/Amsterdam TZ=Europe/Amsterdam -DB_CONNECTION=sqlite -DB_HOST=127.0.0.1 -DB_PORT=3306 -#DB_DATABASE=firefly -DB_USERNAME=homestead -DB_PASSWORD= +# APP_URL and TRUSTED_PROXIES are useful when using Docker and/or a reverse proxy. +APP_URL=http://localhost +TRUSTED_PROXIES= -BROADCAST_DRIVER=log +# The log channel defines where your log entries go to. +LOG_CHANNEL=dailytest + +# Database credentials. Make sure the database exists. I recommend a dedicated user for Firefly III +# For other database types, please see the FAQ: http://firefly-iii.readthedocs.io/en/latest/support/faq.html +DB_CONNECTION=sqlite + +# 'daily' is the default logging mode giving you 5 daily rotated log files in /storage/logs/. +# Several other options exist. You can use 'single' for one big fat error log (not recommended). +# Also available are 'syslog' and 'errorlog' which will log to the system itself. +APP_LOG=daily + +# Log level. You can set this from least severe to most severe: +# debug, info, notice, warning, error, critical, alert, emergency +# If you set it to debug your logs will grow large, and fast. If you set it to emergency probably +# nothing will get logged, ever. +APP_LOG_LEVEL=debug + +# If you're looking for performance improvements, you could install memcached. CACHE_DRIVER=file SESSION_DRIVER=file -QUEUE_DRIVER=sync +# Cookie settings. Should not be necessary to change these. COOKIE_PATH="/" COOKIE_DOMAIN= COOKIE_SECURE=false -REDIS_HOST=127.0.0.1 -REDIS_PASSWORD=null -REDIS_PORT=6379 - +# If you want Firefly III to mail you, update these settings MAIL_DRIVER=log MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 @@ -36,26 +57,41 @@ MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null +# Firefly III can send you the following messages SEND_REGISTRATION_MAIL=true SEND_ERROR_MESSAGE=false -CACHE_PREFIX=firefly - -SEARCH_RESULT_LIMIT=50 -EXCHANGE_RATE_SERVICE=fixerio +# Set a Mapbox API key here (see mapbox.com) so there might be a map available at various places. MAPBOX_API_KEY= -ANALYTICS_ID= -SITE_OWNER=mail@example.com -USE_ENCRYPTION=true +# Set a Fixer IO API key here (see https://fixer.io) to enable live currency exchange rates. +# Please note that this will only work for paid fixer.io accounts because they severly limited +# the free API up to the point where you might as well offer nothing. +FIXER_API_KEY= + +# If you wish to track your own behavior over Firefly III, set a valid analytics tracker ID here. +ANALYTICS_ID= + +# Most parts of the database are encrypted by default, but you can turn this off if you want to. +# This makes it easier to migrate your database. Not that some fields will never be decrypted. +USE_ENCRYPTION=false + +# Leave the following configuration vars as is. +# Unless you like to tinker and know what you're doing. +APP_NAME=FireflyIII +BROADCAST_DRIVER=log +QUEUE_DRIVER=sync +REDIS_HOST=127.0.0.1 +REDIS_PASSWORD=null +REDIS_PORT=6379 +CACHE_PREFIX=firefly_tst +SEARCH_RESULT_LIMIT=50 PUSHER_KEY= PUSHER_SECRET= PUSHER_ID= - DEMO_USERNAME= DEMO_PASSWORD= - IS_DOCKER=false IS_SANDSTORM=false IS_HEROKU=false diff --git a/.sandstorm/changelog.md b/.sandstorm/changelog.md index c48ae8ed54..62cbe77596 100644 --- a/.sandstorm/changelog.md +++ b/.sandstorm/changelog.md @@ -1,3 +1,49 @@ +# 4.7.2 +- [Issue 1123](https://github.com/firefly-iii/firefly-iii/issues/1123) First browser based update routine. +- Add support for Italian. +- [Issue 1232](https://github.com/firefly-iii/firefly-iii/issues/1232) Allow user to specify Docker database port. +- [Issue 1197](https://github.com/firefly-iii/firefly-iii/issues/1197) Beter account list overview +- [Issue 1202](https://github.com/firefly-iii/firefly-iii/issues/1202) Some budgetary warnings +- [Issue 1284](https://github.com/firefly-iii/firefly-iii/issues/1284) Experimental support for bunq import +- [Issue 1248](https://github.com/firefly-iii/firefly-iii/issues/1248) Ability to import BIC, ability to import SEPA fields. +- [Issue 1102](https://github.com/firefly-iii/firefly-iii/issues/1102) Summary line for bills +- More info to debug page. +- [Issue 1186](https://github.com/firefly-iii/firefly-iii/issues/1186) You can see the latest account balance in CRUD forms +- Add Kubernetes YAML files, kindly created by a FF3 user. +- [Issue 1244](https://github.com/firefly-iii/firefly-iii/issues/1244) Better line for "today" marker and add it to other chart as well ([issue 1214](https://github.com/firefly-iii/firefly-iii/issues/1214)) +- [Issue 1219](https://github.com/firefly-iii/firefly-iii/issues/1219) Languages in dropdown +- [Issue 1189](https://github.com/firefly-iii/firefly-iii/issues/1189) Inactive accounts get removed from net worth +- [Issue 1220](https://github.com/firefly-iii/firefly-iii/issues/1220) Attachment description and notes migrated to just "notes". +- [Issue 1236](https://github.com/firefly-iii/firefly-iii/issues/1236) Multi currency balance box +- [Issue 1240](https://github.com/firefly-iii/firefly-iii/issues/1240) Better overview for accounts. +- [Issue 1292](https://github.com/firefly-iii/firefly-iii/issues/1292) Removed some charts from the "all"-overview of budgets and categories +- [Issue 1245](https://github.com/firefly-iii/firefly-iii/issues/1245) Improved recognition of IBANs +- Improved import routine. +- Update notifier will wait three days before notifying users. +- [Issue 1300](https://github.com/firefly-iii/firefly-iii/issues/1300) Virtual balance of credit cards does not count for net worth +- [Issue 1247](https://github.com/firefly-iii/firefly-iii/issues/1247) Can now see overspent amount +- [Issue 1221](https://github.com/firefly-iii/firefly-iii/issues/1221) Upgrade to Laravel 5.6 +- [Issue 1187](https://github.com/firefly-iii/firefly-iii/issues/1187) Updated the password verifier to use Troy Hunt's new API +- Revenue chart is now on frontpage permanently +- [Issue 1153](https://github.com/firefly-iii/firefly-iii/issues/1153) 2FA settings are in your profile now +- [Issue 1227](https://github.com/firefly-iii/firefly-iii/issues/1227) Can set the timezone in config or in Docker +- [Issue 1294](https://github.com/firefly-iii/firefly-iii/issues/1294) Ability to link a transaction to itself +- Correct reference to journal description in split form. +- [Issue 1234](https://github.com/firefly-iii/firefly-iii/issues/1234) Fix budget page issues in SQLite +- [Issue 1262](https://github.com/firefly-iii/firefly-iii/issues/1262) Can now use double and epty headers in CSV files +- [Issue 1258](https://github.com/firefly-iii/firefly-iii/issues/1258) Fixed a possible date mismatch in piggy banks +- [Issue 1283](https://github.com/firefly-iii/firefly-iii/issues/1283) Bulk delete was broken +- [Issue 1293](https://github.com/firefly-iii/firefly-iii/issues/1293) Layout problem with notes +- [Issue 1257](https://github.com/firefly-iii/firefly-iii/issues/1257) Improve transaction lists query count +- [Issue 1291](https://github.com/firefly-iii/firefly-iii/issues/1291) Fixer IO problems +- [Issue 1239](https://github.com/firefly-iii/firefly-iii/issues/1239) Could not edit expense or revenue accounts ([issue 1298](https://github.com/firefly-iii/firefly-iii/issues/1298)) +- [Issue 1297](https://github.com/firefly-iii/firefly-iii/issues/1297) Could not convert to withdrawal +- [Issue 1226](https://github.com/firefly-iii/firefly-iii/issues/1226) Category overview in default report shows no income. +- Various other bugs and problems ([issue 1198](https://github.com/firefly-iii/firefly-iii/issues/1198), [issue 1213](https://github.com/firefly-iii/firefly-iii/issues/1213), [issue 1237](https://github.com/firefly-iii/firefly-iii/issues/1237), [issue 1238](https://github.com/firefly-iii/firefly-iii/issues/1238), [issue 1199](https://github.com/firefly-iii/firefly-iii/issues/1199), [issue 1200](https://github.com/firefly-iii/firefly-iii/issues/1200)) + +### Security +- Fixed an issue with token validation on the command line. + # 4.7.1 - A brand new API. Read about it in the [documentation](http://firefly-iii.readthedocs.io/en/latest/). - Add support for Spanish. [issue 1194](https://github.com/firefly-iii/firefly-iii/issues/1194) diff --git a/.sandstorm/sandstorm-pkgdef.capnp b/.sandstorm/sandstorm-pkgdef.capnp index 5f865b44c0..a08db02187 100644 --- a/.sandstorm/sandstorm-pkgdef.capnp +++ b/.sandstorm/sandstorm-pkgdef.capnp @@ -15,8 +15,8 @@ const pkgdef :Spk.PackageDefinition = ( manifest = ( appTitle = (defaultText = "Firefly III"), - appVersion = 9, - appMarketingVersion = (defaultText = "4.7.1"), + appVersion = 10, + appMarketingVersion = (defaultText = "4.7.2"), actions = [ # Define your "new document" handlers here. diff --git a/.travis.yml b/.travis.yml index 33f7a18921..100fc61eeb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,21 +12,19 @@ install: - composer update --no-scripts - cp .env.testing .env - php artisan clear-compiled - - php artisan optimize - php artisan env - cp .env.testing .env - wget -q https://github.com/firefly-iii/test-data/raw/master/storage/database.sqlite -O storage/database/database.sqlite - mkdir -p build/logs script: - - phpunit -c phpunit.coverage.xml + - ./vendor/bin/phpunit -c phpunit.coverage.xml after_success: - travis_retry php vendor/bin/php-coveralls -x storage/build/clover-all.xml - - bash <(curl -s https://codecov.io/bash) -f storage/build/clover-all.xml # safelist branches: only: - develop - - master \ No newline at end of file + - master diff --git a/Dockerfile b/Dockerfile index 37c369df1f..e3730e4787 100644 --- a/Dockerfile +++ b/Dockerfile @@ -31,7 +31,7 @@ RUN docker-php-ext-install -j$(nproc) curl gd intl json readline tidy zip bcmath RUN echo "de_DE.UTF-8 UTF-8\nen_US.UTF-8 UTF-8\nfr_FR.UTF-8 UTF-8\nid_ID.UTF-8 UTF-8\nnl_NL.UTF-8 UTF-8\npl_PL.UTF-8 UTF-8" > /etc/locale.gen && locale-gen # copy Apache config to correct spot. -COPY ./docker/apache2.conf /etc/apache2/apache2.conf +COPY ./.deploy/docker/apache2.conf /etc/apache2/apache2.conf # Enable apache mod rewrite.. RUN a2enmod rewrite @@ -46,7 +46,7 @@ VOLUME $FIREFLY_PATH/storage/export $FIREFLY_PATH/storage/upload RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer # Enable default site (Firefly III) -COPY ./docker/apache-firefly.conf /etc/apache2/sites-available/000-default.conf +COPY ./.deploy/docker/apache-firefly.conf /etc/apache2/sites-available/000-default.conf # Make sure we own Firefly III directory RUN chown -R www-data:www-data /var/www && chmod -R 775 $FIREFLY_PATH/storage @@ -58,4 +58,4 @@ RUN composer install --prefer-dist --no-dev --no-scripts --no-suggest EXPOSE 80 # Run entrypoint thing -ENTRYPOINT ["docker/entrypoint.sh"] \ No newline at end of file +ENTRYPOINT [".deploy/docker/entrypoint.sh"] \ No newline at end of file diff --git a/app/Api/V1/Controllers/AboutController.php b/app/Api/V1/Controllers/AboutController.php index 56725ad5d5..721ec068fe 100644 --- a/app/Api/V1/Controllers/AboutController.php +++ b/app/Api/V1/Controllers/AboutController.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Api\V1\Controllers; @@ -30,7 +30,6 @@ use League\Fractal\Manager; use League\Fractal\Resource\Item; use League\Fractal\Serializer\JsonApiSerializer; - /** * Class AboutController */ @@ -44,7 +43,6 @@ class AboutController extends Controller public function __construct() { parent::__construct(); - } /** @@ -55,7 +53,7 @@ class AboutController extends Controller $search = ['~', '#']; $replace = ['\~', '# ']; $phpVersion = str_replace($search, $replace, PHP_VERSION); - $phpOs = str_replace($search, $replace, php_uname()); + $phpOs = str_replace($search, $replace, PHP_OS); $currentDriver = DB::getDriverName(); $data = [ @@ -64,7 +62,6 @@ class AboutController extends Controller 'php_version' => $phpVersion, 'os' => $phpOs, 'driver' => $currentDriver, - ]; return response()->json(['data' => $data], 200)->header('Content-Type', 'application/vnd.api+json'); @@ -84,5 +81,4 @@ class AboutController extends Controller return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); } - } diff --git a/app/Api/V1/Controllers/AccountController.php b/app/Api/V1/Controllers/AccountController.php index b30fe6903a..7fa157ff1d 100644 --- a/app/Api/V1/Controllers/AccountController.php +++ b/app/Api/V1/Controllers/AccountController.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Api\V1\Controllers; @@ -43,7 +43,6 @@ use Preferences; */ class AccountController extends Controller { - /** @var CurrencyRepositoryInterface */ private $currencyRepository; /** @var AccountRepositoryInterface */ @@ -59,7 +58,7 @@ class AccountController extends Controller parent::__construct(); $this->middleware( function ($request, $next) { - /** @var AccountRepositoryInterface repository */ + // @var AccountRepositoryInterface repository $this->repository = app(AccountRepositoryInterface::class); $this->repository->setUser(auth()->user()); @@ -74,7 +73,7 @@ class AccountController extends Controller /** * Remove the specified resource from storage. * - * @param \FireflyIII\Models\Account $account + * @param \FireflyIII\Models\Account $account * * @return \Illuminate\Http\Response */ @@ -95,16 +94,16 @@ class AccountController extends Controller public function index(Request $request) { // create some objects: - $manager = new Manager(); - $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; + $manager = new Manager(); + $baseUrl = $request->getSchemeAndHttpHost() . '/api/v1'; // read type from URI $type = $request->get('type') ?? 'all'; $this->parameters->set('type', $type); // types to get, page size: - $types = $this->mapTypes($this->parameters->get('type')); - $pageSize = intval(Preferences::getForUser(auth()->user(), 'listPageSize', 50)->data); + $types = $this->mapTypes($this->parameters->get('type')); + $pageSize = intval(Preferences::getForUser(auth()->user(), 'listPageSize', 50)->data); // get list of accounts. Count it and split it. $collection = $this->repository->getAccountsByType($types); @@ -153,7 +152,7 @@ class AccountController extends Controller { $data = $request->getAll(); // if currency ID is 0, find the currency by the code: - if ($data['currency_id'] === 0) { + if (0 === $data['currency_id']) { $currency = $this->currencyRepository->findByCodeNull($data['currency_code']); $data['currency_id'] = is_null($currency) ? 0 : $currency->id; } @@ -165,7 +164,6 @@ class AccountController extends Controller $resource = new Item($account, new AccountTransformer($this->parameters), 'accounts'); return response()->json($manager->createData($resource)->toArray())->header('Content-Type', 'application/vnd.api+json'); - } /** @@ -180,7 +178,7 @@ class AccountController extends Controller { $data = $request->getAll(); // if currency ID is 0, find the currency by the code: - if ($data['currency_id'] === 0) { + if (0 === $data['currency_id']) { $currency = $this->currencyRepository->findByCodeNull($data['currency_code']); $data['currency_id'] = is_null($currency) ? 0 : $currency->id; } diff --git a/app/Api/V1/Controllers/BillController.php b/app/Api/V1/Controllers/BillController.php index 6e62d6e906..e26b96bbf5 100644 --- a/app/Api/V1/Controllers/BillController.php +++ b/app/Api/V1/Controllers/BillController.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Api\V1\Controllers; use FireflyIII\Api\V1\Requests\BillRequest; -use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\Bill; use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Transformers\BillTransformer; diff --git a/app/Api/V1/Controllers/Controller.php b/app/Api/V1/Controllers/Controller.php index 91145d63b8..68f0d0c91d 100644 --- a/app/Api/V1/Controllers/Controller.php +++ b/app/Api/V1/Controllers/Controller.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Api\V1\Controllers; @@ -30,10 +30,12 @@ use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminate\Foundation\Validation\ValidatesRequests; use Illuminate\Routing\Controller as BaseController; +use Log; use Symfony\Component\HttpFoundation\ParameterBag; /** * Class Controller. + * * @codeCoverageIgnore */ class Controller extends BaseController @@ -70,7 +72,7 @@ class Controller extends BaseController $return = '?'; $params = []; foreach ($this->parameters as $key => $value) { - if($key === 'page') { + if ($key === 'page') { continue; } if ($value instanceof Carbon) { @@ -110,6 +112,7 @@ class Controller extends BaseController $obj = new Carbon($date); } catch (InvalidDateException $e) { // don't care + Log::error(sprintf('Invalid date exception in API controller: %s', $e->getMessage())); } } $bag->set($field, $obj); diff --git a/app/Api/V1/Controllers/TransactionController.php b/app/Api/V1/Controllers/TransactionController.php index b02e69e2d3..4ecec57436 100644 --- a/app/Api/V1/Controllers/TransactionController.php +++ b/app/Api/V1/Controllers/TransactionController.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Api\V1\Controllers; @@ -37,7 +37,6 @@ use Illuminate\Support\Collection; use League\Fractal\Manager; use League\Fractal\Pagination\IlluminatePaginatorAdapter; use League\Fractal\Resource\Collection as FractalCollection; -use League\Fractal\Resource\Item; use League\Fractal\Serializer\JsonApiSerializer; use Log; use Preferences; @@ -172,7 +171,9 @@ class TransactionController extends Controller } /** - * @param TransactionRequest $request + * @param TransactionRequest $request + * + * @param JournalRepositoryInterface $repository * * @return \Illuminate\Http\JsonResponse */ diff --git a/app/Api/V1/Controllers/UserController.php b/app/Api/V1/Controllers/UserController.php index 027d94e9e7..4af7e7b7d8 100644 --- a/app/Api/V1/Controllers/UserController.php +++ b/app/Api/V1/Controllers/UserController.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Api\V1\Controllers; @@ -70,6 +70,7 @@ class UserController extends Controller * @param \FireflyIII\User $user * * @return \Illuminate\Http\Response + * @throws \Symfony\Component\HttpFoundation\File\Exception\AccessDeniedException */ public function delete(User $user) { diff --git a/app/Api/V1/Requests/AccountRequest.php b/app/Api/V1/Requests/AccountRequest.php index fdb789779c..44977d41e2 100644 --- a/app/Api/V1/Requests/AccountRequest.php +++ b/app/Api/V1/Requests/AccountRequest.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Api\V1\Requests; @@ -70,9 +70,9 @@ class AccountRequest extends Request */ public function rules(): array { - $accountRoles = join(',', config('firefly.accountRoles')); - $types = join(',', array_keys(config('firefly.subTitlesByIdentifier'))); - $ccPaymentTypes = join(',', array_keys(config('firefly.ccTypes'))); + $accountRoles = implode(',', config('firefly.accountRoles')); + $types = implode(',', array_keys(config('firefly.subTitlesByIdentifier'))); + $ccPaymentTypes = implode(',', array_keys(config('firefly.ccTypes'))); $rules = [ 'name' => 'required|min:1|uniqueAccountForUser', 'opening_balance' => 'numeric|required_with:opening_balance_date|nullable', diff --git a/app/Api/V1/Requests/BillRequest.php b/app/Api/V1/Requests/BillRequest.php index 2efd4828cb..9c701e8502 100644 --- a/app/Api/V1/Requests/BillRequest.php +++ b/app/Api/V1/Requests/BillRequest.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Api\V1\Requests; diff --git a/app/Api/V1/Requests/Request.php b/app/Api/V1/Requests/Request.php index 198680635b..509c092956 100644 --- a/app/Api/V1/Requests/Request.php +++ b/app/Api/V1/Requests/Request.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Api\V1\Requests; use FireflyIII\Http\Requests\Request as FireflyIIIRequest; + /** * Class Request. */ diff --git a/app/Api/V1/Requests/TransactionRequest.php b/app/Api/V1/Requests/TransactionRequest.php index 744ee8fb77..979502d98a 100644 --- a/app/Api/V1/Requests/TransactionRequest.php +++ b/app/Api/V1/Requests/TransactionRequest.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Api\V1\Requests; @@ -168,6 +168,7 @@ class TransactionRequest extends Request * @param Validator $validator * * @return void + * @throws \FireflyIII\Exceptions\FireflyException */ public function withValidator(Validator $validator): void { @@ -192,8 +193,10 @@ class TransactionRequest extends Request * @param null|string $accountName * @param string $idField * @param string $nameField + * + * @return null|Account */ - protected function assetAccountExists(Validator $validator, ?int $accountId, ?string $accountName, string $idField, string $nameField): void + protected function assetAccountExists(Validator $validator, ?int $accountId, ?string $accountName, string $idField, string $nameField): ?Account { $accountId = intval($accountId); @@ -202,7 +205,7 @@ class TransactionRequest extends Request if ($accountId < 1 && strlen($accountName) === 0) { $validator->errors()->add($idField, trans('validation.filled', ['attribute' => $idField])); - return; + return null; } // ID belongs to user and is asset account: /** @var AccountRepositoryInterface $repository */ @@ -215,19 +218,21 @@ class TransactionRequest extends Request if ($first->accountType->type !== AccountType::ASSET) { $validator->errors()->add($idField, trans('validation.belongs_user')); - return; + return null; } // we ignore the account name at this point. - return; + return $first; } - $account = $repository->findByName($accountName, [AccountType::ASSET]); + $account = $repository->findByNameNull($accountName, [AccountType::ASSET]); if (is_null($account)) { $validator->errors()->add($nameField, trans('validation.belongs_user')); + + return null; } - return; + return $account; } /** @@ -342,13 +347,16 @@ class TransactionRequest extends Request * @param int|null $accountId * @param null|string $accountName * @param string $idField + * + * @return null|Account */ - protected function opposingAccountExists(Validator $validator, string $type, ?int $accountId, ?string $accountName, string $idField): void { + protected function opposingAccountExists(Validator $validator, string $type, ?int $accountId, ?string $accountName, string $idField): ?Account + { $accountId = intval($accountId); $accountName = strval($accountName); // both empty? done! if ($accountId < 1 && strlen($accountName) === 0) { - return; + return null; } if ($accountId !== 0) { // ID belongs to user and is $type account: @@ -362,16 +370,16 @@ class TransactionRequest extends Request if ($first->accountType->type !== $type) { $validator->errors()->add($idField, trans('validation.belongs_user')); - return; + return null; } // we ignore the account name at this point. - return; + return $first; } } // not having an opposing account by this name is NOT a problem. - return; + return null; } /** @@ -395,41 +403,49 @@ class TransactionRequest extends Request $data['type'] = strtolower($transaction->transactionJournal->transactionType->type); } foreach ($transactions as $index => $transaction) { - $sourceId = isset($transaction['source_id']) ? intval($transaction['source_id']) : null; - $sourceName = $transaction['source_name'] ?? null; - $destinationId = isset($transaction['destination_id']) ? intval($transaction['destination_id']) : null; - $destinationName = $transaction['destination_name'] ?? null; - + $sourceId = isset($transaction['source_id']) ? intval($transaction['source_id']) : null; + $sourceName = $transaction['source_name'] ?? null; + $destinationId = isset($transaction['destination_id']) ? intval($transaction['destination_id']) : null; + $destinationName = $transaction['destination_name'] ?? null; + $sourceAccount = null; + $destinationAccount = null; switch ($data['type']) { case 'withdrawal': - $idField = 'transactions.' . $index . '.source_id'; - $nameField = 'transactions.' . $index . '.source_name'; - $this->assetAccountExists($validator, $sourceId, $sourceName, $idField, $nameField); - - $idField = 'transactions.' . $index . '.destination_id'; - $this->opposingAccountExists($validator, AccountType::EXPENSE, $destinationId, $destinationName, $idField); + $idField = 'transactions.' . $index . '.source_id'; + $nameField = 'transactions.' . $index . '.source_name'; + $sourceAccount = $this->assetAccountExists($validator, $sourceId, $sourceName, $idField, $nameField); + $idField = 'transactions.' . $index . '.destination_id'; + $destinationAccount = $this->opposingAccountExists($validator, AccountType::EXPENSE, $destinationId, $destinationName, $idField); break; case 'deposit': - $idField = 'transactions.' . $index . '.source_id'; - $this->opposingAccountExists($validator, AccountType::REVENUE, $sourceId, $sourceName, $idField); + $idField = 'transactions.' . $index . '.source_id'; + $sourceAccount = $this->opposingAccountExists($validator, AccountType::REVENUE, $sourceId, $sourceName, $idField); - $idField = 'transactions.' . $index . '.destination_id'; - $nameField = 'transactions.' . $index . '.destination_name'; - $this->assetAccountExists($validator, $destinationId, $destinationName, $idField, $nameField); + $idField = 'transactions.' . $index . '.destination_id'; + $nameField = 'transactions.' . $index . '.destination_name'; + $destinationAccount = $this->assetAccountExists($validator, $destinationId, $destinationName, $idField, $nameField); break; case 'transfer': - $idField = 'transactions.' . $index . '.source_id'; - $nameField = 'transactions.' . $index . '.source_name'; - $this->assetAccountExists($validator, $sourceId, $sourceName, $idField, $nameField); + $idField = 'transactions.' . $index . '.source_id'; + $nameField = 'transactions.' . $index . '.source_name'; + $sourceAccount = $this->assetAccountExists($validator, $sourceId, $sourceName, $idField, $nameField); - $idField = 'transactions.' . $index . '.destination_id'; - $nameField = 'transactions.' . $index . '.destination_name'; - $this->assetAccountExists($validator, $destinationId, $destinationName, $idField, $nameField); + $idField = 'transactions.' . $index . '.destination_id'; + $nameField = 'transactions.' . $index . '.destination_name'; + $destinationAccount = $this->assetAccountExists($validator, $destinationId, $destinationName, $idField, $nameField); break; default: - throw new FireflyException(sprintf('The validator cannot handle transaction type "%s" in validateAccountInformation().', $data['type'])); + // @codeCoverageIgnoreStart + throw new FireflyException( + sprintf('The validator cannot handle transaction type "%s" in validateAccountInformation().', $data['type']) + ); + // @codeCoverageIgnoreEnd } + // add some errors in case of same account submitted: + if (null !== $sourceAccount && null !== $destinationAccount && $sourceAccount->id === $destinationAccount->id) { + $validator->errors()->add($idField, trans('validation.source_equals_destination')); + } } } @@ -451,7 +467,7 @@ class TransactionRequest extends Request // the journal may exist in the request: /** @var Transaction $transaction */ $transaction = $this->route()->parameter('transaction'); - if (is_null($transaction)) { + if (null === $transaction) { return; } $data['type'] = strtolower($transaction->transactionJournal->transactionType->type); @@ -493,8 +509,6 @@ class TransactionRequest extends Request ); // @codeCoverageIgnoreEnd } - - return; } } diff --git a/app/Api/V1/Requests/UserRequest.php b/app/Api/V1/Requests/UserRequest.php index 4a5844da49..2a1d76fe86 100644 --- a/app/Api/V1/Requests/UserRequest.php +++ b/app/Api/V1/Requests/UserRequest.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Api\V1\Requests; diff --git a/app/Console/Commands/CreateExport.php b/app/Console/Commands/CreateExport.php index c38acfa3b9..d83520a2ad 100644 --- a/app/Console/Commands/CreateExport.php +++ b/app/Console/Commands/CreateExport.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Console\Commands; @@ -60,17 +60,6 @@ class CreateExport extends Command {--with_uploads : Include user\'s uploads?}'; /** - * Create a new command instance. - */ - public function __construct() - { - parent::__construct(); - } - - /** - * @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's five its fine. - * @SuppressWarnings(PHPMD.ExcessiveMethodLength) - * * Execute the console command. * * @return mixed @@ -80,7 +69,7 @@ class CreateExport extends Command if (!$this->verifyAccessToken()) { $this->error('Invalid access token.'); - return; + return 1; } $this->line('Full export is running...'); // make repositories @@ -94,7 +83,7 @@ class CreateExport extends Command $journalRepository = app(JournalRepositoryInterface::class); // set user - $user = $userRepository->find(intval($this->option('user'))); + $user = $userRepository->findNull((int)$this->option('user')); $jobRepository->setUser($user); $journalRepository->setUser($user); $accountRepository->setUser($user); @@ -140,7 +129,5 @@ class CreateExport extends Command $this->line('The export has finished! You can find the ZIP file in this location:'); $this->line(storage_path(sprintf('export/%s', $fileName))); - - return; } } diff --git a/app/Console/Commands/CreateImport.php b/app/Console/Commands/CreateImport.php index 07fe3d734d..209ed068cf 100644 --- a/app/Console/Commands/CreateImport.php +++ b/app/Console/Commands/CreateImport.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Console\Commands; -use Artisan; use FireflyIII\Exceptions\FireflyException; -use FireflyIII\Import\Logging\CommandHandler; use FireflyIII\Import\Routine\RoutineInterface; use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; use FireflyIII\Repositories\User\UserRepositoryInterface; +use FireflyIII\Services\Internal\File\EncryptService; use Illuminate\Console\Command; use Illuminate\Support\MessageBag; use Log; -use Monolog\Formatter\LineFormatter; use Preferences; /** @@ -61,76 +59,67 @@ class CreateImport extends Command {--token= : The user\'s access token.} {--start : Starts the job immediately.}'; - /** - * Create a new command instance. - */ - public function __construct() - { - parent::__construct(); - } - /** * Run the command. * - * @SuppressWarnings(PHPMD.ExcessiveMethodLength) // cannot be helped - * @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's five exactly. + * @noinspection MultipleReturnStatementsInspection * * @throws FireflyException */ - public function handle() + public function handle(): int { if (!$this->verifyAccessToken()) { - $this->error('Invalid access token.'); + $this->errorLine('Invalid access token.'); - return; + return 1; } /** @var UserRepositoryInterface $userRepository */ $userRepository = app(UserRepositoryInterface::class); $file = $this->argument('file'); $configuration = $this->argument('configuration'); - $user = $userRepository->find(intval($this->option('user'))); + $user = $userRepository->findNull((int)$this->option('user')); $cwd = getcwd(); $type = strtolower($this->option('type')); if (!$this->validArguments()) { - return; + $this->errorLine('Invalid arguments.'); + + return 1; } $configurationData = json_decode(file_get_contents($configuration), true); if (null === $configurationData) { - $this->error(sprintf('Firefly III cannot read the contents of configuration file "%s" (working directory: "%s").', $configuration, $cwd)); + $this->errorLine(sprintf('Firefly III cannot read the contents of configuration file "%s" (working directory: "%s").', $configuration, $cwd)); - return; + return 1; } - $this->line(sprintf('Going to create a job to import file: %s', $file)); - $this->line(sprintf('Using configuration file: %s', $configuration)); - $this->line(sprintf('Import into user: #%d (%s)', $user->id, $user->email)); - $this->line(sprintf('Type of import: %s', $type)); + $this->infoLine(sprintf('Going to create a job to import file: %s', $file)); + $this->infoLine(sprintf('Using configuration file: %s', $configuration)); + $this->infoLine(sprintf('Import into user: #%d (%s)', $user->id, $user->email)); + $this->infoLine(sprintf('Type of import: %s', $type)); /** @var ImportJobRepositoryInterface $jobRepository */ $jobRepository = app(ImportJobRepositoryInterface::class); $jobRepository->setUser($user); $job = $jobRepository->create($type); - $this->line(sprintf('Created job "%s"', $job->key)); + $this->infoLine(sprintf('Created job "%s"', $job->key)); - Artisan::call('firefly:encrypt-file', ['file' => $file, 'key' => $job->key]); - $this->line('Stored import data...'); + /** @var EncryptService $service */ + $service = app(EncryptService::class); + $service->encrypt($file, $job->key); + + $this->infoLine('Stored import data...'); $jobRepository->setConfiguration($job, $configurationData); $jobRepository->updateStatus($job, 'configured'); - $this->line('Stored configuration...'); + $this->infoLine('Stored configuration...'); if (true === $this->option('start')) { - $this->line('The import will start in a moment. This process is not visible...'); + $this->infoLine('The import will start in a moment. This process is not visible...'); Log::debug('Go for import!'); // normally would refer to other firefly:start-import but that doesn't seem to work all to well... - $monolog = Log::getMonolog(); - $handler = new CommandHandler($this); - $formatter = new LineFormatter(null, null, false, true); - $handler->setFormatter($formatter); - $monolog->pushHandler($handler); // start the actual routine: $type = 'csv' === $job->file_type ? 'file' : $job->file_type; @@ -147,9 +136,9 @@ class CreateImport extends Command // give feedback. /** @var MessageBag $error */ foreach ($routine->getErrors() as $index => $error) { - $this->error(sprintf('Error importing line #%d: %s', $index, $error)); + $this->errorLine(sprintf('Error importing line #%d: %s', $index, $error)); } - $this->line( + $this->infoLine( sprintf( 'The import has finished. %d transactions have been imported out of %d records.', $routine->getJournals()->count(), $routine->getLines() ) @@ -159,45 +148,58 @@ class CreateImport extends Command // clear cache for user: Preferences::setForUser($user, 'lastActivity', microtime()); - return; + return 0; + } + + /** + * @param string $message + * @param array|null $data + */ + private function errorLine(string $message, array $data = null): void + { + Log::error($message, $data ?? []); + $this->error($message); + + } + + /** + * @param string $message + * @param array $data + */ + private function infoLine(string $message, array $data = null): void + { + Log::info($message, $data ?? []); + $this->line($message); } /** * Verify user inserts correct arguments. * + * @noinspection MultipleReturnStatementsInspection * @return bool - * @SuppressWarnings(PHPMD.CyclomaticComplexity) // it's five exactly. */ private function validArguments(): bool { - /** @var UserRepositoryInterface $userRepository */ - $userRepository = app(UserRepositoryInterface::class); - $file = $this->argument('file'); - $configuration = $this->argument('configuration'); - $user = $userRepository->find(intval($this->option('user'))); - $cwd = getcwd(); - $validTypes = config('import.options.file.import_formats'); - $type = strtolower($this->option('type')); - if (null === $user) { - $this->error(sprintf('There is no user with ID %d.', $this->option('user'))); + $file = $this->argument('file'); + $configuration = $this->argument('configuration'); + $cwd = getcwd(); + $validTypes = config('import.options.file.import_formats'); + $type = strtolower($this->option('type')); - return false; - } - - if (!in_array($type, $validTypes)) { - $this->error(sprintf('Cannot import file of type "%s"', $type)); + if (!\in_array($type, $validTypes, true)) { + $this->errorLine(sprintf('Cannot import file of type "%s"', $type)); return false; } if (!file_exists($file)) { - $this->error(sprintf('Firefly III cannot find file "%s" (working directory: "%s").', $file, $cwd)); + $this->errorLine(sprintf('Firefly III cannot find file "%s" (working directory: "%s").', $file, $cwd)); return false; } if (!file_exists($configuration)) { - $this->error(sprintf('Firefly III cannot find configuration file "%s" (working directory: "%s").', $configuration, $cwd)); + $this->errorLine(sprintf('Firefly III cannot find configuration file "%s" (working directory: "%s").', $configuration, $cwd)); return false; } diff --git a/app/Console/Commands/DecryptAttachment.php b/app/Console/Commands/DecryptAttachment.php index 00f30daa5d..730a402134 100644 --- a/app/Console/Commands/DecryptAttachment.php +++ b/app/Console/Commands/DecryptAttachment.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Console\Commands; diff --git a/app/Console/Commands/EncryptFile.php b/app/Console/Commands/EncryptFile.php index 97bb228678..0e787860e7 100644 --- a/app/Console/Commands/EncryptFile.php +++ b/app/Console/Commands/EncryptFile.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Console\Commands; -use Crypt; +use FireflyIII\Exceptions\FireflyException; +use FireflyIII\Services\Internal\File\EncryptService; use Illuminate\Console\Command; /** @@ -44,31 +45,26 @@ class EncryptFile extends Command */ protected $signature = 'firefly:encrypt-file {file} {key}'; - /** - * Create a new command instance. - */ - public function __construct() - { - parent::__construct(); - } - /** * Execute the console command. + * + * @throws \Illuminate\Contracts\Encryption\EncryptException */ - public function handle() + public function handle(): int { - $file = e(strval($this->argument('file'))); - if (!file_exists($file)) { - $this->error(sprintf('File "%s" does not seem to exist.', $file)); + $code = 0; + $file = (string)$this->argument('file'); + $key = (string)$this->argument('key'); + /** @var EncryptService $service */ + $service = app(EncryptService::class); - return; + try { + $service->encrypt($file, $key); + } catch (FireflyException $e) { + $this->error($e->getMessage()); + $code = 1; } - $content = file_get_contents($file); - $content = Crypt::encrypt($content); - $newName = e(strval($this->argument('key'))) . '.upload'; - $path = storage_path('upload') . '/' . $newName; - file_put_contents($path, $content); - $this->line(sprintf('Encrypted "%s" and put it in "%s"', $file, $path)); + return $code; } } diff --git a/app/Console/Commands/Import.php b/app/Console/Commands/Import.php index 7d7a735c82..b85fc9291a 100644 --- a/app/Console/Commands/Import.php +++ b/app/Console/Commands/Import.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Console\Commands; use FireflyIII\Exceptions\FireflyException; -use FireflyIII\Import\Logging\CommandHandler; use FireflyIII\Import\Routine\RoutineInterface; use FireflyIII\Models\ImportJob; use Illuminate\Console\Command; @@ -68,21 +67,17 @@ class Import extends Command $jobKey = $this->argument('key'); $job = ImportJob::where('key', $jobKey)->first(); if (null === $job) { - $this->error(sprintf('No job found with key "%s"', $jobKey)); + $this->errorLine(sprintf('No job found with key "%s"', $jobKey)); return; } if (!$this->isValid($job)) { - Log::error('Job is not valid for some reason. Exit.'); + $this->errorLine('Job is not valid for some reason. Exit.'); return; } - $this->line(sprintf('Going to import job with key "%s" of type "%s"', $job->key, $job->file_type)); - - $monolog = Log::getMonolog(); - $handler = new CommandHandler($this); - $monolog->pushHandler($handler); + $this->infoLine(sprintf('Going to import job with key "%s" of type "%s"', $job->key, $job->file_type)); // actually start job: $type = 'csv' === $job->file_type ? 'file' : $job->file_type; @@ -99,16 +94,37 @@ class Import extends Command /** @var MessageBag $error */ foreach ($routine->getErrors() as $index => $error) { - $this->error(sprintf('Error importing line #%d: %s', $index, $error)); + $this->errorLine(sprintf('Error importing line #%d: %s', $index, $error)); } - $this->line( + $this->infoLine( sprintf('The import has finished. %d transactions have been imported out of %d records.', $routine->getJournals()->count(), $routine->getLines()) ); return; } + /** + * @param string $message + * @param array|null $data + */ + private function errorLine(string $message, array $data = null): void + { + Log::error($message, $data ?? []); + $this->error($message); + + } + + /** + * @param string $message + * @param array $data + */ + private function infoLine(string $message, array $data = null): void + { + Log::info($message, $data ?? []); + $this->line($message); + } + /** * Check if job is valid to be imported. * @@ -119,15 +135,14 @@ class Import extends Command private function isValid(ImportJob $job): bool { if (null === $job) { - Log::error('This job does not seem to exist.'); - $this->error('This job does not seem to exist.'); + $this->errorLine('This job does not seem to exist.'); return false; } if ('configured' !== $job->status) { Log::error(sprintf('This job is not ready to be imported (status is %s).', $job->status)); - $this->error('This job is not ready to be imported.'); + $this->errorLine('This job is not ready to be imported.'); return false; } diff --git a/app/Console/Commands/ScanAttachments.php b/app/Console/Commands/ScanAttachments.php index 060f3b06a6..d13bcd7a54 100644 --- a/app/Console/Commands/ScanAttachments.php +++ b/app/Console/Commands/ScanAttachments.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Console\Commands; diff --git a/app/Console/Commands/UpgradeDatabase.php b/app/Console/Commands/UpgradeDatabase.php index d0c7b10028..f5c8c45e4a 100644 --- a/app/Console/Commands/UpgradeDatabase.php +++ b/app/Console/Commands/UpgradeDatabase.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Console\Commands; @@ -26,6 +26,7 @@ use DB; use FireflyIII\Models\Account; use FireflyIII\Models\AccountMeta; use FireflyIII\Models\AccountType; +use FireflyIII\Models\Attachment; use FireflyIII\Models\Note; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionCurrency; @@ -86,6 +87,7 @@ class UpgradeDatabase extends Command $this->updateOtherCurrencies(); $this->line('Done updating currency information..'); $this->migrateNotes(); + $this->migrateAttachmentData(); $this->info('Firefly III database is up to date.'); return; @@ -281,6 +283,38 @@ class UpgradeDatabase extends Command } } + /** + * Move the description of each attachment (when not NULL) to the notes or to a new note object + * for all attachments. + */ + private function migrateAttachmentData(): void + { + $attachments = Attachment::get(); + + /** @var Attachment $att */ + foreach ($attachments as $att) { + + // move description: + $description = strval($att->description); + if (strlen($description) > 0) { + // find or create note: + $note = $att->notes()->first(); + if (is_null($note)) { + $note = new Note; + $note->noteable()->associate($att); + } + $note->text = $description; + $note->save(); + + // clear description: + $att->description = ''; + $att->save(); + + Log::debug(sprintf('Migrated attachment #%s description to note #%d', $att->id, $note->id)); + } + } + } + /** * Move all the journal_meta notes to their note object counter parts. * diff --git a/app/Console/Commands/UpgradeFireflyInstructions.php b/app/Console/Commands/UpgradeFireflyInstructions.php index f6acbe9bee..375ef4b5ec 100644 --- a/app/Console/Commands/UpgradeFireflyInstructions.php +++ b/app/Console/Commands/UpgradeFireflyInstructions.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Console\Commands; diff --git a/app/Console/Commands/UseEncryption.php b/app/Console/Commands/UseEncryption.php index 0809ec08b2..b772a6a2fe 100644 --- a/app/Console/Commands/UseEncryption.php +++ b/app/Console/Commands/UseEncryption.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Console\Commands; diff --git a/app/Console/Commands/VerifiesAccessToken.php b/app/Console/Commands/VerifiesAccessToken.php index f2bd65a49c..da3225a045 100644 --- a/app/Console/Commands/VerifiesAccessToken.php +++ b/app/Console/Commands/VerifiesAccessToken.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Console\Commands; @@ -49,11 +49,11 @@ trait VerifiesAccessToken */ protected function verifyAccessToken(): bool { - $userId = intval($this->option('user')); - $token = strval($this->option('token')); + $userId = (int)$this->option('user'); + $token = (string)$this->option('token'); /** @var UserRepositoryInterface $repository */ $repository = app(UserRepositoryInterface::class); - $user = $repository->find($userId); + $user = $repository->findNull($userId); if (null === $user) { Log::error(sprintf('verifyAccessToken(): no such user for input "%d"', $userId)); @@ -68,7 +68,7 @@ trait VerifiesAccessToken } if (!($accessToken->data === $token)) { Log::error(sprintf('Invalid access token for user #%d.', $userId)); - Log::error(sprintf('Token given is "%s", expected "%s".', $token, $accessToken->data)); + Log::error(sprintf('Token given is "%s", expected something else.', $token)); return false; } diff --git a/app/Console/Commands/VerifyDatabase.php b/app/Console/Commands/VerifyDatabase.php index e11b69159e..3a0137d074 100644 --- a/app/Console/Commands/VerifyDatabase.php +++ b/app/Console/Commands/VerifyDatabase.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Console\Commands; diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 316260b8a0..5a16876766 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Console; diff --git a/app/Events/AdminRequestedTestMessage.php b/app/Events/AdminRequestedTestMessage.php index c9a9fd5ab4..54858f2000 100644 --- a/app/Events/AdminRequestedTestMessage.php +++ b/app/Events/AdminRequestedTestMessage.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Events; diff --git a/app/Events/Event.php b/app/Events/Event.php index 59c1ec66de..490238246a 100644 --- a/app/Events/Event.php +++ b/app/Events/Event.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Events; diff --git a/app/Events/RegisteredUser.php b/app/Events/RegisteredUser.php index 027dccf6bc..8296bcdec5 100644 --- a/app/Events/RegisteredUser.php +++ b/app/Events/RegisteredUser.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Events; diff --git a/app/Events/RequestedNewPassword.php b/app/Events/RequestedNewPassword.php index 81a7dfc987..566aadeed5 100644 --- a/app/Events/RequestedNewPassword.php +++ b/app/Events/RequestedNewPassword.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Events; diff --git a/app/Events/RequestedVersionCheckStatus.php b/app/Events/RequestedVersionCheckStatus.php index df6f2c8948..1147c7cea4 100644 --- a/app/Events/RequestedVersionCheckStatus.php +++ b/app/Events/RequestedVersionCheckStatus.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Events; diff --git a/app/Events/StoredTransactionJournal.php b/app/Events/StoredTransactionJournal.php index 082a092e2b..2d57502558 100644 --- a/app/Events/StoredTransactionJournal.php +++ b/app/Events/StoredTransactionJournal.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Events; @@ -26,6 +26,7 @@ use FireflyIII\Models\TransactionJournal; use Illuminate\Queue\SerializesModels; /** + * @codeCoverageIgnore * Class StoredTransactionJournal. */ class StoredTransactionJournal extends Event diff --git a/app/Events/UpdatedTransactionJournal.php b/app/Events/UpdatedTransactionJournal.php index 16b5f0adb0..c8b08ddaa8 100644 --- a/app/Events/UpdatedTransactionJournal.php +++ b/app/Events/UpdatedTransactionJournal.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Events; @@ -27,6 +27,9 @@ use Illuminate\Queue\SerializesModels; /** * Class UpdatedTransactionJournal. + * + * @codeCoverageIgnore + * */ class UpdatedTransactionJournal extends Event { diff --git a/app/Events/UserChangedEmail.php b/app/Events/UserChangedEmail.php index 52027b9d70..577fcd5c86 100644 --- a/app/Events/UserChangedEmail.php +++ b/app/Events/UserChangedEmail.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Events; diff --git a/app/Exceptions/FireflyException.php b/app/Exceptions/FireflyException.php index 538e094b06..2dddf3e3c7 100644 --- a/app/Exceptions/FireflyException.php +++ b/app/Exceptions/FireflyException.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Exceptions; +use Exception; + /** * Class FireflyException. */ -class FireflyException extends \Exception +class FireflyException extends Exception { } diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 2dc4e0320c..dee948baa3 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Exceptions; @@ -70,14 +70,15 @@ class Handler extends ExceptionHandler return parent::render($request, $exception); } if ($exception instanceof NotFoundHttpException && $request->expectsJson()) { + // JSON error: return response()->json(['message' => 'Resource not found', 'exception' => 'NotFoundHttpException'], 404); } if ($exception instanceof AuthenticationException && $request->expectsJson()) { + // somehow Laravel handler does not catch this: return response()->json(['message' => 'Unauthenticated', 'exception' => 'AuthenticationException'], 401); } - if ($request->expectsJson()) { $isDebug = config('app.debug', false); if ($isDebug) { diff --git a/app/Exceptions/NotImplementedException.php b/app/Exceptions/NotImplementedException.php index 467c5e3bc7..e05cccd6fe 100644 --- a/app/Exceptions/NotImplementedException.php +++ b/app/Exceptions/NotImplementedException.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Exceptions; diff --git a/app/Exceptions/ValidationException.php b/app/Exceptions/ValidationException.php index 236c862cc3..e0443c126e 100644 --- a/app/Exceptions/ValidationException.php +++ b/app/Exceptions/ValidationException.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Exceptions; diff --git a/app/Export/Collector/AttachmentCollector.php b/app/Export/Collector/AttachmentCollector.php index c4c52cbf29..478fd5eeac 100644 --- a/app/Export/Collector/AttachmentCollector.php +++ b/app/Export/Collector/AttachmentCollector.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Export\Collector; diff --git a/app/Export/Collector/BasicCollector.php b/app/Export/Collector/BasicCollector.php index d17cb810fc..38b357ea0d 100644 --- a/app/Export/Collector/BasicCollector.php +++ b/app/Export/Collector/BasicCollector.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Export\Collector; diff --git a/app/Export/Collector/CollectorInterface.php b/app/Export/Collector/CollectorInterface.php index 5aa2d22ca8..11c0f53271 100644 --- a/app/Export/Collector/CollectorInterface.php +++ b/app/Export/Collector/CollectorInterface.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Export\Collector; diff --git a/app/Export/Collector/UploadCollector.php b/app/Export/Collector/UploadCollector.php index 47c7cb8f09..9f4a932fec 100644 --- a/app/Export/Collector/UploadCollector.php +++ b/app/Export/Collector/UploadCollector.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Export\Collector; use Crypt; +use Exception; use Illuminate\Contracts\Encryption\DecryptException; -use Illuminate\Contracts\Filesystem\FileNotFoundException; use Log; use Storage; @@ -99,7 +99,7 @@ class UploadCollector extends BasicCollector implements CollectorInterface $content = ''; try { $content = Crypt::decrypt($this->uploadDisk->get(sprintf('%s.upload', $key))); - } catch (FileNotFoundException | DecryptException $e) { + } catch (Exception | DecryptException $e) { Log::error(sprintf('Could not decrypt old import file "%s". Skipped because: %s', $key, $e->getMessage())); } diff --git a/app/Export/Entry/Entry.php b/app/Export/Entry/Entry.php index 63f0c5ea43..82e1d38358 100644 --- a/app/Export/Entry/Entry.php +++ b/app/Export/Entry/Entry.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Export\Entry; diff --git a/app/Export/ExpandedProcessor.php b/app/Export/ExpandedProcessor.php index 9539dcc3de..7f56bb91cd 100644 --- a/app/Export/ExpandedProcessor.php +++ b/app/Export/ExpandedProcessor.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Export; @@ -124,7 +124,7 @@ class ExpandedProcessor implements ProcessorInterface $currencyId = $ibans[$accountId]['currency_id'] ?? 0; $opposingCurrencyId = $ibans[$opposingId]['currency_id'] ?? 0; $transaction->notes = $notes[$journalId] ?? ''; - $transaction->tags = join(',', $tags[$journalId] ?? []); + $transaction->tags = implode(',', $tags[$journalId] ?? []); $transaction->account_number = $ibans[$accountId]['accountNumber'] ?? ''; $transaction->account_bic = $ibans[$accountId]['BIC'] ?? ''; $transaction->account_currency_code = $currencies[$currencyId] ?? ''; @@ -331,6 +331,7 @@ class ExpandedProcessor implements ProcessorInterface * @param array $array * * @return array + * @throws \Illuminate\Contracts\Encryption\DecryptException */ private function getTags(array $array): array { diff --git a/app/Export/Exporter/BasicExporter.php b/app/Export/Exporter/BasicExporter.php index be63ba6676..ee618c2bb2 100644 --- a/app/Export/Exporter/BasicExporter.php +++ b/app/Export/Exporter/BasicExporter.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Export\Exporter; diff --git a/app/Export/Exporter/CsvExporter.php b/app/Export/Exporter/CsvExporter.php index 012e4d6e2b..78945230e8 100644 --- a/app/Export/Exporter/CsvExporter.php +++ b/app/Export/Exporter/CsvExporter.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Export\Exporter; diff --git a/app/Export/Exporter/ExporterInterface.php b/app/Export/Exporter/ExporterInterface.php index 427b5fed85..f9c35b8d04 100644 --- a/app/Export/Exporter/ExporterInterface.php +++ b/app/Export/Exporter/ExporterInterface.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Export\Exporter; diff --git a/app/Export/ProcessorInterface.php b/app/Export/ProcessorInterface.php index 106c708c41..c255eb7713 100644 --- a/app/Export/ProcessorInterface.php +++ b/app/Export/ProcessorInterface.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Export; diff --git a/app/Factory/AccountFactory.php b/app/Factory/AccountFactory.php index 065876cb9e..53e2f98afe 100644 --- a/app/Factory/AccountFactory.php +++ b/app/Factory/AccountFactory.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Factory; @@ -43,6 +43,7 @@ class AccountFactory * @param array $data * * @return Account + * @throws \FireflyIII\Exceptions\FireflyException */ public function create(array $data): Account { @@ -74,7 +75,7 @@ class AccountFactory } $newAccount = Account::create($databaseData); - $this->updateMetadata($newAccount, $data); + $this->updateMetaData($newAccount, $data); if ($this->validIBData($data) && $type->type === AccountType::ASSET) { $this->updateIB($newAccount, $data); @@ -116,6 +117,8 @@ class AccountFactory * @param string $accountType * * @return Account + * @throws \FireflyIII\Exceptions\FireflyException + * @throws \FireflyIII\Exceptions\FireflyException */ public function findOrCreate(string $accountName, string $accountType): Account { @@ -162,9 +165,14 @@ class AccountFactory if ($accountTypeId > 0) { return AccountType::find($accountTypeId); } - $type = config('firefly.accountTypeByIdentifier.' . strval($accountType)); + $type = config('firefly.accountTypeByIdentifier.' . strval($accountType)); + $result = AccountType::whereType($type)->first(); + if (is_null($result) && !is_null($accountType)) { + // try as full name: + $result = AccountType::whereType($accountType)->first(); + } - return AccountType::whereType($type)->first(); + return $result; } diff --git a/app/Factory/AccountMetaFactory.php b/app/Factory/AccountMetaFactory.php index 67667d76ef..c514e182f8 100644 --- a/app/Factory/AccountMetaFactory.php +++ b/app/Factory/AccountMetaFactory.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Factory; diff --git a/app/Factory/BillFactory.php b/app/Factory/BillFactory.php index 15d1e38655..dabd71f412 100644 --- a/app/Factory/BillFactory.php +++ b/app/Factory/BillFactory.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Factory; diff --git a/app/Factory/BudgetFactory.php b/app/Factory/BudgetFactory.php index 0a4f9704f9..001b509852 100644 --- a/app/Factory/BudgetFactory.php +++ b/app/Factory/BudgetFactory.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Factory; diff --git a/app/Factory/CategoryFactory.php b/app/Factory/CategoryFactory.php index 1b5c4f1cf3..c71d3d202d 100644 --- a/app/Factory/CategoryFactory.php +++ b/app/Factory/CategoryFactory.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Factory; diff --git a/app/Factory/PiggyBankEventFactory.php b/app/Factory/PiggyBankEventFactory.php index c5a88bb3a7..f5e0005387 100644 --- a/app/Factory/PiggyBankEventFactory.php +++ b/app/Factory/PiggyBankEventFactory.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Factory; diff --git a/app/Factory/PiggyBankFactory.php b/app/Factory/PiggyBankFactory.php index fdbd37ef46..4eb5f232ee 100644 --- a/app/Factory/PiggyBankFactory.php +++ b/app/Factory/PiggyBankFactory.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Factory; diff --git a/app/Factory/TagFactory.php b/app/Factory/TagFactory.php index d9e41a7d85..ea9f36ec73 100644 --- a/app/Factory/TagFactory.php +++ b/app/Factory/TagFactory.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Factory; diff --git a/app/Factory/TransactionCurrencyFactory.php b/app/Factory/TransactionCurrencyFactory.php index 25bf06fdcf..2cb05b23aa 100644 --- a/app/Factory/TransactionCurrencyFactory.php +++ b/app/Factory/TransactionCurrencyFactory.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Factory; use FireflyIII\Models\TransactionCurrency; +use Illuminate\Database\QueryException; +use Log; /** * Class TransactionCurrencyFactory */ class TransactionCurrencyFactory { + /** + * @param array $data + * + * @return TransactionCurrency|null + */ + public function create(array $data): ?TransactionCurrency + { + $result = null; + try { + /** @var TransactionCurrency $currency */ + $result = TransactionCurrency::create( + [ + 'name' => $data['name'], + 'code' => $data['code'], + 'symbol' => $data['symbol'], + 'decimal_places' => $data['decimal_places'], + ] + ); + } catch (QueryException $e) { + Log::error(sprintf('Could not create new currency: %s', $e->getMessage())); + } + + return $result; + } + /** * @param int|null $currencyId * @param null|string $currencyCode diff --git a/app/Factory/TransactionFactory.php b/app/Factory/TransactionFactory.php index b0f9406bf8..5dfdc9c60c 100644 --- a/app/Factory/TransactionFactory.php +++ b/app/Factory/TransactionFactory.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Factory; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; +use FireflyIII\Models\TransactionType; use FireflyIII\Services\Internal\Support\TransactionServiceTrait; use FireflyIII\User; use Illuminate\Support\Collection; @@ -124,6 +125,11 @@ class TransactionFactory } // set budget: + if ($journal->transactionType->type === TransactionType::TRANSFER) { + $data['budget_id'] = null; + $data['budget_name'] = null; + } + $budget = $this->findBudget($data['budget_id'], $data['budget_name']); $this->setBudget($source, $budget); $this->setBudget($dest, $budget); diff --git a/app/Factory/TransactionJournalFactory.php b/app/Factory/TransactionJournalFactory.php index 5612c0fb99..c96a1304d4 100644 --- a/app/Factory/TransactionJournalFactory.php +++ b/app/Factory/TransactionJournalFactory.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Factory; @@ -68,6 +68,7 @@ class TransactionJournalFactory ); // store basic transactions: + /** @var TransactionFactory $factory */ $factory = app(TransactionFactory::class); $factory->setUser($this->user); @@ -91,13 +92,12 @@ class TransactionJournalFactory $this->storeNote($journal, strval($data['notes'])); // store date meta fields (if present): - $this->storeMeta($journal, $data, 'interest_date'); - $this->storeMeta($journal, $data, 'book_date'); - $this->storeMeta($journal, $data, 'process_date'); - $this->storeMeta($journal, $data, 'due_date'); - $this->storeMeta($journal, $data, 'payment_date'); - $this->storeMeta($journal, $data, 'invoice_date'); - $this->storeMeta($journal, $data, 'internal_reference'); + $fields = ['sepa-cc', 'sepa-ct-op', 'sepa-ct-id', 'sepa-db', 'sepa-country', 'sepa-ep', 'sepa-ci', 'interest_date', 'book_date', 'process_date', + 'due_date', 'payment_date', 'invoice_date', 'internal_reference','bunq_payment_id']; + + foreach ($fields as $field) { + $this->storeMeta($journal, $data, $field); + } Log::debug('End of TransactionJournalFactory::create()'); return $journal; diff --git a/app/Factory/TransactionJournalMetaFactory.php b/app/Factory/TransactionJournalMetaFactory.php index 44d4990abf..4be44a8bbe 100644 --- a/app/Factory/TransactionJournalMetaFactory.php +++ b/app/Factory/TransactionJournalMetaFactory.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Factory; @@ -43,7 +43,7 @@ class TransactionJournalMetaFactory $value = $data['data']; /** @var TransactionJournalMeta $entry */ $entry = $data['journal']->transactionJournalMeta()->where('name', $data['name'])->first(); - if (is_null($value) && !is_null($entry)) { + if (null === $value && null !== $entry) { try { $entry->delete(); } catch (Exception $e) { // @codeCoverageIgnore @@ -56,7 +56,18 @@ class TransactionJournalMetaFactory if ($data['data'] instanceof Carbon) { $value = $data['data']->toW3cString(); } + if ((string)$value === '') { + // don't store blank strings. + if (null !== $entry) { + try { + $entry->delete(); + } catch (Exception $e) { // @codeCoverageIgnore + Log::error(sprintf('Could not delete transaction journal meta: %s', $e->getMessage())); // @codeCoverageIgnore + } + } + return null; + } if (null === $entry) { $entry = new TransactionJournalMeta(); diff --git a/app/Factory/TransactionTypeFactory.php b/app/Factory/TransactionTypeFactory.php index f19f0d87a4..8a36869407 100644 --- a/app/Factory/TransactionTypeFactory.php +++ b/app/Factory/TransactionTypeFactory.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII\Factory; diff --git a/app/Generator/Report/Audit/MonthReportGenerator.php b/app/Generator/Report/Audit/MonthReportGenerator.php index 9bdf1b28be..e8d9205417 100644 --- a/app/Generator/Report/Audit/MonthReportGenerator.php +++ b/app/Generator/Report/Audit/MonthReportGenerator.php @@ -45,6 +45,7 @@ class MonthReportGenerator implements ReportGeneratorInterface /** * @return string + * @throws \Throwable */ public function generate(): string { diff --git a/app/Generator/Report/Budget/MonthReportGenerator.php b/app/Generator/Report/Budget/MonthReportGenerator.php index adf6639de0..ad26a9d435 100644 --- a/app/Generator/Report/Budget/MonthReportGenerator.php +++ b/app/Generator/Report/Budget/MonthReportGenerator.php @@ -63,6 +63,7 @@ class MonthReportGenerator extends Support implements ReportGeneratorInterface /** * @return string + * @throws \Throwable */ public function generate(): string { diff --git a/app/Generator/Report/Category/MonthReportGenerator.php b/app/Generator/Report/Category/MonthReportGenerator.php index 7977f83d0a..0b32b11007 100644 --- a/app/Generator/Report/Category/MonthReportGenerator.php +++ b/app/Generator/Report/Category/MonthReportGenerator.php @@ -64,6 +64,7 @@ class MonthReportGenerator extends Support implements ReportGeneratorInterface /** * @return string + * @throws \Throwable */ public function generate(): string { diff --git a/app/Generator/Report/Support.php b/app/Generator/Report/Support.php index aca9c005ba..4219f8f892 100644 --- a/app/Generator/Report/Support.php +++ b/app/Generator/Report/Support.php @@ -146,15 +146,12 @@ class Support */ protected function summarizeByAccount(Collection $collection): array { - $result = [ - 'sum' => '0', - ]; + $result = []; /** @var Transaction $transaction */ foreach ($collection as $transaction) { $accountId = $transaction->account_id; $result[$accountId] = $result[$accountId] ?? '0'; $result[$accountId] = bcadd($transaction->transaction_amount, $result[$accountId]); - $result['sum'] = bcadd($result['sum'], $transaction->transaction_amount); } return $result; diff --git a/app/Handlers/Events/AdminEventHandler.php b/app/Handlers/Events/AdminEventHandler.php index 4d7dc4101c..2cfe634aa1 100644 --- a/app/Handlers/Events/AdminEventHandler.php +++ b/app/Handlers/Events/AdminEventHandler.php @@ -24,6 +24,7 @@ namespace FireflyIII\Handlers\Events; use FireflyIII\Events\AdminRequestedTestMessage; use FireflyIII\Mail\AdminTestMail; +use FireflyIII\Repositories\User\UserRepositoryInterface; use Log; use Mail; use Session; @@ -43,6 +44,15 @@ class AdminEventHandler */ public function sendTestMessage(AdminRequestedTestMessage $event): bool { + /** @var UserRepositoryInterface $repository */ + $repository = app(UserRepositoryInterface::class); + + // is user even admin? + if (!$repository->hasRole($event->user, 'owner')) { + return true; + } + + $email = $event->user->email; $ipAddress = $event->ipAddress; diff --git a/app/Handlers/Events/StoredJournalEventHandler.php b/app/Handlers/Events/StoredJournalEventHandler.php index ef6a26bcc0..6cfb5ad600 100644 --- a/app/Handlers/Events/StoredJournalEventHandler.php +++ b/app/Handlers/Events/StoredJournalEventHandler.php @@ -30,7 +30,6 @@ use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface as PRI; use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface as RGRI; use FireflyIII\Support\Events\BillScanner; use FireflyIII\TransactionRules\Processor; -use Log; /** * @codeCoverageIgnore @@ -67,6 +66,7 @@ class StoredJournalEventHandler * @param StoredTransactionJournal $storedJournalEvent * * @return bool + * @throws \FireflyIII\Exceptions\FireflyException */ public function processRules(StoredTransactionJournal $storedJournalEvent): bool { diff --git a/app/Handlers/Events/UpdatedJournalEventHandler.php b/app/Handlers/Events/UpdatedJournalEventHandler.php index a99a078374..4b1ee5b3ff 100644 --- a/app/Handlers/Events/UpdatedJournalEventHandler.php +++ b/app/Handlers/Events/UpdatedJournalEventHandler.php @@ -51,11 +51,11 @@ class UpdatedJournalEventHandler /** * This method will check all the rules when a journal is updated. - * TODO move to factory. * * @param UpdatedTransactionJournal $updatedJournalEvent * * @return bool + * @throws \FireflyIII\Exceptions\FireflyException */ public function processRules(UpdatedTransactionJournal $updatedJournalEvent): bool { @@ -82,7 +82,6 @@ class UpdatedJournalEventHandler /** * This method calls a special bill scanner that will check if the updated journal is part of a bill. - * TODO move to factory. * * @param UpdatedTransactionJournal $updatedJournalEvent * diff --git a/app/Handlers/Events/VersionCheckEventHandler.php b/app/Handlers/Events/VersionCheckEventHandler.php index 8b6b097c0e..9c5f2a6264 100644 --- a/app/Handlers/Events/VersionCheckEventHandler.php +++ b/app/Handlers/Events/VersionCheckEventHandler.php @@ -26,6 +26,7 @@ namespace FireflyIII\Handlers\Events; use FireflyConfig; use FireflyIII\Events\RequestedVersionCheckStatus; use FireflyIII\Exceptions\FireflyException; +use FireflyIII\Repositories\User\UserRepositoryInterface; use FireflyIII\Services\Github\Object\Release; use FireflyIII\Services\Github\Request\UpdateRequest; use FireflyIII\User; @@ -43,22 +44,26 @@ class VersionCheckEventHandler public function checkForUpdates(RequestedVersionCheckStatus $event) { // in Sandstorm, cannot check for updates: - $sandstorm = 1 === intval(getenv('SANDSTORM')); + $sandstorm = 1 === (int)getenv('SANDSTORM'); if ($sandstorm === true) { - return; + return; // @codeCoverageIgnore } + /** @var UserRepositoryInterface $repository */ + $repository = app(UserRepositoryInterface::class); /** @var User $user */ $user = $event->user; - if (!$user->hasRole('owner')) { + if (!$repository->hasRole($user, 'owner')) { return; } $permission = FireflyConfig::get('permission_update_check', -1); $lastCheckTime = FireflyConfig::get('last_update_check', time()); $now = time(); - if ($now - $lastCheckTime->data < 604800) { + $diff = $now - $lastCheckTime->data; + Log::debug(sprintf('Difference is %d seconds.', $diff)); + if ($diff < 604800) { Log::debug(sprintf('Checked for updates less than a week ago (on %s).', date('Y-m-d H:i:s', $lastCheckTime->data))); return; @@ -70,7 +75,7 @@ class VersionCheckEventHandler // have actual permission? if ($permission->data === -1) { // never asked before. - session()->flash('info', strval(trans('firefly.check_for_updates_permission', ['link' => route('admin.update-check')]))); + session()->flash('info', (string)trans('firefly.check_for_updates_permission', ['link' => route('admin.update-check')])); return; } @@ -79,7 +84,7 @@ class VersionCheckEventHandler /** @var UpdateRequest $request */ $request = app(UpdateRequest::class); $check = -2; - $first = new Release(['id' => '0', 'title' => '0', 'updated' => '2017-01-01', 'content' => '']); + $first = new Release(['id' => '0', 'title' => '0.2', 'updated' => '2017-01-01', 'content' => '']); try { $request->call(); $releases = $request->getReleases(); @@ -87,6 +92,7 @@ class VersionCheckEventHandler /** @var Release $first */ $first = reset($releases); $check = version_compare($current, $first->getTitle()); + Log::debug(sprintf('Comparing %s with %s, result is %s', $current, $first->getTitle(), $check)); FireflyConfig::set('last_update_check', time()); } catch (FireflyException $e) { Log::error(sprintf('Could not check for updates: %s', $e->getMessage())); @@ -98,19 +104,19 @@ class VersionCheckEventHandler if ($check === -1) { // there is a new FF version! $monthAndDayFormat = (string)trans('config.month_and_day'); - $string = strval( - trans( - 'firefly.update_new_version_alert', - ['your_version' => $current, 'new_version' => $first->getTitle(), 'date' => $first->getUpdated()->formatLocalized($monthAndDayFormat)] - ) + $string = (string)trans( + 'firefly.update_new_version_alert', + [ + 'your_version' => $current, + 'new_version' => $first->getTitle(), + 'date' => $first->getUpdated()->formatLocalized($monthAndDayFormat), + ] ); } if ($check !== 0) { // flash info session()->flash('info', $string); } - - return; } } diff --git a/app/Helpers/Attachments/AttachmentHelper.php b/app/Helpers/Attachments/AttachmentHelper.php index cdc3df2c85..6ade273a6a 100644 --- a/app/Helpers/Attachments/AttachmentHelper.php +++ b/app/Helpers/Attachments/AttachmentHelper.php @@ -155,6 +155,7 @@ class AttachmentHelper implements AttachmentHelperInterface * @param Model $model * * @return Attachment + * @throws \Illuminate\Contracts\Encryption\EncryptException */ protected function processFile(UploadedFile $file, Model $model): Attachment { @@ -206,7 +207,7 @@ class AttachmentHelper implements AttachmentHelperInterface Log::debug('Now in validMime()'); $mime = e($file->getMimeType()); $name = e($file->getClientOriginalName()); - Log::debug(sprintf('Name is %, and mime is %s', $name, $mime)); + Log::debug(sprintf('Name is %s, and mime is %s', $name, $mime)); Log::debug('Valid mimes are', $this->allowedMimes); if (!in_array($mime, $this->allowedMimes)) { diff --git a/app/Helpers/Chart/MetaPieChart.php b/app/Helpers/Chart/MetaPieChart.php index 931b996360..556b3422ce 100644 --- a/app/Helpers/Chart/MetaPieChart.php +++ b/app/Helpers/Chart/MetaPieChart.php @@ -282,6 +282,7 @@ class MetaPieChart implements MetaPieChartInterface $collector->withCategoryInformation(); $collector->withBudgetInformation(); } + // @codeCoverageIgnoreEnd return $collector->getJournals(); diff --git a/app/Helpers/Collection/BalanceLine.php b/app/Helpers/Collection/BalanceLine.php index 9bbacd7be6..c1de6d9211 100644 --- a/app/Helpers/Collection/BalanceLine.php +++ b/app/Helpers/Collection/BalanceLine.php @@ -35,15 +35,15 @@ class BalanceLine /** * */ - const ROLE_DEFAULTROLE = 1; + public const ROLE_DEFAULTROLE = 1; /** * */ - const ROLE_TAGROLE = 2; + public const ROLE_TAGROLE = 2; /** * */ - const ROLE_DIFFROLE = 3; + public const ROLE_DIFFROLE = 3; /** @var Collection */ protected $balanceEntries; diff --git a/app/Helpers/Collector/JournalCollector.php b/app/Helpers/Collector/JournalCollector.php index f4fa3d2e6e..5463421094 100644 --- a/app/Helpers/Collector/JournalCollector.php +++ b/app/Helpers/Collector/JournalCollector.php @@ -25,11 +25,13 @@ namespace FireflyIII\Helpers\Collector; use Carbon\Carbon; use DB; use FireflyIII\Exceptions\FireflyException; +use FireflyIII\Helpers\Filter\CountAttachmentsFilter; use FireflyIII\Helpers\Filter\FilterInterface; use FireflyIII\Helpers\Filter\InternalTransferFilter; use FireflyIII\Helpers\Filter\NegativeAmountFilter; use FireflyIII\Helpers\Filter\OpposingAccountFilter; use FireflyIII\Helpers\Filter\PositiveAmountFilter; +use FireflyIII\Helpers\Filter\SplitIndicatorFilter; use FireflyIII\Helpers\Filter\TransferFilter; use FireflyIII\Models\AccountType; use FireflyIII\Models\Budget; @@ -760,6 +762,8 @@ class JournalCollector implements JournalCollectorInterface TransferFilter::class => new TransferFilter, PositiveAmountFilter::class => new PositiveAmountFilter, NegativeAmountFilter::class => new NegativeAmountFilter, + SplitIndicatorFilter::class => new SplitIndicatorFilter, + CountAttachmentsFilter::class => new CountAttachmentsFilter, ]; Log::debug(sprintf('Will run %d filters on the set.', count($this->filters))); foreach ($this->filters as $enabled) { @@ -830,6 +834,7 @@ class JournalCollector implements JournalCollectorInterface /** * + * @throws \InvalidArgumentException */ private function joinOpposingTables() { diff --git a/app/Helpers/Collector/JournalCollectorInterface.php b/app/Helpers/Collector/JournalCollectorInterface.php index eef1662e03..1b439a748b 100644 --- a/app/Helpers/Collector/JournalCollectorInterface.php +++ b/app/Helpers/Collector/JournalCollectorInterface.php @@ -42,13 +42,6 @@ interface JournalCollectorInterface */ public function addFilter(string $filter): JournalCollectorInterface; - /** - * @param Collection $journals - * - * @return JournalCollectorInterface - */ - public function setJournals(Collection $journals): JournalCollectorInterface; - /** * @param string $amount * @@ -153,6 +146,13 @@ interface JournalCollectorInterface */ public function setCategory(Category $category): JournalCollectorInterface; + /** + * @param Collection $journals + * + * @return JournalCollectorInterface + */ + public function setJournals(Collection $journals): JournalCollectorInterface; + /** * @param int $limit * diff --git a/app/Helpers/Filter/CountAttachmentsFilter.php b/app/Helpers/Filter/CountAttachmentsFilter.php new file mode 100644 index 0000000000..3103de0e54 --- /dev/null +++ b/app/Helpers/Filter/CountAttachmentsFilter.php @@ -0,0 +1,67 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Helpers\Filter; + + +use DB; +use FireflyIII\Models\Transaction; +use FireflyIII\Models\TransactionJournal; +use Illuminate\Support\Collection; + +/** + * Class CountAttachmentsFilter + */ +class CountAttachmentsFilter implements FilterInterface +{ + + /** + * @param Collection $set + * + * @return Collection + */ + public function filter(Collection $set): Collection + { + // grab journal ID's: + $ids = $set->pluck('journal_id')->toArray(); + + $result = DB::table('attachments') + ->whereNull('deleted_at') + ->whereIn('attachable_id', $ids) + ->where('attachable_type', TransactionJournal::class) + ->groupBy('attachable_id')->get(['attachable_id', DB::raw('COUNT(*) as number')]); + $counter = []; + foreach ($result as $row) { + $counter[$row->attachable_id] = $row->number; + } + $set->each( + function (Transaction $transaction) use ($counter) { + $id = (int)$transaction->journal_id; + $count = $counter[$id] ?? 0; + $transaction->attachmentCount = $count; + } + ); + + return $set; + } +} diff --git a/app/Helpers/Filter/SplitIndicatorFilter.php b/app/Helpers/Filter/SplitIndicatorFilter.php new file mode 100644 index 0000000000..5d59ce5496 --- /dev/null +++ b/app/Helpers/Filter/SplitIndicatorFilter.php @@ -0,0 +1,67 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Helpers\Filter; + + +use DB; +use FireflyIII\Models\Transaction; +use Illuminate\Support\Collection; + +/** + * Class SplitIndicatorFilter + */ +class SplitIndicatorFilter implements FilterInterface +{ + + /** + * @param Collection $set + * + * @return Collection + */ + public function filter(Collection $set): Collection + { + // grab journal ID's: + $ids = $set->pluck('journal_id')->toArray(); + + $result = DB::table('transactions') + ->whereNull('deleted_at')->whereIn('transaction_journal_id', $ids) + ->groupBy('transaction_journal_id')->get(['transaction_journal_id', DB::raw('COUNT(*) as number')]); + $counter = []; + foreach ($result as $row) { + $counter[$row->transaction_journal_id] = $row->number; + } + $set->each( + function (Transaction $transaction) use ($counter) { + $id = (int)$transaction->journal_id; + $count = $counter[$id] ?? 0; + $transaction->is_split = false; + if ($count > 2) { + $transaction->is_split = true; + } + } + ); + + return $set; + } +} diff --git a/app/Helpers/Help/Help.php b/app/Helpers/Help/Help.php index fb5cc1f4c9..db7d34fef9 100644 --- a/app/Helpers/Help/Help.php +++ b/app/Helpers/Help/Help.php @@ -37,7 +37,7 @@ class Help implements HelpInterface /** * */ - const CACHEKEY = 'help_%s_%s'; + public const CACHEKEY = 'help_%s_%s'; /** @var string */ protected $userAgent = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36'; diff --git a/app/Helpers/Report/PopupReport.php b/app/Helpers/Report/PopupReport.php index e55db58a4e..188e21ec70 100644 --- a/app/Helpers/Report/PopupReport.php +++ b/app/Helpers/Report/PopupReport.php @@ -57,11 +57,8 @@ class PopupReport implements PopupReportInterface return $journals->filter( function (Transaction $transaction) { $tags = $transaction->transactionJournal->tags()->where('tagMode', 'balancingAct')->count(); - if (0 === $tags) { - return true; - } - return false; + return 0 === $tags; } ); } diff --git a/app/Helpers/Report/ReportHelper.php b/app/Helpers/Report/ReportHelper.php index 210e4683d4..5359c309a2 100644 --- a/app/Helpers/Report/ReportHelper.php +++ b/app/Helpers/Report/ReportHelper.php @@ -119,6 +119,7 @@ class ReportHelper implements ReportHelperInterface * @param Carbon $date * * @return array + * @throws \InvalidArgumentException */ public function listOfMonths(Carbon $date): array { diff --git a/app/Http/Controllers/Account/ReconcileController.php b/app/Http/Controllers/Account/ReconcileController.php index 1a690f11e3..4ac431f472 100644 --- a/app/Http/Controllers/Account/ReconcileController.php +++ b/app/Http/Controllers/Account/ReconcileController.php @@ -24,7 +24,6 @@ namespace FireflyIII\Http\Controllers\Account; use Carbon\Carbon; use FireflyIII\Exceptions\FireflyException; -use FireflyIII\Factory\TransactionJournalFactory; use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Requests\ReconciliationStoreRequest; @@ -37,12 +36,11 @@ use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; -use FireflyIII\Services\Internal\Update\TransactionUpdateService; +use FireflyIII\Services\Internal\Update\CurrencyUpdateService; use Illuminate\Http\Request; use Illuminate\Support\Collection; use Log; use Preferences; -use Response; use Session; /** @@ -52,6 +50,10 @@ use Session; */ class ReconcileController extends Controller { + /** @var CurrencyUpdateService */ + private $accountRepos; + /** @var AccountRepositoryInterface */ + private $currencyRepos; /** @var JournalRepositoryInterface */ private $repository; @@ -67,7 +69,9 @@ class ReconcileController extends Controller function ($request, $next) { app('view')->share('mainTitleIcon', 'fa-credit-card'); app('view')->share('title', trans('firefly.accounts')); - $this->repository = app(JournalRepositoryInterface::class); + $this->repository = app(JournalRepositoryInterface::class); + $this->accountRepos = app(AccountRepositoryInterface::class); + $this->currencyRepos = app(CurrencyRepositoryInterface::class); return $next($request); } @@ -92,7 +96,7 @@ class ReconcileController extends Controller $preFilled = [ 'date' => $this->repository->getJournalDate($journal, null), 'category' => $this->repository->getJournalCategoryName($journal), - 'tags' => join(',', $journal->tags->pluck('tag')->toArray()), + 'tags' => implode(',', $journal->tags->pluck('tag')->toArray()), 'amount' => $pTransaction->amount, ]; @@ -163,7 +167,7 @@ class ReconcileController extends Controller )->render(), ]; - return Response::json($return); + return response()->json($return); } /** @@ -185,10 +189,8 @@ class ReconcileController extends Controller return redirect(route('accounts.index', [config('firefly.shortNamesByFullName.' . $account->accountType->type)])); } - /** @var CurrencyRepositoryInterface $currencyRepos */ - $currencyRepos = app(CurrencyRepositoryInterface::class); - $currencyId = intval($account->getMeta('currency_id')); - $currency = $currencyRepos->findNull($currencyId); + $currencyId = intval($this->accountRepos->getMetaValue($account, 'currency_id')); + $currency = $this->currencyRepos->findNull($currencyId); if (0 === $currencyId) { $currency = app('amount')->getDefaultCurrency(); // @codeCoverageIgnore } @@ -247,12 +249,12 @@ class ReconcileController extends Controller /** * @param ReconciliationStoreRequest $request + * @param JournalRepositoryInterface $repository * @param Account $account * @param Carbon $start * @param Carbon $end * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector - * @throws FireflyException */ public function submit(ReconciliationStoreRequest $request, JournalRepositoryInterface $repository, Account $account, Carbon $start, Carbon $end) { @@ -268,9 +270,7 @@ class ReconcileController extends Controller // create reconciliation transaction (if necessary): if ('create' === $data['reconcile']) { // get "opposing" account. - /** @var AccountRepositoryInterface $accountRepos */ - $accountRepos = app(AccountRepositoryInterface::class); - $reconciliation = $accountRepos->getReconciliation($account); + $reconciliation = $this->accountRepos->getReconciliation($account); $difference = $data['difference']; @@ -300,7 +300,7 @@ class ReconcileController extends Controller 'tags' => null, 'interest_date' => null, 'transactions' => [[ - 'currency_id' => intval($account->getMeta('currency_id')), + 'currency_id' => intval($this->accountRepos->getMetaValue($account, 'currency_id')), 'currency_code' => null, 'description' => null, 'amount' => app('steam')->positive($difference), @@ -319,7 +319,7 @@ class ReconcileController extends Controller 'category_name' => null, ], ], - 'notes' => join(', ', $data['transactions']), + 'notes' => implode(', ', $data['transactions']), ]; $journal = $repository->store($journalData); @@ -350,10 +350,8 @@ class ReconcileController extends Controller $startDate = clone $start; $startDate->subDays(1); - /** @var CurrencyRepositoryInterface $currencyRepos */ - $currencyRepos = app(CurrencyRepositoryInterface::class); - $currencyId = intval($account->getMeta('currency_id')); - $currency = $currencyRepos->findNull($currencyId); + $currencyId = intval($this->accountRepos->getMetaValue($account, 'currency_id')); + $currency = $this->currencyRepos->findNull($currencyId); if (0 === $currencyId) { $currency = app('amount')->getDefaultCurrency(); // @codeCoverageIgnore } @@ -375,7 +373,7 @@ class ReconcileController extends Controller $transactions = $collector->getJournals(); $html = view('accounts.reconcile.transactions', compact('account', 'transactions', 'start', 'end', 'selectionStart', 'selectionEnd'))->render(); - return Response::json(['html' => $html, 'startBalance' => $startBalance, 'endBalance' => $endBalance]); + return response()->json(['html' => $html, 'startBalance' => $startBalance, 'endBalance' => $endBalance]); } /** diff --git a/app/Http/Controllers/AccountController.php b/app/Http/Controllers/AccountController.php index 98f3c8f978..f43e22938e 100644 --- a/app/Http/Controllers/AccountController.php +++ b/app/Http/Controllers/AccountController.php @@ -84,6 +84,7 @@ class AccountController extends Controller * @param string $what * * @return View + * @throws \RuntimeException */ public function create(Request $request, string $what = 'asset') { @@ -94,7 +95,7 @@ class AccountController extends Controller $subTitle = trans('firefly.make_new_' . $what . '_account'); $roles = []; foreach (config('firefly.accountRoles') as $role) { - $roles[$role] = strval(trans('firefly.account_role_' . $role)); + $roles[$role] = (string)trans('firefly.account_role_' . $role); } // pre fill some data @@ -128,11 +129,11 @@ class AccountController extends Controller } /** - * @param Request $request - * @param AccountRepositoryInterface $repository - * @param Account $account + * @param Request $request + * @param Account $account * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @throws \RuntimeException */ public function destroy(Request $request, Account $account) { @@ -152,15 +153,17 @@ class AccountController extends Controller /** * Edit an account. * - * @param Request $request - * @param Account $account + * @param Request $request + * @param Account $account + * + * @param AccountRepositoryInterface $repository + * + * @return View * * @SuppressWarnings(PHPMD.CyclomaticComplexity) // long and complex but not that excessively so. * @SuppressWarnings(PHPMD.ExcessiveMethodLength) * - * @return View - * - * @throws FireflyException + * @throws \RuntimeException */ public function edit(Request $request, Account $account, AccountRepositoryInterface $repository) { @@ -185,14 +188,18 @@ class AccountController extends Controller // the opening balance is tricky: $openingBalanceAmount = strval($repository->getOpeningBalanceAmount($account)); $openingBalanceDate = $repository->getOpeningBalanceDate($account); - $currency = $this->currencyRepos->findNull(intval($account->getMeta('currency_id'))); + $default = app('amount')->getDefaultCurrency(); + $currency = $this->currencyRepos->findNull(intval($repository->getMetaValue($account, 'currency_id'))); + if (is_null($currency)) { + $currency = $default; + } $preFilled = [ - 'accountNumber' => $account->getMeta('accountNumber'), - 'accountRole' => $account->getMeta('accountRole'), - 'ccType' => $account->getMeta('ccType'), - 'ccMonthlyPaymentDate' => $account->getMeta('ccMonthlyPaymentDate'), - 'BIC' => $account->getMeta('BIC'), + 'accountNumber' => $repository->getMetaValue($account, 'accountNumber'), + 'accountRole' => $repository->getMetaValue($account, 'accountRole'), + 'ccType' => $repository->getMetaValue($account, 'ccType'), + 'ccMonthlyPaymentDate' => $repository->getMetaValue($account, 'ccMonthlyPaymentDate'), + 'BIC' => $repository->getMetaValue($account, 'BIC'), 'openingBalanceDate' => $openingBalanceDate, 'openingBalance' => $openingBalanceAmount, 'virtualBalance' => $account->virtual_balance, @@ -273,37 +280,36 @@ class AccountController extends Controller /** * Show an account. * - * @param Request $request - * @param Account $account - * @param string $moment + * @param Request $request + * @param Account $account + * @param Carbon|null $start + * @param Carbon|null $end * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|View * - * @SuppressWarnings(PHPMD.CyclomaticComplexity) // long and complex but not that excessively so. - * @SuppressWarnings(PHPMD.ExcessiveMethodLength) - * * @throws FireflyException + * */ public function show(Request $request, Account $account, Carbon $start = null, Carbon $end = null) { if (AccountType::INITIAL_BALANCE === $account->accountType->type) { return $this->redirectToOriginalAccount($account); } - $range = Preferences::get('viewRange', '1M')->data; if (null === $start) { $start = session('start'); } if (null === $end) { - $end = app('navigation')->endOfPeriod($start, $range); + $end = session('end'); } if ($end < $start) { throw new FireflyException('End is after start!'); // @codeCoverageIgnore } + $today = new Carbon; $subTitleIcon = config('firefly.subIconsByIdentifier.' . $account->accountType->type); - $page = intval($request->get('page')); - $pageSize = intval(Preferences::get('listPageSize', 50)->data); - $currencyId = intval($account->getMeta('currency_id')); + $page = (int)$request->get('page'); + $pageSize = (int)Preferences::get('listPageSize', 50)->data; + $currencyId = (int)$this->repository->getMetaValue($account, 'currency_id'); $currency = $this->currencyRepos->findNull($currencyId); if (0 === $currencyId) { $currency = app('amount')->getDefaultCurrency(); // @codeCoverageIgnore @@ -315,15 +321,56 @@ class AccountController extends Controller $periods = $this->getPeriodOverview($account, $end); $collector = app(JournalCollectorInterface::class); $collector->setAccounts(new Collection([$account]))->setLimit($pageSize)->setPage($page); - if (null !== $start) { - $collector->setRange($start, $end); - } + $collector->setRange($start, $end); $transactions = $collector->getPaginatedJournals(); $transactions->setPath(route('accounts.show', [$account->id, $start->format('Y-m-d'), $end->format('Y-m-d')])); + $showAll = false; return view( 'accounts.show', - compact('account', 'currency', 'periods', 'subTitleIcon', 'transactions', 'subTitle', 'start', 'end', 'chartUri') + compact('account', 'showAll', 'currency', 'today', 'periods', 'subTitleIcon', 'transactions', 'subTitle', 'start', 'end', 'chartUri') + ); + } + + /** + * Show an account. + * + * @param Request $request + * @param Account $account + * + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|View + * + * @throws FireflyException + * + */ + public function showAll(Request $request, Account $account) + { + if (AccountType::INITIAL_BALANCE === $account->accountType->type) { + return $this->redirectToOriginalAccount($account); + } + $end = new Carbon; + $today = new Carbon; + $start = $this->repository->oldestJournalDate($account); + $subTitleIcon = config('firefly.subIconsByIdentifier.' . $account->accountType->type); + $page = (int)$request->get('page'); + $pageSize = (int)Preferences::get('listPageSize', 50)->data; + $currencyId = (int)$this->repository->getMetaValue($account, 'currency_id'); + $currency = $this->currencyRepos->findNull($currencyId); + if (0 === $currencyId) { + $currency = app('amount')->getDefaultCurrency(); // @codeCoverageIgnore + } + $subTitle = trans('firefly.all_journals_for_account', ['name' => $account->name]); + $periods = new Collection; + $collector = app(JournalCollectorInterface::class); + $collector->setAccounts(new Collection([$account]))->setLimit($pageSize)->setPage($page); + $transactions = $collector->getPaginatedJournals(); + $transactions->setPath(route('accounts.show.all', [$account->id])); + $chartUri = route('chart.account.period', [$account->id, $start->format('Y-m-d'), $end->format('Y-m-d')]); + $showAll = true; + + return view( + 'accounts.show', + compact('account', 'showAll', 'currency', 'today', 'chartUri', 'periods', 'subTitleIcon', 'transactions', 'subTitle', 'start', 'end') ); } @@ -331,12 +378,13 @@ class AccountController extends Controller * @param AccountFormRequest $request * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @throws \RuntimeException */ public function store(AccountFormRequest $request) { $data = $request->getAccountData(); $account = $this->repository->store($data); - $request->session()->flash('success', strval(trans('firefly.stored_new_account', ['name' => $account->name]))); + $request->session()->flash('success', (string)trans('firefly.stored_new_account', ['name' => $account->name])); Preferences::mark(); // update preferences if necessary: @@ -360,11 +408,11 @@ class AccountController extends Controller } /** - * @param AccountFormRequest $request - * @param AccountRepositoryInterface $repository - * @param Account $account + * @param AccountFormRequest $request + * @param Account $account * * @return $this|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @throws \RuntimeException */ public function update(AccountFormRequest $request, Account $account) { @@ -405,7 +453,9 @@ class AccountController extends Controller * and for each period, the amount of money spent and earned. This is a complex operation which is cached for * performance reasons. * - * @param Account $account the account involved + * @param Account $account the account involved + * + * @param Carbon|null $date * * @return Collection * @@ -429,33 +479,34 @@ class AccountController extends Controller if ($cache->has()) { return $cache->get(); // @codeCoverageIgnore } + /** @var array $dates */ $dates = app('navigation')->blockPeriods($start, $end, $range); $entries = new Collection; // loop dates - foreach ($dates as $date) { + foreach ($dates as $currentDate) { // try a collector for income: /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); - $collector->setAccounts(new Collection([$account]))->setRange($date['start'], $date['end'])->setTypes([TransactionType::DEPOSIT]) + $collector->setAccounts(new Collection([$account]))->setRange($currentDate['start'], $currentDate['end'])->setTypes([TransactionType::DEPOSIT]) ->withOpposingAccount(); - $earned = strval($collector->getJournals()->sum('transaction_amount')); + $earned = (string)$collector->getJournals()->sum('transaction_amount'); // try a collector for expenses: /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); - $collector->setAccounts(new Collection([$account]))->setRange($date['start'], $date['end'])->setTypes([TransactionType::WITHDRAWAL]) + $collector->setAccounts(new Collection([$account]))->setRange($currentDate['start'], $currentDate['end'])->setTypes([TransactionType::WITHDRAWAL]) ->withOpposingAccount(); - $spent = strval($collector->getJournals()->sum('transaction_amount')); + $spent = (string)$collector->getJournals()->sum('transaction_amount'); - $dateName = app('navigation')->periodShow($date['start'], $date['period']); + $dateName = app('navigation')->periodShow($currentDate['start'], $currentDate['period']); $entries->push( [ 'name' => $dateName, 'spent' => $spent, 'earned' => $earned, - 'start' => $date['start']->format('Y-m-d'), - 'end' => $date['end']->format('Y-m-d'), + 'start' => $currentDate['start']->format('Y-m-d'), + 'end' => $currentDate['end']->format('Y-m-d'), ] ); } diff --git a/app/Http/Controllers/Admin/LinkController.php b/app/Http/Controllers/Admin/LinkController.php index 0955f00521..aa2078da42 100644 --- a/app/Http/Controllers/Admin/LinkController.php +++ b/app/Http/Controllers/Admin/LinkController.php @@ -76,6 +76,7 @@ class LinkController extends Controller * @param LinkType $linkType * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|View + * @throws \RuntimeException */ public function delete(Request $request, LinkTypeRepositoryInterface $repository, LinkType $linkType) { @@ -108,6 +109,7 @@ class LinkController extends Controller * @param LinkType $linkType * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @throws \RuntimeException */ public function destroy(Request $request, LinkTypeRepositoryInterface $repository, LinkType $linkType) { @@ -126,6 +128,7 @@ class LinkController extends Controller * @param LinkType $linkType * * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View + * @throws \RuntimeException */ public function edit(Request $request, LinkType $linkType) { @@ -184,6 +187,7 @@ class LinkController extends Controller * @param LinkTypeRepositoryInterface $repository * * @return $this|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @throws \RuntimeException */ public function store(LinkTypeFormRequest $request, LinkTypeRepositoryInterface $repository) { @@ -212,6 +216,7 @@ class LinkController extends Controller * @param LinkType $linkType * * @return $this|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @throws \RuntimeException */ public function update(LinkTypeFormRequest $request, LinkTypeRepositoryInterface $repository, LinkType $linkType) { diff --git a/app/Http/Controllers/Admin/UpdateController.php b/app/Http/Controllers/Admin/UpdateController.php index f8208d659f..423de9cb6b 100644 --- a/app/Http/Controllers/Admin/UpdateController.php +++ b/app/Http/Controllers/Admin/UpdateController.php @@ -22,6 +22,7 @@ declare(strict_types=1); namespace FireflyIII\Http\Controllers\Admin; +use Carbon\Carbon; use FireflyConfig; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Http\Controllers\Controller; @@ -31,7 +32,6 @@ use FireflyIII\Services\Github\Object\Release; use FireflyIII\Services\Github\Request\UpdateRequest; use Illuminate\Http\Request; use Log; -use Response; use Session; /** @@ -61,6 +61,8 @@ class UpdateController extends Controller /** * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + * @throws \Psr\Container\NotFoundExceptionInterface + * @throws \Psr\Container\ContainerExceptionInterface * @throws \Illuminate\Container\EntryNotFoundException */ public function index() @@ -121,12 +123,20 @@ class UpdateController extends Controller if ($check === -1) { // there is a new FF version! - $string = strval( - trans( - 'firefly.update_new_version_alert', - ['your_version' => $current, 'new_version' => $first->getTitle(), 'date' => $first->getUpdated()->formatLocalized($this->monthAndDayFormat)] - ) - ); + // has it been released for more than three days? + $today = new Carbon; + if ($today->diffInDays($first->getUpdated(), true) > 3) { + $string = strval( + trans( + 'firefly.update_new_version_alert', + [ + 'your_version' => $current, + 'new_version' => $first->getTitle(), + 'date' => $first->getUpdated()->formatLocalized($this->monthAndDayFormat), + ] + ) + ); + } } if ($check === 0) { // you are running the current version! @@ -137,6 +147,6 @@ class UpdateController extends Controller $string = strval(trans('firefly.update_newer_version_alert', ['your_version' => $current, 'new_version' => $first->getTitle()])); } - return Response::json(['result' => $string]); + return response()->json(['result' => $string]); } } diff --git a/app/Http/Controllers/AttachmentController.php b/app/Http/Controllers/AttachmentController.php index 098559ac27..bce1cde2fe 100644 --- a/app/Http/Controllers/AttachmentController.php +++ b/app/Http/Controllers/AttachmentController.php @@ -29,7 +29,6 @@ use FireflyIII\Repositories\Attachment\AttachmentRepositoryInterface; use Illuminate\Http\Request; use Illuminate\Http\Response as LaravelResponse; use Preferences; -use Response; use View; /** @@ -81,6 +80,7 @@ class AttachmentController extends Controller * @param Attachment $attachment * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @throws \RuntimeException */ public function destroy(Request $request, Attachment $attachment) { @@ -130,6 +130,7 @@ class AttachmentController extends Controller * @param Attachment $attachment * * @return View + * @throws \RuntimeException */ public function edit(Request $request, Attachment $attachment) { @@ -142,6 +143,9 @@ class AttachmentController extends Controller } $request->session()->forget('attachments.edit.fromUpdate'); + $preFilled['notes'] = $this->repository->getNoteText($attachment); + $request->session()->flash('preFilled', $preFilled); + return view('attachments.edit', compact('attachment', 'subTitleIcon', 'subTitle')); } @@ -150,6 +154,7 @@ class AttachmentController extends Controller * @param Attachment $attachment * * @return \Illuminate\Http\RedirectResponse + * @throws \RuntimeException */ public function update(AttachmentFormRequest $request, Attachment $attachment) { @@ -182,7 +187,7 @@ class AttachmentController extends Controller if ($this->repository->exists($attachment)) { $content = $this->repository->getContent($attachment); - return Response::make( + return response()->make( $content, 200, [ 'Content-Type' => $attachment->mime, 'Content-Disposition' => 'inline; filename="' . $attachment->filename . '"', diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index e6a4bfcc9b..1c621d6866 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -22,14 +22,13 @@ declare(strict_types=1); namespace FireflyIII\Http\Controllers\Auth; +use DB; use FireflyConfig; use FireflyIII\Http\Controllers\Controller; -use FireflyIII\Models\TransactionCurrency; use FireflyIII\User; use Illuminate\Cookie\CookieJar; use Illuminate\Foundation\Auth\AuthenticatesUsers; use Illuminate\Http\Request; -use Schema; /** * @codeCoverageIgnore @@ -66,6 +65,7 @@ class LoginController extends Controller * * @return \Illuminate\Http\Response|\Symfony\Component\HttpFoundation\Response * + * @throws \RuntimeException * @throws \Illuminate\Validation\ValidationException */ public function login(Request $request) @@ -103,6 +103,7 @@ class LoginController extends Controller * @param CookieJar $cookieJar * * @return $this|\Illuminate\Http\RedirectResponse + * @throws \RuntimeException */ public function logout(Request $request, CookieJar $cookieJar) { @@ -120,26 +121,13 @@ class LoginController extends Controller * @param Request $request * * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + * @throws \RuntimeException */ public function showLoginForm(Request $request) { - // check for presence of tables: - $hasTable = Schema::hasTable('users'); - - if (!$hasTable) { - $message - = 'Firefly III could not find the "users" table. This is a strong indication your database credentials are wrong or the database has not been initialized. Did you follow the installation instructions correctly?'; - - return view('error', compact('message')); - } - - // check for presence of currency: - $currency = TransactionCurrency::where('code', 'EUR')->first(); - if (null === $currency) { - $message - = 'Firefly III could not find the EURO currency. This is a strong indication the database has not been initialized correctly. Did you follow the installation instructions?'; - - return view('error', compact('message')); + $count = DB::table('users')->count(); + if ($count === 0) { + return redirect(route('register')); // @codeCoverageIgnore } // forget 2fa session thing. diff --git a/app/Http/Controllers/Auth/TwoFactorController.php b/app/Http/Controllers/Auth/TwoFactorController.php index d6b984b756..b54e9fdf8a 100644 --- a/app/Http/Controllers/Auth/TwoFactorController.php +++ b/app/Http/Controllers/Auth/TwoFactorController.php @@ -40,6 +40,7 @@ class TwoFactorController extends Controller * * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\Illuminate\View\View * + * @throws \RuntimeException * @throws FireflyException * * @SuppressWarnings(PHPMD.CyclomaticComplexity) @@ -91,6 +92,7 @@ class TwoFactorController extends Controller * * @return mixed * @SuppressWarnings(PHPMD.UnusedFormalParameter) // it's unused but the class does some validation. + * @throws \RuntimeException */ public function postIndex(TokenFormRequest $request, CookieJar $cookieJar) { diff --git a/app/Http/Controllers/BillController.php b/app/Http/Controllers/BillController.php index 24210ebf34..e275a2f2b1 100644 --- a/app/Http/Controllers/BillController.php +++ b/app/Http/Controllers/BillController.php @@ -22,7 +22,6 @@ declare(strict_types=1); namespace FireflyIII\Http\Controllers; -use Carbon\Carbon; use FireflyIII\Helpers\Attachments\AttachmentHelperInterface; use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Http\Requests\BillFormRequest; @@ -76,6 +75,7 @@ class BillController extends Controller * @param Request $request * * @return View + * @throws \RuntimeException */ public function create(Request $request) { @@ -114,6 +114,7 @@ class BillController extends Controller * @param Bill $bill * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @throws \RuntimeException */ public function destroy(Request $request, BillRepositoryInterface $repository, Bill $bill) { @@ -131,6 +132,7 @@ class BillController extends Controller * @param Bill $bill * * @return View + * @throws \RuntimeException */ public function edit(Request $request, Bill $bill) { @@ -199,6 +201,7 @@ class BillController extends Controller * @param Bill $bill * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @throws \RuntimeException */ public function rescan(Request $request, BillRepositoryInterface $repository, Bill $bill) { @@ -265,6 +268,7 @@ class BillController extends Controller * @param BillRepositoryInterface $repository * * @return \Illuminate\Http\RedirectResponse + * @throws \RuntimeException */ public function store(BillFormRequest $request, BillRepositoryInterface $repository) { @@ -300,6 +304,7 @@ class BillController extends Controller * @param Bill $bill * * @return \Illuminate\Http\RedirectResponse + * @throws \RuntimeException */ public function update(BillFormRequest $request, BillRepositoryInterface $repository, Bill $bill) { diff --git a/app/Http/Controllers/BudgetController.php b/app/Http/Controllers/BudgetController.php index b445ca7adc..b4e35b81e2 100644 --- a/app/Http/Controllers/BudgetController.php +++ b/app/Http/Controllers/BudgetController.php @@ -39,7 +39,6 @@ use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Collection; use Log; use Preferences; -use Response; use View; /** @@ -79,13 +78,18 @@ class BudgetController extends Controller * @param Budget $budget * * @return \Illuminate\Http\JsonResponse + * @throws \InvalidArgumentException */ public function amount(Request $request, BudgetRepositoryInterface $repository, Budget $budget) { - $amount = strval($request->get('amount')); - $start = Carbon::createFromFormat('Y-m-d', $request->get('start')); - $end = Carbon::createFromFormat('Y-m-d', $request->get('end')); + $amount = strval($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); + $largeDiff = false; + $warnText = ''; + $average = '0'; + $current = '0'; if (0 === bccomp($amount, '0')) { $budgetLimit = null; } @@ -95,15 +99,50 @@ class BudgetController extends Controller $currency = app('amount')->getDefaultCurrency(); $left = app('amount')->formatAnything($currency, bcadd($amount, $spent), true); + + // over or under budgeting, compared to previous budgets? + $average = $this->repository->budgetedPerDay($budget); + // current average per day: + $diff = $start->diffInDays($end); + $current = $amount; + if ($diff > 0) { + $current = bcdiv($amount, strval($diff)); + } + if (bccomp(bcmul('1.1', $average), $current) === -1) { + $largeDiff = true; + $warnText = strval( + trans( + 'firefly.over_budget_warn', + [ + 'amount' => app('amount')->formatAnything($currency, $average, false), + 'over_amount' => app('amount')->formatAnything($currency, $current, false), + ] + ) + ); + } + Preferences::mark(); - return Response::json(['left' => $left, 'name' => $budget->name, 'limit' => $budgetLimit ? $budgetLimit->id : 0, 'amount' => $amount]); + return response()->json( + [ + 'left' => $left, + 'name' => $budget->name, + 'limit' => $budgetLimit ? $budgetLimit->id : 0, + 'amount' => $amount, + 'current' => $current, + 'average' => $average, + 'large_diff' => $largeDiff, + 'warn_text' => $warnText, + + ] + ); } /** * @param Request $request * * @return View + * @throws \RuntimeException */ public function create(Request $request) { @@ -137,6 +176,7 @@ class BudgetController extends Controller * @param Budget $budget * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @throws \RuntimeException */ public function destroy(Request $request, Budget $budget) { @@ -153,6 +193,7 @@ class BudgetController extends Controller * @param Budget $budget * * @return View + * @throws \RuntimeException */ public function edit(Request $request, Budget $budget) { @@ -168,6 +209,7 @@ class BudgetController extends Controller } /** + * @param Request $request * @param string|null $moment * * @return View @@ -184,12 +226,13 @@ class BudgetController extends Controller $pageSize = intval(Preferences::get('listPageSize', 50)->data); // make date if present: - if (null !== $moment || 0 !== strlen(strval($moment))) { + if (null !== $moment || '' !== (string)$moment) { try { $start = new Carbon($moment); $end = app('navigation')->endOfPeriod($start, $range); } catch (Exception $e) { // start and end are already defined. + Log::debug('start and end are already defined.'); } } $next = clone $end; @@ -292,7 +335,7 @@ class BudgetController extends Controller // @codeCoverageIgnoreStart $result = $cache->get(); - return view('budgets.info', compact('result', 'begin', 'currentEnd')); + return view('budgets.info', compact('result')); // @codeCoverageIgnoreEnd } $result = [ @@ -413,6 +456,7 @@ class BudgetController extends Controller * @param BudgetIncomeRequest $request * * @return \Illuminate\Http\RedirectResponse + * @throws \InvalidArgumentException */ public function postUpdateIncome(BudgetIncomeRequest $request) { @@ -433,16 +477,18 @@ class BudgetController extends Controller * @param Budget $budget * * @return View + * @throws \InvalidArgumentException */ public function show(Request $request, Budget $budget) { /** @var Carbon $start */ $start = session('first', Carbon::create()->startOfYear()); $end = new Carbon; - $page = intval($request->get('page')); - $pageSize = intval(Preferences::get('listPageSize', 50)->data); + $page = (int)$request->get('page'); + $pageSize = (int)Preferences::get('listPageSize', 50)->data; $limits = $this->getLimits($budget, $start, $end); $repetition = null; + // collector: /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); @@ -462,6 +508,7 @@ class BudgetController extends Controller * * @return View * + * @throws \InvalidArgumentException * @throws FireflyException */ public function showByBudgetLimit(Request $request, Budget $budget, BudgetLimit $budgetLimit) @@ -499,6 +546,7 @@ class BudgetController extends Controller * @param BudgetFormRequest $request * * @return \Illuminate\Http\RedirectResponse + * @throws \RuntimeException */ public function store(BudgetFormRequest $request) { @@ -524,6 +572,7 @@ class BudgetController extends Controller * @param Budget $budget * * @return \Illuminate\Http\RedirectResponse + * @throws \RuntimeException */ public function update(BudgetFormRequest $request, Budget $budget) { @@ -546,8 +595,9 @@ class BudgetController extends Controller } /** - * @param Carbon $start - * @param Carbon $end + * @param Request $request + * @param Carbon $start + * @param Carbon $end * * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ diff --git a/app/Http/Controllers/CategoryController.php b/app/Http/Controllers/CategoryController.php index ea797583f2..bb1bbea092 100644 --- a/app/Http/Controllers/CategoryController.php +++ b/app/Http/Controllers/CategoryController.php @@ -77,6 +77,7 @@ class CategoryController extends Controller * @param Request $request * * @return View + * @throws \RuntimeException */ public function create(Request $request) { @@ -109,6 +110,7 @@ class CategoryController extends Controller * @param Category $category * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @throws \RuntimeException */ public function destroy(Request $request, Category $category) { @@ -126,6 +128,7 @@ class CategoryController extends Controller * @param Category $category * * @return View + * @throws \RuntimeException */ public function edit(Request $request, Category $category) { @@ -297,6 +300,7 @@ class CategoryController extends Controller * @param CategoryRepositoryInterface $repository * * @return $this|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @throws \RuntimeException */ public function store(CategoryFormRequest $request, CategoryRepositoryInterface $repository) { @@ -323,6 +327,7 @@ class CategoryController extends Controller * @param Category $category * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @throws \RuntimeException */ public function update(CategoryFormRequest $request, CategoryRepositoryInterface $repository, Category $category) { @@ -424,6 +429,8 @@ class CategoryController extends Controller /** * @param Category $category * + * @param Carbon $date + * * @return Collection */ private function getPeriodOverview(Category $category, Carbon $date): Collection @@ -445,20 +452,20 @@ class CategoryController extends Controller if ($cache->has()) { return $cache->get(); // @codeCoverageIgnore } - + /** @var array $dates */ $dates = app('navigation')->blockPeriods($start, $end, $range); $entries = new Collection; - foreach ($dates as $date) { - $spent = $this->repository->spentInPeriod(new Collection([$category]), $accounts, $date['start'], $date['end']); - $earned = $this->repository->earnedInPeriod(new Collection([$category]), $accounts, $date['start'], $date['end']); - $dateStr = $date['end']->format('Y-m-d'); - $dateName = app('navigation')->periodShow($date['end'], $date['period']); + foreach ($dates as $currentDate) { + $spent = $this->repository->spentInPeriod(new Collection([$category]), $accounts, $currentDate['start'], $currentDate['end']); + $earned = $this->repository->earnedInPeriod(new Collection([$category]), $accounts, $currentDate['start'], $currentDate['end']); + $dateStr = $currentDate['end']->format('Y-m-d'); + $dateName = app('navigation')->periodShow($currentDate['end'], $currentDate['period']); // amount transferred /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); - $collector->setAllAssetAccounts()->setRange($date['start'], $date['end'])->setCategory($category) + $collector->setAllAssetAccounts()->setRange($currentDate['start'], $currentDate['end'])->setCategory($category) ->withOpposingAccount()->setTypes([TransactionType::TRANSFER]); $collector->removeFilter(InternalTransferFilter::class); $transferred = Steam::positive($collector->getJournals()->sum('transaction_amount')); @@ -471,7 +478,7 @@ class CategoryController extends Controller 'earned' => $earned, 'sum' => bcadd($earned, $spent), 'transferred' => $transferred, - 'date' => clone $date['end'], + 'date' => clone $currentDate['end'], ] ); } diff --git a/app/Http/Controllers/Chart/AccountController.php b/app/Http/Controllers/Chart/AccountController.php index baf19747d6..6006316482 100644 --- a/app/Http/Controllers/Chart/AccountController.php +++ b/app/Http/Controllers/Chart/AccountController.php @@ -38,7 +38,6 @@ use FireflyIII\Support\CacheProperties; use Illuminate\Support\Collection; use Log; use Preferences; -use Response; /** checked * Class AccountController. @@ -74,7 +73,7 @@ class AccountController extends Controller $cache->addProperty($end); $cache->addProperty('chart.account.expense-accounts'); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } $start->subDay(); @@ -97,7 +96,7 @@ class AccountController extends Controller $data = $this->generator->singleSet(strval(trans('firefly.spent')), $chartData); $cache->store($data); - return Response::json($data); + return response()->json($data); } /** @@ -115,7 +114,7 @@ class AccountController extends Controller $cache->addProperty($end); $cache->addProperty('chart.account.expense-budget'); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } $collector = app(JournalCollectorInterface::class); $collector->setAccounts(new Collection([$account]))->setRange($start, $end)->withBudgetInformation()->setTypes([TransactionType::WITHDRAWAL]); @@ -140,7 +139,7 @@ class AccountController extends Controller $data = $this->generator->pieChart($chartData); $cache->store($data); - return Response::json($data); + return response()->json($data); } /** @@ -172,7 +171,7 @@ class AccountController extends Controller $cache->addProperty($end); $cache->addProperty('chart.account.expense-category'); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } $collector = app(JournalCollectorInterface::class); @@ -197,7 +196,7 @@ class AccountController extends Controller $data = $this->generator->pieChart($chartData); $cache->store($data); - return Response::json($data); + return response()->json($data); } /** @@ -236,7 +235,7 @@ class AccountController extends Controller } $accounts = $repository->getAccountsById($frontPage->data); - return Response::json($this->accountBalanceChart($accounts, $start, $end)); + return response()->json($this->accountBalanceChart($accounts, $start, $end)); } /** @@ -254,7 +253,7 @@ class AccountController extends Controller $cache->addProperty($end); $cache->addProperty('chart.account.income-category'); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } // grab all journals: @@ -279,7 +278,7 @@ class AccountController extends Controller $data = $this->generator->pieChart($chartData); $cache->store($data); - return Response::json($data); + return response()->json($data); } /** @@ -300,6 +299,8 @@ class AccountController extends Controller * @param Account $account * @param Carbon $start * + * @param Carbon $end + * * @return \Illuminate\Http\JsonResponse */ public function period(Account $account, Carbon $start, Carbon $end) @@ -310,7 +311,7 @@ class AccountController extends Controller $cache->addProperty($end); $cache->addProperty($account->id); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } // depending on diff, do something with range of chart. $step = '1D'; @@ -356,7 +357,7 @@ class AccountController extends Controller $data = $this->generator->singleSet($account->name, $chartData); $cache->store($data); - return Response::json($data); + return response()->json($data); } /** @@ -370,7 +371,7 @@ class AccountController extends Controller */ public function report(Collection $accounts, Carbon $start, Carbon $end) { - return Response::json($this->accountBalanceChart($accounts, $start, $end)); + return response()->json($this->accountBalanceChart($accounts, $start, $end)); } /** @@ -390,7 +391,7 @@ class AccountController extends Controller $cache->addProperty($end); $cache->addProperty('chart.account.revenue-accounts'); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } $accounts = $repository->getAccountsByType([AccountType::REVENUE]); @@ -413,7 +414,7 @@ class AccountController extends Controller $data = $this->generator->singleSet(strval(trans('firefly.earned')), $chartData); $cache->store($data); - return Response::json($data); + return response()->json($data); } /** diff --git a/app/Http/Controllers/Chart/BillController.php b/app/Http/Controllers/Chart/BillController.php index ebf0559d17..d5794c45a9 100644 --- a/app/Http/Controllers/Chart/BillController.php +++ b/app/Http/Controllers/Chart/BillController.php @@ -31,7 +31,6 @@ use FireflyIII\Models\Transaction; use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Support\CacheProperties; use Illuminate\Support\Collection; -use Response; /** * Class BillController. @@ -66,7 +65,7 @@ class BillController extends Controller $cache->addProperty($end); $cache->addProperty('chart.bill.frontpage'); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } $paid = $repository->getBillsPaidInRange($start, $end); // will be a negative amount. @@ -79,7 +78,7 @@ class BillController extends Controller $data = $this->generator->pieChart($chartData); $cache->store($data); - return Response::json($data); + return response()->json($data); } /** @@ -94,7 +93,7 @@ class BillController extends Controller $cache->addProperty('chart.bill.single'); $cache->addProperty($bill->id); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } $results = $collector->setAllAssetAccounts()->setBills(new Collection([$bill]))->getJournals(); @@ -120,6 +119,6 @@ class BillController extends Controller $data = $this->generator->multiSet($chartData); $cache->store($data); - return Response::json($data); + return response()->json($data); } } diff --git a/app/Http/Controllers/Chart/BudgetController.php b/app/Http/Controllers/Chart/BudgetController.php index b48f3c3d25..da87461707 100644 --- a/app/Http/Controllers/Chart/BudgetController.php +++ b/app/Http/Controllers/Chart/BudgetController.php @@ -37,7 +37,6 @@ use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use FireflyIII\Support\CacheProperties; use Illuminate\Support\Collection; -use Response; use Steam; /** @@ -86,7 +85,7 @@ class BudgetController extends Controller $cache->addProperty($budget->id); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } // depending on diff, do something with range of chart. @@ -122,7 +121,7 @@ class BudgetController extends Controller $cache->store($data); - return Response::json($data); + return response()->json($data); } /** @@ -153,7 +152,7 @@ class BudgetController extends Controller $cache->addProperty($budget->id); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } $entries = []; @@ -170,7 +169,7 @@ class BudgetController extends Controller $data = $this->generator->singleSet(strval(trans('firefly.left')), $entries); $cache->store($data); - return Response::json($data); + return response()->json($data); } /** @@ -186,7 +185,7 @@ class BudgetController extends Controller $cache->addProperty($budgetLimit->id ?? 0); $cache->addProperty('chart.budget.expense-asset'); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } /** @var JournalCollectorInterface $collector */ @@ -214,7 +213,7 @@ class BudgetController extends Controller $data = $this->generator->pieChart($chartData); $cache->store($data); - return Response::json($data); + return response()->json($data); } /** @@ -230,7 +229,7 @@ class BudgetController extends Controller $cache->addProperty($budgetLimit->id ?? 0); $cache->addProperty('chart.budget.expense-category'); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } /** @var JournalCollectorInterface $collector */ @@ -260,7 +259,7 @@ class BudgetController extends Controller $data = $this->generator->pieChart($chartData); $cache->store($data); - return Response::json($data); + return response()->json($data); } /** @@ -276,7 +275,7 @@ class BudgetController extends Controller $cache->addProperty($budgetLimit->id ?? 0); $cache->addProperty('chart.budget.expense-expense'); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } /** @var JournalCollectorInterface $collector */ @@ -305,7 +304,7 @@ class BudgetController extends Controller $data = $this->generator->pieChart($chartData); $cache->store($data); - return Response::json($data); + return response()->json($data); } /** @@ -326,7 +325,7 @@ class BudgetController extends Controller $cache->addProperty($end); $cache->addProperty('chart.budget.frontpage'); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } $budgets = $this->repository->getActiveBudgets(); $chartData = [ @@ -359,7 +358,7 @@ class BudgetController extends Controller $data = $this->generator->multiSet($chartData); $cache->store($data); - return Response::json($data); + return response()->json($data); } /** @@ -382,7 +381,7 @@ class BudgetController extends Controller $cache->addProperty($budget->id); $cache->addProperty('chart.budget.period'); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } $periods = app('navigation')->listOfPeriods($start, $end); $entries = $this->repository->getBudgetPeriodReport(new Collection([$budget]), $accounts, $start, $end); // get the expenses @@ -404,7 +403,7 @@ class BudgetController extends Controller $data = $this->generator->multiSet($chartData); $cache->store($data); - return Response::json($data); + return response()->json($data); } /** @@ -423,7 +422,7 @@ class BudgetController extends Controller $cache->addProperty($accounts); $cache->addProperty('chart.budget.no-budget'); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } // the expenses: @@ -440,7 +439,7 @@ class BudgetController extends Controller $data = $this->generator->singleSet(strval(trans('firefly.spent')), $chartData); $cache->store($data); - return Response::json($data); + return response()->json($data); } /** diff --git a/app/Http/Controllers/Chart/BudgetReportController.php b/app/Http/Controllers/Chart/BudgetReportController.php index fefa1c63e9..e7aaf052a4 100644 --- a/app/Http/Controllers/Chart/BudgetReportController.php +++ b/app/Http/Controllers/Chart/BudgetReportController.php @@ -37,7 +37,6 @@ use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Support\CacheProperties; use Illuminate\Support\Collection; -use Response; /** * Separate controller because many helper functions are shared. @@ -88,7 +87,7 @@ class BudgetReportController extends Controller $chartData = $helper->generate('expense', 'account'); $data = $this->generator->pieChart($chartData); - return Response::json($data); + return response()->json($data); } /** @@ -112,7 +111,7 @@ class BudgetReportController extends Controller $chartData = $helper->generate('expense', 'budget'); $data = $this->generator->pieChart($chartData); - return Response::json($data); + return response()->json($data); } /** @@ -132,7 +131,7 @@ class BudgetReportController extends Controller $cache->addProperty($start); $cache->addProperty($end); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } $format = app('navigation')->preferredCarbonLocalizedFormat($start, $end); $function = app('navigation')->preferredEndOfPeriod($start, $end); @@ -195,7 +194,7 @@ class BudgetReportController extends Controller $data = $this->generator->multiSet($chartData); $cache->store($data); - return Response::json($data); + return response()->json($data); } /** diff --git a/app/Http/Controllers/Chart/CategoryController.php b/app/Http/Controllers/Chart/CategoryController.php index 1c0a8ddcac..db05731ab0 100644 --- a/app/Http/Controllers/Chart/CategoryController.php +++ b/app/Http/Controllers/Chart/CategoryController.php @@ -32,7 +32,6 @@ use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use FireflyIII\Support\CacheProperties; use Illuminate\Support\Collection; use Preferences; -use Response; /** * Class CategoryController. @@ -67,7 +66,7 @@ class CategoryController extends Controller $cache->addProperty('chart.category.all'); $cache->addProperty($category->id); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } $start = $repository->firstUseDate($category); @@ -114,7 +113,7 @@ class CategoryController extends Controller $data = $this->generator->multiSet($chartData); $cache->store($data); - return Response::json($data); + return response()->json($data); } /** @@ -133,7 +132,7 @@ class CategoryController extends Controller $cache->addProperty($end); $cache->addProperty('chart.category.frontpage'); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } $chartData = []; $categories = $repository->getCategories(); @@ -154,7 +153,7 @@ class CategoryController extends Controller $data = $this->generator->singleSet(strval(trans('firefly.spent')), $chartData); $cache->store($data); - return Response::json($data); + return response()->json($data); } /** @@ -212,7 +211,7 @@ class CategoryController extends Controller $data = $this->generator->multiSet($chartData); $cache->store($data); - return Response::json($data); + return response()->json($data); } /** @@ -267,7 +266,7 @@ class CategoryController extends Controller $data = $this->generator->multiSet($chartData); $cache->store($data); - return Response::json($data); + return response()->json($data); } /** @@ -284,7 +283,7 @@ class CategoryController extends Controller $end = app('navigation')->endOfPeriod($date, $range); $data = $this->makePeriodChart($repository, $category, $start, $end); - return Response::json($data); + return response()->json($data); } /** diff --git a/app/Http/Controllers/Chart/CategoryReportController.php b/app/Http/Controllers/Chart/CategoryReportController.php index daa7d1951b..d2405d2af5 100644 --- a/app/Http/Controllers/Chart/CategoryReportController.php +++ b/app/Http/Controllers/Chart/CategoryReportController.php @@ -36,7 +36,6 @@ use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionType; use FireflyIII\Support\CacheProperties; use Illuminate\Support\Collection; -use Response; /** * Separate controller because many helper functions are shared. @@ -81,7 +80,7 @@ class CategoryReportController extends Controller $chartData = $helper->generate('expense', 'account'); $data = $this->generator->pieChart($chartData); - return Response::json($data); + return response()->json($data); } /** @@ -105,7 +104,7 @@ class CategoryReportController extends Controller $chartData = $helper->generate('income', 'account'); $data = $this->generator->pieChart($chartData); - return Response::json($data); + return response()->json($data); } /** @@ -129,7 +128,7 @@ class CategoryReportController extends Controller $chartData = $helper->generate('expense', 'category'); $data = $this->generator->pieChart($chartData); - return Response::json($data); + return response()->json($data); } /** @@ -153,7 +152,7 @@ class CategoryReportController extends Controller $chartData = $helper->generate('income', 'category'); $data = $this->generator->pieChart($chartData); - return Response::json($data); + return response()->json($data); } /** @@ -173,7 +172,7 @@ class CategoryReportController extends Controller $cache->addProperty($start); $cache->addProperty($end); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } $format = app('navigation')->preferredCarbonLocalizedFormat($start, $end); @@ -258,7 +257,7 @@ class CategoryReportController extends Controller $data = $this->generator->multiSet($newSet); $cache->store($data); - return Response::json($data); + return response()->json($data); } /** diff --git a/app/Http/Controllers/Chart/ExpenseReportController.php b/app/Http/Controllers/Chart/ExpenseReportController.php index 03ca051730..3772e5c5c0 100644 --- a/app/Http/Controllers/Chart/ExpenseReportController.php +++ b/app/Http/Controllers/Chart/ExpenseReportController.php @@ -33,7 +33,6 @@ use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Support\CacheProperties; use Illuminate\Support\Collection; -use Response; /** * Separate controller because many helper functions are shared. @@ -80,7 +79,7 @@ class ExpenseReportController extends Controller $cache->addProperty($start); $cache->addProperty($end); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } $format = app('navigation')->preferredCarbonLocalizedFormat($start, $end); @@ -180,7 +179,7 @@ class ExpenseReportController extends Controller $data = $this->generator->multiSet($newSet); $cache->store($data); - return Response::json($data); + return response()->json($data); } /** diff --git a/app/Http/Controllers/Chart/PiggyBankController.php b/app/Http/Controllers/Chart/PiggyBankController.php index 3958495261..12beec2072 100644 --- a/app/Http/Controllers/Chart/PiggyBankController.php +++ b/app/Http/Controllers/Chart/PiggyBankController.php @@ -28,7 +28,6 @@ use FireflyIII\Models\PiggyBank; use FireflyIII\Models\PiggyBankEvent; use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; use FireflyIII\Support\CacheProperties; -use Response; /** * Class PiggyBankController. @@ -63,7 +62,7 @@ class PiggyBankController extends Controller $cache->addProperty('chart.piggy-bank.history'); $cache->addProperty($piggyBank->id); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } $set = $repository->getEvents($piggyBank); @@ -80,6 +79,6 @@ class PiggyBankController extends Controller $data = $this->generator->singleSet($piggyBank->name, $chartData); $cache->store($data); - return Response::json($data); + return response()->json($data); } } diff --git a/app/Http/Controllers/Chart/ReportController.php b/app/Http/Controllers/Chart/ReportController.php index d8c2736153..5120b807bf 100644 --- a/app/Http/Controllers/Chart/ReportController.php +++ b/app/Http/Controllers/Chart/ReportController.php @@ -29,7 +29,6 @@ use FireflyIII\Repositories\Account\AccountTaskerInterface; use FireflyIII\Support\CacheProperties; use Illuminate\Support\Collection; use Log; -use Response; use Steam; /** @@ -69,7 +68,7 @@ class ReportController extends Controller $cache->addProperty($accounts); $cache->addProperty($end); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } $current = clone $start; $chartData = []; @@ -84,7 +83,7 @@ class ReportController extends Controller $data = $this->generator->singleSet(strval(trans('firefly.net_worth')), $chartData); $cache->store($data); - return Response::json($data); + return response()->json($data); } /** @@ -105,7 +104,7 @@ class ReportController extends Controller $cache->addProperty($accounts); $cache->addProperty($end); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } Log::debug('Going to do operations for accounts ', $accounts->pluck('id')->toArray()); $format = app('navigation')->preferredCarbonLocalizedFormat($start, $end); @@ -139,7 +138,7 @@ class ReportController extends Controller $data = $this->generator->multiSet($chartData); $cache->store($data); - return Response::json($data); + return response()->json($data); } /** @@ -160,7 +159,7 @@ class ReportController extends Controller $cache->addProperty($end); $cache->addProperty($accounts); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } $source = $this->getChartData($accounts, $start, $end); @@ -209,7 +208,7 @@ class ReportController extends Controller $data = $this->generator->multiSet($chartData); $cache->store($data); - return Response::json($data); + return response()->json($data); } /** diff --git a/app/Http/Controllers/Chart/TagReportController.php b/app/Http/Controllers/Chart/TagReportController.php index 0da5c269cb..58a7d2c7eb 100644 --- a/app/Http/Controllers/Chart/TagReportController.php +++ b/app/Http/Controllers/Chart/TagReportController.php @@ -36,7 +36,6 @@ use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionType; use FireflyIII\Support\CacheProperties; use Illuminate\Support\Collection; -use Response; /** * Class TagReportController @@ -77,7 +76,7 @@ class TagReportController extends Controller $chartData = $helper->generate('expense', 'account'); $data = $this->generator->pieChart($chartData); - return Response::json($data); + return response()->json($data); } /** @@ -101,7 +100,7 @@ class TagReportController extends Controller $chartData = $helper->generate('income', 'account'); $data = $this->generator->pieChart($chartData); - return Response::json($data); + return response()->json($data); } /** @@ -124,7 +123,7 @@ class TagReportController extends Controller $chartData = $helper->generate('expense', 'budget'); $data = $this->generator->pieChart($chartData); - return Response::json($data); + return response()->json($data); } /** @@ -147,7 +146,7 @@ class TagReportController extends Controller $chartData = $helper->generate('expense', 'category'); $data = $this->generator->pieChart($chartData); - return Response::json($data); + return response()->json($data); } /** @@ -167,7 +166,7 @@ class TagReportController extends Controller $cache->addProperty($start); $cache->addProperty($end); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } $format = app('navigation')->preferredCarbonLocalizedFormat($start, $end); @@ -252,7 +251,7 @@ class TagReportController extends Controller $data = $this->generator->multiSet($newSet); $cache->store($data); - return Response::json($data); + return response()->json($data); } /** @@ -276,7 +275,7 @@ class TagReportController extends Controller $chartData = $helper->generate('expense', 'tag'); $data = $this->generator->pieChart($chartData); - return Response::json($data); + return response()->json($data); } /** @@ -300,7 +299,7 @@ class TagReportController extends Controller $chartData = $helper->generate('income', 'tag'); $data = $this->generator->pieChart($chartData); - return Response::json($data); + return response()->json($data); } /** diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index 8f1f4ecd39..02e8aa7793 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -139,7 +139,7 @@ class Controller extends BaseController */ protected function isOpeningBalance(TransactionJournal $journal): bool { - return TransactionType::OPENING_BALANCE === $journal->transactionTypeStr(); + return TransactionType::OPENING_BALANCE === $journal->transactionType->type; } /** diff --git a/app/Http/Controllers/CurrencyController.php b/app/Http/Controllers/CurrencyController.php index 4dea312903..1a2ce4c916 100644 --- a/app/Http/Controllers/CurrencyController.php +++ b/app/Http/Controllers/CurrencyController.php @@ -67,6 +67,7 @@ class CurrencyController extends Controller * @param Request $request * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|View + * @throws \RuntimeException */ public function create(Request $request) { @@ -93,6 +94,7 @@ class CurrencyController extends Controller * @param TransactionCurrency $currency * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @throws \RuntimeException */ public function defaultCurrency(Request $request, TransactionCurrency $currency) { @@ -111,6 +113,7 @@ class CurrencyController extends Controller * @param TransactionCurrency $currency * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|View + * @throws \RuntimeException */ public function delete(Request $request, TransactionCurrency $currency) { @@ -140,6 +143,7 @@ class CurrencyController extends Controller * @param TransactionCurrency $currency * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @throws \RuntimeException */ public function destroy(Request $request, TransactionCurrency $currency) { @@ -168,6 +172,7 @@ class CurrencyController extends Controller * @param TransactionCurrency $currency * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|View + * @throws \RuntimeException */ public function edit(Request $request, TransactionCurrency $currency) { @@ -196,6 +201,7 @@ class CurrencyController extends Controller * @param Request $request * * @return View + * @throws \RuntimeException */ public function index(Request $request) { @@ -226,6 +232,7 @@ class CurrencyController extends Controller * @param CurrencyFormRequest $request * * @return $this|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @throws \RuntimeException */ public function store(CurrencyFormRequest $request) { @@ -257,6 +264,7 @@ class CurrencyController extends Controller * @param TransactionCurrency $currency * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @throws \RuntimeException */ public function update(CurrencyFormRequest $request, TransactionCurrency $currency) { diff --git a/app/Http/Controllers/DebugController.php b/app/Http/Controllers/DebugController.php index 23eea881d4..38bf6e7fea 100644 --- a/app/Http/Controllers/DebugController.php +++ b/app/Http/Controllers/DebugController.php @@ -50,6 +50,7 @@ class DebugController extends Controller * @param Request $request * * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + * @throws \InvalidArgumentException */ public function index(Request $request) { @@ -57,11 +58,11 @@ class DebugController extends Controller $replace = ['\~', '# ']; $phpVersion = str_replace($search, $replace, PHP_VERSION); - $phpOs = str_replace($search, $replace, php_uname()); + $phpOs = str_replace($search, $replace, PHP_OS); $interface = PHP_SAPI; $now = Carbon::create()->format('Y-m-d H:i:s e'); - $extensions = join(', ', get_loaded_extensions()); - $drivers = join(', ', DB::availableDrivers()); + $extensions = implode(', ', get_loaded_extensions()); + $drivers = implode(', ', DB::availableDrivers()); $currentDriver = DB::getDriverName(); $userAgent = $request->header('user-agent'); $isSandstorm = var_export(env('IS_SANDSTORM', 'unknown'), true); @@ -76,9 +77,18 @@ class DebugController extends Controller $packages = $this->collectPackages(); $cacheDriver = env('CACHE_DRIVER', 'unknown'); + // set languages, see what happens: + $original = setlocale(LC_ALL, 0); + $localeAttempts = []; + $parts = explode(',', trans('config.locale')); + foreach ($parts as $code) { + $code = trim($code); + $localeAttempts[$code] = var_export(setlocale(LC_ALL, $code), true); + } + setlocale(LC_ALL, $original); // get latest log file: - $logger = Log::getMonolog(); + $logger = Log::driver(); $handlers = $logger->getHandlers(); $logContent = ''; foreach ($handlers as $handler) { @@ -89,6 +99,7 @@ class DebugController extends Controller $logContent = file_get_contents($logFile); } catch (Exception $e) { // don't care + Log::debug(sprintf('Could not read log file. %s', $e->getMessage())); } } } @@ -100,8 +111,7 @@ class DebugController extends Controller 'debug', compact( 'phpVersion', - 'extensions', - 'carbon', + 'extensions', 'localeAttempts', 'appEnv', 'appDebug', 'appLog', diff --git a/app/Http/Controllers/ExportController.php b/app/Http/Controllers/ExportController.php index 51cedfd44c..4cb9e5c422 100644 --- a/app/Http/Controllers/ExportController.php +++ b/app/Http/Controllers/ExportController.php @@ -34,7 +34,6 @@ use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\ExportJob\ExportJobRepositoryInterface; use Illuminate\Http\Response as LaravelResponse; use Preferences; -use Response; use View; /** @@ -104,7 +103,7 @@ class ExportController extends Controller */ public function getStatus(ExportJob $job) { - return Response::json(['status' => trans('firefly.' . $job->status)]); + return response()->json(['status' => trans('firefly.' . $job->status)]); } /** @@ -112,6 +111,7 @@ class ExportController extends Controller * @param ExportJobRepositoryInterface $jobs * * @return View + * @throws \InvalidArgumentException */ public function index(AccountRepositoryInterface $repository, ExportJobRepositoryInterface $jobs) { @@ -121,7 +121,7 @@ class ExportController extends Controller $jobs->cleanup(); // does the user have shared accounts? - $accounts = $repository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); + $accounts = $repository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); $accountList = ExpandedForm::makeSelectList($accounts); $checked = array_keys($accountList); $formats = array_keys(config('firefly.export_formats')); @@ -193,6 +193,6 @@ class ExportController extends Controller $jobs->changeStatus($job, 'export_status_created_zip_file'); $jobs->changeStatus($job, 'export_status_finished'); - return Response::json('ok'); + return response()->json('ok'); } } diff --git a/app/Http/Controllers/HelpController.php b/app/Http/Controllers/HelpController.php index b972e5185a..1f7e13f4b9 100644 --- a/app/Http/Controllers/HelpController.php +++ b/app/Http/Controllers/HelpController.php @@ -25,7 +25,6 @@ namespace FireflyIII\Http\Controllers; use FireflyIII\Helpers\Help\HelpInterface; use Log; use Preferences; -use Response; /** * Class HelpController. @@ -61,7 +60,7 @@ class HelpController extends Controller $language = Preferences::get('language', config('firefly.default_language', 'en_US'))->data; $html = $this->getHelpText($route, $language); - return Response::json(['html' => $html]); + return response()->json(['html' => $html]); } /** diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index d1587d0824..a32d290b40 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -38,7 +38,6 @@ use Illuminate\Routing\Route; use Illuminate\Support\Collection; use Log; use Preferences; -use Response; use Route as RouteFacade; use View; @@ -63,6 +62,7 @@ class HomeController extends Controller * @param Request $request * * @return \Illuminate\Http\JsonResponse + * @throws \RuntimeException */ public function dateRange(Request $request) { @@ -93,7 +93,7 @@ class HomeController extends Controller $request->session()->put('end', $end); Log::debug(sprintf('Set end to %s', $end->format('Y-m-d H:i:s'))); - return Response::json(['ok' => 'ok']); + return response()->json(['ok' => 'ok']); } @@ -117,6 +117,7 @@ class HomeController extends Controller * @param Request $request * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @throws \RuntimeException */ public function flush(Request $request) { @@ -133,6 +134,7 @@ class HomeController extends Controller Artisan::call('twig:clean'); } catch (Exception $e) { // dont care + Log::debug('Called twig:clean.'); } Log::debug('Call view:clear...'); Artisan::call('view:clear'); @@ -165,7 +167,6 @@ class HomeController extends Controller /** @var Carbon $end */ $end = session('end', Carbon::now()->endOfMonth()); $accounts = $repository->getAccountsById($frontPage->data); - $showDeps = Preferences::get('showDepositsFrontpage', false)->data; $today = new Carbon; // zero bills? Hide some elements from view. @@ -185,7 +186,7 @@ class HomeController extends Controller return view( 'index', - compact('count', 'subTitle', 'transactions', 'showDeps', 'billCount', 'start', 'end', 'today') + compact('count', 'subTitle', 'transactions', 'billCount', 'start', 'end', 'today') ); } @@ -231,6 +232,7 @@ class HomeController extends Controller * @param Request $request * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @throws \RuntimeException */ public function testFlash(Request $request) { diff --git a/app/Http/Controllers/Import/ConfigurationController.php b/app/Http/Controllers/Import/ConfigurationController.php index 8450c26aab..3c3df4f9c5 100644 --- a/app/Http/Controllers/Import/ConfigurationController.php +++ b/app/Http/Controllers/Import/ConfigurationController.php @@ -97,6 +97,7 @@ class ConfigurationController extends Controller * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * + * @throws \RuntimeException * @throws FireflyException */ public function post(Request $request, ImportJob $job) diff --git a/app/Http/Controllers/Import/IndexController.php b/app/Http/Controllers/Import/IndexController.php index af3704e1a8..6216cc0045 100644 --- a/app/Http/Controllers/Import/IndexController.php +++ b/app/Http/Controllers/Import/IndexController.php @@ -30,7 +30,6 @@ use FireflyIII\Models\ImportJob; use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; use Illuminate\Http\Response as LaravelResponse; use Log; -use Response; use View; @@ -72,7 +71,7 @@ class IndexController extends Controller */ public function create(string $bank) { - if (true === !(config(sprintf('import.enabled.%s', $bank)))) { + if (true === !config(sprintf('import.enabled.%s', $bank))) { throw new FireflyException(sprintf('Cannot import from "%s" at this time.', $bank)); // @codeCoverageIgnore } @@ -155,7 +154,7 @@ class IndexController extends Controller $result = $routine->run(); if ($result) { - return Response::json(['run' => 'ok']); + return response()->json(['run' => 'ok']); } throw new FireflyException('Job did not complete successfully. Please review the log files.'); diff --git a/app/Http/Controllers/Import/PrerequisitesController.php b/app/Http/Controllers/Import/PrerequisitesController.php index 42a7b3d243..81065bb670 100644 --- a/app/Http/Controllers/Import/PrerequisitesController.php +++ b/app/Http/Controllers/Import/PrerequisitesController.php @@ -66,7 +66,7 @@ class PrerequisitesController extends Controller */ public function index(string $bank) { - if (true === !(config(sprintf('import.enabled.%s', $bank)))) { + if (true === !config(sprintf('import.enabled.%s', $bank))) { throw new FireflyException(sprintf('Cannot import from "%s" at this time.', $bank)); // @codeCoverageIgnore } $class = strval(config(sprintf('import.prerequisites.%s', $bank))); @@ -103,13 +103,14 @@ class PrerequisitesController extends Controller * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * + * @throws \RuntimeException * @throws FireflyException */ public function post(Request $request, string $bank) { Log::debug(sprintf('Now in postPrerequisites for %s', $bank)); - if (true === !(config(sprintf('import.enabled.%s', $bank)))) { + if (true === !config(sprintf('import.enabled.%s', $bank))) { throw new FireflyException(sprintf('Cannot import from "%s" at this time.', $bank)); // @codeCoverageIgnore } @@ -128,6 +129,7 @@ class PrerequisitesController extends Controller Log::debug('Going to store entered prerequisites.'); // store post data $result = $object->storePrerequisites($request); + Log::debug(sprintf('Result of storePrerequisites has message count: %d', $result->count())); if ($result->count() > 0) { $request->session()->flash('error', $result->first()); diff --git a/app/Http/Controllers/Import/StatusController.php b/app/Http/Controllers/Import/StatusController.php index d5eb0a0165..d476cd3578 100644 --- a/app/Http/Controllers/Import/StatusController.php +++ b/app/Http/Controllers/Import/StatusController.php @@ -26,7 +26,7 @@ use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Middleware\IsDemoUser; use FireflyIII\Models\ImportJob; use FireflyIII\Repositories\Tag\TagRepositoryInterface; -use Response; +use Log; /** * Class StatusController @@ -118,7 +118,8 @@ class StatusController extends Controller $result['running'] = true; } $result['percentage'] = $result['percentage'] > 100 ? 100 : $result['percentage']; + Log::debug(sprintf('JOB STATUS: %d/%d', $result['done'], $result['steps'])); - return Response::json($result); + return response()->json($result); } } diff --git a/app/Http/Controllers/JavascriptController.php b/app/Http/Controllers/JavascriptController.php index bb991eb100..4fcdc4f734 100644 --- a/app/Http/Controllers/JavascriptController.php +++ b/app/Http/Controllers/JavascriptController.php @@ -54,7 +54,7 @@ class JavascriptController extends Controller /** @var Account $account */ foreach ($accounts as $account) { $accountId = $account->id; - $currency = intval($account->getMeta('currency_id')); + $currency = intval($repository->getMetaValue($account, 'currency_id')); $currency = 0 === $currency ? $default->id : $currency; $entry = ['preferredCurrency' => $currency, 'name' => $account->name]; $data['accounts'][$accountId] = $entry; @@ -92,13 +92,14 @@ class JavascriptController extends Controller * @param CurrencyRepositoryInterface $currencyRepository * * @return \Illuminate\Http\Response + * @throws \RuntimeException */ public function variables(Request $request, AccountRepositoryInterface $repository, CurrencyRepositoryInterface $currencyRepository) { $account = $repository->findNull(intval($request->get('account'))); $currencyId = 0; if (null !== $account) { - $currencyId = intval($account->getMeta('currency_id')); + $currencyId = intval($repository->getMetaValue($account, 'currency_id')); } /** @var TransactionCurrency $currency */ $currency = $currencyRepository->findNull($currencyId); diff --git a/app/Http/Controllers/Json/AutoCompleteController.php b/app/Http/Controllers/Json/AutoCompleteController.php index 6e28443d54..2efcc72696 100644 --- a/app/Http/Controllers/Json/AutoCompleteController.php +++ b/app/Http/Controllers/Json/AutoCompleteController.php @@ -29,7 +29,6 @@ use FireflyIII\Models\AccountType; use FireflyIII\Models\TransactionJournal; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Support\CacheProperties; -use Response; /** * Class AutoCompleteController. @@ -52,7 +51,7 @@ class AutoCompleteController extends Controller ); sort($return); - return Response::json($return); + return response()->json($return); } /** @@ -66,7 +65,7 @@ class AutoCompleteController extends Controller $return = array_unique($collector->getJournals()->pluck('description')->toArray()); sort($return); - return Response::json($return); + return response()->json($return); } /** @@ -92,7 +91,7 @@ class AutoCompleteController extends Controller sort($return); - return Response::json($return); + return response()->json($return); } /** @@ -125,7 +124,7 @@ class AutoCompleteController extends Controller $cache->store($return); - return Response::json($return); + return response()->json($return); } /** @@ -148,7 +147,7 @@ class AutoCompleteController extends Controller $return = array_unique($filtered->pluck('name')->toArray()); sort($return); - return Response::json($return); + return response()->json($return); } /** @@ -166,6 +165,6 @@ class AutoCompleteController extends Controller $return = array_unique($collector->getJournals()->pluck('description')->toArray()); sort($return); - return Response::json($return); + return response()->json($return); } } diff --git a/app/Http/Controllers/Json/BoxController.php b/app/Http/Controllers/Json/BoxController.php index 67204d993c..dbd80ec03e 100644 --- a/app/Http/Controllers/Json/BoxController.php +++ b/app/Http/Controllers/Json/BoxController.php @@ -22,18 +22,19 @@ declare(strict_types=1); namespace FireflyIII\Http\Controllers\Json; +use Amount; use Carbon\Carbon; use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\Account; use FireflyIII\Models\AccountType; +use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Support\CacheProperties; -use Response; /** * Class BoxController. @@ -56,7 +57,7 @@ class BoxController extends Controller $cache->addProperty($today); $cache->addProperty('box-available'); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } // get available amount $currency = app('amount')->getDefaultCurrency(); @@ -65,71 +66,104 @@ class BoxController extends Controller // get spent amount: $budgets = $repository->getActiveBudgets(); $budgetInformation = $repository->collectBudgetInformation($budgets, $start, $end); - $spent = strval(array_sum(array_column($budgetInformation, 'spent'))); + $spent = (string)array_sum(array_column($budgetInformation, 'spent')); $left = bcadd($available, $spent); - // left less than zero? then it's zero: + $days = $today->diffInDays($end) + 1; + $perDay = '0'; + $text = (string)trans('firefly.left_to_spend'); + $overspent = false; if (bccomp($left, '0') === -1) { - $left = '0'; + $text = (string)trans('firefly.overspent'); + $overspent = true; } - $days = $today->diffInDays($end) + 1; - $perDay = '0'; - if (0 !== $days) { - $perDay = bcdiv($left, strval($days)); + if (0 !== $days && bccomp($left, '0') > -1) { + $perDay = bcdiv($left, (string)$days); } $return = [ - 'perDay' => app('amount')->formatAnything($currency, $perDay, false), - 'left' => app('amount')->formatAnything($currency, $left, false), + 'perDay' => app('amount')->formatAnything($currency, $perDay, false), + 'left' => app('amount')->formatAnything($currency, $left, false), + 'text' => $text, + 'overspent' => $overspent, ]; $cache->store($return); - return Response::json($return); + return response()->json($return); } /** + * @param CurrencyRepositoryInterface $repository + * * @return \Illuminate\Http\JsonResponse */ - public function balance() + public function balance(CurrencyRepositoryInterface $repository) { + // Cache result, return cache if present. $start = session('start', Carbon::now()->startOfMonth()); $end = session('end', Carbon::now()->endOfMonth()); - $cache = new CacheProperties; $cache->addProperty($start); $cache->addProperty($end); $cache->addProperty('box-balance'); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } + // prep some arrays: + $incomes = []; + $expenses = []; + $sums = []; - // try a collector for income: + // collect income of user: /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); $collector->setAllAssetAccounts()->setRange($start, $end) ->setTypes([TransactionType::DEPOSIT]) ->withOpposingAccount(); - $income = strval($collector->getJournals()->sum('transaction_amount')); - $currency = app('amount')->getDefaultCurrency(); + $set = $collector->getJournals(); + /** @var Transaction $transaction */ + foreach ($set as $transaction) { + $currencyId = intval($transaction->transaction_currency_id); + $incomes[$currencyId] = $incomes[$currencyId] ?? '0'; + $incomes[$currencyId] = bcadd($incomes[$currencyId], $transaction->transaction_amount); + $sums[$currencyId] = $sums[$currencyId] ?? '0'; + $sums[$currencyId] = bcadd($sums[$currencyId], $transaction->transaction_amount); + } - // expense: - // try a collector for expenses: + // collect expenses /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); $collector->setAllAssetAccounts()->setRange($start, $end) ->setTypes([TransactionType::WITHDRAWAL]) ->withOpposingAccount(); - $expense = strval($collector->getJournals()->sum('transaction_amount')); + $set = $collector->getJournals(); + /** @var Transaction $transaction */ + foreach ($set as $transaction) { + $currencyId = (int)$transaction->transaction_currency_id; + $expenses[$currencyId] = $expenses[$currencyId] ?? '0'; + $expenses[$currencyId] = bcadd($expenses[$currencyId], $transaction->transaction_amount); + $sums[$currencyId] = $sums[$currencyId] ?? '0'; + $sums[$currencyId] = bcadd($sums[$currencyId], $transaction->transaction_amount); + } + + // format amounts: + foreach ($sums as $currencyId => $amount) { + $currency = $repository->findNull($currencyId); + $sums[$currencyId] = Amount::formatAnything($currency, $sums[$currencyId], false); + $incomes[$currencyId] = Amount::formatAnything($currency, $incomes[$currencyId] ?? '0', false); + $expenses[$currencyId] = Amount::formatAnything($currency, $expenses[$currencyId] ?? '0', false); + } $response = [ - 'income' => app('amount')->formatAnything($currency, $income, false), - 'expense' => app('amount')->formatAnything($currency, $expense, false), - 'combined' => app('amount')->formatAnything($currency, bcadd($income, $expense), false), + 'incomes' => $incomes, + 'expenses' => $expenses, + 'sums' => $sums, + 'size' => count($sums), ]; $cache->store($response); - return Response::json($response); + return response()->json($response); } /** @@ -147,7 +181,7 @@ class BoxController extends Controller $cache->addProperty($end); $cache->addProperty('box-bills'); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } /* @@ -164,11 +198,13 @@ class BoxController extends Controller ]; $cache->store($return); - return Response::json($return); + return response()->json($return); } /** - * @param AccountRepositoryInterface $repository + * @param AccountRepositoryInterface $repository + * + * @param CurrencyRepositoryInterface $currencyRepos * * @return \Illuminate\Http\JsonResponse */ @@ -193,21 +229,33 @@ class BoxController extends Controller $cache->addProperty($date); $cache->addProperty('box-net-worth'); if ($cache->has()) { - return Response::json($cache->get()); // @codeCoverageIgnore + return response()->json($cache->get()); // @codeCoverageIgnore } $netWorth = []; - $accounts = $repository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); + $accounts = $repository->getActiveAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); $currency = app('amount')->getDefaultCurrency(); $balances = app('steam')->balancesByAccounts($accounts, $date); /** @var Account $account */ foreach ($accounts as $account) { - $accountCurrency = $currency; + $accountCurrency = null; $balance = $balances[$account->id] ?? '0'; - $currencyId = intval($account->getMeta('currency_id')); + $currencyId = (int)$repository->getMetaValue($account, 'currency_id'); if ($currencyId !== 0) { $accountCurrency = $currencyRepos->findNull($currencyId); } + if (null === $accountCurrency) { + $accountCurrency = $currency; + } + + // if the account is a credit card, subtract the virtual balance from the balance, + // to better reflect that this is not money that is actually "yours". + $role = (string)$repository->getMetaValue($account, 'accountRole'); + $virtualBalance = (string)$account->virtual_balance; + if ($role === 'ccAsset' && $virtualBalance !== '' && (float)$virtualBalance > 0) { + $balance = bcsub($balance, $virtualBalance); + } + if (!isset($netWorth[$accountCurrency->id])) { $netWorth[$accountCurrency->id]['currency'] = $accountCurrency; $netWorth[$accountCurrency->id]['sum'] = '0'; @@ -225,6 +273,6 @@ class BoxController extends Controller $cache->store($return); - return Response::json($return); + return response()->json($return); } } diff --git a/app/Http/Controllers/Json/ExchangeController.php b/app/Http/Controllers/Json/ExchangeController.php index 4fd83001fe..7752fec71e 100644 --- a/app/Http/Controllers/Json/ExchangeController.php +++ b/app/Http/Controllers/Json/ExchangeController.php @@ -29,7 +29,6 @@ use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Services\Currency\ExchangeRateInterface; use Illuminate\Http\Request; use Log; -use Response; /** * Class ExchangeController. @@ -49,15 +48,23 @@ class ExchangeController extends Controller /** @var CurrencyRepositoryInterface $repository */ $repository = app(CurrencyRepositoryInterface::class); $rate = $repository->getExchangeRate($fromCurrency, $toCurrency, $date); + + + + + if (null === $rate->id) { Log::debug(sprintf('No cached exchange rate in database for %s to %s on %s', $fromCurrency->code, $toCurrency->code, $date->format('Y-m-d'))); - $preferred = env('EXCHANGE_RATE_SERVICE', config('firefly.preferred_exchange_service')); - $class = config('firefly.currency_exchange_services.' . $preferred); - /** @var ExchangeRateInterface $object */ - $object = app($class); - $object->setUser(auth()->user()); - $rate = $object->getRate($fromCurrency, $toCurrency, $date); + + // create service: + /** @var ExchangeRateInterface $service */ + $service = app(ExchangeRateInterface::class); + $service->setUser(auth()->user()); + + // get rate: + $rate = $service->getRate($fromCurrency, $toCurrency, $date); } + $return = $rate->toArray(); $return['amount'] = null; if (null !== $request->get('amount')) { @@ -67,6 +74,6 @@ class ExchangeController extends Controller $return['amount'] = round($return['amount'], $toCurrency->decimal_places); } - return Response::json($return); + return response()->json($return); } } diff --git a/app/Http/Controllers/Json/FrontpageController.php b/app/Http/Controllers/Json/FrontpageController.php index 3aa2d1a30d..0fef3453eb 100644 --- a/app/Http/Controllers/Json/FrontpageController.php +++ b/app/Http/Controllers/Json/FrontpageController.php @@ -25,7 +25,6 @@ namespace FireflyIII\Http\Controllers\Json; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\PiggyBank; use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; -use Response; /** * Class FrontpageController. @@ -66,6 +65,6 @@ class FrontpageController extends Controller $html = view('json.piggy-banks', compact('info'))->render(); } - return Response::json(['html' => $html]); + return response()->json(['html' => $html]); } } diff --git a/app/Http/Controllers/Json/IntroController.php b/app/Http/Controllers/Json/IntroController.php index ace783ae57..2a8d2b5bf9 100644 --- a/app/Http/Controllers/Json/IntroController.php +++ b/app/Http/Controllers/Json/IntroController.php @@ -24,7 +24,6 @@ namespace FireflyIII\Http\Controllers\Json; use FireflyIII\Support\Facades\Preferences; use Log; -use Response; /** * Class IntroController. @@ -47,7 +46,7 @@ class IntroController if (0 === count($specificSteps)) { Log::debug(sprintf('No specific steps for route "%s" and page "%s"', $route, $specificPage)); - return Response::json($steps); + return response()->json($steps); } if ($this->hasOutroStep($route)) { // @codeCoverageIgnoreStart @@ -64,7 +63,7 @@ class IntroController $steps = array_merge($steps, $specificSteps); } - return Response::json($steps); + return response()->json($steps); } /** @@ -103,7 +102,7 @@ class IntroController Log::debug(sprintf('Going to mark the following route as NOT done: %s with special "%s" (%s)', $route, $specialPage, $key)); Preferences::set($key, false); - return Response::json(['message' => trans('firefly.intro_boxes_after_refresh')]); + return response()->json(['message' => trans('firefly.intro_boxes_after_refresh')]); } /** @@ -121,7 +120,7 @@ class IntroController Log::debug(sprintf('Going to mark the following route as done: %s with special "%s" (%s)', $route, $specialPage, $key)); Preferences::set($key, true); - return Response::json(['result' => sprintf('Reported demo watched for route "%s".', $route)]); + return response()->json(['result' => sprintf('Reported demo watched for route "%s".', $route)]); } /** diff --git a/app/Http/Controllers/JsonController.php b/app/Http/Controllers/JsonController.php index 98f5ca62b4..33c5ce17ac 100644 --- a/app/Http/Controllers/JsonController.php +++ b/app/Http/Controllers/JsonController.php @@ -27,7 +27,6 @@ use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\Repositories\Tag\TagRepositoryInterface; use Illuminate\Http\Request; -use Response; /** * Class JsonController. @@ -59,7 +58,7 @@ class JsonController extends Controller } $view = view('rules.partials.action', compact('actions', 'count'))->render(); - return Response::json(['html' => $view]); + return response()->json(['html' => $view]); } /** @@ -72,7 +71,7 @@ class JsonController extends Controller $return = array_unique($repository->getBudgets()->pluck('name')->toArray()); sort($return); - return Response::json($return); + return response()->json($return); } /** @@ -87,7 +86,7 @@ class JsonController extends Controller $return = array_unique($repository->getCategories()->pluck('name')->toArray()); sort($return); - return Response::json($return); + return response()->json($return); } /** @@ -102,7 +101,7 @@ class JsonController extends Controller $return = array_unique($tagRepository->get()->pluck('tag')->toArray()); sort($return); - return Response::json($return); + return response()->json($return); } /** @@ -115,7 +114,7 @@ class JsonController extends Controller $return = array_unique($repository->getTransactionTypes()->pluck('type')->toArray()); sort($return); - return Response::json($return); + return response()->json($return); } /** @@ -139,6 +138,6 @@ class JsonController extends Controller $view = view('rules.partials.trigger', compact('triggers', 'count'))->render(); - return Response::json(['html' => $view]); + return response()->json(['html' => $view]); } } diff --git a/app/Http/Controllers/PiggyBankController.php b/app/Http/Controllers/PiggyBankController.php index 7ba0315b5c..d81ed60593 100644 --- a/app/Http/Controllers/PiggyBankController.php +++ b/app/Http/Controllers/PiggyBankController.php @@ -23,17 +23,13 @@ declare(strict_types=1); namespace FireflyIII\Http\Controllers; use Carbon\Carbon; -use ExpandedForm; use FireflyIII\Http\Requests\PiggyBankFormRequest; -use FireflyIII\Models\AccountType; use FireflyIII\Models\PiggyBank; -use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\PiggyBank\PiggyBankRepositoryInterface; use Illuminate\Http\Request; use Illuminate\Pagination\LengthAwarePaginator; use Log; use Preferences; -use Response; use Session; use Steam; use View; @@ -63,7 +59,9 @@ class PiggyBankController extends Controller /** * Add money to piggy bank. * - * @param PiggyBank $piggyBank + * @param PiggyBank $piggyBank + * + * @param PiggyBankRepositoryInterface $repository * * @return View */ @@ -82,8 +80,9 @@ class PiggyBankController extends Controller /** * Add money to piggy bank (for mobile devices). * - * @param PiggyBank $piggyBank + * @param PiggyBank $piggyBank * + * @param PiggyBankRepositoryInterface $repository * @return View */ public function addMobile(PiggyBank $piggyBank, PiggyBankRepositoryInterface $repository) @@ -99,29 +98,20 @@ class PiggyBankController extends Controller } /** - * @param AccountRepositoryInterface $repository - * - * @return View + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ - public function create(AccountRepositoryInterface $repository) + public function create() { - $accounts = ExpandedForm::makeSelectList($repository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET])); $subTitle = trans('firefly.new_piggy_bank'); $subTitleIcon = 'fa-plus'; - if (0 === count($accounts)) { - Session::flash('error', strval(trans('firefly.need_at_least_one_account'))); - - return redirect(route('new-user.index')); - } - // put previous url in session if not redirect from store (not "create another"). if (true !== session('piggy-banks.create.fromStore')) { $this->rememberPreviousUri('piggy-banks.create.uri'); } Session::forget('piggy-banks.create.fromStore'); - return view('piggy-banks.create', compact('accounts', 'subTitle', 'subTitleIcon')); + return view('piggy-banks.create', compact('subTitle', 'subTitleIcon')); } /** @@ -155,14 +145,12 @@ class PiggyBankController extends Controller } /** - * @param AccountRepositoryInterface $repository - * @param PiggyBank $piggyBank + * @param PiggyBank $piggyBank * * @return View */ - public function edit(AccountRepositoryInterface $repository, PiggyBank $piggyBank) + public function edit(PiggyBank $piggyBank) { - $accounts = ExpandedForm::makeSelectList($repository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET])); $subTitle = trans('firefly.update_piggy_title', ['name' => $piggyBank->name]); $subTitleIcon = 'fa-pencil'; $targetDate = null; @@ -191,10 +179,11 @@ class PiggyBankController extends Controller } Session::forget('piggy-banks.edit.fromUpdate'); - return view('piggy-banks.edit', compact('subTitle', 'subTitleIcon', 'piggyBank', 'accounts', 'preFilled')); + return view('piggy-banks.edit', compact('subTitle', 'subTitleIcon', 'piggyBank', 'preFilled')); } /** + * @param Request $request * @param PiggyBankRepositoryInterface $piggyRepository * * @return View @@ -262,11 +251,11 @@ class PiggyBankController extends Controller if (is_array($data)) { foreach ($data as $order => $id) { - $repository->setOrder(intval($id), ($order + 1)); + $repository->setOrder(intval($id), $order + 1); } } - return Response::json(['result' => 'ok']); + return response()->json(['result' => 'ok']); } /** diff --git a/app/Http/Controllers/Popup/ReportController.php b/app/Http/Controllers/Popup/ReportController.php index 4d5b8a852a..456be43bec 100644 --- a/app/Http/Controllers/Popup/ReportController.php +++ b/app/Http/Controllers/Popup/ReportController.php @@ -34,7 +34,6 @@ use FireflyIII\Support\Binder\AccountList; use Illuminate\Http\Request; use Illuminate\Routing\Route; use InvalidArgumentException; -use Response; use View; /** @@ -116,7 +115,7 @@ class ReportController extends Controller break; } - return Response::json(['html' => $html]); + return response()->json(['html' => $html]); } /** @@ -130,8 +129,8 @@ class ReportController extends Controller private function balanceAmount(array $attributes): string { $role = intval($attributes['role']); - $budget = $this->budgetRepository->find(intval($attributes['budgetId'])); - $account = $this->accountRepository->find(intval($attributes['accountId'])); + $budget = $this->budgetRepository->findNull(intval($attributes['budgetId'])); + $account = $this->accountRepository->findNull(intval($attributes['accountId'])); switch (true) { case BalanceLine::ROLE_DEFAULTROLE === $role && null !== $budget->id: @@ -167,7 +166,7 @@ class ReportController extends Controller */ private function budgetSpentAmount(array $attributes): string { - $budget = $this->budgetRepository->find(intval($attributes['budgetId'])); + $budget = $this->budgetRepository->findNull(intval($attributes['budgetId'])); $journals = $this->popupHelper->byBudget($budget, $attributes); $view = view('popup.report.budget-spent-amount', compact('journals', 'budget'))->render(); @@ -185,7 +184,7 @@ class ReportController extends Controller */ private function categoryEntry(array $attributes): string { - $category = $this->categoryRepository->find(intval($attributes['categoryId'])); + $category = $this->categoryRepository->findNull(intval($attributes['categoryId'])); $journals = $this->popupHelper->byCategory($category, $attributes); $view = view('popup.report.category-entry', compact('journals', 'category'))->render(); @@ -203,7 +202,7 @@ class ReportController extends Controller */ private function expenseEntry(array $attributes): string { - $account = $this->accountRepository->find(intval($attributes['accountId'])); + $account = $this->accountRepository->findNull(intval($attributes['accountId'])); $journals = $this->popupHelper->byExpenses($account, $attributes); $view = view('popup.report.expense-entry', compact('journals', 'account'))->render(); @@ -221,7 +220,7 @@ class ReportController extends Controller */ private function incomeEntry(array $attributes): string { - $account = $this->accountRepository->find(intval($attributes['accountId'])); + $account = $this->accountRepository->findNull(intval($attributes['accountId'])); $journals = $this->popupHelper->byIncome($account, $attributes); $view = view('popup.report.income-entry', compact('journals', 'account'))->render(); diff --git a/app/Http/Controllers/PreferencesController.php b/app/Http/Controllers/PreferencesController.php index 7f68c9875d..b4e5d68855 100644 --- a/app/Http/Controllers/PreferencesController.php +++ b/app/Http/Controllers/PreferencesController.php @@ -22,11 +22,9 @@ declare(strict_types=1); namespace FireflyIII\Http\Controllers; -use FireflyIII\Http\Requests\TokenFormRequest; use FireflyIII\Models\AccountType; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\User\UserRepositoryInterface; -use Google2FA; use Illuminate\Http\Request; use Preferences; use Session; @@ -54,35 +52,6 @@ class PreferencesController extends Controller ); } - /** - * @return View - */ - public function code() - { - $domain = $this->getDomain(); - $secret = Google2FA::generateSecretKey(); - Session::flash('two-factor-secret', $secret); - $image = Google2FA::getQRCodeInline($domain, auth()->user()->email, $secret, 200); - - return view('preferences.code', compact('image')); - } - - /** - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector - * - * @throws \Exception - * @throws \Exception - */ - public function deleteCode() - { - Preferences::delete('twoFactorAuthEnabled'); - Preferences::delete('twoFactorAuthSecret'); - Session::flash('success', strval(trans('firefly.pref_two_factor_auth_disabled'))); - Session::flash('info', strval(trans('firefly.pref_two_factor_auth_remove_it'))); - - return redirect(route('preferences.index')); - } - /** * @param AccountRepositoryInterface $repository * @@ -97,12 +66,9 @@ class PreferencesController extends Controller $language = Preferences::get('language', config('firefly.default_language', 'en_US'))->data; $listPageSize = Preferences::get('listPageSize', 50)->data; $customFiscalYear = Preferences::get('customFiscalYear', 0)->data; - $showDeps = Preferences::get('showDepositsFrontpage', false)->data; $fiscalYearStartStr = Preferences::get('fiscalYearStart', '01-01')->data; $fiscalYearStart = date('Y') . '-' . $fiscalYearStartStr; $tjOptionalFields = Preferences::get('transaction_journal_optional_fields', [])->data; - $is2faEnabled = Preferences::get('twoFactorAuthEnabled', 0)->data; // twoFactorAuthEnabled - $has2faSecret = null !== Preferences::get('twoFactorAuthSecret'); // hasTwoFactorAuthSecret return view( 'preferences.index', @@ -114,31 +80,11 @@ class PreferencesController extends Controller 'viewRange', 'customFiscalYear', 'listPageSize', - 'fiscalYearStart', - 'is2faEnabled', - 'has2faSecret', - 'showDeps' + 'fiscalYearStart' ) ); } - /** - * @param TokenFormRequest $request - * - * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector - * @SuppressWarnings(PHPMD.UnusedFormalParameter) // it's unused but the class does some validation. - */ - public function postCode(/** @scrutinizer ignore-unused */ TokenFormRequest $request) - { - Preferences::set('twoFactorAuthEnabled', 1); - Preferences::set('twoFactorAuthSecret', Session::get('two-factor-secret')); - - Session::flash('success', strval(trans('firefly.saved_preferences'))); - Preferences::mark(); - - return redirect(route('preferences.index')); - } - /** * @param Request $request * @param UserRepositoryInterface $repository @@ -169,10 +115,6 @@ class PreferencesController extends Controller Preferences::set('customFiscalYear', $customFiscalYear); Preferences::set('fiscalYearStart', $fiscalYearStart); - // show deposits frontpage: - $showDepositsFrontpage = 1 === intval($request->get('showDepositsFrontpage')); - Preferences::set('showDepositsFrontpage', $showDepositsFrontpage); - // save page size: Preferences::set('listPageSize', 50); $listPageSize = intval($request->get('listPageSize')); @@ -180,19 +122,6 @@ class PreferencesController extends Controller Preferences::set('listPageSize', $listPageSize); } - $twoFactorAuthEnabled = false; - $hasTwoFactorAuthSecret = false; - if (!$repository->hasRole(auth()->user(), 'demo')) { - // two factor auth - $twoFactorAuthEnabled = intval($request->get('twoFactorAuthEnabled')); - $hasTwoFactorAuthSecret = null !== Preferences::get('twoFactorAuthSecret'); - - // If we already have a secret, just set the two factor auth enabled to 1, and let the user continue with the existing secret. - if ($hasTwoFactorAuthSecret) { - Preferences::set('twoFactorAuthEnabled', $twoFactorAuthEnabled); - } - } - // language: $lang = $request->get('language'); if (in_array($lang, array_keys(config('firefly.languages')))) { @@ -217,23 +146,6 @@ class PreferencesController extends Controller Session::flash('success', strval(trans('firefly.saved_preferences'))); Preferences::mark(); - // if we don't have a valid secret yet, redirect to the code page. - // AND USER HAS ACTUALLY ENABLED 2FA - if (!$hasTwoFactorAuthSecret && 1 === $twoFactorAuthEnabled) { - return redirect(route('preferences.code')); - } - return redirect(route('preferences.index')); } - - /** - * @return string - */ - private function getDomain(): string - { - $url = url()->to('/'); - $parts = parse_url($url); - - return $parts['host']; - } } diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php index ceb9ad16ae..a039ec2212 100644 --- a/app/Http/Controllers/ProfileController.php +++ b/app/Http/Controllers/ProfileController.php @@ -31,9 +31,11 @@ use FireflyIII\Http\Middleware\IsSandStormUser; use FireflyIII\Http\Requests\DeleteAccountFormRequest; use FireflyIII\Http\Requests\EmailFormRequest; use FireflyIII\Http\Requests\ProfileFormRequest; +use FireflyIII\Http\Requests\TokenFormRequest; use FireflyIII\Models\Preference; use FireflyIII\Repositories\User\UserRepositoryInterface; use FireflyIII\User; +use Google2FA; use Hash; use Illuminate\Contracts\Auth\Guard; use Log; @@ -92,6 +94,21 @@ class ProfileController extends Controller return view('profile.change-password', compact('title', 'subTitle', 'subTitleIcon')); } + /** + * View that generates a 2FA code for the user. + * + * @return View + */ + public function code() + { + $domain = $this->getDomain(); + $secret = Google2FA::generateSecretKey(); + Session::flash('two-factor-secret', $secret); + $image = Google2FA::getQRCodeInline($domain, auth()->user()->email, $secret, 200); + + return view('profile.code', compact('image')); + } + /** * @param UserRepositoryInterface $repository * @param string $token @@ -139,13 +156,52 @@ class ProfileController extends Controller return view('profile.delete-account', compact('title', 'subTitle', 'subTitleIcon')); } + /** + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + */ + public function deleteCode() + { + Preferences::delete('twoFactorAuthEnabled'); + Preferences::delete('twoFactorAuthSecret'); + Session::flash('success', strval(trans('firefly.pref_two_factor_auth_disabled'))); + Session::flash('info', strval(trans('firefly.pref_two_factor_auth_remove_it'))); + + return redirect(route('profile.index')); + } + + /** + * @param UserRepositoryInterface $repository + * + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + */ + public function enable2FA(UserRepositoryInterface $repository) + { + if ($repository->hasRole(auth()->user(), 'demo')) { + return redirect(route('profile.index')); + } + $hasTwoFactorAuthSecret = (null !== Preferences::get('twoFactorAuthSecret')); + + // if we don't have a valid secret yet, redirect to the code page to get one. + if (!$hasTwoFactorAuthSecret) { + return redirect(route('profile.code')); + } + + // If FF3 already has a secret, just set the two factor auth enabled to 1, + // and let the user continue with the existing secret. + + Preferences::set('twoFactorAuthEnabled', 1); + + return redirect(route('profile.index')); + } + /** * @return View */ public function index() { - $subTitle = auth()->user()->email; - $userId = auth()->user()->id; + $subTitle = auth()->user()->email; + $userId = auth()->user()->id; + $enabled2FA = intval(Preferences::get('twoFactorAuthEnabled', 0)->data) === 1; // get access token or create one. $accessToken = Preferences::get('access_token', null); @@ -154,7 +210,7 @@ class ProfileController extends Controller $accessToken = Preferences::set('access_token', $token); } - return view('profile.index', compact('subTitle', 'userId', 'accessToken')); + return view('profile.index', compact('subTitle', 'userId', 'accessToken', 'enabled2FA')); } /** @@ -162,6 +218,7 @@ class ProfileController extends Controller * @param UserRepositoryInterface $repository * * @return $this|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @throws \RuntimeException */ public function postChangeEmail(EmailFormRequest $request, UserRepositoryInterface $repository) { @@ -226,6 +283,23 @@ class ProfileController extends Controller return redirect(route('profile.index')); } + /** + * @param TokenFormRequest $request + * + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + * @SuppressWarnings(PHPMD.UnusedFormalParameter) // it's unused but the class does some validation. + */ + public function postCode(TokenFormRequest $request) + { + Preferences::set('twoFactorAuthEnabled', 1); + Preferences::set('twoFactorAuthSecret', Session::get('two-factor-secret')); + + Session::flash('success', strval(trans('firefly.saved_preferences'))); + Preferences::mark(); + + return redirect(route('profile.index')); + } + /** * @param UserRepositoryInterface $repository * @param DeleteAccountFormRequest $request @@ -332,4 +406,15 @@ class ProfileController extends Controller return true; } + + /** + * @return string + */ + private function getDomain(): string + { + $url = url()->to('/'); + $parts = parse_url($url); + + return $parts['host']; + } } diff --git a/app/Http/Controllers/ReportController.php b/app/Http/Controllers/ReportController.php index 61902a57b9..c79b940008 100644 --- a/app/Http/Controllers/ReportController.php +++ b/app/Http/Controllers/ReportController.php @@ -36,7 +36,6 @@ use Illuminate\Http\RedirectResponse; use Illuminate\Support\Collection; use Log; use Preferences; -use Response; use Session; use View; @@ -102,9 +101,8 @@ class ReportController extends Controller $generator = ReportGeneratorFactory::reportGenerator('Account', $start, $end); $generator->setAccounts($accounts); $generator->setExpense($expense); - $result = $generator->generate(); - return $result; + return $generator->generate(); } /** @@ -139,9 +137,8 @@ class ReportController extends Controller $generator = ReportGeneratorFactory::reportGenerator('Audit', $start, $end); $generator->setAccounts($accounts); - $result = $generator->generate(); - return $result; + return $generator->generate(); } /** @@ -305,7 +302,7 @@ class ReportController extends Controller break; } - return Response::json(['html' => $result]); + return response()->json(['html' => $result]); } /** diff --git a/app/Http/Controllers/RuleController.php b/app/Http/Controllers/RuleController.php index 77cd0cc883..2959754ece 100644 --- a/app/Http/Controllers/RuleController.php +++ b/app/Http/Controllers/RuleController.php @@ -39,7 +39,6 @@ use FireflyIII\Repositories\RuleGroup\RuleGroupRepositoryInterface; use FireflyIII\TransactionRules\TransactionMatcher; use Illuminate\Http\Request; use Preferences; -use Response; use Session; use View; @@ -287,7 +286,7 @@ class RuleController extends Controller $repository->reorderRuleActions($rule, $ids); } - return Response::json('true'); + return response()->json('true'); } /** @@ -304,7 +303,7 @@ class RuleController extends Controller $repository->reorderRuleTriggers($rule, $ids); } - return Response::json('true'); + return response()->json('true'); } /** @@ -312,6 +311,7 @@ class RuleController extends Controller * @param Rule $rule * * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + * @throws \InvalidArgumentException */ public function selectTransactions(AccountRepositoryInterface $repository, Rule $rule) { @@ -373,7 +373,7 @@ class RuleController extends Controller $triggers = $this->getValidTriggerList($request); if (0 === count($triggers)) { - return Response::json(['html' => '', 'warning' => trans('firefly.warning_no_valid_triggers')]); // @codeCoverageIgnore + return response()->json(['html' => '', 'warning' => trans('firefly.warning_no_valid_triggers')]); // @codeCoverageIgnore } $limit = intval(config('firefly.test-triggers.limit')); @@ -398,7 +398,7 @@ class RuleController extends Controller // Return json response $view = view('list.journals-tiny', ['transactions' => $matchingTransactions])->render(); - return Response::json(['html' => $view, 'warning' => $warning]); + return response()->json(['html' => $view, 'warning' => $warning]); } /** @@ -421,7 +421,7 @@ class RuleController extends Controller $triggers = $rule->ruleTriggers; if (0 === count($triggers)) { - return Response::json(['html' => '', 'warning' => trans('firefly.warning_no_valid_triggers')]); // @codeCoverageIgnore + return response()->json(['html' => '', 'warning' => trans('firefly.warning_no_valid_triggers')]); // @codeCoverageIgnore } $limit = intval(config('firefly.test-triggers.limit')); @@ -446,7 +446,7 @@ class RuleController extends Controller // Return json response $view = view('list.journals-tiny', ['transactions' => $matchingTransactions])->render(); - return Response::json(['html' => $view, 'warning' => $warning]); + return response()->json(['html' => $view, 'warning' => $warning]); } /** @@ -678,7 +678,7 @@ class RuleController extends Controller $triggers[] = [ 'type' => $triggerType, 'value' => $data['rule-trigger-values'][$index], - 'stopProcessing' => 1 === intval($data['rule-trigger-stop'][$index]) ? true : false, + 'stopProcessing' => 1 === (int)$data['rule-trigger-stop'][$index], ]; } } diff --git a/app/Http/Controllers/RuleGroupController.php b/app/Http/Controllers/RuleGroupController.php index 98308933f7..366c5c6d0e 100644 --- a/app/Http/Controllers/RuleGroupController.php +++ b/app/Http/Controllers/RuleGroupController.php @@ -184,11 +184,12 @@ class RuleGroupController extends Controller * @param RuleGroup $ruleGroup * * @return View + * @throws \InvalidArgumentException */ public function selectTransactions(AccountRepositoryInterface $repository, RuleGroup $ruleGroup) { // does the user have shared accounts? - $accounts = $repository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); + $accounts = $repository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); $accountList = ExpandedForm::makeSelectList($accounts); $checkedAccounts = array_keys($accountList); $first = session('first')->format('Y-m-d'); diff --git a/app/Http/Controllers/SearchController.php b/app/Http/Controllers/SearchController.php index a2f2663c2e..65f5fc6ab0 100644 --- a/app/Http/Controllers/SearchController.php +++ b/app/Http/Controllers/SearchController.php @@ -26,7 +26,6 @@ use FireflyIII\Support\CacheProperties; use FireflyIII\Support\Search\SearchInterface; use Illuminate\Http\Request; use Illuminate\Support\Collection; -use Response; use View; /** @@ -100,6 +99,6 @@ class SearchController extends Controller $html = view('search.search', compact('transactions'))->render(); - return Response::json(['count' => $transactions->count(), 'html' => $html]); + return response()->json(['count' => $transactions->count(), 'html' => $html]); } } diff --git a/app/Http/Controllers/System/InstallController.php b/app/Http/Controllers/System/InstallController.php new file mode 100644 index 0000000000..cd9bb698f0 --- /dev/null +++ b/app/Http/Controllers/System/InstallController.php @@ -0,0 +1,116 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Http\Controllers\System; + + +use Artisan; +use FireflyIII\Http\Controllers\Controller; +use Laravel\Passport\Passport; +use Log; +use phpseclib\Crypt\RSA; + +/** + * Class InstallController + */ +class InstallController extends Controller +{ + /** @noinspection MagicMethodsValidityInspection */ + /** + * InstallController constructor. + */ + public function __construct() + { + // empty on purpose. + } + + /** + * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + */ + public function index() + { + return view('install.index'); + } + + /** + * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector + */ + public function keys() + { + // create keys manually because for some reason the passport namespace + // does not exist + $rsa = new RSA(); + $keys = $rsa->createKey(4096); + + list($publicKey, $privateKey) = [ + Passport::keyPath('oauth-public.key'), + Passport::keyPath('oauth-private.key'), + ]; + + if (file_exists($publicKey) || file_exists($privateKey)) { + return response()->json(['OK']); + } + + file_put_contents($publicKey, array_get($keys, 'publickey')); + file_put_contents($privateKey, array_get($keys, 'privatekey')); + + return response()->json(['OK']); + } + + /** + * @return \Illuminate\Http\JsonResponse + */ + public function migrate() + { + Log::debug('Am now calling migrate routine...'); + Artisan::call('migrate', ['--seed' => true, '--force' => true]); + Log::debug(Artisan::output()); + + return response()->json(['OK']); + } + + /** + * @return \Illuminate\Http\JsonResponse + */ + public function upgrade() + { + Log::debug('Am now calling upgrade database routine...'); + Artisan::call('firefly:upgrade-database'); + Log::debug(Artisan::output()); + + return response()->json(['OK']); + } + + /** + * @return \Illuminate\Http\JsonResponse + */ + public function verify() + { + Log::debug('Am now calling verify database routine...'); + Artisan::call('firefly:verify'); + Log::debug(Artisan::output()); + + return response()->json(['OK']); + } + +} diff --git a/app/Http/Controllers/TagController.php b/app/Http/Controllers/TagController.php index 5dce01ca3c..c4e1e05d69 100644 --- a/app/Http/Controllers/TagController.php +++ b/app/Http/Controllers/TagController.php @@ -333,8 +333,8 @@ class TagController extends Controller 'string' => $end->format('Y-m-d'), 'name' => app('navigation')->periodShow($end, $range), 'date' => clone $end, - 'spent' => $this->repository->spentInperiod($tag, $end, $currentEnd), - 'earned' => $this->repository->earnedInperiod($tag, $end, $currentEnd), + 'spent' => $this->repository->spentInPeriod($tag, $end, $currentEnd), + 'earned' => $this->repository->earnedInPeriod($tag, $end, $currentEnd), ]; $collection->push($arr); diff --git a/app/Http/Controllers/Transaction/BulkController.php b/app/Http/Controllers/Transaction/BulkController.php index 45fdc9c78e..3c98c177a3 100644 --- a/app/Http/Controllers/Transaction/BulkController.php +++ b/app/Http/Controllers/Transaction/BulkController.php @@ -66,9 +66,11 @@ class BulkController extends Controller } /** + * @param Request $request * @param Collection $journals * * @return View + * @throws \RuntimeException */ public function edit(Request $request, Collection $journals) { @@ -138,6 +140,7 @@ class BulkController extends Controller * @param JournalRepositoryInterface $repository * * @return mixed + * @throws \RuntimeException */ public function update(BulkEditJournalRequest $request, JournalRepositoryInterface $repository) { @@ -168,7 +171,7 @@ class BulkController extends Controller } if ($ignoreTags === false) { Log::debug(sprintf('Set tags to %s', $request->string('budget_id'))); - $repository->updateTags($journal,['tags' => explode(',', $request->string('tags'))]); + $repository->updateTags($journal, ['tags' => explode(',', $request->string('tags'))]); } // update tags if not told to ignore (and is withdrawal) } diff --git a/app/Http/Controllers/Transaction/ConvertController.php b/app/Http/Controllers/Transaction/ConvertController.php index 9541162376..d536705bcd 100644 --- a/app/Http/Controllers/Transaction/ConvertController.php +++ b/app/Http/Controllers/Transaction/ConvertController.php @@ -22,11 +22,9 @@ declare(strict_types=1); namespace FireflyIII\Http\Controllers\Transaction; -use ExpandedForm; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Models\Account; -use FireflyIII\Models\AccountType; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Account\AccountRepositoryInterface; @@ -40,9 +38,6 @@ use View; */ class ConvertController extends Controller { - /** @var AccountRepositoryInterface */ - private $accounts; - /** @var JournalRepositoryInterface */ private $repository; @@ -56,7 +51,6 @@ class ConvertController extends Controller // some useful repositories: $this->middleware( function ($request, $next) { - $this->accounts = app(AccountRepositoryInterface::class); $this->repository = app(JournalRepositoryInterface::class); app('view')->share('title', trans('firefly.transactions')); @@ -81,7 +75,6 @@ class ConvertController extends Controller } // @codeCoverageIgnoreEnd $positiveAmount = $this->repository->getJournalTotal($journal); - $assetAccounts = ExpandedForm::makeSelectList($this->accounts->getActiveAccountsByType([AccountType::DEFAULT, AccountType::ASSET])); $sourceType = $journal->transactionType; $subTitle = trans('firefly.convert_to_' . $destinationType->type, ['description' => $journal->description]); $subTitleIcon = 'fa-exchange'; @@ -110,7 +103,6 @@ class ConvertController extends Controller 'sourceType', 'destinationType', 'journal', - 'assetAccounts', 'positiveAmount', 'sourceAccount', 'destinationAccount', @@ -206,16 +198,15 @@ class ConvertController extends Controller // three and five if ('' === $data['destination_account_expense'] || null === $data['destination_account_expense']) { // destination is a cash account. - $destination = $accountRepository->getCashAccount(); - - return $destination; + return $accountRepository->getCashAccount(); } $data = [ - 'name' => $data['destination_account_expense'], - 'accountType' => 'expense', - 'virtualBalance' => 0, - 'active' => true, - 'iban' => null, + 'name' => $data['destination_account_expense'], + 'accountType' => 'expense', + 'account_type_id' => null, + 'virtualBalance' => 0, + 'active' => true, + 'iban' => null, ]; $destination = $accountRepository->store($data); break; @@ -254,17 +245,16 @@ class ConvertController extends Controller if ('' === $data['source_account_revenue'] || null === $data['source_account_revenue']) { // destination is a cash account. - $destination = $accountRepository->getCashAccount(); - - return $destination; + return $accountRepository->getCashAccount(); } $data = [ - 'name' => $data['source_account_revenue'], - 'accountType' => 'revenue', - 'virtualBalance' => 0, - 'active' => true, - 'iban' => null, + 'name' => $data['source_account_revenue'], + 'accountType' => 'revenue', + 'virtualBalance' => 0, + 'active' => true, + 'account_type_id' => null, + 'iban' => null, ]; $source = $accountRepository->store($data); break; diff --git a/app/Http/Controllers/Transaction/LinkController.php b/app/Http/Controllers/Transaction/LinkController.php index 5bd8c3ae20..86d6618e18 100644 --- a/app/Http/Controllers/Transaction/LinkController.php +++ b/app/Http/Controllers/Transaction/LinkController.php @@ -110,6 +110,13 @@ class LinkController extends Controller } $other = $this->journalRepository->find($linkInfo['transaction_journal_id']); $alreadyLinked = $this->repository->findLink($journal, $other); + + if($other->id === $journal->id) { + Session::flash('error', trans('firefly.journals_link_to_self')); + + return redirect(route('transactions.show', [$journal->id])); + } + if ($alreadyLinked) { Session::flash('error', trans('firefly.journals_error_linked')); diff --git a/app/Http/Controllers/Transaction/MassController.php b/app/Http/Controllers/Transaction/MassController.php index c84cde082b..e21f296f4c 100644 --- a/app/Http/Controllers/Transaction/MassController.php +++ b/app/Http/Controllers/Transaction/MassController.php @@ -103,7 +103,7 @@ class MassController extends Controller /** @var TransactionJournal $journal */ foreach ($set as $journal) { - $this->repository->delete($journal); + $this->repository->destroy($journal); ++$count; } @@ -115,8 +115,6 @@ class MassController extends Controller } /** - * TODO this code is a mess. - * * @param Collection $journals * * @return View @@ -207,8 +205,6 @@ class MassController extends Controller } /** - * TODO this cannot work with new update service. - * * @param MassEditJournalRequest $request * @param JournalRepositoryInterface $repository * @@ -236,7 +232,6 @@ class MassController extends Controller $foreignAmount = isset($request->get('foreign_amount')[$journal->id]) ? round($request->get('foreign_amount')[$journal->id], 12) : null; $foreignCurrencyId = isset($request->get('foreign_currency_id')[$journal->id]) ? intval($request->get('foreign_currency_id')[$journal->id]) : null; - $notes = $repository->getNoteText($journal); // build data array $data = [ 'id' => $journal->id, @@ -245,7 +240,7 @@ class MassController extends Controller 'date' => new Carbon($request->get('date')[$journal->id]), 'bill_id' => null, 'bill_name' => null, - 'notes' => $notes, + 'notes' => $repository->getNoteText($journal), 'transactions' => [[ 'category_id' => null, @@ -262,7 +257,7 @@ class MassController extends Controller 'currency_id' => intval($currencyId), 'currency_code' => null, 'description' => null, - 'foreign_amount' => null, + 'foreign_amount' => $foreignAmount, 'foreign_currency_id' => $foreignCurrencyId, 'foreign_currency_code' => null, //'native_amount' => $amount, diff --git a/app/Http/Controllers/Transaction/SingleController.php b/app/Http/Controllers/Transaction/SingleController.php index 8dd3023290..b9dcc296a6 100644 --- a/app/Http/Controllers/Transaction/SingleController.php +++ b/app/Http/Controllers/Transaction/SingleController.php @@ -29,13 +29,10 @@ 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\Note; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; -use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; @@ -51,9 +48,6 @@ use View; */ class SingleController extends Controller { - /** @var AccountRepositoryInterface */ - private $accounts; - /** @var AttachmentHelperInterface */ private $attachments; @@ -82,7 +76,6 @@ class SingleController extends Controller // some useful repositories: $this->middleware( function ($request, $next) { - $this->accounts = app(AccountRepositoryInterface::class); $this->budgets = app(BudgetRepositoryInterface::class); $this->piggyBanks = app(PiggyBankRepositoryInterface::class); $this->attachments = app(AttachmentHelperInterface::class); @@ -109,8 +102,7 @@ class SingleController extends Controller $budgetId = $this->repository->getJournalBudgetId($journal); $categoryName = $this->repository->getJournalCategoryName($journal); - $tags = join(',', $this->repository->getTags($journal)); - // todo less direct database access. Use collector? + $tags = implode(',', $this->repository->getTags($journal)); /** @var Transaction $transaction */ $transaction = $journal->transactions()->first(); $amount = app('steam')->positive($transaction->amount); @@ -163,7 +155,6 @@ class SingleController extends Controller { $what = strtolower($what); $what = $request->old('what') ?? $what; - $assetAccounts = $this->groupedActiveAccountList(); $budgets = ExpandedForm::makeSelectListWithEmpty($this->budgets->getActiveBudgets()); $piggyBanks = $this->piggyBanks->getPiggyBanksWithAmount(); $piggies = ExpandedForm::makeSelectListWithEmpty($piggyBanks); @@ -192,7 +183,7 @@ class SingleController extends Controller return view( 'transactions.single.create', - compact('assetAccounts', 'subTitleIcon', 'budgets', 'what', 'piggies', 'subTitle', 'optionalFields', 'preFilled') + compact('subTitleIcon', 'budgets', 'what', 'piggies', 'subTitle', 'optionalFields', 'preFilled') ); } @@ -246,7 +237,9 @@ class SingleController extends Controller } /** - * @param TransactionJournal $journal + * @param TransactionJournal $journal + * + * @param JournalRepositoryInterface $repository * * @return mixed */ @@ -268,9 +261,8 @@ class SingleController extends Controller return redirect(route('transactions.split.edit', [$journal->id])); } - $what = strtolower($transactionType); - $assetAccounts = $this->groupedAccountList(); - $budgetList = ExpandedForm::makeSelectListWithEmpty($this->budgets->getBudgets()); + $what = strtolower($transactionType); + $budgetList = ExpandedForm::makeSelectListWithEmpty($this->budgets->getBudgets()); // view related code $subTitle = trans('breadcrumbs.edit_journal', ['description' => $journal->description]); @@ -288,7 +280,7 @@ class SingleController extends Controller 'process_date' => $repository->getJournalDate($journal, 'process_date'), 'category' => $repository->getJournalCategoryName($journal), 'budget_id' => $repository->getJournalBudgetId($journal), - 'tags' => join(',', $repository->getTags($journal)), + 'tags' => implode(',', $repository->getTags($journal)), 'source_account_id' => $sourceAccounts->first()->id, 'source_account_name' => $sourceAccounts->first()->edit_name, 'destination_account_id' => $destinationAccounts->first()->id, @@ -330,7 +322,7 @@ class SingleController extends Controller return view( 'transactions.single.edit', - compact('journal', 'optionalFields', 'assetAccounts', 'what', 'budgetList', 'subTitle') + compact('journal', 'optionalFields', 'what', 'budgetList', 'subTitle') )->with('data', $preFilled); } @@ -440,46 +432,6 @@ 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 (0 === strlen($type)) { - $type = 'no_account_type'; // @codeCoverageIgnore - } - $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 (0 === strlen($type)) { - $type = 'no_account_type'; // @codeCoverageIgnore - } - $key = strval(trans('firefly.opt_group_' . $type)); - $return[$key][$account->id] = $account->name; - } - - return $return; - } - /** * @param TransactionJournal $journal * @@ -489,10 +441,6 @@ class SingleController extends Controller { $count = $this->repository->countTransactions($journal); - if ($count > 2) { - return true; // @codeCoverageIgnore - } - - return false; + return $count > 2; } } diff --git a/app/Http/Controllers/Transaction/SplitController.php b/app/Http/Controllers/Transaction/SplitController.php index b82633bef4..be620809ce 100644 --- a/app/Http/Controllers/Transaction/SplitController.php +++ b/app/Http/Controllers/Transaction/SplitController.php @@ -24,21 +24,26 @@ namespace FireflyIII\Http\Controllers\Transaction; use ExpandedForm; use FireflyIII\Events\UpdatedTransactionJournal; +use FireflyIII\Exceptions\FireflyException; use FireflyIII\Helpers\Attachments\AttachmentHelperInterface; +use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Http\Controllers\Controller; use FireflyIII\Http\Requests\SplitJournalFormRequest; use FireflyIII\Models\Account; use FireflyIII\Models\AccountType; +use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; -use FireflyIII\Repositories\Journal\JournalTaskerInterface; +use FireflyIII\Transformers\TransactionTransformer; use Illuminate\Http\Request; +use Illuminate\Support\Collection; use Preferences; use Session; use Steam; +use Symfony\Component\HttpFoundation\ParameterBag; use View; /** @@ -59,8 +64,6 @@ class SplitController extends Controller private $currencies; /** @var JournalRepositoryInterface */ private $repository; - /** @var JournalTaskerInterface */ - private $tasker; /** * @@ -74,7 +77,6 @@ class SplitController extends Controller function ($request, $next) { $this->accounts = app(AccountRepositoryInterface::class); $this->budgets = app(BudgetRepositoryInterface::class); - $this->tasker = app(JournalTaskerInterface::class); $this->attachments = app(AttachmentHelperInterface::class); $this->currencies = app(CurrencyRepositoryInterface::class); $this->repository = app(JournalRepositoryInterface::class); @@ -91,6 +93,7 @@ class SplitController extends Controller * @param TransactionJournal $journal * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|View + * @throws FireflyException */ public function edit(Request $request, TransactionJournal $journal) { @@ -100,15 +103,13 @@ class SplitController extends Controller $uploadSize = min(Steam::phpBytes(ini_get('upload_max_filesize')), Steam::phpBytes(ini_get('post_max_size'))); $currencies = $this->currencies->get(); - $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 = []; + $accountList = $this->accounts->getAccountsByType([AccountType::ASSET, AccountType::DEFAULT]); + $accountArray = []; // account array to display currency info: /** @var Account $account */ foreach ($accountList as $account) { @@ -124,7 +125,7 @@ class SplitController extends Controller return view( 'transactions.split.edit', compact( - 'subTitleIcon', 'currencies', 'optionalFields', 'preFilled', 'subTitle', 'uploadSize', 'assetAccounts', 'budgets', + 'subTitleIcon', 'currencies', 'optionalFields', 'preFilled', 'subTitle', 'uploadSize', 'budgets', 'journal', 'accountArray', 'previous' ) @@ -159,7 +160,7 @@ class SplitController extends Controller // @codeCoverageIgnoreEnd $type = strtolower($this->repository->getTransactionType($journal)); - Session::flash('success', strval(trans('firefly.updated_' . $type, ['description' => $data['description']]))); + Session::flash('success', strval(trans('firefly.updated_' . $type, ['description' => $journal->description]))); Preferences::mark(); // @codeCoverageIgnoreStart @@ -180,6 +181,7 @@ class SplitController extends Controller * @param TransactionJournal $journal * * @return array + * @throws FireflyException */ private function arrayFromJournal(Request $request, TransactionJournal $journal): array { @@ -195,7 +197,7 @@ class SplitController extends Controller 'destinationAccounts' => $destinationAccounts, 'what' => strtolower($this->repository->getTransactionType($journal)), 'date' => $request->old('date', $this->repository->getJournalDate($journal, null)), - 'tags' => join(',', $journal->tags->pluck('tag')->toArray()), + 'tags' => implode(',', $journal->tags->pluck('tag')->toArray()), // all custom fields: 'interest_date' => $request->old('interest_date', $this->repository->getMetaField($journal, 'interest_date')), @@ -221,43 +223,28 @@ class SplitController extends Controller * @param TransactionJournal $journal * * @return array + * @throws FireflyException */ private function getTransactionDataFromJournal(TransactionJournal $journal): array { - $transactions = $this->tasker->getTransactionsOverview($journal); - $return = []; - /** @var array $transaction */ - foreach ($transactions as $index => $transaction) { - $set = [ - 'description' => $transaction['description'], - 'source_account_id' => $transaction['source_account_id'], - 'source_account_name' => $transaction['source_account_name'], - 'destination_account_id' => $transaction['destination_account_id'], - 'destination_account_name' => $transaction['destination_account_name'], - 'amount' => round($transaction['destination_amount'], 12), - 'budget_id' => isset($transaction['budget_id']) ? intval($transaction['budget_id']) : 0, - 'category' => $transaction['category'], - 'transaction_currency_id' => $transaction['transaction_currency_id'], - 'transaction_currency_code' => $transaction['transaction_currency_code'], - 'transaction_currency_symbol' => $transaction['transaction_currency_symbol'], - 'foreign_amount' => round($transaction['foreign_destination_amount'], 12), - 'foreign_currency_id' => $transaction['foreign_currency_id'], - 'foreign_currency_code' => $transaction['foreign_currency_code'], - 'foreign_currency_symbol' => $transaction['foreign_currency_symbol'], - ]; - // set initial category and/or budget: - if ($set['budget_id'] === 0) { - $set['budget_id'] = $this->repository->getJournalBudgetId($journal); - } - if (strlen($set['category']) === 0) { - $set['category'] = $this->repository->getJournalCategoryName($journal); - } + // use collector to collect transactions. + $collector = app(JournalCollectorInterface::class); + $collector->setUser(auth()->user()); + $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); + // filter on specific journals. + $collector->setJournals(new Collection([$journal])); + $set = $collector->getJournals(); + $transactions = []; + $transformer = new TransactionTransformer(new ParameterBag); - - $return[] = $set; + /** @var Transaction $transaction */ + foreach ($set as $transaction) { + if ($transaction->transaction_amount > 0) { + $transactions[] = $transformer->transform($transaction); + } } - return $return; + return $transactions; } /** @@ -279,14 +266,14 @@ class SplitController extends Controller 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']; + $array[$index] = $row; + $array[$index]['currency_id'] = $array[0]['transaction_currency_id']; + $array[$index]['currency_code'] = $array[0]['transaction_currency_code']; + $array[$index]['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 ba24a58696..0d7a950ed2 100644 --- a/app/Http/Controllers/TransactionController.php +++ b/app/Http/Controllers/TransactionController.php @@ -25,19 +25,20 @@ namespace FireflyIII\Http\Controllers; use Carbon\Carbon; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Helpers\Collector\JournalCollectorInterface; +use FireflyIII\Helpers\Filter\CountAttachmentsFilter; use FireflyIII\Helpers\Filter\InternalTransferFilter; +use FireflyIII\Helpers\Filter\SplitIndicatorFilter; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; -use FireflyIII\Repositories\Journal\JournalTaskerInterface; use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface; -use FireflyIII\Support\CacheProperties; +use FireflyIII\Transformers\TransactionTransformer; use Illuminate\Http\Request; use Illuminate\Support\Collection; use Log; use Preferences; -use Response; +use Symfony\Component\HttpFoundation\ParameterBag; use View; /** @@ -45,6 +46,9 @@ use View; */ class TransactionController extends Controller { + /** @var JournalRepositoryInterface */ + private $repository; + /** * TransactionController constructor. */ @@ -56,6 +60,7 @@ class TransactionController extends Controller function ($request, $next) { app('view')->share('title', trans('firefly.transactions')); app('view')->share('mainTitleIcon', 'fa-repeat'); + $this->repository = app(JournalRepositoryInterface::class); return $next($request); } @@ -63,97 +68,110 @@ class TransactionController extends Controller } /** - * @param Request $request - * @param JournalRepositoryInterface $repository - * @param string $what - * @param string $moment + * Index for a range of transactions. + * + * @param Request $request + * @param string $what + * @param Carbon $start + * @param Carbon $end * * @return View * - * @throws FireflyException */ - public function index(Request $request, JournalRepositoryInterface $repository, string $what, string $moment = '') + public function index(Request $request, string $what, Carbon $start = null, Carbon $end = null) { - // default values: $subTitleIcon = config('firefly.transactionIconsByWhat.' . $what); $types = config('firefly.transactionTypesByWhat.' . $what); - $page = intval($request->get('page')); - $pageSize = intval(Preferences::get('listPageSize', 50)->data); - $range = Preferences::get('viewRange', '1M')->data; - $start = null; - $end = null; - $periods = new Collection; + $page = (int)$request->get('page'); + $pageSize = (int)Preferences::get('listPageSize', 50)->data; $path = route('transactions.index', [$what]); - - // prep for "all" view. - if ('all' === $moment) { - $subTitle = trans('firefly.all_' . $what); - $first = $repository->first(); - $start = $first->date ?? new Carbon; - $end = new Carbon; - $path = route('transactions.index', [$what, 'all']); + if (null === $start) { + $start = session('start'); + $end = session('end'); + } + if (null === $end) { + $end = session('end'); } - // prep for "specific date" view. - if (strlen($moment) > 0 && 'all' !== $moment) { - $start = new Carbon($moment); - $end = app('navigation')->endOfPeriod($start, $range); - $path = route('transactions.index', [$what, $moment]); - $subTitle = trans( - 'firefly.title_' . $what . '_between', - ['start' => $start->formatLocalized($this->monthAndDayFormat), 'end' => $end->formatLocalized($this->monthAndDayFormat)] - ); - $periods = $this->getPeriodOverview($what); - } - - // prep for current period - if (0 === strlen($moment)) { - $start = clone session('start', app('navigation')->startOfPeriod(new Carbon, $range)); - $end = clone session('end', app('navigation')->endOfPeriod(new Carbon, $range)); - $periods = $this->getPeriodOverview($what); - $subTitle = trans( - 'firefly.title_' . $what . '_between', - ['start' => $start->formatLocalized($this->monthAndDayFormat), 'end' => $end->formatLocalized($this->monthAndDayFormat)] - ); + if ($end < $start) { + list($start, $end) = [$end, $start]; } + $startStr = $start->formatLocalized($this->monthAndDayFormat); + $endStr = $end->formatLocalized($this->monthAndDayFormat); + $subTitle = trans('firefly.title_' . $what . '_between', ['start' => $startStr, 'end' => $endStr]); + $periods = $this->getPeriodOverview($what, $end); /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); - $collector->setAllAssetAccounts()->setRange($start, $end)->setTypes($types)->setLimit($pageSize)->setPage($page)->withOpposingAccount(); + $collector->setAllAssetAccounts()->setRange($start, $end) + ->setTypes($types)->setLimit($pageSize)->setPage($page)->withOpposingAccount() + ->withBudgetInformation()->withCategoryInformation(); $collector->removeFilter(InternalTransferFilter::class); + $collector->addFilter(SplitIndicatorFilter::class); + $collector->addFilter(CountAttachmentsFilter::class); $transactions = $collector->getPaginatedJournals(); $transactions->setPath($path); - return view('transactions.index', compact('subTitle', 'what', 'subTitleIcon', 'transactions', 'periods', 'start', 'end', 'moment')); + return view('transactions.index', compact('subTitle', 'what', 'subTitleIcon', 'transactions', 'periods', 'start', 'end')); } /** - * @param Request $request - * @param JournalRepositoryInterface $repository + * @param Request $request + * @param string $what + * + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + */ + public function indexAll(Request $request, string $what) + { + $subTitleIcon = config('firefly.transactionIconsByWhat.' . $what); + $types = config('firefly.transactionTypesByWhat.' . $what); + $page = (int)$request->get('page'); + $pageSize = (int)Preferences::get('listPageSize', 50)->data; + $path = route('transactions.index.all', [$what]); + $first = $this->repository->first(); + $start = $first->date ?? new Carbon; + $end = new Carbon; + $subTitle = trans('firefly.all_' . $what); + + /** @var JournalCollectorInterface $collector */ + $collector = app(JournalCollectorInterface::class); + $collector->setAllAssetAccounts()->setRange($start, $end) + ->setTypes($types)->setLimit($pageSize)->setPage($page)->withOpposingAccount() + ->withBudgetInformation()->withCategoryInformation(); + $collector->removeFilter(InternalTransferFilter::class); + $collector->addFilter(SplitIndicatorFilter::class); + $collector->addFilter(CountAttachmentsFilter::class); + $transactions = $collector->getPaginatedJournals(); + $transactions->setPath($path); + + return view('transactions.index', compact('subTitle', 'what', 'subTitleIcon', 'transactions', 'start', 'end')); + } + + /** + * @param Request $request * * @return \Illuminate\Http\JsonResponse */ - public function reconcile(Request $request, JournalRepositoryInterface $repository) + public function reconcile(Request $request) { $transactionIds = $request->get('transactions'); foreach ($transactionIds as $transactionId) { - $transactionId = intval($transactionId); - $transaction = $repository->findTransaction($transactionId); + $transactionId = (int)$transactionId; + $transaction = $this->repository->findTransaction($transactionId); Log::debug(sprintf('Transaction ID is %d', $transaction->id)); - $repository->reconcile($transaction); + $this->repository->reconcile($transaction); } - return Response::json(['ok' => 'reconciled']); + return response()->json(['ok' => 'reconciled']); } /** - * @param Request $request - * @param JournalRepositoryInterface $repository + * @param Request $request * * @return \Illuminate\Http\JsonResponse */ - public function reorder(Request $request, JournalRepositoryInterface $repository) + public function reorder(Request $request) { $ids = $request->get('items'); $date = new Carbon($request->get('date')); @@ -161,39 +179,54 @@ class TransactionController extends Controller $order = 0; $ids = array_unique($ids); foreach ($ids as $id) { - $journal = $repository->find(intval($id)); + $journal = $this->repository->find((int)$id); if ($journal && $journal->date->isSameDay($date)) { - $repository->setOrder($journal, $order); + $this->repository->setOrder($journal, $order); ++$order; } } } Preferences::mark(); - return Response::json([true]); + return response()->json([true]); } /** * @param TransactionJournal $journal - * @param JournalTaskerInterface $tasker * @param LinkTypeRepositoryInterface $linkTypeRepository * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|View + * @throws FireflyException */ - public function show(TransactionJournal $journal, JournalTaskerInterface $tasker, LinkTypeRepositoryInterface $linkTypeRepository) + public function show(TransactionJournal $journal, LinkTypeRepositoryInterface $linkTypeRepository) { if ($this->isOpeningBalance($journal)) { return $this->redirectToAccount($journal); } - if (TransactionType::RECONCILIATION === $journal->transactionType->type) { + $transactionType = $journal->transactionType->type; + if (TransactionType::RECONCILIATION === $transactionType) { return redirect(route('accounts.reconcile.show', [$journal->id])); // @codeCoverageIgnore } - $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) . ' "' . $journal->description . '"'; + $linkTypes = $linkTypeRepository->get(); + $links = $linkTypeRepository->getLinks($journal); + + // get transactions using the collector: + $collector = app(JournalCollectorInterface::class); + $collector->setUser(auth()->user()); + $collector->withOpposingAccount()->withCategoryInformation()->withBudgetInformation(); + // filter on specific journals. + $collector->setJournals(new Collection([$journal])); + $set = $collector->getJournals(); + $transactions = []; + $transformer = new TransactionTransformer(new ParameterBag); + /** @var Transaction $transaction */ + foreach ($set as $transaction) { + $transactions[] = $transformer->transform($transaction); + } + + $events = $this->repository->getPiggyBankEvents($journal); + $what = strtolower($transactionType); + $subTitle = trans('firefly.' . $what) . ' "' . $journal->description . '"'; return view('transactions.show', compact('journal', 'events', 'subTitle', 'what', 'transactions', 'linkTypes', 'links')); } @@ -201,63 +234,50 @@ class TransactionController extends Controller /** * @param string $what * + * @param Carbon $date + * * @return Collection */ - private function getPeriodOverview(string $what): Collection + private function getPeriodOverview(string $what, Carbon $date): Collection { - $repository = app(JournalRepositoryInterface::class); - $first = $repository->first(); - $start = $first->date ?? new Carbon; - $range = Preferences::get('viewRange', '1M')->data; - $start = app('navigation')->startOfPeriod($start, $range); - $end = app('navigation')->endOfX(new Carbon, $range, null); - $entries = new Collection; - $types = config('firefly.transactionTypesByWhat.' . $what); - - // properties for cache - $cache = new CacheProperties; - $cache->addProperty($start); - $cache->addProperty($end); - $cache->addProperty($what); - $cache->addProperty('transaction-list-entries'); - - if ($cache->has()) { - return $cache->get(); // @codeCoverageIgnore + $range = Preferences::get('viewRange', '1M')->data; + $first = $this->repository->first(); + $start = new Carbon; + $start->subYear(); + $types = config('firefly.transactionTypesByWhat.' . $what); + $entries = new Collection; + if (null !== $first) { + $start = $first->date; + } + if ($date < $start) { + list($start, $date) = [$date, $start]; // @codeCoverageIgnore } - Log::debug(sprintf('Going to get period expenses and incomes between %s and %s.', $start->format('Y-m-d'), $end->format('Y-m-d'))); - while ($end >= $start) { - Log::debug('Loop start!'); - $end = app('navigation')->startOfPeriod($end, $range); - $currentEnd = app('navigation')->endOfPeriod($end, $range); + /** @var array $dates */ + $dates = app('navigation')->blockPeriods($start, $date, $range); - // count journals without budget in this period: + foreach ($dates as $currentDate) { /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); - $collector->setAllAssetAccounts()->setRange($end, $currentEnd)->withOpposingAccount()->setTypes($types); + $collector->setAllAssetAccounts()->setRange($currentDate['start'], $currentDate['end'])->withOpposingAccount()->setTypes($types); $collector->removeFilter(InternalTransferFilter::class); $journals = $collector->getJournals(); - $sum = $journals->sum('transaction_amount'); - // count per currency: - $sums = $this->sumPerCurrency($journals); - $dateStr = $end->format('Y-m-d'); - $dateName = app('navigation')->periodShow($end, $range); - $array = [ - 'string' => $dateStr, - 'name' => $dateName, - 'sum' => $sum, - 'sums' => $sums, - 'date' => clone $end, - ]; - Log::debug(sprintf('What is %s', $what)); if ($journals->count() > 0) { - $entries->push($array); // @codeCoverageIgnore + $sums = $this->sumPerCurrency($journals); + $dateName = app('navigation')->periodShow($currentDate['start'], $currentDate['period']); + $sum = $journals->sum('transaction_amount'); + $entries->push( + [ + 'name' => $dateName, + 'sums' => $sums, + 'sum' => $sum, + 'start' => $currentDate['start']->format('Y-m-d'), + 'end' => $currentDate['end']->format('Y-m-d'), + ] + ); } - $end = app('navigation')->subtractPeriod($end, $range, 1); } - Log::debug('End of loop'); - $cache->store($entries); return $entries; } @@ -272,7 +292,7 @@ class TransactionController extends Controller $return = []; /** @var Transaction $transaction */ foreach ($collection as $transaction) { - $currencyId = intval($transaction->transaction_currency_id); + $currencyId = (int)$transaction->transaction_currency_id; // save currency information: if (!isset($return[$currencyId])) { diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 35d914499d..6b6b17dd59 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -26,6 +26,7 @@ use FireflyIII\Http\Middleware\Authenticate; use FireflyIII\Http\Middleware\AuthenticateTwoFactor; use FireflyIII\Http\Middleware\Binder; use FireflyIII\Http\Middleware\EncryptCookies; +use FireflyIII\Http\Middleware\Installer; use FireflyIII\Http\Middleware\IsAdmin; use FireflyIII\Http\Middleware\Range; use FireflyIII\Http\Middleware\RedirectIfAuthenticated; @@ -66,6 +67,7 @@ class Kernel extends HttpKernel TrimStrings::class, ConvertEmptyStringsToNull::class, TrustProxies::class, + Installer::class, ]; /** @@ -90,6 +92,7 @@ class Kernel extends HttpKernel // MUST NOT be logged in. Does not care about 2FA or confirmation. 'user-not-logged-in' => [ + Installer::class, Sandstorm::class, EncryptCookies::class, AddQueuedCookiesToResponse::class, @@ -103,6 +106,7 @@ class Kernel extends HttpKernel // MUST NOT have 2FA // don't care about confirmation: 'user-logged-in-no-2fa' => [ + Installer::class, Sandstorm::class, EncryptCookies::class, AddQueuedCookiesToResponse::class, diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php index 9d5e3c0006..372655d233 100644 --- a/app/Http/Middleware/Authenticate.php +++ b/app/Http/Middleware/Authenticate.php @@ -74,8 +74,7 @@ class Authenticate * * @param array $guards * - * @return void - * + * @return mixed * @throws \Illuminate\Auth\AuthenticationException */ protected function authenticate(array $guards) diff --git a/app/Http/Middleware/AuthenticateTwoFactor.php b/app/Http/Middleware/AuthenticateTwoFactor.php index ca6879d96c..e78a155a0a 100644 --- a/app/Http/Middleware/AuthenticateTwoFactor.php +++ b/app/Http/Middleware/AuthenticateTwoFactor.php @@ -56,12 +56,14 @@ class AuthenticateTwoFactor * @param array ...$guards * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|mixed + * @throws \Psr\Container\NotFoundExceptionInterface + * @throws \Psr\Container\ContainerExceptionInterface * @throws \Illuminate\Container\EntryNotFoundException */ public function handle($request, Closure $next, ...$guards) { if ($this->auth->guest()) { - return redirect()->guest('login'); + return response()->redirectTo(route('login')); } $is2faEnabled = app('preferences')->get('twoFactorAuthEnabled', false)->data; @@ -71,7 +73,7 @@ class AuthenticateTwoFactor if ($is2faEnabled && $has2faSecret && !$is2faAuthed) { Log::debug('Does not seem to be 2 factor authed, redirect.'); - return redirect(route('two-factor.index')); + return response()->redirectTo(route('two-factor.index')); } return $next($request); diff --git a/app/Http/Middleware/Binder.php b/app/Http/Middleware/Binder.php index 415dbe2474..3e58b67dee 100644 --- a/app/Http/Middleware/Binder.php +++ b/app/Http/Middleware/Binder.php @@ -63,7 +63,7 @@ class Binder * * @return mixed * - * @throws \Illuminate\Auth\AuthenticationException + * @throws \LogicException */ public function handle($request, Closure $next, ...$guards) { diff --git a/app/Http/Middleware/Installer.php b/app/Http/Middleware/Installer.php new file mode 100644 index 0000000000..f5ff6ec02c --- /dev/null +++ b/app/Http/Middleware/Installer.php @@ -0,0 +1,96 @@ +url(); + $strpos = stripos($url, '/install'); + if (!($strpos === false)) { + Log::debug(sprintf('URL is %s, will NOT run installer middleware', $url)); + + return $next($request); + } + // Log::debug(sprintf('URL is %s, will run installer middleware', $url)); + + // no tables present? + try { + DB::table('users')->count(); + } catch (QueryException $e) { + $message = $e->getMessage(); + Log::error('Access denied: ' . $message); + if ($this->isAccessDenied($message)) { + throw new FireflyException('It seems your database configuration is not correct. Please verify the username and password in your .env file.'); + } + if ($this->noTablesExist($message)) { + // redirect to UpdateController + Log::warning('There are no Firefly III tables present. Redirect to migrate routine.'); + + return response()->redirectTo(route('installer.index')); + } + throw new FireflyException(sprintf('Could not access the database: %s', $message)); + } + + // older version in config than database? + $configVersion = intval(config('firefly.db_version')); + $dbVersion = intval(FireflyConfig::getFresh('db_version', 1)->data); + if ($configVersion > $dbVersion) { + Log::warning( + sprintf( + 'The current installed version (%d) is older than the required version (%d). Redirect to migrate routine.', $dbVersion, $configVersion + ) + ); + + // redirect to migrate routine: + return response()->redirectTo(route('installer.index')); + } + + return $next($request); + } + + /** + * @param string $message + * + * @return bool + */ + protected function isAccessDenied(string $message): bool + { + return !(stripos($message, 'Access denied') === false); + } + + /** + * @param string $message + * + * @return bool + */ + protected function noTablesExist(string $message): bool + { + return !(stripos($message, 'Base table or view not found') === false); + } +} diff --git a/app/Http/Middleware/IsAdmin.php b/app/Http/Middleware/IsAdmin.php index e06eecc07b..539cf378fe 100644 --- a/app/Http/Middleware/IsAdmin.php +++ b/app/Http/Middleware/IsAdmin.php @@ -48,12 +48,12 @@ class IsAdmin return response('Unauthorized.', 401); } - return redirect()->guest('login'); + return response()->redirectTo(route('login')); } /** @var User $user */ $user = auth()->user(); if (!$user->hasRole('owner')) { - return redirect(route('home')); + return response()->redirectTo(route('home')); } return $next($request); diff --git a/app/Http/Middleware/IsDemoUser.php b/app/Http/Middleware/IsDemoUser.php index 7f704adc14..bd9e708bd5 100644 --- a/app/Http/Middleware/IsDemoUser.php +++ b/app/Http/Middleware/IsDemoUser.php @@ -23,10 +23,9 @@ declare(strict_types=1); namespace FireflyIII\Http\Middleware; use Closure; +use FireflyIII\Exceptions\IsDemoUserException; use FireflyIII\User; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Auth; -use Session; /** * Class IsDemoUser. @@ -38,9 +37,9 @@ class IsDemoUser * * @param \Illuminate\Http\Request $request * @param \Closure $next - * @param string[] ...$guards * * @return mixed + * @throws \RuntimeException */ public function handle(Request $request, Closure $next) { @@ -51,11 +50,14 @@ class IsDemoUser } if ($user->hasRole('demo')) { - Session::flash('info', strval(trans('firefly.not_available_demo_user'))); + $request->session()->flash('info', strval(trans('firefly.not_available_demo_user'))); + $current = $request->url(); + $previous = $request->session()->previousUrl(); + if ($current !== $previous) { + return response()->redirectTo($previous); + } - redirect($request->session()->previousUrl()); - - return $next($request); + return response()->redirectTo(route('index')); } return $next($request); diff --git a/app/Http/Middleware/IsSandStormUser.php b/app/Http/Middleware/IsSandStormUser.php index aba1be7020..4847fdef31 100644 --- a/app/Http/Middleware/IsSandStormUser.php +++ b/app/Http/Middleware/IsSandStormUser.php @@ -51,7 +51,7 @@ class IsSandStormUser if (1 === intval(getenv('SANDSTORM'))) { Session::flash('warning', strval(trans('firefly.sandstorm_not_available'))); - return redirect(route('index')); + return response()->redirectTo(route('index')); } return $next($request); diff --git a/app/Http/Middleware/Range.php b/app/Http/Middleware/Range.php index 15f9b10b21..f7c935ac75 100644 --- a/app/Http/Middleware/Range.php +++ b/app/Http/Middleware/Range.php @@ -26,9 +26,7 @@ use App; use Carbon\Carbon; use Closure; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; -use Illuminate\Contracts\Auth\Guard; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Auth; use Preferences; use Session; use View; diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php index f318f14d5d..98d010590c 100644 --- a/app/Http/Middleware/RedirectIfAuthenticated.php +++ b/app/Http/Middleware/RedirectIfAuthenticated.php @@ -43,7 +43,7 @@ class RedirectIfAuthenticated public function handle($request, Closure $next, $guard = null) { if (Auth::guard($guard)->check()) { - return redirect(route('index')); + return response()->redirectTo(route('index')); } return $next($request); diff --git a/app/Http/Middleware/RedirectIfTwoFactorAuthenticated.php b/app/Http/Middleware/RedirectIfTwoFactorAuthenticated.php index 1827455932..f2b4f27e12 100644 --- a/app/Http/Middleware/RedirectIfTwoFactorAuthenticated.php +++ b/app/Http/Middleware/RedirectIfTwoFactorAuthenticated.php @@ -51,7 +51,7 @@ class RedirectIfTwoFactorAuthenticated $is2faAuthed = 'true' === $request->cookie('twoFactorAuthenticated'); if ($is2faEnabled && $has2faSecret && $is2faAuthed) { - return redirect(route('index')); + return response()->redirectTo(route('index')); } } diff --git a/app/Http/Middleware/Sandstorm.php b/app/Http/Middleware/Sandstorm.php index 5dce1f605a..c8b6e3e878 100644 --- a/app/Http/Middleware/Sandstorm.php +++ b/app/Http/Middleware/Sandstorm.php @@ -95,9 +95,9 @@ class Sandstorm /** @var User $user */ $user = $repository->store( [ - 'blocked' => false, + 'blocked' => false, 'blocked_code' => null, - 'email' => $email, + 'email' => $email, ] ); Auth::guard($guard)->login($user); diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php index e2089b222c..63cbdbd2f3 100644 --- a/app/Http/Middleware/TrustProxies.php +++ b/app/Http/Middleware/TrustProxies.php @@ -32,19 +32,9 @@ use Illuminate\Http\Request; */ class TrustProxies extends Middleware { - /** - * The current proxy header mappings. - * - * @var array - */ - protected $headers - = [ - Request::HEADER_FORWARDED => 'FORWARDED', - Request::HEADER_X_FORWARDED_FOR => 'X_FORWARDED_FOR', - Request::HEADER_X_FORWARDED_HOST => 'X_FORWARDED_HOST', - Request::HEADER_X_FORWARDED_PORT => 'X_FORWARDED_PORT', - Request::HEADER_X_FORWARDED_PROTO => 'X_FORWARDED_PROTO', - ]; + /** @var int */ + protected $headers = Request::HEADER_X_FORWARDED_ALL; + /** * The trusted proxies for this application. * diff --git a/app/Http/Requests/AccountFormRequest.php b/app/Http/Requests/AccountFormRequest.php index c3a867f7e4..e380bcd243 100644 --- a/app/Http/Requests/AccountFormRequest.php +++ b/app/Http/Requests/AccountFormRequest.php @@ -68,14 +68,14 @@ class AccountFormRequest extends Request */ public function rules() { - $accountRoles = join(',', config('firefly.accountRoles')); - $types = join(',', array_keys(config('firefly.subTitlesByIdentifier'))); - $ccPaymentTypes = join(',', array_keys(config('firefly.ccTypes'))); + $accountRoles = implode(',', config('firefly.accountRoles')); + $types = implode(',', array_keys(config('firefly.subTitlesByIdentifier'))); + $ccPaymentTypes = implode(',', array_keys(config('firefly.ccTypes'))); $rules = [ 'name' => 'required|min:1|uniqueAccountForUser', 'openingBalance' => 'numeric|required_with:openingBalanceDate|nullable', 'openingBalanceDate' => 'date|required_with:openingBalance|nullable', - 'iban' => ['iban', 'nullable', new UniqueIban(null)], + 'iban' => ['iban', 'nullable', new UniqueIban(null, $this->string('what'))], 'BIC' => 'bic|nullable', 'virtualBalance' => 'numeric|nullable', 'currency_id' => 'exists:transaction_currencies,id', @@ -95,7 +95,7 @@ class AccountFormRequest extends Request // add rules: $rules['id'] = 'belongsToUser:accounts'; $rules['name'] = 'required|min:1|uniqueAccountForUser:' . intval($this->get('id')); - $rules['iban'] = ['iban', 'nullable', new UniqueIban($account)]; + $rules['iban'] = ['iban', 'nullable', new UniqueIban($account, $account->accountType->type)]; } return $rules; diff --git a/app/Http/Requests/AttachmentFormRequest.php b/app/Http/Requests/AttachmentFormRequest.php index 1e31e6973f..a05ac1ac87 100644 --- a/app/Http/Requests/AttachmentFormRequest.php +++ b/app/Http/Requests/AttachmentFormRequest.php @@ -44,7 +44,6 @@ class AttachmentFormRequest extends Request { return [ 'title' => $this->string('title'), - 'description' => $this->string('description'), 'notes' => $this->string('notes'), ]; } @@ -57,7 +56,6 @@ class AttachmentFormRequest extends Request // fixed return [ 'title' => 'between:1,255|nullable', - 'description' => 'between:1,65536|nullable', 'notes' => 'between:1,65536|nullable', ]; } diff --git a/app/Http/Requests/BudgetFormRequest.php b/app/Http/Requests/BudgetFormRequest.php index 2042a32660..9bce8af565 100644 --- a/app/Http/Requests/BudgetFormRequest.php +++ b/app/Http/Requests/BudgetFormRequest.php @@ -58,7 +58,7 @@ class BudgetFormRequest extends Request /** @var BudgetRepositoryInterface $repository */ $repository = app(BudgetRepositoryInterface::class); $nameRule = 'required|between:1,100|uniqueObjectForUser:budgets,name'; - if (null !== $repository->find(intval($this->get('id')))->id) { + if (null !== $repository->findNull(intval($this->get('id')))) { $nameRule = 'required|between:1,100|uniqueObjectForUser:budgets,name,' . intval($this->get('id')); } diff --git a/app/Http/Requests/CategoryFormRequest.php b/app/Http/Requests/CategoryFormRequest.php index f48a2d7c21..38b2b872e6 100644 --- a/app/Http/Requests/CategoryFormRequest.php +++ b/app/Http/Requests/CategoryFormRequest.php @@ -56,7 +56,7 @@ class CategoryFormRequest extends Request /** @var CategoryRepositoryInterface $repository */ $repository = app(CategoryRepositoryInterface::class); $nameRule = 'required|between:1,100|uniqueObjectForUser:categories,name'; - if (null !== $repository->find($this->integer('id'))->id) { + if (null !== $repository->findNull($this->integer('id'))) { $nameRule = 'required|between:1,100|uniqueObjectForUser:categories,name,' . $this->integer('id'); } diff --git a/app/Http/Requests/ExportFormRequest.php b/app/Http/Requests/ExportFormRequest.php index 3d60ac7696..7a3057987d 100644 --- a/app/Http/Requests/ExportFormRequest.php +++ b/app/Http/Requests/ExportFormRequest.php @@ -40,13 +40,14 @@ class ExportFormRequest extends Request /** * @return array + * @throws \InvalidArgumentException */ 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'))); + $formats = implode(',', array_keys(config('firefly.export_formats'))); // fixed diff --git a/app/Http/Requests/JournalLinkRequest.php b/app/Http/Requests/JournalLinkRequest.php index 725f71e40c..3e12a28686 100644 --- a/app/Http/Requests/JournalLinkRequest.php +++ b/app/Http/Requests/JournalLinkRequest.php @@ -46,7 +46,7 @@ class JournalLinkRequest extends Request $return = []; $linkType = $this->get('link_type'); $parts = explode('_', $linkType); - $return['link_type_id'] = intval($parts[0]); + $return['link_type_id'] = (int)$parts[0]; $return['transaction_journal_id'] = $this->integer('link_journal_id'); $return['notes'] = strlen($this->string('notes')) > 0 ? $this->string('notes') : ''; $return['direction'] = $parts[1]; @@ -70,7 +70,7 @@ class JournalLinkRequest extends Request $combinations[] = sprintf('%d_inward', $type->id); $combinations[] = sprintf('%d_outward', $type->id); } - $string = join(',', $combinations); + $string = implode(',', $combinations); // fixed return [ diff --git a/app/Http/Requests/LinkTypeFormRequest.php b/app/Http/Requests/LinkTypeFormRequest.php index 79fef825ff..82fa430801 100644 --- a/app/Http/Requests/LinkTypeFormRequest.php +++ b/app/Http/Requests/LinkTypeFormRequest.php @@ -22,8 +22,6 @@ declare(strict_types=1); namespace FireflyIII\Http\Requests; -use FireflyIII\Repositories\LinkType\LinkTypeRepositoryInterface; - /** * Class BillFormRequest. */ @@ -44,8 +42,8 @@ class LinkTypeFormRequest extends Request public function rules() { // fixed - $nameRule = 'required|min:1|unique:link_types,name'; - $idRule = ''; + $nameRule = 'required|min:1|unique:link_types,name'; + $idRule = ''; // get parameter link: $link = $this->route()->parameter('linkType'); diff --git a/app/Http/Requests/ReportFormRequest.php b/app/Http/Requests/ReportFormRequest.php index 1808b793bc..4c2632a54e 100644 --- a/app/Http/Requests/ReportFormRequest.php +++ b/app/Http/Requests/ReportFormRequest.php @@ -30,6 +30,7 @@ use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use FireflyIII\Repositories\Tag\TagRepositoryInterface; use Illuminate\Support\Collection; +use Log; /** * Class CategoryFormRequest. @@ -124,6 +125,7 @@ class ReportFormRequest extends Request $date = new Carbon($parts[1]); // @codeCoverageIgnoreStart } catch (Exception $e) { + Log::error(sprintf('"%s" is not a valid date range.', $range)); throw new FireflyException(sprintf('"%s" is not a valid date range.', $range)); // @codeCoverageIgnoreEnd } @@ -170,6 +172,7 @@ class ReportFormRequest extends Request $date = new Carbon($parts[0]); // @codeCoverageIgnoreStart } catch (Exception $e) { + Log::error(sprintf('"%s" is not a valid date range.', $range)); throw new FireflyException(sprintf('"%s" is not a valid date range.', $range)); // @codeCoverageIgnoreEnd } diff --git a/app/Http/Requests/RuleFormRequest.php b/app/Http/Requests/RuleFormRequest.php index 110639df3e..0890a543e4 100644 --- a/app/Http/Requests/RuleFormRequest.php +++ b/app/Http/Requests/RuleFormRequest.php @@ -70,7 +70,7 @@ class RuleFormRequest extends Request $validActions = array_keys(config('firefly.rule-actions')); // some actions require text: - $contextActions = join(',', config('firefly.rule-actions-text')); + $contextActions = implode(',', config('firefly.rule-actions-text')); $titleRule = 'required|between:1,100|uniqueObjectForUser:rules,title'; if (null !== $repository->find(intval($this->get('id')))->id) { @@ -82,9 +82,9 @@ class RuleFormRequest extends Request 'stop_processing' => 'boolean', 'rule_group_id' => 'required|belongsToUser:rule_groups', 'trigger' => 'required|in:store-journal,update-journal', - 'rule-trigger.*' => 'required|in:' . join(',', $validTriggers), + 'rule-trigger.*' => 'required|in:' . implode(',', $validTriggers), 'rule-trigger-value.*' => 'required|min:1|ruleTriggerValue', - 'rule-action.*' => 'required|in:' . join(',', $validActions), + 'rule-action.*' => 'required|in:' . implode(',', $validActions), ]; // since Laravel does not support this stuff yet, here's a trick. for ($i = 0; $i < 10; ++$i) { diff --git a/app/Http/Requests/SelectTransactionsRequest.php b/app/Http/Requests/SelectTransactionsRequest.php index 249613892a..082e4dd746 100644 --- a/app/Http/Requests/SelectTransactionsRequest.php +++ b/app/Http/Requests/SelectTransactionsRequest.php @@ -41,6 +41,7 @@ class SelectTransactionsRequest extends Request /** * @return array + * @throws \InvalidArgumentException */ public function rules() { diff --git a/app/Http/Requests/SplitJournalFormRequest.php b/app/Http/Requests/SplitJournalFormRequest.php index 303c0d7bf8..14aa681378 100644 --- a/app/Http/Requests/SplitJournalFormRequest.php +++ b/app/Http/Requests/SplitJournalFormRequest.php @@ -22,7 +22,7 @@ declare(strict_types=1); namespace FireflyIII\Http\Requests; -use Steam; +use Illuminate\Validation\Validator; /** * Class SplitJournalFormRequest. @@ -44,7 +44,7 @@ class SplitJournalFormRequest extends Request public function getAll(): array { $data = [ - 'description' => $this->string('description'), + 'description' => $this->string('journal_description'), 'type' => $this->string('what'), 'date' => $this->date('date'), 'tags' => explode(',', $this->string('tags')), @@ -65,10 +65,10 @@ class SplitJournalFormRequest extends Request switch ($data['type']) { case 'withdrawal': $sourceId = $this->integer('journal_source_account_id'); - $destinationName = $transaction['destination_account_name']; + $destinationName = $transaction['destination_name'] ?? ''; break; case 'deposit': - $sourceName = $transaction['source_account_name']; + $sourceName = $transaction['source_name'] ?? ''; $destinationId = $this->integer('journal_destination_account_id'); break; case 'transfer': @@ -77,24 +77,25 @@ class SplitJournalFormRequest extends Request break; } $foreignAmount = $transaction['foreign_amount'] ?? null; + $foreignCurrencyId = intval($transaction['foreign_currency_id'] ?? 0); $set = [ 'source_id' => $sourceId, 'source_name' => $sourceName, 'destination_id' => $destinationId, 'destination_name' => $destinationName, 'foreign_amount' => $foreignAmount, - 'foreign_currency_id' => null, + 'foreign_currency_id' => $foreignCurrencyId, 'foreign_currency_code' => null, 'reconciled' => false, 'identifier' => $index, 'currency_id' => $this->integer('journal_currency_id'), 'currency_code' => null, - 'description' => $transaction['description'], + 'description' => $transaction['transaction_description'], 'amount' => $transaction['amount'], 'budget_id' => intval($transaction['budget_id'] ?? 0), 'budget_name' => null, 'category_id' => null, - 'category_name' => $transaction['category'], + 'category_name' => $transaction['category_name'], ]; $data['transactions'][] = $set; } @@ -108,24 +109,57 @@ 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|nullable', - 'book_date' => 'date|nullable', - 'process_date' => 'date|nullable', - 'transactions.*.description' => 'required|between:1,255', - 'transactions.*.destination_account_id' => 'numeric|belongsToUser:accounts,id', - 'transactions.*.destination_account_name' => 'between:1,255|nullable', - 'transactions.*.amount' => 'required|numeric', - 'transactions.*.budget_id' => 'belongsToUser:budgets,id', - 'transactions.*.category' => 'between:1,255|nullable', - 'transactions.*.piggy_bank_id' => 'between:1,255|nullable', + '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|nullable', + 'book_date' => 'date|nullable', + 'process_date' => 'date|nullable', + 'transactions.*.transaction_description' => 'required|between:1,255', + 'transactions.*.destination_account_id' => 'numeric|belongsToUser:accounts,id', + 'transactions.*.destination_name' => 'between:1,255|nullable', + 'transactions.*.amount' => 'required|numeric', + 'transactions.*.budget_id' => 'belongsToUser:budgets,id', + 'transactions.*.category_name' => 'between:1,255|nullable', + 'transactions.*.piggy_bank_id' => 'between:1,255|nullable', ]; } + /** + * Configure the validator instance. + * + * @param Validator $validator + * + * @return void + */ + public function withValidator(Validator $validator): void + { + $validator->after( + function (Validator $validator) { + $this->sameAccounts($validator); + } + ); + } + + /** + * @param Validator $validator + */ + protected function sameAccounts(Validator $validator): void + { + $data = $this->getAll(); + $transactions = $data['transactions'] ?? []; + /** @var array $array */ + foreach ($transactions as $array) { + if ($array['destination_id'] !== null && $array['source_id'] !== null && $array['destination_id'] === $array['source_id']) { + $validator->errors()->add('journal_source_account_id', trans('validation.source_equals_destination')); + $validator->errors()->add('journal_destination_account_id', trans('validation.source_equals_destination')); + } + } + + } + } diff --git a/app/Http/Requests/TestRuleFormRequest.php b/app/Http/Requests/TestRuleFormRequest.php index 4064306cbd..c0f90fcd98 100644 --- a/app/Http/Requests/TestRuleFormRequest.php +++ b/app/Http/Requests/TestRuleFormRequest.php @@ -45,7 +45,7 @@ class TestRuleFormRequest extends Request // fixed $validTriggers = array_keys(config('firefly.rule-triggers')); $rules = [ - 'rule-trigger.*' => 'required|min:1|in:' . join(',', $validTriggers), + 'rule-trigger.*' => 'required|min:1|in:' . implode(',', $validTriggers), 'rule-trigger-value.*' => 'required|min:1|ruleTriggerValue', ]; diff --git a/app/Http/Requests/TokenFormRequest.php b/app/Http/Requests/TokenFormRequest.php index cc3aeb4c33..fd247f593e 100644 --- a/app/Http/Requests/TokenFormRequest.php +++ b/app/Http/Requests/TokenFormRequest.php @@ -43,10 +43,8 @@ class TokenFormRequest extends Request public function rules() { // fixed - $rules = [ + return [ 'code' => 'required|2faCode', ]; - - return $rules; } } diff --git a/app/Import/Configuration/BunqConfigurator.php b/app/Import/Configuration/BunqConfigurator.php new file mode 100644 index 0000000000..8dbf9255f2 --- /dev/null +++ b/app/Import/Configuration/BunqConfigurator.php @@ -0,0 +1,215 @@ +. + */ +declare(strict_types=1); + +namespace FireflyIII\Import\Configuration; + +use FireflyIII\Exceptions\FireflyException; +use FireflyIII\Models\ImportJob; +use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; +use FireflyIII\Support\Import\Configuration\Bunq\HaveAccounts; +use Log; + +/** + * Class BunqConfigurator. + */ +class BunqConfigurator implements ConfiguratorInterface +{ + /** @var ImportJob */ + private $job; + + /** @var ImportJobRepositoryInterface */ + private $repository; + + /** @var string */ + private $warning = ''; + + /** + * ConfiguratorInterface constructor. + */ + public function __construct() + { + } + + /** + * Store any data from the $data array into the job. + * + * @param array $data + * + * @return bool + * + * @throws FireflyException + */ + public function configureJob(array $data): bool + { + if (is_null($this->job)) { + throw new FireflyException('Cannot call configureJob() without a job.'); + } + $stage = $this->getConfig()['stage'] ?? 'initial'; + Log::debug(sprintf('in getNextData(), for stage "%s".', $stage)); + + switch ($stage) { + case 'have-accounts': + /** @var HaveAccounts $class */ + $class = app(HaveAccounts::class); + $class->setJob($this->job); + $class->storeConfiguration($data); + + // update job for next step and set to "configured". + $config = $this->getConfig(); + $config['stage'] = 'have-account-mapping'; + $this->repository->setConfiguration($this->job, $config); + + return true; + default: + throw new FireflyException(sprintf('Cannot store configuration when job is in state "%s"', $stage)); + break; + } + } + + /** + * Return the data required for the next step in the job configuration. + * + * @return array + * + * @throws FireflyException + */ + public function getNextData(): array + { + if (is_null($this->job)) { + throw new FireflyException('Cannot call configureJob() without a job.'); + } + $config = $this->getConfig(); + $stage = $config['stage'] ?? 'initial'; + + Log::debug(sprintf('in getNextData(), for stage "%s".', $stage)); + + switch ($stage) { + case 'have-accounts': + /** @var HaveAccounts $class */ + $class = app(HaveAccounts::class); + $class->setJob($this->job); + $data = $class->getData(); + + return $data; + default: + return []; + } + } + + /** + * @return string + * + * @throws FireflyException + */ + public function getNextView(): string + { + if (is_null($this->job)) { + throw new FireflyException('Cannot call configureJob() without a job.'); + } + $stage = $this->getConfig()['stage'] ?? 'initial'; + + Log::debug(sprintf('getNextView: in getNextView(), for stage "%s".', $stage)); + switch ($stage) { + case 'have-accounts': + return 'import.bunq.accounts'; + default: + return ''; + } + } + + /** + * Return possible warning to user. + * + * @return string + */ + public function getWarningMessage(): string + { + return $this->warning; + } + + /** + * @return bool + * + * @throws FireflyException + */ + public function isJobConfigured(): bool + { + if (is_null($this->job)) { + throw new FireflyException('Cannot call configureJob() without a job.'); + } + $stage = $this->getConfig()['stage'] ?? 'initial'; + + Log::debug(sprintf('in isJobConfigured(), for stage "%s".', $stage)); + switch ($stage) { + case 'have-accounts': + Log::debug('isJobConfigured returns false'); + + return false; + default: + Log::debug('isJobConfigured returns true'); + + return true; + } + } + + /** + * @param ImportJob $job + */ + public function setJob(ImportJob $job): void + { + // make repository + $this->repository = app(ImportJobRepositoryInterface::class); + $this->repository->setUser($job->user); + + // set default config: + $defaultConfig = [ + 'is-redirected' => false, + 'stage' => 'initial', + 'auto-start' => true, + 'apply-rules' => true, + 'match-bills' => false, + ]; + $currentConfig = $this->repository->getConfiguration($job); + $finalConfig = array_merge($defaultConfig, $currentConfig); + + // set default extended status: + $extendedStatus = $this->repository->getExtendedStatus($job); + $extendedStatus['steps'] = 8; + + // save to job: + $job = $this->repository->setConfiguration($job, $finalConfig); + $job = $this->repository->setExtendedStatus($job, $extendedStatus); + $this->job = $job; + + return; + } + + /** + * Shorthand method. + * + * @return array + */ + private function getConfig(): array + { + return $this->repository->getConfiguration($this->job); + } +} diff --git a/app/Import/Configuration/FileConfigurator.php b/app/Import/Configuration/FileConfigurator.php index c5070e5f73..38e1113d01 100644 --- a/app/Import/Configuration/FileConfigurator.php +++ b/app/Import/Configuration/FileConfigurator.php @@ -61,7 +61,6 @@ class FileConfigurator implements ConfiguratorInterface /** @var ImportJobRepositoryInterface */ private $repository; - // give job default config: /** @var string */ private $warning = ''; @@ -145,6 +144,7 @@ class FileConfigurator implements ConfiguratorInterface * Return possible warning to user. * * @return string + * * @throws FireflyException */ public function getWarningMessage(): string @@ -158,6 +158,7 @@ class FileConfigurator implements ConfiguratorInterface /** * @return bool + * * @throws FireflyException */ public function isJobConfigured(): bool @@ -167,7 +168,7 @@ class FileConfigurator implements ConfiguratorInterface } $config = $this->getConfig(); $stage = $config['stage'] ?? 'initial'; - if ($stage === 'ready') { + if ('ready' === $stage) { Log::debug('isJobConfigured returns true'); return true; @@ -252,6 +253,7 @@ class FileConfigurator implements ConfiguratorInterface * Shorthand method to return the extended status. * * @codeCoverageIgnore + * * @return array */ private function getExtendedStatus(): array diff --git a/app/Import/Configuration/SpectreConfigurator.php b/app/Import/Configuration/SpectreConfigurator.php index d3ed6d5b87..0c03c5adb9 100644 --- a/app/Import/Configuration/SpectreConfigurator.php +++ b/app/Import/Configuration/SpectreConfigurator.php @@ -55,6 +55,7 @@ class SpectreConfigurator implements ConfiguratorInterface * @param array $data * * @return bool + * * @throws FireflyException */ public function configureJob(array $data): bool @@ -87,6 +88,7 @@ class SpectreConfigurator implements ConfiguratorInterface * Return the data required for the next step in the job configuration. * * @return array + * * @throws FireflyException */ public function getNextData(): array @@ -124,6 +126,7 @@ class SpectreConfigurator implements ConfiguratorInterface /** * @return string + * * @throws FireflyException */ public function getNextView(): string @@ -143,7 +146,6 @@ class SpectreConfigurator implements ConfiguratorInterface return 'import.spectre.accounts'; default: return ''; - } } @@ -159,6 +161,7 @@ class SpectreConfigurator implements ConfiguratorInterface /** * @return bool + * * @throws FireflyException */ public function isJobConfigured(): bool diff --git a/app/Import/Converter/Amount.php b/app/Import/Converter/Amount.php index ccf7f6f76c..d75346d78b 100644 --- a/app/Import/Converter/Amount.php +++ b/app/Import/Converter/Amount.php @@ -113,13 +113,12 @@ class Amount implements ConverterInterface { $str = preg_replace('/[^\-\(\)\.\,0-9 ]/', '', $value); $len = strlen($str); - if ($str{0} === '(' && $str{$len - 1} === ')') { - $str = '-' . substr($str, 1, ($len - 2)); + if ('(' === $str[0] && ')' === $str[$len - 1]) { + $str = '-' . substr($str, 1, $len - 2); } Log::debug(sprintf('Stripped "%s" away to "%s"', $value, $str)); return $str; - } } diff --git a/app/Import/FileProcessor/CsvProcessor.php b/app/Import/FileProcessor/CsvProcessor.php index 79de2ec118..b4b8b31858 100644 --- a/app/Import/FileProcessor/CsvProcessor.php +++ b/app/Import/FileProcessor/CsvProcessor.php @@ -28,8 +28,8 @@ use FireflyIII\Import\Specifics\SpecificInterface; use FireflyIII\Models\ImportJob; use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; use Illuminate\Support\Collection; -use Iterator; use League\Csv\Reader; +use League\Csv\Statement; use Log; /** @@ -62,6 +62,7 @@ class CsvProcessor implements FileProcessorInterface /** * @return Collection + * * @throws FireflyException */ public function getObjects(): Collection @@ -78,9 +79,8 @@ class CsvProcessor implements FileProcessorInterface * * @return bool * - * @throws \League\Csv\Exception - * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException * @throws FireflyException + * @throws \League\Csv\Exception */ public function run(): bool { @@ -193,6 +193,7 @@ class CsvProcessor implements FileProcessorInterface * Shorthand method to return configuration. * * @codeCoverageIgnore + * * @return array */ private function getConfig(): array @@ -201,29 +202,35 @@ class CsvProcessor implements FileProcessorInterface } /** - * @return Iterator + * @return array * * @throws \League\Csv\Exception * @throws \League\Csv\Exception */ - private function getImportArray(): Iterator + private function getImportArray(): array { $content = $this->repository->uploadFileContents($this->job); $config = $this->getConfig(); $reader = Reader::createFromString($content); $delimiter = $config['delimiter'] ?? ','; $hasHeaders = isset($config['has-headers']) ? $config['has-headers'] : false; + $offset = 0; if ('tab' === $delimiter) { $delimiter = "\t"; // @codeCoverageIgnore } $reader->setDelimiter($delimiter); if ($hasHeaders) { - $reader->setHeaderOffset(0); // @codeCoverageIgnore + $offset = 1; + } + $stmt = (new Statement)->offset($offset); + $records = $stmt->process($reader); + $return = []; + foreach ($records as $record) { + $return[] = $record; } - $results = $reader->getRecords(); Log::debug('Created a CSV reader.'); - return $results; + return $return; } /** @@ -232,6 +239,7 @@ class CsvProcessor implements FileProcessorInterface * @param int $jsonError * * @codeCoverageIgnore + * * @return string */ private function getJsonError(int $jsonError): string @@ -273,9 +281,8 @@ class CsvProcessor implements FileProcessorInterface if (false === $json) { throw new FireflyException(sprintf('Error while encoding JSON for CSV row: %s', $this->getJsonError($jsonError))); // @codeCoverageIgnore } - $hash = hash('sha256', $json); - return $hash; + return hash('sha256', $json); } /** @@ -332,11 +339,8 @@ class CsvProcessor implements FileProcessorInterface { $hash = $this->getRowHash($array); $count = $this->repository->countByHash($hash); - if ($count > 0) { - return true; - } - return false; + return $count > 0; } /** diff --git a/app/Import/Logging/CommandHandler.php b/app/Import/Logging/CommandHandler.php index eb1d9c1b7a..f52fe8a71b 100644 --- a/app/Import/Logging/CommandHandler.php +++ b/app/Import/Logging/CommandHandler.php @@ -54,7 +54,7 @@ class CommandHandler extends AbstractProcessingHandler */ protected function write(array $record) { - $this->command->line((string)trim($record['formatted'])); + $this->command->line(trim($record['formatted'])); } /** diff --git a/app/Import/Mapper/AssetAccountIbans.php b/app/Import/Mapper/AssetAccountIbans.php index cfbdf46437..20f60ba9cf 100644 --- a/app/Import/Mapper/AssetAccountIbans.php +++ b/app/Import/Mapper/AssetAccountIbans.php @@ -53,6 +53,7 @@ class AssetAccountIbans implements MapperInterface $list[$accountId] = $account->name; } } + /** @noinspection AdditionOperationOnArraysInspection */ $list = $topList + $list; asort($list); $list = [0 => trans('import.map_do_not_map')] + $list; diff --git a/app/Import/Object/ImportAccount.php b/app/Import/Object/ImportAccount.php index 990d17d495..638cdfd83a 100644 --- a/app/Import/Object/ImportAccount.php +++ b/app/Import/Object/ImportAccount.php @@ -27,7 +27,6 @@ use FireflyIII\Models\Account; use FireflyIII\Models\AccountType; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\User; -use Illuminate\Support\Collection; use Log; /** @@ -38,6 +37,8 @@ class ImportAccount /** @var Account */ private $account; /** @var array */ + private $accountBic = []; + /** @var array */ private $accountIban = []; /** @var array */ private $accountId = []; @@ -51,7 +52,7 @@ class ImportAccount private $expectedType = ''; /** * This value is used to indicate the other account ID (the opposing transaction's account), - * if it is know. If so, this particular importaccount may never return an Account with this ID. + * if it is know. If so, this particular import account may never return an Account with this ID. * If it would, this would result in a transaction from-to the same account. * * @var int @@ -68,18 +69,18 @@ class ImportAccount public function __construct() { $this->expectedType = AccountType::ASSET; - $this->account = new Account; $this->repository = app(AccountRepositoryInterface::class); Log::debug('Created ImportAccount.'); } /** * @return Account + * * @throws FireflyException */ public function getAccount(): Account { - if (null === $this->account->id) { + if (null === $this->account) { $this->store(); } @@ -88,6 +89,7 @@ class ImportAccount /** * @codeCoverageIgnore + * * @return string */ public function getExpectedType(): string @@ -105,6 +107,14 @@ class ImportAccount $this->expectedType = $expectedType; } + /** + * @param array $accountBic + */ + public function setAccountBic(array $accountBic): void + { + $this->accountBic = $accountBic; + } + /** * @codeCoverageIgnore * @@ -177,43 +187,26 @@ class ImportAccount } /** + * Find account by IBAN and type. + * + * @param AccountType $type + * * @return Account|null - * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ - private function findExistingObject(): ?Account + private function findByIBAN(AccountType $type): ?Account { - Log::debug('In findExistingObject() for Account'); - // 0: determin account type: - /** @var AccountType $accountType */ - $accountType = $this->repository->getAccountType($this->expectedType); - - // 1: find by ID, iban or name (and type) - if (3 === count($this->accountId)) { - Log::debug(sprintf('Finding account of type %d and ID %d', $accountType->id, $this->accountId['value'])); - /** @var Account $account */ - - $account = $this->user->accounts()->where('id', '!=', $this->forbiddenAccountId)->where('account_type_id', $accountType->id)->where( - 'id', - $this->accountId['value'] - )->first(); - if (null !== $account) { - Log::debug(sprintf('Found unmapped %s account by ID (#%d): %s', $this->expectedType, $account->id, $account->name)); - - return $account; - } - Log::debug('Found nothing.'); - } - /** @var Collection $accounts */ - $accounts = $this->repository->getAccountsByType([$accountType->type]); - // Two: find by IBAN (and type): if (3 === count($this->accountIban)) { - $iban = $this->accountIban['value']; - Log::debug(sprintf('Finding account of type %d and IBAN %s', $accountType->id, $iban)); + $accounts = $this->repository->getAccountsByType([$type->type]); + $iban = $this->accountIban['value']; + Log::debug(sprintf('Finding account of type %d and IBAN %s', $type->id, $iban)); $filtered = $accounts->filter( function (Account $account) use ($iban) { if ($account->iban === $iban && $account->id !== $this->forbiddenAccountId) { Log::debug( - sprintf('Found unmapped %s account by IBAN (#%d): %s (%s)', $this->expectedType, $account->id, $account->name, $account->iban) + sprintf( + 'Found unmapped %s account by IBAN (#%d): %s (%s)', + $this->expectedType, $account->id, $account->name, $account->iban + ) ); return $account; @@ -228,10 +221,52 @@ class ImportAccount Log::debug('Found nothing.'); } + return null; + } + + /** + * Find account of type X by its ID. + * + * @param AccountType $type + * + * @return Account|null + */ + private function findById(AccountType $type): ?Account + { + if (3 === count($this->accountId)) { + Log::debug(sprintf('Finding account of type %d and ID %d', $type->id, $this->accountId['value'])); + /** @var Account $account */ + $account = $this->user->accounts() + ->where('id', '!=', $this->forbiddenAccountId) + ->where('account_type_id', $type->id) + ->where('id', $this->accountId['value']) + ->first(); + + if (null !== $account) { + Log::debug(sprintf('Found unmapped %s account by ID (#%d): %s', $this->expectedType, $account->id, $account->name)); + + return $account; + } + Log::debug('Found nothing.'); + } + + return null; + } + + /** + * Find account by account type and name. + * + * @param AccountType $type + * + * @return Account|null + */ + private function findByName(AccountType $type): ?Account + { // Three: find by name (and type): if (3 === count($this->accountName)) { - $name = $this->accountName['value']; - Log::debug(sprintf('Finding account of type %d and name %s', $accountType->id, $name)); + $accounts = $this->repository->getAccountsByType([$type->type]); + $name = $this->accountName['value']; + Log::debug(sprintf('Finding account of type %d and name %s', $type->id, $name)); $filtered = $accounts->filter( function (Account $account) use ($name) { if ($account->name === $name && $account->id !== $this->forbiddenAccountId) { @@ -250,7 +285,36 @@ class ImportAccount Log::debug('Found nothing.'); } - // 4: do not search by account number. + return null; + } + + /** + * Determin account type to find, then use fields in object to try and find it. + * + * @return Account|null + */ + private function findExistingObject(): ?Account + { + Log::debug('In findExistingObject() for Account'); + /** @var AccountType $accountType */ + $accountType = $this->repository->getAccountType($this->expectedType); + $result = $this->findById($accountType); + if (!is_null($result)) { + return $result; + } + + $result = $this->findByIBAN($accountType); + + if (!is_null($result)) { + return $result; + } + + $result = $this->findByName($accountType); + + if (!is_null($result)) { + return $result; + } + Log::debug('Found NO existing accounts.'); return null; @@ -302,9 +366,9 @@ class ImportAccount Log::debug('Finding a mapped account based on', $array); $search = intval($array['mapped'] ?? 0); - $account = $this->repository->find($search); + $account = $this->repository->findNull($search); - if (null === $account->id) { + if (null === $account) { Log::error(sprintf('There is no account with id #%d. Invalid mapping will be ignored!', $search)); return null; @@ -332,6 +396,7 @@ class ImportAccount /** * @return bool + * * @throws FireflyException */ private function store(): bool @@ -339,7 +404,7 @@ class ImportAccount if (is_null($this->user)) { throw new FireflyException('ImportAccount cannot continue without user.'); } - if ((is_null($this->defaultAccountId) || intval($this->defaultAccountId) === 0) && AccountType::ASSET === $this->expectedType) { + if ((is_null($this->defaultAccountId) || 0 === intval($this->defaultAccountId)) && AccountType::ASSET === $this->expectedType) { throw new FireflyException('ImportAccount cannot continue without a default account to fall back on.'); } // 1: find mapped object: @@ -372,7 +437,7 @@ class ImportAccount // 4: if search for an asset account, fall back to given "default account" (mandatory) if (AccountType::ASSET === $this->expectedType) { - $this->account = $this->repository->find($this->defaultAccountId); + $this->account = $this->repository->findNull($this->defaultAccountId); Log::debug(sprintf('Fall back to default account #%d "%s"', $this->account->id, $this->account->name)); return true; @@ -388,6 +453,7 @@ class ImportAccount 'active' => true, 'virtualBalance' => '0', 'account_type_id' => null, + 'BIC' => $this->accountBic['value'] ?? null, ]; $this->account = $this->repository->store($data); diff --git a/app/Import/Object/ImportBill.php b/app/Import/Object/ImportBill.php index f27eaaf070..32061504a2 100644 --- a/app/Import/Object/ImportBill.php +++ b/app/Import/Object/ImportBill.php @@ -25,7 +25,6 @@ namespace FireflyIII\Import\Object; use FireflyIII\Models\Bill; use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\User; -use Illuminate\Support\Collection; use Log; use Steam; @@ -52,7 +51,6 @@ class ImportBill */ public function __construct() { - $this->bill = new Bill; $this->repository = app(BillRepositoryInterface::class); Log::debug('Created ImportBill.'); } @@ -62,7 +60,7 @@ class ImportBill */ public function getBill(): Bill { - if (null === $this->bill->id) { + if (null === $this->bill) { $this->store(); } @@ -103,13 +101,10 @@ class ImportBill } /** - * @return Bill + * @return Bill|null */ - private function findExistingObject(): Bill + private function findById(): ?Bill { - Log::debug('In findExistingObject() for Bill'); - // 1: find by ID, or name - if (3 === count($this->id)) { Log::debug(sprintf('Finding bill with ID #%d', $this->id['value'])); /** @var Bill $bill */ @@ -121,9 +116,16 @@ class ImportBill } Log::debug('Found nothing.'); } - // 2: find by name + + return null; + } + + /** + * @return Bill|null + */ + private function findByName(): ?Bill + { if (3 === count($this->name)) { - /** @var Collection $bills */ $bills = $this->repository->getBills(); $name = $this->name['value']; Log::debug(sprintf('Finding bill with name %s', $name)); @@ -145,16 +147,33 @@ class ImportBill Log::debug('Found nothing.'); } - // 4: do not search by account number. - Log::debug('Found NO existing bills.'); - - return new Bill; + return null; } /** - * @return Bill + * @return Bill|null */ - private function findMappedObject(): Bill + private function findExistingObject(): ?Bill + { + Log::debug('In findExistingObject() for Bill'); + $result = $this->findById(); + if (!is_null($result)) { + return $result; + } + $result = $this->findByName(); + if (!is_null($result)) { + return $result; + } + + Log::debug('Found NO existing bills.'); + + return null; + } + + /** + * @return Bill|null + */ + private function findMappedObject(): ?Bill { Log::debug('In findMappedObject() for Bill'); $fields = ['id', 'name']; @@ -163,7 +182,7 @@ class ImportBill Log::debug(sprintf('Find mapped bill based on field "%s" with value', $field), $array); // check if a pre-mapped object exists. $mapped = $this->getMappedObject($array); - if (null !== $mapped->id) { + if (null !== $mapped) { Log::debug(sprintf('Found bill #%d!', $mapped->id)); return $mapped; @@ -171,7 +190,7 @@ class ImportBill } Log::debug('Found no bill on mapped data or no map present.'); - return new Bill; + return null; } /** @@ -179,19 +198,19 @@ class ImportBill * * @return Bill */ - private function getMappedObject(array $array): Bill + private function getMappedObject(array $array): ?Bill { Log::debug('In getMappedObject() for Bill'); if (0 === count($array)) { Log::debug('Array is empty, nothing will come of this.'); - return new Bill; + return null; } if (array_key_exists('mapped', $array) && null === $array['mapped']) { Log::debug(sprintf('No map present for value "%s". Return NULL.', $array['value'])); - return new Bill; + return null; } Log::debug('Finding a mapped bill based on', $array); @@ -202,7 +221,7 @@ class ImportBill if (null === $bill) { Log::error(sprintf('There is no bill with id #%d. Invalid mapping will be ignored!', $search)); - return new Bill; + return null; } Log::debug(sprintf('Found bill! #%d ("%s"). Return it', $bill->id, $bill->name)); @@ -217,14 +236,14 @@ class ImportBill { // 1: find mapped object: $mapped = $this->findMappedObject(); - if (null !== $mapped->id) { + if (null !== $mapped) { $this->bill = $mapped; return true; } // 2: find existing by given values: $found = $this->findExistingObject(); - if (null !== $found->id) { + if (null !== $found) { $this->bill = $found; return true; diff --git a/app/Import/Object/ImportBudget.php b/app/Import/Object/ImportBudget.php index a45de9d5d6..5327855d89 100644 --- a/app/Import/Object/ImportBudget.php +++ b/app/Import/Object/ImportBudget.php @@ -25,7 +25,6 @@ namespace FireflyIII\Import\Object; use FireflyIII\Models\Budget; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; use FireflyIII\User; -use Illuminate\Support\Collection; use Log; /** @@ -49,17 +48,16 @@ class ImportBudget */ public function __construct() { - $this->budget = new Budget; $this->repository = app(BudgetRepositoryInterface::class); Log::debug('Created ImportBudget.'); } /** - * @return Budget + * @return Budget|null */ - public function getBudget(): Budget + public function getBudget(): ?Budget { - if (null === $this->budget->id) { + if (null === $this->budget) { $this->store(); } @@ -92,27 +90,31 @@ class ImportBudget } /** - * @return Budget + * @return Budget|null */ - private function findExistingObject(): Budget + private function findById(): ?Budget { - Log::debug('In findExistingObject() for Budget'); - // 1: find by ID, or name - if (3 === count($this->id)) { Log::debug(sprintf('Finding budget with ID #%d', $this->id['value'])); /** @var Budget $budget */ - $budget = $this->repository->find(intval($this->id['value'])); - if (null !== $budget->id) { + $budget = $this->repository->findNull(intval($this->id['value'])); + if (null !== $budget) { Log::debug(sprintf('Found unmapped budget by ID (#%d): %s', $budget->id, $budget->name)); return $budget; } Log::debug('Found nothing.'); } - // 2: find by name + + return null; + } + + /** + * @return Budget|null + */ + private function findByName(): ?Budget + { if (3 === count($this->name)) { - /** @var Collection $budgets */ $budgets = $this->repository->getBudgets(); $name = $this->name['value']; Log::debug(sprintf('Finding budget with name %s', $name)); @@ -134,16 +136,33 @@ class ImportBudget Log::debug('Found nothing.'); } - // 4: do not search by account number. - Log::debug('Found NO existing budgets.'); - - return new Budget; + return null; } /** * @return Budget */ - private function findMappedObject(): Budget + private function findExistingObject(): ?Budget + { + Log::debug('In findExistingObject() for Budget'); + $result = $this->findById(); + if (!is_null($result)) { + return $result; + } + $result = $this->findByName(); + if (!is_null($result)) { + return $result; + } + + Log::debug('Found NO existing budgets.'); + + return null; + } + + /** + * @return Budget + */ + private function findMappedObject(): ?Budget { Log::debug('In findMappedObject() for Budget'); $fields = ['id', 'name']; @@ -152,7 +171,7 @@ class ImportBudget Log::debug(sprintf('Find mapped budget based on field "%s" with value', $field), $array); // check if a pre-mapped object exists. $mapped = $this->getMappedObject($array); - if (null !== $mapped->id) { + if (null !== $mapped) { Log::debug(sprintf('Found budget #%d!', $mapped->id)); return $mapped; @@ -160,7 +179,7 @@ class ImportBudget } Log::debug('Found no budget on mapped data or no map present.'); - return new Budget; + return null; } /** @@ -168,19 +187,19 @@ class ImportBudget * * @return Budget */ - private function getMappedObject(array $array): Budget + private function getMappedObject(array $array): ?Budget { Log::debug('In getMappedObject() for Budget'); if (0 === count($array)) { Log::debug('Array is empty, nothing will come of this.'); - return new Budget; + return null; } if (array_key_exists('mapped', $array) && null === $array['mapped']) { Log::debug(sprintf('No map present for value "%s". Return NULL.', $array['value'])); - return new Budget; + return null; } Log::debug('Finding a mapped budget based on', $array); @@ -191,7 +210,7 @@ class ImportBudget if (null === $budget->id) { Log::error(sprintf('There is no budget with id #%d. Invalid mapping will be ignored!', $search)); - return new Budget; + return null; } Log::debug(sprintf('Found budget! #%d ("%s"). Return it', $budget->id, $budget->name)); @@ -206,14 +225,14 @@ class ImportBudget { // 1: find mapped object: $mapped = $this->findMappedObject(); - if (null !== $mapped->id) { + if (null !== $mapped) { $this->budget = $mapped; return true; } // 2: find existing by given values: $found = $this->findExistingObject(); - if (null !== $found->id) { + if (null !== $found) { $this->budget = $found; return true; diff --git a/app/Import/Object/ImportCategory.php b/app/Import/Object/ImportCategory.php index 3c899f1664..176ce6fc0c 100644 --- a/app/Import/Object/ImportCategory.php +++ b/app/Import/Object/ImportCategory.php @@ -25,7 +25,6 @@ namespace FireflyIII\Import\Object; use FireflyIII\Models\Category; use FireflyIII\Repositories\Category\CategoryRepositoryInterface; use FireflyIII\User; -use Illuminate\Support\Collection; use Log; /** @@ -49,17 +48,16 @@ class ImportCategory */ public function __construct() { - $this->category = new Category(); $this->repository = app(CategoryRepositoryInterface::class); Log::debug('Created ImportCategory.'); } /** - * @return Category + * @return null|Category */ - public function getCategory(): Category + public function getCategory(): ?Category { - if (null === $this->category->id) { + if (null === $this->category) { $this->store(); } @@ -92,27 +90,35 @@ class ImportCategory } /** - * @return Category + * Find category by ID. + * + * @return Category|null */ - private function findExistingObject(): Category + private function findById(): ?Category { - Log::debug('In findExistingObject() for Category'); - // 1: find by ID, or name - if (3 === count($this->id)) { Log::debug(sprintf('Finding category with ID #%d', $this->id['value'])); /** @var Category $category */ - $category = $this->repository->find(intval($this->id['value'])); - if (null !== $category->id) { + $category = $this->repository->findNull(intval($this->id['value'])); + if (null !== $category) { Log::debug(sprintf('Found unmapped category by ID (#%d): %s', $category->id, $category->name)); return $category; } Log::debug('Found nothing.'); } - // 2: find by name + + return null; + } + + /** + * Find category by name. + * + * @return Category|null + */ + private function findByName(): ?Category + { if (3 === count($this->name)) { - /** @var Collection $categories */ $categories = $this->repository->getCategories(); $name = $this->name['value']; Log::debug(sprintf('Finding category with name %s', $name)); @@ -134,16 +140,34 @@ class ImportCategory Log::debug('Found nothing.'); } - // 4: do not search by account number. - Log::debug('Found NO existing categories.'); - - return new Category; + return null; } /** * @return Category */ - private function findMappedObject(): Category + private function findExistingObject(): ?Category + { + Log::debug('In findExistingObject() for Category'); + $result = $this->findById(); + if (!is_null($result)) { + return $result; + } + + $result = $this->findByName(); + if (!is_null($result)) { + return $result; + } + + Log::debug('Found NO existing categories.'); + + return null; + } + + /** + * @return Category + */ + private function findMappedObject(): ?Category { Log::debug('In findMappedObject() for Category'); $fields = ['id', 'name']; @@ -152,7 +176,7 @@ class ImportCategory Log::debug(sprintf('Find mapped category based on field "%s" with value', $field), $array); // check if a pre-mapped object exists. $mapped = $this->getMappedObject($array); - if (null !== $mapped->id) { + if (null !== $mapped) { Log::debug(sprintf('Found category #%d!', $mapped->id)); return $mapped; @@ -160,7 +184,7 @@ class ImportCategory } Log::debug('Found no category on mapped data or no map present.'); - return new Category; + return null; } /** @@ -168,30 +192,30 @@ class ImportCategory * * @return Category */ - private function getMappedObject(array $array): Category + private function getMappedObject(array $array): ?Category { Log::debug('In getMappedObject() for Category'); if (0 === count($array)) { Log::debug('Array is empty, nothing will come of this.'); - return new Category; + return null; } if (array_key_exists('mapped', $array) && null === $array['mapped']) { Log::debug(sprintf('No map present for value "%s". Return NULL.', $array['value'])); - return new Category; + return null; } Log::debug('Finding a mapped category based on', $array); $search = intval($array['mapped']); - $category = $this->repository->find($search); + $category = $this->repository->findNull($search); - if (null === $category->id) { + if (null === $category) { Log::error(sprintf('There is no category with id #%d. Invalid mapping will be ignored!', $search)); - return new Category; + return null; } Log::debug(sprintf('Found category! #%d ("%s"). Return it', $category->id, $category->name)); @@ -206,14 +230,14 @@ class ImportCategory { // 1: find mapped object: $mapped = $this->findMappedObject(); - if (null !== $mapped->id) { + if (null !== $mapped) { $this->category = $mapped; return true; } // 2: find existing by given values: $found = $this->findExistingObject(); - if (null !== $found->id) { + if (null !== $found) { $this->category = $found; return true; @@ -226,11 +250,7 @@ class ImportCategory Log::debug('Found no category so must create one ourselves.'); - $data = [ - 'name' => $name, - ]; - - $this->category = $this->repository->store($data); + $this->category = $this->repository->store(['name' => $name]); Log::debug(sprintf('Successfully stored new category #%d: %s', $this->category->id, $this->category->name)); return true; diff --git a/app/Import/Object/ImportCurrency.php b/app/Import/Object/ImportCurrency.php index 9a459d4c24..d375048024 100644 --- a/app/Import/Object/ImportCurrency.php +++ b/app/Import/Object/ImportCurrency.php @@ -52,23 +52,22 @@ class ImportCurrency */ public function __construct() { - $this->currency = new TransactionCurrency; $this->repository = app(CurrencyRepositoryInterface::class); } /** * @return TransactionCurrency */ - public function getTransactionCurrency(): TransactionCurrency + public function getTransactionCurrency(): ?TransactionCurrency { - if (null !== $this->currency->id) { + if (null !== $this->currency) { return $this->currency; } Log::debug('In createCurrency()'); // check if any of them is mapped: $mapped = $this->findMappedObject(); - if (null !== $mapped->id) { + if (null !== $mapped) { Log::debug('Mapped existing currency.', ['new' => $mapped->toArray()]); $this->currency = $mapped; @@ -76,7 +75,7 @@ class ImportCurrency } $searched = $this->findExistingObject(); - if (null !== $searched->id) { + if (null !== $searched) { Log::debug('Found existing currency.', ['found' => $searched->toArray()]); $this->currency = $searched; @@ -91,7 +90,7 @@ class ImportCurrency if (null === $data['code']) { Log::debug('Need at least a code to create currency, return nothing.'); - return new TransactionCurrency(); + return null; } Log::debug('Search for maps resulted in nothing, create new one based on', $data); @@ -147,33 +146,34 @@ class ImportCurrency /** * @return TransactionCurrency */ - private function findExistingObject(): TransactionCurrency + private function findExistingObject(): ?TransactionCurrency { $search = [ - 'id' => 'find', - 'code' => 'findByCode', - 'symbol' => 'findBySymbol', - 'name' => 'findByName', + 'id' => 'findNull', + 'code' => 'findByCodeNull', + 'symbol' => 'findBySymbolNull', + 'name' => 'findByNameNull', ]; foreach ($search as $field => $function) { $value = $this->$field['value'] ?? null; if (null !== $value) { Log::debug(sprintf('Searching for %s using function %s and value %s', $field, $function, $value)); + /** @var TransactionCurrency|null $currency */ $currency = $this->repository->$function($value); - if (null !== $currency->id) { + if (null !== $currency) { return $currency; } } } - return new TransactionCurrency(); + return null; } /** * @return TransactionCurrency */ - private function findMappedObject(): TransactionCurrency + private function findMappedObject(): ?TransactionCurrency { Log::debug('In findMappedObject()'); $fields = ['id', 'code', 'name', 'symbol']; @@ -182,7 +182,7 @@ class ImportCurrency Log::debug(sprintf('Find mapped currency based on field "%s" with value', $field), $array); // check if a pre-mapped object exists. $mapped = $this->getMappedObject($array); - if (null !== $mapped->id) { + if (null !== $mapped) { Log::debug(sprintf('Found currency #%d!', $mapped->id)); return $mapped; @@ -190,7 +190,7 @@ class ImportCurrency } Log::debug('Found no currency on mapped data or no map present.'); - return new TransactionCurrency; + return null; } /** @@ -198,30 +198,30 @@ class ImportCurrency * * @return TransactionCurrency */ - private function getMappedObject(array $array): TransactionCurrency + private function getMappedObject(array $array): ?TransactionCurrency { Log::debug('In getMappedObject()'); if (0 === count($array)) { Log::debug('Array is empty, nothing will come of this.'); - return new TransactionCurrency; + return null; } if (array_key_exists('mapped', $array) && null === $array['mapped']) { Log::debug(sprintf('No map present for value "%s". Return NULL.', $array['value'])); - return new TransactionCurrency; + return null; } Log::debug('Finding a mapped object based on', $array); $search = intval($array['mapped']); - $currency = $this->repository->find($search); + $currency = $this->repository->findNull($search); - if (null === $currency->id) { + if (null === $currency) { Log::error(sprintf('There is no currency with id #%d. Invalid mapping will be ignored!', $search)); - return new TransactionCurrency; + return null; } Log::debug(sprintf('Found currency! #%d ("%s"). Return it', $currency->id, $currency->name)); diff --git a/app/Import/Object/ImportJournal.php b/app/Import/Object/ImportJournal.php index 740e60e0cf..1b8d04bfd9 100644 --- a/app/Import/Object/ImportJournal.php +++ b/app/Import/Object/ImportJournal.php @@ -24,6 +24,7 @@ namespace FireflyIII\Import\Object; use Carbon\Carbon; use FireflyIII\Exceptions\FireflyException; +use FireflyIII\Import\Converter\Amount; use FireflyIII\Import\Converter\ConverterInterface; use FireflyIII\Import\MapperPreProcess\PreProcessorInterface; use FireflyIII\User; @@ -36,6 +37,7 @@ use Steam; */ class ImportJournal { + /** @var ImportAccount */ public $asset; /** @var ImportBill */ @@ -54,6 +56,8 @@ class ImportJournal public $hash; /** @var array */ public $metaDates = []; + /** @var array */ + public $metaFields = []; /** @var string */ public $notes = ''; /** @var ImportAccount */ @@ -154,6 +158,80 @@ class ImportJournal return $this->description; } + /** + * @return string|null + */ + public function getForeignAmount(): ?string + { + Log::debug('Now in getForeignAmount()'); + Log::debug(sprintf('foreign amount is %s', var_export($this->foreignAmount, true))); + + // no foreign amount? return null + if (null === $this->foreignAmount) { + Log::debug('Return NULL for foreign amount'); + + return null; + } + // converter is default amount converter: no special stuff + $converter = app(Amount::class); + $amount = $converter->convert($this->foreignAmount['value']); + Log::debug(sprintf('First attempt to convert foreign gives "%s"', $amount)); + // 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) { + $amount = Steam::negative($amount); + } + Log::debug(sprintf('Foreign amount after conversion is %s', $amount)); + } + + Log::debug(sprintf('After modifiers the result is: "%s"', $amount)); + + + Log::debug(sprintf('converted foreign amount is: "%s"', $amount)); + if (0 === bccomp($amount, '0')) { + return null; + } + + return $amount; + } + + /** + * Get date field or NULL + * + * @param string $field + * + * @return Carbon|null + */ + public function getMetaDate(string $field): ?Carbon + { + if (isset($this->metaDates[$field])) { + return new Carbon($this->metaDates[$field]); + } + + return null; + } + + /** + * Get string field or NULL + * + * @param string $field + * + * @return string|null + */ + public function getMetaString(string $field): ?string + { + if (isset($this->metaFields[$field]) && strlen($this->metaFields[$field]) > 0) { + return strval($this->metaFields[$field]); + } + + return null; + } + + /** * @param string $hash */ @@ -192,6 +270,18 @@ class ImportJournal case 'account-id': $this->asset->setAccountId($array); break; + case 'sepa-cc': + case 'sepa-ct-op': + case 'sepa-ct-id': + case 'sepa-db': + case 'sepa-country': + case 'sepa-ep': + case 'sepa-ci': + $value = trim(strval($array['value'])); + if (strlen($value) > 0) { + $this->metaFields[$array['role']] = $value; + } + break; case 'amount': $this->amount = $array; break; @@ -199,7 +289,7 @@ class ImportJournal $this->foreignAmount = $array; break; case 'foreign-currency-code': - $this->foreignCurrency->setId($array); + $this->foreignCurrency->setCode($array); break; case 'amount_debit': $this->amountDebit = $array; @@ -252,12 +342,6 @@ class ImportJournal case 'description': $this->description .= $array['value']; break; - case 'sepa-ct-op': - case 'sepa-ct-id': - case 'sepa-db': - $this->notes .= ' ' . $array['value']; - $this->notes = trim($this->notes); - break; case 'note': $this->notes .= ' ' . $array['value']; $this->notes = trim($this->notes); @@ -265,6 +349,9 @@ class ImportJournal case 'external-id': $this->externalId = $array['value']; break; + case 'internal-reference': + $this->metaFields['internal_reference'] = $array['value']; + break; case '_ignore': break; case 'ing-debit-credit': @@ -283,6 +370,9 @@ class ImportJournal case 'opposing-id': $this->opposing->setAccountId($array); break; + case 'opposing-bic': + $this->opposing->setAccountBic($array); + break; case 'tags-comma': case 'tags-space': $this->setTags($array); @@ -296,6 +386,15 @@ class ImportJournal case 'date-process': $this->metaDates['process_date'] = $array['value']; break; + case 'date-due': + $this->metaDates['due_date'] = $array['value']; + break; + case 'date-payment': + $this->metaDates['payment_date'] = $array['value']; + break; + case 'date-invoice': + $this->metaDates['invoice_date'] = $array['value']; + break; } } @@ -316,7 +415,7 @@ class ImportJournal throw new FireflyException('No amount information for this row.'); } $class = $info['class'] ?? ''; - if (strlen($class) === 0) { + if (0 === strlen($class)) { throw new FireflyException('No amount information (conversion class) for this row.'); } @@ -379,7 +478,5 @@ class ImportJournal $preProcessor = app(sprintf('\FireflyIII\Import\MapperPreProcess\%s', $preProcessorClass)); $tags = $preProcessor->run($array['value']); $this->tags = array_merge($this->tags, $tags); - - return; } } diff --git a/app/Import/Prerequisites/BunqPrerequisites.php b/app/Import/Prerequisites/BunqPrerequisites.php index a82345c8db..7c982c9bec 100644 --- a/app/Import/Prerequisites/BunqPrerequisites.php +++ b/app/Import/Prerequisites/BunqPrerequisites.php @@ -22,21 +22,11 @@ declare(strict_types=1); namespace FireflyIII\Import\Prerequisites; -use FireflyIII\Exceptions\FireflyException; -use FireflyIII\Services\Bunq\Id\DeviceServerId; -use FireflyIII\Services\Bunq\Object\DeviceServer; -use FireflyIII\Services\Bunq\Object\ServerPublicKey; -use FireflyIII\Services\Bunq\Request\DeviceServerRequest; -use FireflyIII\Services\Bunq\Request\InstallationTokenRequest; -use FireflyIII\Services\Bunq\Request\ListDeviceServerRequest; -use FireflyIII\Services\Bunq\Token\InstallationToken; use FireflyIII\User; use Illuminate\Http\Request; use Illuminate\Support\MessageBag; use Log; use Preferences; -use Requests; -use Requests_Exception; /** * This class contains all the routines necessary to connect to Bunq. @@ -53,6 +43,8 @@ class BunqPrerequisites implements PrerequisitesInterface */ public function getView(): string { + Log::debug('Now in BunqPrerequisites::getView()'); + return 'import.bunq.prerequisites'; } @@ -63,7 +55,14 @@ class BunqPrerequisites implements PrerequisitesInterface */ public function getViewParameters(): array { - return []; + Log::debug('Now in BunqPrerequisites::getViewParameters()'); + $apiKey = Preferences::getForUser($this->user, 'bunq_api_key', null); + $string = ''; + if (!is_null($apiKey)) { + $string = $apiKey->data; + } + + return ['key' => $string]; } /** @@ -75,9 +74,15 @@ class BunqPrerequisites implements PrerequisitesInterface */ public function hasPrerequisites(): bool { + Log::debug('Now in BunqPrerequisites::hasPrerequisites()'); $apiKey = Preferences::getForUser($this->user, 'bunq_api_key', false); + $result = (false === $apiKey->data || null === $apiKey->data); - return false === $apiKey->data || null === $apiKey->data; + Log::debug(sprintf('Is apiKey->data false? %s', var_export(false === $apiKey->data, true))); + Log::debug(sprintf('Is apiKey->data NULL? %s', var_export(null === $apiKey->data, true))); + Log::debug(sprintf('Result is: %s', var_export($result, true))); + + return $result; } /** @@ -87,6 +92,7 @@ class BunqPrerequisites implements PrerequisitesInterface */ public function setUser(User $user): void { + Log::debug(sprintf('Now in setUser(#%d)', $user->id)); $this->user = $user; return; @@ -105,236 +111,7 @@ class BunqPrerequisites implements PrerequisitesInterface $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 - * @throws \Exception - */ - 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 (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 (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 (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 (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 (200 !== $response->status_code) { - throw new FireflyException(sprintf('Could not retrieve external IP: %d %s', $response->status_code, $response->body)); - } - $serverIp = $response->body; - Preferences::setForUser($this->user, 'external_ip', $serverIp); - - return $serverIp; - } - - 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. - * - * @throws FireflyException - * @throws FireflyException - * @throws \Exception - */ - private function registerDevice(): DeviceServerId - { - Log::debug('Now in registerDevice'); - $deviceServerId = Preferences::getForUser($this->user, 'bunq_device_server_id', null); - $serverIp = $this->getRemoteIp(); - if (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 (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; + return new MessageBag; } } diff --git a/app/Import/Prerequisites/FilePrerequisites.php b/app/Import/Prerequisites/FilePrerequisites.php index e0a9219218..72ed8fab76 100644 --- a/app/Import/Prerequisites/FilePrerequisites.php +++ b/app/Import/Prerequisites/FilePrerequisites.php @@ -63,6 +63,7 @@ class FilePrerequisites implements PrerequisitesInterface * True if prerequisites. False if not. * * @return bool + * * @throws FireflyException */ public function hasPrerequisites(): bool diff --git a/app/Import/Routine/BunqRoutine.php b/app/Import/Routine/BunqRoutine.php new file mode 100644 index 0000000000..e4feb97f1d --- /dev/null +++ b/app/Import/Routine/BunqRoutine.php @@ -0,0 +1,921 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Import\Routine; + +use Carbon\Carbon; +use DB; +use Exception; +use FireflyIII\Exceptions\FireflyException; +use FireflyIII\Factory\AccountFactory; +use FireflyIII\Factory\TransactionJournalFactory; +use FireflyIII\Models\Account; +use FireflyIII\Models\AccountType; +use FireflyIII\Models\ImportJob; +use FireflyIII\Models\TransactionJournalMeta; +use FireflyIII\Models\TransactionType; +use FireflyIII\Repositories\Account\AccountRepositoryInterface; +use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; +use FireflyIII\Repositories\Tag\TagRepositoryInterface; +use FireflyIII\Services\Bunq\Id\DeviceServerId; +use FireflyIII\Services\Bunq\Object\DeviceServer; +use FireflyIII\Services\Bunq\Object\LabelMonetaryAccount; +use FireflyIII\Services\Bunq\Object\MonetaryAccountBank; +use FireflyIII\Services\Bunq\Object\Payment; +use FireflyIII\Services\Bunq\Object\ServerPublicKey; +use FireflyIII\Services\Bunq\Object\UserCompany; +use FireflyIII\Services\Bunq\Object\UserPerson; +use FireflyIII\Services\Bunq\Request\DeviceServerRequest; +use FireflyIII\Services\Bunq\Request\DeviceSessionRequest; +use FireflyIII\Services\Bunq\Request\InstallationTokenRequest; +use FireflyIII\Services\Bunq\Request\ListDeviceServerRequest; +use FireflyIII\Services\Bunq\Request\ListMonetaryAccountRequest; +use FireflyIII\Services\Bunq\Request\ListPaymentRequest; +use FireflyIII\Services\Bunq\Token\InstallationToken; +use FireflyIII\Services\Bunq\Token\SessionToken; +use Illuminate\Support\Collection; +use Log; +use Preferences; +use Requests; + +/** + * Class BunqRoutine + * + * Steps before import: + * 1) register device complete. + * + * Stage: 'initial'. + * + * 1) Get an installation token (if not present) + * 2) Register device (if not found) + * + * Stage 'registered' + * + * 1) Get a session token. (new session) + * 2) store user person / user company + * + * Stage 'logged-in' + * + * Get list of bank accounts + * + * Stage 'have-accounts' + * + * Map accounts to existing accounts + * + * Stage 'do-import'? + */ +class BunqRoutine implements RoutineInterface +{ + /** @var Collection */ + public $errors; + /** @var Collection */ + public $journals; + /** @var int */ + public $lines = 0; + /** @var AccountFactory */ + private $accountFactory; + /** @var AccountRepositoryInterface */ + private $accountRepository; + /** @var ImportJob */ + private $job; + /** @var TransactionJournalFactory */ + private $journalFactory; + /** @var ImportJobRepositoryInterface */ + private $repository; + + /** + * ImportRoutine constructor. + */ + public function __construct() + { + $this->journals = new Collection; + $this->errors = new Collection; + } + + /** + * @return Collection + */ + public function getErrors(): Collection + { + return $this->errors; + } + + /** + * @return Collection + */ + public function getJournals(): Collection + { + return $this->journals; + } + + /** + * @return int + */ + public function getLines(): int + { + return $this->lines; + } + + /** + * @return bool + * + * @throws FireflyException + */ + public function run(): bool + { + Log::info(sprintf('Start with import job %s using Bunq.', $this->job->key)); + set_time_limit(0); + // this method continues with the job and is called by whenever a stage is + // finished + $this->continueJob(); + + return true; + } + + /** + * @param ImportJob $job + */ + public function setJob(ImportJob $job) + { + $this->job = $job; + $this->repository = app(ImportJobRepositoryInterface::class); + $this->accountRepository = app(AccountRepositoryInterface::class); + $this->accountFactory = app(AccountFactory::class); + $this->journalFactory = app(TransactionJournalFactory::class); + $this->repository->setUser($job->user); + $this->accountRepository->setUser($job->user); + $this->accountFactory->setUser($job->user); + $this->journalFactory->setUser($job->user); + } + + /** + * @throws FireflyException + */ + protected function continueJob() + { + // if in "configuring" + if ('configuring' === $this->getStatus()) { + Log::debug('Job is in configuring stage, will do nothing.'); + + return; + } + $stage = $this->getConfig()['stage'] ?? 'unknown'; + Log::debug(sprintf('Now in continueJob() for stage %s', $stage)); + switch ($stage) { + case 'initial': + // register device and get tokens. + $this->runStageInitial(); + $this->continueJob(); + break; + case 'registered': + // get all bank accounts of user. + $this->runStageRegistered(); + $this->continueJob(); + break; + case 'logged-in': + $this->runStageLoggedIn(); + break; + case 'have-accounts': + // do nothing in this stage. Job should revert to config routine. + break; + case 'have-account-mapping': + $this->setStatus('running'); + $this->runStageHaveAccountMapping(); + + break; + default: + throw new FireflyException(sprintf('No action for stage %s!', $stage)); + break; + } + } + + /** + * @throws FireflyException + */ + protected function runStageInitial() + { + $this->addStep(); + Log::debug('In runStageInitial()'); + $this->setStatus('running'); + + // register the device at Bunq: + $serverId = $this->registerDevice(); + Log::debug(sprintf('Found device server with id %d', $serverId->getId())); + + $config = $this->getConfig(); + $config['stage'] = 'registered'; + $this->setConfig($config); + $this->addStep(); + } + + /** + * Get a session token + userperson + usercompany. Store it in the job. + * + * @throws FireflyException + */ + protected function runStageRegistered(): void + { + $this->addStep(); + Log::debug('Now in runStageRegistered()'); + $apiKey = Preferences::getForUser($this->job->user, 'bunq_api_key')->data; + $serverPublicKey = Preferences::getForUser($this->job->user, 'bunq_server_public_key')->data; + $installationToken = $this->getInstallationToken(); + $request = new DeviceSessionRequest; + $request->setInstallationToken($installationToken); + $request->setPrivateKey($this->getPrivateKey()); + $request->setServerPublicKey($serverPublicKey); + $request->setSecret($apiKey); + $request->call(); + $this->addStep(); + + Log::debug('Requested new session.'); + + $deviceSession = $request->getDeviceSessionId(); + $userPerson = $request->getUserPerson(); + $userCompany = $request->getUserCompany(); + $sessionToken = $request->getSessionToken(); + + $config = $this->getConfig(); + $config['device_session_id'] = $deviceSession->toArray(); + $config['user_person'] = $userPerson->toArray(); + $config['user_company'] = $userCompany->toArray(); + $config['session_token'] = $sessionToken->toArray(); + $config['stage'] = 'logged-in'; + $this->setConfig($config); + $this->addStep(); + + Log::debug('Session stored in job.'); + + return; + } + + /** + * Shorthand method. + */ + private function addStep() + { + $this->addSteps(1); + } + + /** + * Shorthand method. + * + * @param int $count + */ + private function addSteps(int $count) + { + $this->repository->addStepsDone($this->job, $count); + } + + /** + * Shorthand + * + * @param int $steps + */ + private function addTotalSteps(int $steps) + { + $this->repository->addTotalSteps($this->job, $steps); + } + + /** + * @param int $paymentId + * + * @return bool + */ + private function alreadyImported(int $paymentId): bool + { + $count = TransactionJournalMeta::where('name', 'bunq_payment_id') + ->where('data', json_encode($paymentId))->count(); + + Log::debug(sprintf('Transaction #%d is %d time(s) in the database.', $paymentId, $count)); + + return $count > 0; + } + + /** + * @param LabelMonetaryAccount $party + * @param string $expectedType + * + * @return Account + * @throws \FireflyIII\Exceptions\FireflyException + * @throws FireflyException + */ + private function convertToAccount(LabelMonetaryAccount $party, string $expectedType): Account + { + Log::debug('in convertToAccount()'); + // find opposing party by IBAN first. + $result = $this->accountRepository->findByIbanNull($party->getIban(), [$expectedType]); + if (!is_null($result)) { + Log::debug(sprintf('Search for %s resulted in account %s (#%d)', $party->getIban(), $result->name, $result->id)); + + return $result; + } + + // try to find asset account just in case: + if ($expectedType !== AccountType::ASSET) { + $result = $this->accountRepository->findByIbanNull($party->getIban(), [AccountType::ASSET]); + if (!is_null($result)) { + Log::debug(sprintf('Search for Asset "%s" resulted in account %s (#%d)', $party->getIban(), $result->name, $result->id)); + + return $result; + } + } + // create new account: + $data = [ + 'user_id' => $this->job->user_id, + 'iban' => $party->getIban(), + 'name' => $party->getLabelUser()->getDisplayName(), + 'account_type_id' => null, + 'accountType' => $expectedType, + 'virtualBalance' => null, + 'active' => true, + + ]; + $account = $this->accountFactory->create($data); + Log::debug( + sprintf( + 'Converted label monetary account %s to %s account %s (#%d)', + $party->getLabelUser()->getDisplayName(), + $expectedType, + $account->name, $account->id + ) + ); + + return $account; + } + + /** + * 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('Now in createKeyPair()'); + $private = Preferences::getForUser($this->job->user, 'bunq_private_key', null); + $public = Preferences::getForUser($this->job->user, 'bunq_public_key', null); + + if (!(null === $private && null === $public)) { + Log::info('Already have public and private key, return NULL.'); + + return; + } + + 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->job->user, 'bunq_private_key', $privKey); + Preferences::setForUser($this->job->user, 'bunq_public_key', $pubKey['key']); + Log::debug('Created and stored key pair'); + + return; + } + + /** + * @return array + */ + private function getConfig(): array + { + return $this->repository->getConfiguration($this->job); + } + + /** + * Try to detect the current device ID (in case this instance has been registered already. + * + * @return DeviceServerId + * + * @throws FireflyException + */ + private function getExistingDevice(): ?DeviceServerId + { + Log::debug('Now in getExistingDevice()'); + $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) { + Log::debug(sprintf('This instance is registered as device #%s', $device->getId()->getId())); + + return $device->getId(); + } + } + Log::info('This instance is not yet registered.'); + + return null; + } + + /** + * Shorthand method. + * + * @return array + */ + private function getExtendedStatus(): array + { + return $this->repository->getExtendedStatus($this->job); + } + + /** + * Get the installation token, either from the users preferences or from Bunq. + * + * @return InstallationToken + * + * @throws FireflyException + */ + private function getInstallationToken(): InstallationToken + { + Log::debug('Now in getInstallationToken().'); + $token = Preferences::getForUser($this->job->user, 'bunq_installation_token', null); + if (null !== $token) { + Log::debug('Have installation token, return it.'); + + return $token->data; + } + Log::debug('Have no installation token, request one.'); + + // verify bunq api code: + $publicKey = $this->getPublicKey(); + $request = new InstallationTokenRequest; + $request->setPublicKey($publicKey); + $request->call(); + Log::debug('Sent request for installation token.'); + + $installationToken = $request->getInstallationToken(); + $installationId = $request->getInstallationId(); + $serverPublicKey = $request->getServerPublicKey(); + + Preferences::setForUser($this->job->user, 'bunq_installation_token', $installationToken); + Preferences::setForUser($this->job->user, 'bunq_installation_id', $installationId); + Preferences::setForUser($this->job->user, 'bunq_server_public_key', $serverPublicKey); + + Log::debug('Stored token, ID and pub key.'); + + return $installationToken; + } + + /** + * Get the private key from the users preferences. + * + * @return string + */ + private function getPrivateKey(): string + { + Log::debug('In getPrivateKey()'); + $preference = Preferences::getForUser($this->job->user, 'bunq_private_key', null); + if (null === $preference) { + Log::debug('private key is null'); + // create key pair + $this->createKeyPair(); + } + $preference = Preferences::getForUser($this->job->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('Now in getPublicKey()'); + $preference = Preferences::getForUser($this->job->user, 'bunq_public_key', null); + if (null === $preference) { + Log::debug('public key is NULL.'); + // create key pair + $this->createKeyPair(); + } + $preference = Preferences::getForUser($this->job->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->job->user, 'external_ip', null); + if (null === $preference) { + try { + $response = Requests::get('https://api.ipify.org'); + } catch (Exception $e) { + throw new FireflyException(sprintf('Could not retrieve external IP: %s', $e->getMessage())); + } + if (200 !== $response->status_code) { + throw new FireflyException(sprintf('Could not retrieve external IP: %d %s', $response->status_code, $response->body)); + } + $serverIp = $response->body; + Preferences::setForUser($this->job->user, 'external_ip', $serverIp); + + return $serverIp; + } + + return $preference->data; + } + + /** + * Get the public key of the server, necessary to verify server signature. + * + * @return ServerPublicKey + * + * @throws FireflyException + */ + private function getServerPublicKey(): ServerPublicKey + { + $pref = Preferences::getForUser($this->job->user, 'bunq_server_public_key', null)->data; + if (is_null($pref)) { + throw new FireflyException('Cannot determine bunq server public key, but should have it at this point.'); + } + + return $pref; + } + + /** + * Shorthand method. + * + * @return string + */ + private function getStatus(): string + { + return $this->repository->getStatus($this->job); + } + + /** + * Import the transactions that were found. + * + * @param array $payments + * + * @throws FireflyException + */ + private function importPayments(array $payments): void + { + Log::debug('Going to run importPayments()'); + $journals = new Collection; + $config = $this->getConfig(); + foreach ($payments as $accountId => $data) { + Log::debug(sprintf('Now running for bunq account #%d with %d payment(s).', $accountId, count($data['payments']))); + /** @var Payment $payment */ + foreach ($data['payments'] as $index => $payment) { + Log::debug(sprintf('Now at payment #%d with ID #%d', $index, $payment->getId())); + // store or find counter party: + $counterParty = $payment->getCounterParty(); + $amount = $payment->getAmount(); + $paymentId = $payment->getId(); + if ($this->alreadyImported($paymentId)) { + Log::error(sprintf('Already imported bunq payment with id #%d', $paymentId)); + + // add three steps to keep up + $this->addSteps(3); + continue; + } + Log::debug(sprintf('Amount is %s %s', $amount->getCurrency(), $amount->getValue())); + $expected = AccountType::EXPENSE; + if (bccomp($amount->getValue(), '0') === 1) { + // amount + means that its a deposit. + $expected = AccountType::REVENUE; + Log::debug('Will make opposing account revenue.'); + } + $opposing = $this->convertToAccount($counterParty, $expected); + $account = $this->accountRepository->findNull($config['accounts-mapped'][$accountId]); + $type = TransactionType::WITHDRAWAL; + + $this->addStep(); + + Log::debug(sprintf('Will store withdrawal between "%s" (%d) and "%s" (%d)', $account->name, $account->id, $opposing->name, $opposing->id)); + + // start storing stuff: + $source = $account; + $destination = $opposing; + if (bccomp($amount->getValue(), '0') === 1) { + // its a deposit: + $source = $opposing; + $destination = $account; + $type = TransactionType::DEPOSIT; + Log::debug('Will make it a deposit.'); + } + if ($account->accountType->type === AccountType::ASSET && $opposing->accountType->type === AccountType::ASSET) { + $type = TransactionType::TRANSFER; + Log::debug('Both are assets, will make transfer.'); + } + + $storeData = [ + 'user' => $this->job->user_id, + 'type' => $type, + 'date' => $payment->getCreated(), + 'description' => $payment->getDescription(), + 'piggy_bank_id' => null, + 'piggy_bank_name' => null, + 'bill_id' => null, + 'bill_name' => null, + 'tags' => [$payment->getType(), $payment->getSubType()], + 'internal_reference' => $payment->getId(), + 'notes' => null, + 'bunq_payment_id' => $payment->getId(), + 'transactions' => [ + // single transaction: + [ + 'description' => null, + 'amount' => $amount->getValue(), + 'currency_id' => null, + 'currency_code' => $amount->getCurrency(), + 'foreign_amount' => null, + 'foreign_currency_id' => null, + 'foreign_currency_code' => null, + 'budget_id' => null, + 'budget_name' => null, + 'category_id' => null, + 'category_name' => null, + 'source_id' => $source->id, + 'source_name' => null, + 'destination_id' => $destination->id, + 'destination_name' => null, + 'reconciled' => false, + 'identifier' => 0, + ], + ], + ]; + $journal = $this->journalFactory->create($storeData); + Log::debug(sprintf('Stored journal with ID #%d', $journal->id)); + $this->addStep(); + $journals->push($journal); + + } + } + + // link to tag + /** @var TagRepositoryInterface $repository */ + $repository = app(TagRepositoryInterface::class); + $repository->setUser($this->job->user); + $data = [ + 'tag' => trans('import.import_with_key', ['key' => $this->job->key]), + 'date' => new Carbon, + 'description' => null, + 'latitude' => null, + 'longitude' => null, + 'zoomLevel' => null, + 'tagMode' => 'nothing', + ]; + $tag = $repository->store($data); + $extended = $this->getExtendedStatus(); + $extended['tag'] = $tag->id; + $this->setExtendedStatus($extended); + + Log::debug(sprintf('Created tag #%d ("%s")', $tag->id, $tag->tag)); + Log::debug('Looping journals...'); + $tagId = $tag->id; + + foreach ($journals as $journal) { + Log::debug(sprintf('Linking journal #%d to tag #%d...', $journal->id, $tagId)); + DB::table('tag_transaction_journal')->insert(['transaction_journal_id' => $journal->id, 'tag_id' => $tagId]); + $this->addStep(); + } + Log::info(sprintf('Linked %d journals to tag #%d ("%s")', $journals->count(), $tag->id, $tag->tag)); + + // set status to "finished"? + // update job: + $this->setStatus('finished'); + + return; + } + + /** + * 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. + * + * @throws FireflyException + */ + private function registerDevice(): DeviceServerId + { + Log::debug('Now in registerDevice()'); + $deviceServerId = Preferences::getForUser($this->job->user, 'bunq_device_server_id', null); + $serverIp = $this->getRemoteIp(); + if (null !== $deviceServerId) { + Log::debug('Already have device server ID.'); + + return $deviceServerId->data; + } + + Log::debug('Device server ID is null, we have to find an existing one or register a new one.'); + $installationToken = $this->getInstallationToken(); + $serverPublicKey = $this->getServerPublicKey(); + $apiKey = Preferences::getForUser($this->job->user, 'bunq_api_key', ''); + $this->addStep(); + + // try get the current from a list: + $deviceServerId = $this->getExistingDevice(); + $this->addStep(); + if (null !== $deviceServerId) { + Log::debug('Found device server ID in existing devices list.'); + + return $deviceServerId; + } + + Log::debug('Going to create new DeviceServerRequest() because nothing found in existing list.'); + $request = new DeviceServerRequest; + $request->setPrivateKey($this->getPrivateKey()); + $request->setDescription('Firefly III v' . config('firefly.version') . ' for ' . $this->job->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()); + // we really have to quit at this point :( + throw new FireflyException($e->getMessage()); + } + if (is_null($deviceServerId)) { + throw new FireflyException('Was not able to register server with bunq. Please see the log files.'); + } + + Preferences::setForUser($this->job->user, 'bunq_device_server_id', $deviceServerId); + Log::debug(sprintf('Server ID: %s', serialize($deviceServerId))); + + return $deviceServerId; + } + + /** + * Will download the transactions for each account that is selected to be imported from. + * Will of course also update the number of steps and what-not. + * + * @throws FireflyException + */ + private function runStageHaveAccountMapping(): void + { + $config = $this->getConfig(); + $user = new UserPerson($config['user_person']); + $mapping = $config['accounts-mapped']; + $token = new SessionToken($config['session_token']); + $count = 0; + if (0 === $user->getId()) { + $user = new UserCompany($config['user_company']); + Log::debug(sprintf('Will try to get transactions for company #%d', $user->getId())); + } + + $this->addTotalSteps(count($config['accounts']) * 2); + + foreach ($config['accounts'] as $accountData) { + $this->addStep(); + $account = new MonetaryAccountBank($accountData); + $importId = $account->getId(); + if (1 === $mapping[$importId]) { + Log::debug(sprintf('Will grab payments for account %s', $account->getDescription())); + $request = new ListPaymentRequest(); + $request->setPrivateKey($this->getPrivateKey()); + $request->setServerPublicKey($this->getServerPublicKey()); + $request->setSessionToken($token); + $request->setUserId($user->getId()); + $request->setAccount($account); + $request->call(); + $payments = $request->getPayments(); + + // store in array + $all[$account->getId()] = [ + 'account' => $account, + 'import_id' => $importId, + 'payments' => $payments, + ]; + $count += count($payments); + } + Log::debug(sprintf('Total number of payments: %d', $count)); + $this->addStep(); + // add steps for import: + $this->addTotalSteps($count * 3); + $this->importPayments($all); + } + + // update job to be complete, I think? + } + + /** + * @throws FireflyException + */ + private function runStageLoggedIn(): void + { + $this->addStep(); + // grab new session token: + $config = $this->getConfig(); + $token = new SessionToken($config['session_token']); + $user = new UserPerson($config['user_person']); + if (0 === $user->getId()) { + $user = new UserCompany($config['user_company']); + } + + // list accounts request + $request = new ListMonetaryAccountRequest(); + $request->setServerPublicKey($this->getServerPublicKey()); + $request->setPrivateKey($this->getPrivateKey()); + $request->setUserId($user->getId()); + $request->setSessionToken($token); + $request->call(); + $accounts = $request->getMonetaryAccounts(); + $arr = []; + Log::debug(sprintf('Get monetary accounts, found %d accounts.', $accounts->count())); + $this->addStep(); + + /** @var MonetaryAccountBank $account */ + foreach ($accounts as $account) { + $arr[] = $account->toArray(); + } + + $config = $this->getConfig(); + $config['accounts'] = $arr; + $config['stage'] = 'have-accounts'; + $this->setConfig($config); + + // once the accounts are stored, go to configuring stage: + // update job, set status to "configuring". + $this->setStatus('configuring'); + $this->addStep(); + + return; + } + + /** + * Shorthand. + * + * @param array $config + */ + private function setConfig(array $config): void + { + $this->repository->setConfiguration($this->job, $config); + + return; + } + + /** + * Shorthand method. + * + * @param array $extended + */ + private function setExtendedStatus(array $extended): void + { + $this->repository->setExtendedStatus($this->job, $extended); + + return; + } + + /** + * Shorthand. + * + * @param string $status + */ + private function setStatus(string $status): void + { + $this->repository->setStatus($this->job, $status); + } +} diff --git a/app/Import/Routine/FileRoutine.php b/app/Import/Routine/FileRoutine.php index 121651660f..b4c58bc856 100644 --- a/app/Import/Routine/FileRoutine.php +++ b/app/Import/Routine/FileRoutine.php @@ -113,7 +113,6 @@ class FileRoutine implements RoutineInterface $this->addStep(); Log::debug('Back in run()'); - Log::debug('Updated job...'); Log::debug(sprintf('%d journals in $storage->journals', $storage->journals->count())); $this->journals = $storage->journals; @@ -267,8 +266,6 @@ class FileRoutine implements RoutineInterface private function setExtendedStatus(array $extended): void { $this->repository->setExtendedStatus($this->job, $extended); - - return; } /** diff --git a/app/Import/Routine/SpectreRoutine.php b/app/Import/Routine/SpectreRoutine.php index dfc29781bb..9f035fc4ea 100644 --- a/app/Import/Routine/SpectreRoutine.php +++ b/app/Import/Routine/SpectreRoutine.php @@ -117,8 +117,11 @@ class SpectreRoutine implements RoutineInterface * have-account-mapping: start downloading transactions? * * - * @throws \FireflyIII\Exceptions\FireflyException - * @throws \FireflyIII\Services\Spectre\Exception\SpectreException + * @return bool + * + * @throws FireflyException + * @throws SpectreException + * @throws \Illuminate\Container\EntryNotFoundException */ public function run(): bool { @@ -164,8 +167,10 @@ class SpectreRoutine implements RoutineInterface /** * @return Customer + * * @throws \FireflyIII\Exceptions\FireflyException * @throws \FireflyIII\Services\Spectre\Exception\SpectreException + * @throws \Illuminate\Container\EntryNotFoundException */ protected function createCustomer(): Customer { @@ -184,24 +189,24 @@ class SpectreRoutine implements RoutineInterface $customers = $getCustomerRequest->getCustomers(); /** @var Customer $current */ foreach ($customers as $current) { - if ($current->getIdentifier() === 'default_ff3_customer') { + if ('default_ff3_customer' === $current->getIdentifier()) { $customer = $current; break; } } } - Preferences::setForUser($this->job->user, 'spectre_customer', $customer->toArray()); return $customer; - } /** * @return Customer + * * @throws FireflyException - * @throws \FireflyIII\Services\Spectre\Exception\SpectreException + * @throws SpectreException + * @throws \Illuminate\Container\EntryNotFoundException */ protected function getCustomer(): Customer { @@ -228,8 +233,10 @@ class SpectreRoutine implements RoutineInterface * @param string $returnUri * * @return Token + * * @throws \FireflyIII\Exceptions\FireflyException * @throws \FireflyIII\Services\Spectre\Exception\SpectreException + * @throws \Illuminate\Container\EntryNotFoundException */ protected function getToken(Customer $customer, string $returnUri): Token { @@ -240,12 +247,12 @@ class SpectreRoutine implements RoutineInterface Log::debug('Call to get token is finished'); return $request->getToken(); - } /** * @throws FireflyException * @throws SpectreException + * @throws \Illuminate\Container\EntryNotFoundException */ protected function runStageInitial(): void { @@ -280,6 +287,7 @@ class SpectreRoutine implements RoutineInterface /** * @throws FireflyException * @throws SpectreException + * @throws \Illuminate\Container\EntryNotFoundException */ protected function runStageLoggedIn(): void { @@ -335,8 +343,6 @@ class SpectreRoutine implements RoutineInterface $this->setConfig($config); $this->setStatus('configuring'); $this->addStep(); - - return; } /** @@ -453,16 +459,14 @@ class SpectreRoutine implements RoutineInterface // date: $importJournal->setValue(['role' => 'date-transaction', 'value' => $transaction->getMadeOn()->toIso8601String()]); - // amount $importJournal->setValue(['role' => 'amount', 'value' => $transaction->getAmount()]); $importJournal->setValue(['role' => 'currency-code', 'value' => $transaction->getCurrencyCode()]); - // various meta fields: $importJournal->setValue(['role' => 'category-name', 'value' => $transaction->getCategory()]); $importJournal->setValue(['role' => 'note', 'value' => $notes]); - $importJournal->setValue(['role' => 'tags-comma', 'value' => join(',', $tags)]); + $importJournal->setValue(['role' => 'tags-comma', 'value' => implode(',', $tags)]); $collection->push($importJournal); } } @@ -515,12 +519,12 @@ class SpectreRoutine implements RoutineInterface $this->setStatus('finished'); $this->addStep(); - return; } /** * @throws FireflyException * @throws SpectreException + * @throws \Illuminate\Container\EntryNotFoundException */ private function runStageHaveMapping() { @@ -531,8 +535,8 @@ class SpectreRoutine implements RoutineInterface /** @var array $accountArray */ foreach ($accounts as $accountArray) { $account = new Account($accountArray); - $importId = intval($config['accounts-mapped'][$account->getid()] ?? 0); - $doImport = $importId !== 0 ? true : false; + $importId = intval($config['accounts-mapped'][$account->getId()] ?? 0); + $doImport = 0 !== $importId ? true : false; if (!$doImport) { Log::debug(sprintf('Will NOT import from Spectre account #%d ("%s")', $account->getId(), $account->getName())); continue; @@ -552,7 +556,6 @@ class SpectreRoutine implements RoutineInterface Log::debug(sprintf('Total number of transactions: %d', $count)); $this->addStep(); - $this->importTransactions($all); } @@ -565,7 +568,6 @@ class SpectreRoutine implements RoutineInterface { $this->repository->setConfiguration($this->job, $config); - return; } /** @@ -577,7 +579,6 @@ class SpectreRoutine implements RoutineInterface { $this->repository->setExtendedStatus($this->job, $extended); - return; } /** diff --git a/app/Import/Storage/ImportStorage.php b/app/Import/Storage/ImportStorage.php index 87e0c45c76..619e77d768 100644 --- a/app/Import/Storage/ImportStorage.php +++ b/app/Import/Storage/ImportStorage.php @@ -25,12 +25,13 @@ namespace FireflyIII\Import\Storage; use ErrorException; use Exception; use FireflyIII\Exceptions\FireflyException; +use FireflyIII\Factory\TransactionJournalFactory; use FireflyIII\Import\Object\ImportJournal; use FireflyIII\Models\ImportJob; -use FireflyIII\Models\Note; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; +use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use Illuminate\Support\Collection; use Log; use Preferences; @@ -61,9 +62,11 @@ class ImportStorage /** @var Collection */ protected $bills; /** @var int */ - protected $defaultCurrencyId = 1; // yes, hard coded + protected $defaultCurrencyId = 1; /** @var ImportJob */ - protected $job; + protected $job; // yes, hard coded + /** @var JournalRepositoryInterface */ + protected $journalRepository; /** @var ImportJobRepositoryInterface */ protected $repository; /** @var Collection */ @@ -72,6 +75,8 @@ class ImportStorage private $applyRules = false; /** @var string */ private $dateFormat = 'Ymd'; + /** @var TransactionJournalFactory */ + private $factory; /** @var bool */ private $matchBills = false; /** @var Collection */ @@ -89,6 +94,7 @@ class ImportStorage $this->objects = new Collection; $this->journals = new Collection; $this->errors = new Collection; + } /** @@ -104,8 +110,12 @@ class ImportStorage */ public function setJob(ImportJob $job) { - $this->repository = app(ImportJobRepositoryInterface::class); + $this->repository = app(ImportJobRepositoryInterface::class); + $this->journalRepository = app(JournalRepositoryInterface::class); $this->repository->setUser($job->user); + $this->journalRepository->setUser($job->user); + $this->factory = app(TransactionJournalFactory::class); + $this->factory->setUser($job->user); $config = $this->repository->getConfiguration($job); $currency = app('amount')->getDefaultCurrencyByUser($job->user); @@ -127,8 +137,6 @@ class ImportStorage } Log::debug(sprintf('Value of apply rules is %s', var_export($this->applyRules, true))); Log::debug(sprintf('Value of match bills is %s', var_export($this->matchBills, true))); - - } /** @@ -155,6 +163,7 @@ class ImportStorage } catch (FireflyException | ErrorException | Exception $e) { $this->errors->push($e->getMessage()); Log::error(sprintf('Cannot import row #%d because: %s', $index, $e->getMessage())); + Log::error($e->getTraceAsString()); } } ); @@ -173,15 +182,15 @@ class ImportStorage */ protected function storeImportJournal(int $index, ImportJournal $importJournal): bool { - Log::debug(sprintf('Going to store object #%d/%d with description "%s"', ($index + 1), $this->total, $importJournal->getDescription())); + Log::debug(sprintf('Going to store object #%d/%d with description "%s"', $index + 1, $this->total, $importJournal->getDescription())); $assetAccount = $importJournal->asset->getAccount(); $amount = $importJournal->getAmount(); + $foreignAmount = $importJournal->getForeignAmount(); $currencyId = $this->getCurrencyId($importJournal); $foreignCurrencyId = $this->getForeignCurrencyId($importJournal, $currencyId); $date = $importJournal->getDate($this->dateFormat)->format('Y-m-d'); $opposingAccount = $this->getOpposingAccount($importJournal->opposing, $assetAccount->id, $amount); $transactionType = $this->getTransactionType($amount, $opposingAccount); - $description = $importJournal->getDescription(); $this->addStep(); /** @@ -189,7 +198,7 @@ class ImportStorage */ $parameters = [ 'type' => $transactionType, - 'description' => $description, + 'description' => $importJournal->getDescription(), 'amount' => $amount, 'date' => $date, 'asset' => $assetAccount->name, @@ -208,48 +217,83 @@ class ImportStorage unset($parameters); $this->addStep(); - // store journal and create transactions: - $parameters = [ - 'type' => $transactionType, - 'currency' => $currencyId, - 'foreign_currency' => $foreignCurrencyId, - 'asset' => $assetAccount, - 'opposing' => $opposingAccount, - 'description' => $description, - 'date' => $date, - 'hash' => $importJournal->hash, - 'amount' => $amount, - ]; - $journal = $this->storeJournal($parameters); - unset($parameters); + + try { + $budget = $importJournal->budget->getBudget(); + $category = $importJournal->category->getCategory(); + $bill = $importJournal->bill->getBill(); + $source = $assetAccount; + $destination = $opposingAccount; + + if ($transactionType === TransactionType::DEPOSIT) { + $destination = $assetAccount; + $source = $opposingAccount; + } + Log::debug( + sprintf('Will make #%s (%s) the source and #%s (%s) the destination.', $source->id, $source->name, $destination->id, $destination->name) + ); + $data = [ + 'user' => $this->job->user_id, + 'type' => $transactionType, + 'date' => $importJournal->getDate($this->dateFormat), + 'description' => $importJournal->getDescription(), + 'piggy_bank_id' => null, + 'piggy_bank_name' => null, + 'bill_id' => is_null($bill) ? null : $bill->id, + 'bill_name' => null, + 'tags' => $importJournal->tags, + 'interest_date' => $importJournal->getMetaDate('interest_date'), + 'book_date' => $importJournal->getMetaDate('book_date'), + 'process_date' => $importJournal->getMetaDate('process_date'), + 'due_date' => $importJournal->getMetaDate('due_date'), + 'payment_date' => $importJournal->getMetaDate('payment_date'), + 'invoice_date' => $importJournal->getMetaDate('invoice_date'), + 'internal_reference' => $importJournal->metaFields['internal_reference'] ?? null, + 'notes' => $importJournal->notes, + 'sepa-cc' => $importJournal->getMetaString('sepa-cc'), + 'sepa-ct-op' => $importJournal->getMetaString('sepa-ct-op'), + 'sepa-ct-id' => $importJournal->getMetaString('sepa-ct-id'), + 'sepa-db' => $importJournal->getMetaString('sepa-db'), + 'sepa-country' => $importJournal->getMetaString('sepa-country'), + 'sepa-ep' => $importJournal->getMetaString('sepa-ep'), + 'sepa-ci' => $importJournal->getMetaString('sepa-ci'), + 'transactions' => [ + // single transaction: + [ + 'description' => null, + 'amount' => $amount, + 'currency_id' => intval($currencyId), + 'currency_code' => null, + 'foreign_amount' => $foreignAmount, + 'foreign_currency_id' => $foreignCurrencyId, + 'foreign_currency_code' => null, + 'budget_id' => is_null($budget) ? null : $budget->id, + 'budget_name' => null, + 'category_id' => is_null($category) ? null : $category->id, + 'category_name' => null, + 'source_id' => $source->id, + 'source_name' => null, + 'destination_id' => $destination->id, + 'destination_name' => null, + 'reconciled' => false, + 'identifier' => 0, + ], + ], + ]; + $factoryJournal = $this->factory->create($data); + $this->journals->push($factoryJournal); + } catch (FireflyException $e) { + Log::error(sprintf('Could not use factory to store journal: %s', $e->getMessage())); + Log::error($e->getTraceAsString()); + } + $this->addStep(); - - // store meta object things: - $this->storeCategory($journal, $importJournal->category->getCategory()); - $this->storeBudget($journal, $importJournal->budget->getBudget()); - - // to save bill, also give it the amount: - $importJournal->bill->setAmount($amount); - - $this->storeBill($journal, $importJournal->bill->getBill()); - $this->storeMeta($journal, $importJournal->metaDates); - $this->storeTags($importJournal->tags, $journal); - - // set notes for journal: - $dbNote = new Note(); - $dbNote->noteable()->associate($journal); - $dbNote->text = trim($importJournal->notes); - $dbNote->save(); - - // set journal completed: - $journal->completed = true; - $journal->save(); $this->addStep(); // run rules if config calls for it: if (true === $this->applyRules) { Log::info('Will apply rules to this journal.'); - $this->applyRules($journal); + $this->applyRules($factoryJournal); } Preferences::setForUser($this->job->user, 'lastActivity', microtime()); @@ -261,7 +305,7 @@ class ImportStorage // match bills if config calls for it. if (true === $this->matchBills) { Log::info('Will match bills.'); - $this->matchBills($journal); + $this->matchBills($factoryJournal); } if (!(true === $this->matchBills)) { @@ -269,9 +313,12 @@ class ImportStorage } $this->addStep(); - $this->journals->push($journal); - - Log::info(sprintf('Imported new journal #%d: "%s", amount %s %s.', $journal->id, $journal->description, $journal->transactionCurrency->code, $amount)); + Log::info( + sprintf( + 'Imported new journal #%d: "%s", amount %s %s.', $factoryJournal->id, $factoryJournal->description, $factoryJournal->transactionCurrency->code, + $amount + ) + ); return true; } @@ -321,7 +368,7 @@ class ImportStorage } if ($names === $transfer['names']) { ++$hits; - Log::debug(sprintf('Involved accounts, "%s" equals "%s", hits = %d', join(',', $names), join(',', $transfer['names']), $hits)); + Log::debug(sprintf('Involved accounts, "%s" equals "%s", hits = %d', implode(',', $names), implode(',', $transfer['names']), $hits)); } if (0 === bccomp($amount, $transfer['amount'])) { ++$hits; diff --git a/app/Import/Storage/ImportSupport.php b/app/Import/Storage/ImportSupport.php index 2861dc9f6a..a1bf25557b 100644 --- a/app/Import/Storage/ImportSupport.php +++ b/app/Import/Storage/ImportSupport.php @@ -22,24 +22,19 @@ declare(strict_types=1); namespace FireflyIII\Import\Storage; -use Carbon\Carbon; -use Exception; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Import\Object\ImportAccount; use FireflyIII\Import\Object\ImportJournal; use FireflyIII\Models\Account; use FireflyIII\Models\AccountType; use FireflyIII\Models\Bill; -use FireflyIII\Models\Budget; -use FireflyIII\Models\Category; use FireflyIII\Models\ImportJob; use FireflyIII\Models\Rule; -use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournalMeta; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Bill\BillRepositoryInterface; -use FireflyIII\Repositories\Tag\TagRepositoryInterface; +use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use FireflyIII\TransactionRules\Processor; use Illuminate\Database\Query\JoinClause; use Illuminate\Support\Collection; @@ -58,6 +53,8 @@ trait ImportSupport protected $defaultCurrencyId = 1; /** @var ImportJob */ protected $job; + /** @var JournalRepositoryInterface */ + protected $journalRepository; /** @var Collection */ protected $rules; @@ -65,6 +62,7 @@ trait ImportSupport * @param TransactionJournal $journal * * @return bool + * @throws \FireflyIII\Exceptions\FireflyException */ protected function applyRules(TransactionJournal $journal): bool { @@ -110,32 +108,6 @@ trait ImportSupport return true; } - /** - * @param array $parameters - * - * @return bool - * - * @throws FireflyException - */ - private function createTransaction(array $parameters): bool - { - $transaction = new Transaction; - $transaction->account_id = $parameters['account']; - $transaction->transaction_journal_id = intval($parameters['id']); - $transaction->transaction_currency_id = intval($parameters['currency']); - $transaction->amount = $parameters['amount']; - $transaction->foreign_currency_id = intval($parameters['foreign_currency']) === 0 ? null : intval($parameters['foreign_currency']); - $transaction->foreign_amount = null === $transaction->foreign_currency_id ? null : $parameters['foreign_amount']; - $transaction->save(); - if (null === $transaction->id) { - $errorText = join(', ', $transaction->getErrors()->all()); - throw new FireflyException($errorText); - } - Log::debug(sprintf('Created transaction with ID #%d, account #%d, amount %s', $transaction->id, $parameters['account'], $parameters['amount'])); - - return true; - } - /** * @return Collection */ @@ -155,6 +127,7 @@ trait ImportSupport * @param ImportJournal $importJournal * * @return int + * * @throws FireflyException */ private function getCurrencyId(ImportJournal $importJournal): int @@ -168,7 +141,7 @@ trait ImportSupport // use given currency $currency = $importJournal->currency->getTransactionCurrency(); - if (null !== $currency->id) { + if (null !== $currency) { return $currency->id; } @@ -192,8 +165,8 @@ trait ImportSupport private function getForeignCurrencyId(ImportJournal $importJournal, int $currencyId): ?int { // use given currency by import journal. - $currency = $importJournal->currency->getTransactionCurrency(); - if (null !== $currency->id && intval($currency->id) !== intval($currencyId)) { + $currency = $importJournal->foreignCurrency->getTransactionCurrency(); + if (null !== $currency && intval($currency->id) !== intval($currencyId)) { return $currency->id; } @@ -217,6 +190,7 @@ trait ImportSupport * @see ImportSupport::getTransactionType * * @return Account + * * @throws FireflyException */ private function getOpposingAccount(ImportAccount $account, int $forbiddenAccount, string $amount): Account @@ -306,6 +280,7 @@ trait ImportSupport * is not already present. * * @return array + * @throws \InvalidArgumentException */ private function getTransfers(): array { @@ -374,139 +349,4 @@ trait ImportSupport return false; } - - /** - * @param TransactionJournal $journal - * @param Bill $bill - */ - private function storeBill(TransactionJournal $journal, Bill $bill) - { - if (null !== $bill->id) { - Log::debug(sprintf('Linked bill #%d to journal #%d', $bill->id, $journal->id)); - $journal->bill()->associate($bill); - $journal->save(); - } - } - - /** - * @param TransactionJournal $journal - * @param Budget $budget - */ - private function storeBudget(TransactionJournal $journal, Budget $budget) - { - if (null !== $budget->id) { - Log::debug(sprintf('Linked budget #%d to journal #%d', $budget->id, $journal->id)); - $journal->budgets()->save($budget); - } - } - - /** - * @param TransactionJournal $journal - * @param Category $category - */ - private function storeCategory(TransactionJournal $journal, Category $category) - { - if (null !== $category->id) { - Log::debug(sprintf('Linked category #%d to journal #%d', $category->id, $journal->id)); - $journal->categories()->save($category); - } - } - - /** - * @param array $parameters - * - * @return TransactionJournal - * - * @throws FireflyException - */ - private function storeJournal(array $parameters): TransactionJournal - { - // find transaction type: - $transactionType = TransactionType::whereType($parameters['type'])->first(); - - // create a journal: - $journal = new TransactionJournal; - $journal->user_id = $this->job->user_id; - $journal->transaction_type_id = $transactionType->id; - $journal->transaction_currency_id = $parameters['currency']; - $journal->description = $parameters['description']; - $journal->date = $parameters['date']; - $journal->order = 0; - $journal->tag_count = 0; - $journal->completed = false; - - if (!$journal->save()) { - $errorText = join(', ', $journal->getErrors()->all()); - // throw error - throw new FireflyException($errorText); - } - // save meta data: - $journal->setMeta('importHash', $parameters['hash']); - Log::debug(sprintf('Created journal with ID #%d', $journal->id)); - - // create transactions: - $one = [ - 'id' => $journal->id, - 'account' => $parameters['asset']->id, - 'currency' => $parameters['currency'], - 'amount' => $parameters['amount'], - 'foreign_currency' => $parameters['foreign_currency'], - 'foreign_amount' => null === $parameters['foreign_currency'] ? null : $parameters['amount'], - ]; - $opposite = app('steam')->opposite($parameters['amount']); - $two = [ - 'id' => $journal->id, - 'account' => $parameters['opposing']->id, - 'currency' => $parameters['currency'], - 'amount' => $opposite, - 'foreign_currency' => $parameters['foreign_currency'], - 'foreign_amount' => null === $parameters['foreign_currency'] ? null : $opposite, - ]; - $this->createTransaction($one); - $this->createTransaction($two); - - return $journal; - } - - /** - * @param TransactionJournal $journal - * @param array $dates - */ - private function storeMeta(TransactionJournal $journal, array $dates) - { - // all other date fields as meta thing: - foreach ($dates as $name => $value) { - try { - $date = new Carbon($value); - $journal->setMeta($name, $date); - } catch (Exception $e) { - // don't care, ignore: - Log::warning(sprintf('Could not parse "%s" into a valid Date object for field %s', $value, $name)); - } - } - } - - /** - * @param array $tags - * @param TransactionJournal $journal - */ - private function storeTags(array $tags, TransactionJournal $journal): void - { - $repository = app(TagRepositoryInterface::class); - $repository->setUser($journal->user); - - foreach ($tags as $tag) { - $dbTag = $repository->findByTag($tag); - if (null === $dbTag->id) { - $dbTag = $repository->store( - ['tag' => $tag, 'date' => null, 'description' => null, 'latitude' => null, 'longitude' => null, - 'zoomLevel' => null, 'tagMode' => 'nothing',] - ); - } - $journal->tags()->save($dbTag); - Log::debug(sprintf('Linked tag %d ("%s") to journal #%d', $dbTag->id, $dbTag->tag, $journal->id)); - } - - return; - } } diff --git a/app/Jobs/ExecuteRuleGroupOnExistingTransactions.php b/app/Jobs/ExecuteRuleGroupOnExistingTransactions.php index a1d896184c..5a4495e84b 100644 --- a/app/Jobs/ExecuteRuleGroupOnExistingTransactions.php +++ b/app/Jobs/ExecuteRuleGroupOnExistingTransactions.php @@ -126,6 +126,8 @@ class ExecuteRuleGroupOnExistingTransactions extends Job implements ShouldQueue /** * Execute the job. + * + * @throws \FireflyIII\Exceptions\FireflyException */ public function handle() { @@ -168,6 +170,7 @@ class ExecuteRuleGroupOnExistingTransactions extends Job implements ShouldQueue * Collects a list of rule processors, one for each rule within the rule group. * * @return array + * @throws \FireflyIII\Exceptions\FireflyException */ protected function collectProcessors() { diff --git a/app/Jobs/ExecuteRuleOnExistingTransactions.php b/app/Jobs/ExecuteRuleOnExistingTransactions.php index fafa74a5b9..be5778934b 100644 --- a/app/Jobs/ExecuteRuleOnExistingTransactions.php +++ b/app/Jobs/ExecuteRuleOnExistingTransactions.php @@ -135,6 +135,8 @@ class ExecuteRuleOnExistingTransactions extends Job implements ShouldQueue /** * Execute the job. + * + * @throws \FireflyIII\Exceptions\FireflyException */ public function handle() { diff --git a/app/Jobs/MailError.php b/app/Jobs/MailError.php index 8c61797fa2..7afc2840b3 100644 --- a/app/Jobs/MailError.php +++ b/app/Jobs/MailError.php @@ -22,14 +22,13 @@ declare(strict_types=1); namespace FireflyIII\Jobs; -use ErrorException; +use Exception; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Message; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\SerializesModels; use Log; use Mail; -use Swift_TransportException; /** * Class MailError. @@ -89,11 +88,8 @@ class MailError extends Job implements ShouldQueue } } ); - } catch (Swift_TransportException $e) { - // could also not mail! :o - Log::error('Swift Transport Exception' . $e->getMessage()); - } catch (ErrorException $e) { - Log::error('ErrorException ' . $e->getMessage()); + } catch (Exception $e) { + Log::error('Exception when mailing: ' . $e->getMessage()); } } } diff --git a/app/Models/Account.php b/app/Models/Account.php index b70870c148..cf1e6131ba 100644 --- a/app/Models/Account.php +++ b/app/Models/Account.php @@ -22,7 +22,6 @@ declare(strict_types=1); namespace FireflyIII\Models; -use Carbon\Carbon; use Crypt; use FireflyIII\Exceptions\FireflyException; use Illuminate\Contracts\Encryption\DecryptException; @@ -117,6 +116,7 @@ class Account extends Model * @param string $value * * @return Account + * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException */ public static function routeBinder(string $value): Account { @@ -191,7 +191,7 @@ class Account extends Model * @codeCoverageIgnore * * @param string $fieldName - * + * @deprecated * @return string */ public function getMeta(string $fieldName): string @@ -211,6 +211,7 @@ class Account extends Model * @param $value * * @return string + * @throws \Illuminate\Contracts\Encryption\DecryptException */ public function getNameAttribute($value): ?string { @@ -228,8 +229,7 @@ class Account extends Model */ public function getOpeningBalance(): TransactionJournal { - $journal = TransactionJournal::sortCorrectly() - ->leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id') + $journal = TransactionJournal::leftJoin('transactions', 'transactions.transaction_journal_id', '=', 'transaction_journals.id') ->where('transactions.account_id', $this->id) ->transactionTypes([TransactionType::OPENING_BALANCE]) ->first(['transaction_journals.*']); @@ -275,10 +275,13 @@ class Account extends Model /** * @codeCoverageIgnore + * @deprecated * * @param EloquentBuilder $query * @param string $name * @param string $value + * + * @throws \InvalidArgumentException */ public function scopeHasMetaValue(EloquentBuilder $query, $name, $value) { @@ -298,6 +301,7 @@ class Account extends Model * @param $value * * @codeCoverageIgnore + * @throws \Illuminate\Contracts\Encryption\EncryptException */ public function setIbanAttribute($value) { @@ -308,6 +312,7 @@ class Account extends Model * @codeCoverageIgnore * * @param $value + * @throws \Illuminate\Contracts\Encryption\EncryptException */ public function setNameAttribute($value) { diff --git a/app/Models/AccountType.php b/app/Models/AccountType.php index 9b34d0382e..09402789c7 100644 --- a/app/Models/AccountType.php +++ b/app/Models/AccountType.php @@ -33,43 +33,43 @@ class AccountType extends Model /** * */ - const DEFAULT = 'Default account'; + public const DEFAULT = 'Default account'; /** * */ - const CASH = 'Cash account'; + public const CASH = 'Cash account'; /** * */ - const ASSET = 'Asset account'; + public const ASSET = 'Asset account'; /** * */ - const EXPENSE = 'Expense account'; + public const EXPENSE = 'Expense account'; /** * */ - const REVENUE = 'Revenue account'; + public const REVENUE = 'Revenue account'; /** * */ - const INITIAL_BALANCE = 'Initial balance account'; + public const INITIAL_BALANCE = 'Initial balance account'; /** * */ - const BENEFICIARY = 'Beneficiary account'; + public const BENEFICIARY = 'Beneficiary account'; /** * */ - const IMPORT = 'Import account'; + public const IMPORT = 'Import account'; /** * */ - const RECONCILIATION = 'Reconciliation account'; + public const RECONCILIATION = 'Reconciliation account'; /** * */ - const LOAN = 'Loan'; + public const LOAN = 'Loan'; /** * The attributes that should be casted to native types. * diff --git a/app/Models/Attachment.php b/app/Models/Attachment.php index f78478dde8..9ef2343d09 100644 --- a/app/Models/Attachment.php +++ b/app/Models/Attachment.php @@ -49,12 +49,13 @@ class Attachment extends Model 'uploaded' => 'boolean', ]; /** @var array */ - protected $fillable = ['attachable_id', 'attachable_type', 'user_id', 'md5', 'filename', 'mime', 'title', 'notes', 'description', 'size', 'uploaded']; + protected $fillable = ['attachable_id', 'attachable_type', 'user_id', 'md5', 'filename', 'mime', 'title', 'description', 'size', 'uploaded']; /** * @param string $value * * @return Attachment + * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException */ public static function routeBinder(string $value): Attachment { @@ -96,6 +97,7 @@ class Attachment extends Model * * @codeCoverageIgnore * @return null|string + * @throws \Illuminate\Contracts\Encryption\DecryptException */ public function getDescriptionAttribute($value) { @@ -111,6 +113,7 @@ class Attachment extends Model * * @codeCoverageIgnore * @return null|string + * @throws \Illuminate\Contracts\Encryption\DecryptException */ public function getFilenameAttribute($value) { @@ -126,6 +129,7 @@ class Attachment extends Model * * @codeCoverageIgnore * @return null|string + * @throws \Illuminate\Contracts\Encryption\DecryptException */ public function getMimeAttribute($value) { @@ -141,21 +145,7 @@ class Attachment extends Model * * @codeCoverageIgnore * @return null|string - */ - public function getNotesAttribute($value) - { - if (null === $value || 0 === strlen($value)) { - return null; - } - - return Crypt::decrypt($value); - } - - /** - * @param $value - * - * @codeCoverageIgnore - * @return null|string + * @throws \Illuminate\Contracts\Encryption\DecryptException */ public function getTitleAttribute($value) { @@ -166,10 +156,21 @@ class Attachment extends Model return Crypt::decrypt($value); } + /** + * @codeCoverageIgnore + * Get all of the notes. + */ + public function notes() + { + return $this->morphMany(Note::class, 'noteable'); + } + /** * @codeCoverageIgnore * * @param string $value + * + * @throws \Illuminate\Contracts\Encryption\EncryptException */ public function setDescriptionAttribute(string $value) { @@ -180,6 +181,7 @@ class Attachment extends Model * @codeCoverageIgnore * * @param string $value + * @throws \Illuminate\Contracts\Encryption\EncryptException */ public function setFilenameAttribute(string $value) { @@ -190,6 +192,7 @@ class Attachment extends Model * @codeCoverageIgnore * * @param string $value + * @throws \Illuminate\Contracts\Encryption\EncryptException */ public function setMimeAttribute(string $value) { @@ -200,16 +203,7 @@ class Attachment extends Model * @codeCoverageIgnore * * @param string $value - */ - public function setNotesAttribute(string $value) - { - $this->attributes['notes'] = Crypt::encrypt($value); - } - - /** - * @codeCoverageIgnore - * - * @param string $value + * @throws \Illuminate\Contracts\Encryption\EncryptException */ public function setTitleAttribute(string $value) { diff --git a/app/Models/Bill.php b/app/Models/Bill.php index ec09d0fcc7..823f39b426 100644 --- a/app/Models/Bill.php +++ b/app/Models/Bill.php @@ -72,6 +72,7 @@ class Bill extends Model * @param string $value * * @return Bill + * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException */ public static function routeBinder(string $value): Bill { @@ -100,6 +101,7 @@ class Bill extends Model * @param $value * * @return string + * @throws \Illuminate\Contracts\Encryption\DecryptException */ public function getMatchAttribute($value) { @@ -116,6 +118,7 @@ class Bill extends Model * @param $value * * @return string + * @throws \Illuminate\Contracts\Encryption\DecryptException */ public function getNameAttribute($value) { @@ -159,6 +162,7 @@ class Bill extends Model * @param $value * * @codeCoverageIgnore + * @throws \Illuminate\Contracts\Encryption\EncryptException */ public function setMatchAttribute($value) { @@ -171,6 +175,7 @@ class Bill extends Model * @param $value * * @codeCoverageIgnore + * @throws \Illuminate\Contracts\Encryption\EncryptException */ public function setNameAttribute($value) { diff --git a/app/Models/Budget.php b/app/Models/Budget.php index ba013701ea..7d4a833322 100644 --- a/app/Models/Budget.php +++ b/app/Models/Budget.php @@ -87,6 +87,7 @@ class Budget extends Model * @param string $value * * @return Budget + * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException */ public static function routeBinder(string $value): Budget { @@ -115,6 +116,7 @@ class Budget extends Model * @param $value * * @return string + * @throws \Illuminate\Contracts\Encryption\DecryptException */ public function getNameAttribute($value) { @@ -129,6 +131,8 @@ class Budget extends Model * @codeCoverageIgnore * * @param $value + * + * @throws \Illuminate\Contracts\Encryption\EncryptException */ public function setNameAttribute($value) { diff --git a/app/Models/BudgetLimit.php b/app/Models/BudgetLimit.php index 741e2706c3..8063df7936 100644 --- a/app/Models/BudgetLimit.php +++ b/app/Models/BudgetLimit.php @@ -48,6 +48,7 @@ class BudgetLimit extends Model * @param string $value * * @return mixed + * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException */ public static function routeBinder(string $value): BudgetLimit { diff --git a/app/Models/Category.php b/app/Models/Category.php index 38f6e3712d..f946d8bcdb 100644 --- a/app/Models/Category.php +++ b/app/Models/Category.php @@ -86,6 +86,7 @@ class Category extends Model * @param string $value * * @return Category + * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException */ public static function routeBinder(string $value): Category { @@ -105,6 +106,7 @@ class Category extends Model * @param $value * * @return string + * @throws \Illuminate\Contracts\Encryption\DecryptException */ public function getNameAttribute($value) { @@ -119,6 +121,8 @@ class Category extends Model * @codeCoverageIgnore * * @param $value + * + * @throws \Illuminate\Contracts\Encryption\EncryptException */ public function setNameAttribute($value) { diff --git a/app/Models/ImportJob.php b/app/Models/ImportJob.php index e0ae998c58..70315a5c6b 100644 --- a/app/Models/ImportJob.php +++ b/app/Models/ImportJob.php @@ -24,6 +24,7 @@ namespace FireflyIII\Models; use Crypt; use FireflyIII\Exceptions\FireflyException; +use FireflyIII\User; use Illuminate\Database\Eloquent\Model; use Log; use Storage; @@ -31,6 +32,8 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; /** * Class ImportJob. + * + * @property User $user */ class ImportJob extends Model { @@ -176,6 +179,7 @@ class ImportJob extends Model /** * @return string * + * @throws \Illuminate\Contracts\Encryption\DecryptException * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException */ public function uploadFileContents(): string diff --git a/app/Models/PiggyBank.php b/app/Models/PiggyBank.php index 8706a4b302..af6461ca30 100644 --- a/app/Models/PiggyBank.php +++ b/app/Models/PiggyBank.php @@ -64,6 +64,7 @@ class PiggyBank extends Model * @param string $value * * @return PiggyBank + * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException */ public static function routeBinder(string $value): PiggyBank { @@ -90,6 +91,7 @@ class PiggyBank extends Model /** * Grabs the PiggyBankRepetition that's currently relevant / active. + * * @deprecated * @returns PiggyBankRepetition */ @@ -115,6 +117,7 @@ class PiggyBank extends Model * @param $value * * @return string + * @throws \Illuminate\Contracts\Encryption\DecryptException */ public function getNameAttribute($value) { @@ -153,6 +156,7 @@ class PiggyBank extends Model /** * @param Carbon $date + * * @deprecated * @return string */ @@ -200,6 +204,8 @@ class PiggyBank extends Model * @codeCoverageIgnore * * @param $value + * + * @throws \Illuminate\Contracts\Encryption\EncryptException */ public function setNameAttribute($value) { diff --git a/app/Models/PiggyBankEvent.php b/app/Models/PiggyBankEvent.php index d937815739..4da33d1726 100644 --- a/app/Models/PiggyBankEvent.php +++ b/app/Models/PiggyBankEvent.php @@ -26,6 +26,7 @@ use Illuminate\Database\Eloquent\Model; /** * Class PiggyBankEvent. + * * @property $piggyBank */ class PiggyBankEvent extends Model @@ -39,7 +40,7 @@ class PiggyBankEvent extends Model = [ 'created_at' => 'datetime', 'updated_at' => 'datetime', - 'date' => 'datetime', + 'date' => 'date', ]; /** @var array */ protected $dates = ['date']; diff --git a/app/Models/Preference.php b/app/Models/Preference.php index e59f68148d..757e25ae42 100644 --- a/app/Models/Preference.php +++ b/app/Models/Preference.php @@ -31,6 +31,8 @@ use Log; /** * Class Preference. + * + * @property mixed $data */ class Preference extends Model { @@ -82,6 +84,8 @@ class Preference extends Model * @codeCoverageIgnore * * @param $value + * + * @throws \Illuminate\Contracts\Encryption\EncryptException */ public function setDataAttribute($value) { diff --git a/app/Models/Rule.php b/app/Models/Rule.php index a59525674f..a7be9798ac 100644 --- a/app/Models/Rule.php +++ b/app/Models/Rule.php @@ -52,6 +52,7 @@ class Rule extends Model * @param string $value * * @return Rule + * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException */ public static function routeBinder(string $value): Rule { diff --git a/app/Models/RuleGroup.php b/app/Models/RuleGroup.php index c57ebc4ad8..0345afb535 100644 --- a/app/Models/RuleGroup.php +++ b/app/Models/RuleGroup.php @@ -55,6 +55,7 @@ class RuleGroup extends Model * @param string $value * * @return RuleGroup + * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException */ public static function routeBinder(string $value): RuleGroup { diff --git a/app/Models/Tag.php b/app/Models/Tag.php index 37bf61af66..8ff2aefe35 100644 --- a/app/Models/Tag.php +++ b/app/Models/Tag.php @@ -90,6 +90,7 @@ class Tag extends Model * @param string $value * * @return Tag + * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException */ public static function routeBinder(string $value): Tag { @@ -109,6 +110,7 @@ class Tag extends Model * @param $value * * @return string + * @throws \Illuminate\Contracts\Encryption\DecryptException */ public function getDescriptionAttribute($value) { @@ -125,6 +127,7 @@ class Tag extends Model * @param $value * * @return string + * @throws \Illuminate\Contracts\Encryption\DecryptException */ public function getTagAttribute($value) { @@ -135,28 +138,12 @@ class Tag extends Model return Crypt::decrypt($value); } - /** - * Save the model to the database. - * - * @param array $options - * - * @return bool - */ - public function save(array $options = []) - { - foreach ($this->transactionJournals()->get() as $journal) { - $count = $journal->tags()->count(); - $journal->tag_count = $count; - $journal->save(); - } - - return parent::save($options); - } - /** * @codeCoverageIgnore * * @param $value + * + * @throws \Illuminate\Contracts\Encryption\EncryptException */ public function setDescriptionAttribute($value) { @@ -167,6 +154,7 @@ class Tag extends Model * @codeCoverageIgnore * * @param $value + * @throws \Illuminate\Contracts\Encryption\EncryptException */ public function setTagAttribute($value) { diff --git a/app/Models/Transaction.php b/app/Models/Transaction.php index 09ab60ab42..6e4a004b6b 100644 --- a/app/Models/Transaction.php +++ b/app/Models/Transaction.php @@ -68,6 +68,8 @@ use Watson\Validating\ValidatingTrait; * @property int $transaction_currency_dp * @property string $transaction_currency_code * @property string $description + * @property bool $is_split + * @property int $attachmentCount */ class Transaction extends Model { @@ -91,7 +93,7 @@ class Transaction extends Model */ protected $fillable = ['account_id', 'transaction_journal_id', 'description', 'amount', 'identifier', 'transaction_currency_id', 'foreign_currency_id', - 'foreign_amount','reconciled']; + 'foreign_amount', 'reconciled']; /** * @var array */ @@ -135,6 +137,7 @@ class Transaction extends Model * @param string $value * * @return Transaction + * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException */ public static function routeBinder(string $value): Transaction { diff --git a/app/Models/TransactionCurrency.php b/app/Models/TransactionCurrency.php index 304b45487f..ec3dc40db4 100644 --- a/app/Models/TransactionCurrency.php +++ b/app/Models/TransactionCurrency.php @@ -57,6 +57,7 @@ class TransactionCurrency extends Model * @param string $value * * @return TransactionCurrency + * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException */ public static function routeBinder(string $value): TransactionCurrency { diff --git a/app/Models/TransactionJournal.php b/app/Models/TransactionJournal.php index dd49eb5025..5842d765c4 100644 --- a/app/Models/TransactionJournal.php +++ b/app/Models/TransactionJournal.php @@ -39,6 +39,7 @@ use Watson\Validating\ValidatingTrait; /** * Class TransactionJournal. + * * @property User $user */ class TransactionJournal extends Model @@ -87,6 +88,7 @@ class TransactionJournal extends Model * @param string $value * * @return TransactionJournal + * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException */ public static function routeBinder(string $value): TransactionJournal { @@ -140,7 +142,7 @@ class TransactionJournal extends Model /** * @codeCoverageIgnore - * + * @deprecated * @param string $name * * @return bool @@ -154,6 +156,7 @@ class TransactionJournal extends Model /** * @codeCoverageIgnore + * * @return HasMany */ public function destinationJournalLinks(): HasMany @@ -167,6 +170,7 @@ class TransactionJournal extends Model * @param $value * * @return string + * @throws \Illuminate\Contracts\Encryption\DecryptException */ public function getDescriptionAttribute($value) { @@ -181,6 +185,7 @@ class TransactionJournal extends Model * * @param string $name * + * @deprecated * @return string */ public function getMeta(string $name) @@ -217,7 +222,7 @@ class TransactionJournal extends Model * @codeCoverageIgnore * * @param string $name - * + * @deprecated * @return bool */ public function hasMeta(string $name): bool @@ -295,22 +300,6 @@ class TransactionJournal extends Model return $this->hasMany('FireflyIII\Models\PiggyBankEvent'); } - /** - * @codeCoverageIgnore - * Save the model to the database. - * - * @param array $options - * - * @return bool - */ - public function save(array $options = []): bool - { - $count = $this->tags()->count(); - $this->tag_count = $count; - - return parent::save($options); - } - /** * @codeCoverageIgnore * @@ -337,18 +326,6 @@ class TransactionJournal extends Model return $query->where('transaction_journals.date', '<=', $date->format('Y-m-d 00:00:00')); } - /** - * @codeCoverageIgnore - * - * @param EloquentBuilder $query - */ - public function scopeSortCorrectly(EloquentBuilder $query) - { - $query->orderBy('transaction_journals.date', 'DESC'); - $query->orderBy('transaction_journals.order', 'ASC'); - $query->orderBy('transaction_journals.id', 'DESC'); - } - /** * @codeCoverageIgnore * @@ -369,6 +346,8 @@ class TransactionJournal extends Model * @codeCoverageIgnore * * @param $value + * + * @throws \Illuminate\Contracts\Encryption\EncryptException */ public function setDescriptionAttribute($value) { @@ -378,6 +357,8 @@ class TransactionJournal extends Model } /** + * @deprecated + * * @param string $name * @param $value * diff --git a/app/Models/TransactionJournalLink.php b/app/Models/TransactionJournalLink.php index 8d216cc8ae..0675b5ce07 100644 --- a/app/Models/TransactionJournalLink.php +++ b/app/Models/TransactionJournalLink.php @@ -108,6 +108,8 @@ class TransactionJournalLink extends Model * @codeCoverageIgnore * * @param $value + * + * @throws \Illuminate\Contracts\Encryption\EncryptException */ public function setCommentAttribute($value): void { diff --git a/app/Models/TransactionType.php b/app/Models/TransactionType.php index 1ad60435b3..fa1abdf690 100644 --- a/app/Models/TransactionType.php +++ b/app/Models/TransactionType.php @@ -36,23 +36,23 @@ class TransactionType extends Model /** * */ - const WITHDRAWAL = 'Withdrawal'; + public const WITHDRAWAL = 'Withdrawal'; /** * */ - const DEPOSIT = 'Deposit'; + public const DEPOSIT = 'Deposit'; /** * */ - const TRANSFER = 'Transfer'; + public const TRANSFER = 'Transfer'; /** * */ - const OPENING_BALANCE = 'Opening balance'; + public const OPENING_BALANCE = 'Opening balance'; /** * */ - const RECONCILIATION = 'Reconciliation'; + public const RECONCILIATION = 'Reconciliation'; /** * The attributes that should be casted to native types. * @@ -71,6 +71,7 @@ class TransactionType extends Model * @param string $type * * @return Model|null|static + * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException */ public static function routeBinder(string $type): TransactionType { diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 65d703e6f4..7fafc5d844 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -24,15 +24,10 @@ namespace FireflyIII\Providers; use FireflyIII\Events\RegisteredUser; use FireflyIII\Events\RequestedVersionCheckStatus; -use FireflyIII\Models\Account; use FireflyIII\Models\PiggyBank; use FireflyIII\Models\PiggyBankRepetition; -use FireflyIII\Models\Transaction; -use FireflyIII\Models\TransactionJournal; -use FireflyIII\Models\TransactionJournalMeta; use Illuminate\Auth\Events\Login; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; -use Log; /** * Class EventServiceProvider. @@ -108,8 +103,8 @@ class EventServiceProvider extends ServiceProvider function (PiggyBank $piggyBank) { $repetition = new PiggyBankRepetition; $repetition->piggyBank()->associate($piggyBank); - $repetition->startdate = null === $piggyBank->startdate ? null : $piggyBank->startdate; - $repetition->targetdate = null === $piggyBank->targetdate ? null : $piggyBank->targetdate; + $repetition->startdate = $piggyBank->startdate; + $repetition->targetdate = $piggyBank->targetdate; $repetition->currentamount = 0; $repetition->save(); } diff --git a/app/Providers/FireflyServiceProvider.php b/app/Providers/FireflyServiceProvider.php index f04fad6fa2..5a9c83b109 100644 --- a/app/Providers/FireflyServiceProvider.php +++ b/app/Providers/FireflyServiceProvider.php @@ -46,7 +46,9 @@ use FireflyIII\Repositories\TransactionType\TransactionTypeRepository; use FireflyIII\Repositories\TransactionType\TransactionTypeRepositoryInterface; use FireflyIII\Repositories\User\UserRepository; use FireflyIII\Repositories\User\UserRepositoryInterface; -use FireflyIII\Services\Password\PwndVerifier; +use FireflyIII\Services\Currency\ExchangeRateInterface; +use FireflyIII\Services\Currency\FixerIOv2; +use FireflyIII\Services\Password\PwndVerifierV2; use FireflyIII\Services\Password\Verifier; use FireflyIII\Support\Amount; use FireflyIII\Support\ExpandedForm; @@ -174,8 +176,9 @@ class FireflyServiceProvider extends ServiceProvider $this->app->bind(FiscalHelperInterface::class, FiscalHelper::class); $this->app->bind(BalanceReportHelperInterface::class, BalanceReportHelper::class); $this->app->bind(BudgetReportHelperInterface::class, BudgetReportHelper::class); + $this->app->bind(ExchangeRateInterface::class, FixerIOv2::class); // password verifier thing - $this->app->bind(Verifier::class, PwndVerifier::class); + $this->app->bind(Verifier::class, PwndVerifierV2::class); } } diff --git a/app/Providers/JournalServiceProvider.php b/app/Providers/JournalServiceProvider.php index b839730664..6d3e1e8ad0 100644 --- a/app/Providers/JournalServiceProvider.php +++ b/app/Providers/JournalServiceProvider.php @@ -26,8 +26,6 @@ use FireflyIII\Helpers\Collector\JournalCollector; use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Repositories\Journal\JournalRepository; use FireflyIII\Repositories\Journal\JournalRepositoryInterface; -use FireflyIII\Repositories\Journal\JournalTasker; -use FireflyIII\Repositories\Journal\JournalTaskerInterface; use Illuminate\Foundation\Application; use Illuminate\Support\ServiceProvider; @@ -50,7 +48,6 @@ class JournalServiceProvider extends ServiceProvider public function register() { $this->registerRepository(); - $this->registerTasker(); $this->registerCollector(); } @@ -91,24 +88,4 @@ class JournalServiceProvider extends ServiceProvider } ); } - - /** - * Register the tasker. - */ - private function registerTasker() - { - $this->app->bind( - JournalTaskerInterface::class, - function (Application $app) { - /** @var JournalTaskerInterface $tasker */ - $tasker = app(JournalTasker::class); - - if ($app->auth->check()) { - $tasker->setUser(auth()->user()); - } - - return $tasker; - } - ); - } } diff --git a/app/Repositories/Account/AccountRepository.php b/app/Repositories/Account/AccountRepository.php index 6c6d5348ff..ca37c54489 100644 --- a/app/Repositories/Account/AccountRepository.php +++ b/app/Repositories/Account/AccountRepository.php @@ -23,8 +23,6 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Account; use Carbon\Carbon; -use Exception; -use FireflyIII\Exceptions\FireflyException; use FireflyIII\Factory\AccountFactory; use FireflyIII\Models\Account; use FireflyIII\Models\AccountType; @@ -60,7 +58,7 @@ class AccountRepository implements AccountRepositoryInterface /** * Moved here from account CRUD. * - * @param Account $account + * @param Account $account * @param Account|null $moveTo * * @return bool @@ -98,6 +96,25 @@ class AccountRepository implements AccountRepositoryInterface return AccountType::whereType($type)->first(); } + /** + * Return meta value for account. Null if not found. + * + * @param Account $account + * @param string $field + * + * @return null|string + */ + public function getMetaValue(Account $account, string $field): ?string + { + foreach ($account->accountMeta as $meta) { + if ($meta->name === $field) { + return strval($meta->data); + } + } + + return null; + } + /** * @param Account $account * @@ -108,6 +125,23 @@ class AccountRepository implements AccountRepositoryInterface return $account->notes()->first(); } + /** + * Get note text or null. + * + * @param Account $account + * + * @return null|string + */ + public function getNoteText(Account $account): ?string + { + $note = $account->notes()->first(); + if (is_null($note)) { + return null; + } + + return $note->text; + } + /** * Returns the amount of the opening balance for this account. * @@ -201,6 +235,7 @@ class AccountRepository implements AccountRepositoryInterface /** * Returns the date of the very first transaction in this account. + * TODO refactor to nullable. * * @param Account $account * @@ -208,12 +243,13 @@ class AccountRepository implements AccountRepositoryInterface */ public function oldestJournalDate(Account $account): Carbon { + $result = new Carbon; $journal = $this->oldestJournal($account); - if (null === $journal->id) { - return new Carbon; + if (null !== $journal->id) { + $result = $journal->date; } - return $journal->date; + return $result; } /** @@ -228,8 +264,8 @@ class AccountRepository implements AccountRepositoryInterface * @param array $data * * @return Account - * @throws FireflyException - * @throws Exception + * @throws \FireflyIII\Exceptions\FireflyException + * @throws \FireflyIII\Exceptions\FireflyException */ public function store(array $data): Account { @@ -245,9 +281,9 @@ class AccountRepository implements AccountRepositoryInterface * @param Account $account * @param array $data * - * @throws FireflyException - * @throws Exception * @return Account + * @throws \FireflyIII\Exceptions\FireflyException + * @throws \FireflyIII\Exceptions\FireflyException */ public function update(Account $account, array $data): Account { @@ -263,8 +299,6 @@ class AccountRepository implements AccountRepositoryInterface * @param array $data * * @return TransactionJournal - * @throws FireflyException - * @throws Exception */ public function updateReconciliation(TransactionJournal $journal, array $data): TransactionJournal { diff --git a/app/Repositories/Account/AccountRepositoryInterface.php b/app/Repositories/Account/AccountRepositoryInterface.php index 70b74070b5..8c8bdaf7ea 100644 --- a/app/Repositories/Account/AccountRepositoryInterface.php +++ b/app/Repositories/Account/AccountRepositoryInterface.php @@ -47,7 +47,7 @@ interface AccountRepositoryInterface /** * Moved here from account CRUD. * - * @param Account $account + * @param Account $account * @param Account|null $moveTo * * @return bool @@ -66,6 +66,7 @@ interface AccountRepositoryInterface * @param string $number * @param array $types * + * @deprecated * @return Account */ public function findByAccountNumber(string $number, array $types): Account; @@ -74,10 +75,19 @@ interface AccountRepositoryInterface * @param string $iban * @param array $types * + * @deprecated * @return Account */ public function findByIban(string $iban, array $types): Account; + /** + * @param string $iban + * @param array $types + * + * @return Account|null + */ + public function findByIbanNull(string $iban, array $types): ?Account; + /** * @param string $name * @param array $types @@ -128,6 +138,16 @@ interface AccountRepositoryInterface */ public function getCashAccount(): Account; + /** + * Return meta value for account. Null if not found. + * + * @param Account $account + * @param string $field + * + * @return null|string + */ + public function getMetaValue(Account $account, string $field): ?string; + /** * @param Account $account * @@ -135,6 +155,15 @@ interface AccountRepositoryInterface */ public function getNote(Account $account): ?Note; + /** + * Get note text or null. + * + * @param Account $account + * + * @return null|string + */ + public function getNoteText(Account $account): ?string; + /** * Returns the amount of the opening balance for this account. * diff --git a/app/Repositories/Account/FindAccountsTrait.php b/app/Repositories/Account/FindAccountsTrait.php index dca6580210..a8e393631a 100644 --- a/app/Repositories/Account/FindAccountsTrait.php +++ b/app/Repositories/Account/FindAccountsTrait.php @@ -41,6 +41,7 @@ trait FindAccountsTrait /** * @param $accountId * + * @deprecated * @return Account */ public function find(int $accountId): Account @@ -58,6 +59,7 @@ trait FindAccountsTrait * @param string $number * @param array $types * + * * @deprecated * @return Account */ @@ -109,6 +111,32 @@ trait FindAccountsTrait return new Account; } + /** + * @param string $iban + * @param array $types + * + * @return Account|null + */ + public function findByIbanNull(string $iban, array $types): ?Account + { + $query = $this->user->accounts()->where('iban', '!=', '')->whereNotNull('iban'); + + if (count($types) > 0) { + $query->leftJoin('account_types', 'accounts.account_type_id', '=', 'account_types.id'); + $query->whereIn('account_types.type', $types); + } + + $accounts = $query->get(['accounts.*']); + /** @var Account $account */ + foreach ($accounts as $account) { + if ($account->iban === $iban) { + return $account; + } + } + + return null; + } + /** * @param string $name * @param array $types @@ -216,8 +244,6 @@ trait FindAccountsTrait /** * @return Account * - * @throws FireflyException - * @throws \Exception */ public function getCashAccount(): Account { diff --git a/app/Repositories/Attachment/AttachmentRepository.php b/app/Repositories/Attachment/AttachmentRepository.php index 05e3176293..48da0f6ee9 100644 --- a/app/Repositories/Attachment/AttachmentRepository.php +++ b/app/Repositories/Attachment/AttachmentRepository.php @@ -26,6 +26,7 @@ use Carbon\Carbon; use Crypt; use FireflyIII\Helpers\Attachments\AttachmentHelperInterface; use FireflyIII\Models\Attachment; +use FireflyIII\Models\Note; use FireflyIII\User; use Illuminate\Support\Collection; use Log; @@ -132,6 +133,7 @@ class AttachmentRepository implements AttachmentRepositoryInterface * * @return string * + * @throws \Illuminate\Contracts\Encryption\DecryptException * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException */ public function getContent(Attachment $attachment): string @@ -153,6 +155,23 @@ class AttachmentRepository implements AttachmentRepositoryInterface return $content; } + /** + * Get attachment note text or empty string. + * + * @param Attachment $attachment + * + * @return string + */ + public function getNoteText(Attachment $attachment): ?string + { + $note = $attachment->notes()->first(); + if (!is_null($note)) { + return strval($note->text); + } + + return null; + } + /** * @param User $user */ @@ -169,11 +188,37 @@ class AttachmentRepository implements AttachmentRepositoryInterface */ public function update(Attachment $attachment, array $data): Attachment { - $attachment->title = $data['title']; - $attachment->description = $data['description']; - $attachment->notes = $data['notes']; + $attachment->title = $data['title']; $attachment->save(); + $this->updateNote($attachment, $data['notes']); return $attachment; } + + /** + * @param Attachment $attachment + * @param string $note + * + * @return bool + */ + public function updateNote(Attachment $attachment, string $note): bool + { + if (0 === strlen($note)) { + $dbNote = $attachment->notes()->first(); + if (null !== $dbNote) { + $dbNote->delete(); + } + + return true; + } + $dbNote = $attachment->notes()->first(); + if (null === $dbNote) { + $dbNote = new Note; + $dbNote->noteable()->associate($attachment); + } + $dbNote->text = trim($note); + $dbNote->save(); + + return true; + } } diff --git a/app/Repositories/Attachment/AttachmentRepositoryInterface.php b/app/Repositories/Attachment/AttachmentRepositoryInterface.php index 262d776cb2..0a2b63b537 100644 --- a/app/Repositories/Attachment/AttachmentRepositoryInterface.php +++ b/app/Repositories/Attachment/AttachmentRepositoryInterface.php @@ -32,6 +32,7 @@ use Illuminate\Support\Collection; */ interface AttachmentRepositoryInterface { + /** * @param Attachment $attachment * @@ -80,6 +81,15 @@ interface AttachmentRepositoryInterface */ public function getContent(Attachment $attachment): string; + /** + * Get attachment note text or empty string. + * + * @param Attachment $attachment + * + * @return string + */ + public function getNoteText(Attachment $attachment): ?string; + /** * @param User $user */ diff --git a/app/Repositories/Bill/BillRepository.php b/app/Repositories/Bill/BillRepository.php index 62513a643c..11055dcafe 100644 --- a/app/Repositories/Bill/BillRepository.php +++ b/app/Repositories/Bill/BillRepository.php @@ -136,6 +136,7 @@ class BillRepository implements BillRepositoryInterface * @param Collection $accounts * * @return Collection + * @throws \InvalidArgumentException */ public function getBillsForAccounts(Collection $accounts): Collection { @@ -221,7 +222,6 @@ class BillRepository implements BillRepositoryInterface * @param Carbon $end * * @return string - * @throws \FireflyIII\Exceptions\FireflyException */ public function getBillsUnpaidInRange(Carbon $start, Carbon $end): string { @@ -276,6 +276,7 @@ class BillRepository implements BillRepositoryInterface * @param int $size * * @return LengthAwarePaginator + * @throws \InvalidArgumentException */ public function getPaginator(int $size): LengthAwarePaginator { @@ -306,7 +307,6 @@ class BillRepository implements BillRepositoryInterface * @param Carbon $end * * @return Collection - * @throws \FireflyIII\Exceptions\FireflyException */ public function getPayDatesInRange(Bill $bill, Carbon $start, Carbon $end): Collection { @@ -487,8 +487,6 @@ class BillRepository implements BillRepositoryInterface } /** - * TODO move to a service. - * * @param Bill $bill * @param TransactionJournal $journal * @@ -573,8 +571,6 @@ class BillRepository implements BillRepositoryInterface } /** - * TODO refactor - * * @param float $amount * @param float $min * @param float $max @@ -591,8 +587,6 @@ class BillRepository implements BillRepositoryInterface } /** - * TODO refactor - * * @param array $matches * @param $description * diff --git a/app/Repositories/Budget/BudgetRepository.php b/app/Repositories/Budget/BudgetRepository.php index 98e91fc5af..7df0701e48 100644 --- a/app/Repositories/Budget/BudgetRepository.php +++ b/app/Repositories/Budget/BudgetRepository.php @@ -48,6 +48,33 @@ class BudgetRepository implements BudgetRepositoryInterface /** @var User */ private $user; + /** + * A method that returns the amount of money budgeted per day for this budget, + * on average. + * + * @param Budget $budget + * + * @return string + */ + public function budgetedPerDay(Budget $budget): string + { + $total = '0'; + $count = 0; + foreach ($budget->budgetlimits as $limit) { + $diff = strval($limit->start_date->diffInDays($limit->end_date)); + $amount = strval($limit->amount); + $perDay = bcdiv($amount, $diff); + $total = bcadd($total, $perDay); + $count++; + } + $avg = $total; + if ($count > 0) { + $avg = bcdiv($total, strval($count)); + } + + return $avg; + } + /** * @return bool * @@ -225,6 +252,7 @@ class BudgetRepository implements BudgetRepositoryInterface * @param Budget $budget * * @return Carbon + * @throws \InvalidArgumentException */ public function firstUseDate(Budget $budget): Carbon { @@ -317,8 +345,8 @@ class BudgetRepository implements BudgetRepositoryInterface $amount = '0'; $availableBudget = $this->user->availableBudgets() ->where('transaction_currency_id', $currency->id) - ->where('start_date', $start->format('Y-m-d')) - ->where('end_date', $end->format('Y-m-d'))->first(); + ->where('start_date', $start->format('Y-m-d 00:00:00')) + ->where('end_date', $end->format('Y-m-d 00:00:00'))->first(); if (null !== $availableBudget) { $amount = strval($availableBudget->amount); } @@ -335,7 +363,7 @@ class BudgetRepository implements BudgetRepositoryInterface */ public function getBudgetLimits(Budget $budget, Carbon $start, Carbon $end): Collection { - $set = $budget->budgetLimits() + $set = $budget->budgetlimits() ->where( function (Builder $q5) use ($start, $end) { $q5->where( @@ -492,8 +520,8 @@ class BudgetRepository implements BudgetRepositoryInterface { $availableBudget = $this->user->availableBudgets() ->where('transaction_currency_id', $currency->id) - ->where('start_date', $start->format('Y-m-d')) - ->where('end_date', $end->format('Y-m-d'))->first(); + ->where('start_date', $start->format('Y-m-d 00:00:00')) + ->where('end_date', $end->format('Y-m-d 00:00:00'))->first(); if (null === $availableBudget) { $availableBudget = new AvailableBudget; $availableBudget->user()->associate($this->user); diff --git a/app/Repositories/Budget/BudgetRepositoryInterface.php b/app/Repositories/Budget/BudgetRepositoryInterface.php index 1a6ca75625..04d3e7911a 100644 --- a/app/Repositories/Budget/BudgetRepositoryInterface.php +++ b/app/Repositories/Budget/BudgetRepositoryInterface.php @@ -39,6 +39,16 @@ interface BudgetRepositoryInterface */ public function cleanupBudgets(): bool; + /** + * A method that returns the amount of money budgeted per day for this budget, + * on average. + * + * @param Budget $budget + * + * @return string + */ + public function budgetedPerDay(Budget $budget): string; + /** * This method collects various info on budgets, used on the budget page and on the index. * @@ -73,21 +83,13 @@ interface BudgetRepositoryInterface * Find a budget. * * @param int $budgetId + * * @deprecated * * @return Budget */ public function find(int $budgetId): Budget; - /** - * Find a budget or return NULL - * - * @param int $budgetId - * - * @return Budget|null - */ - public function findNull(int $budgetId): ?Budget; - /** * Find a budget. * @@ -97,6 +99,15 @@ interface BudgetRepositoryInterface */ public function findByName(string $name): ?Budget; + /** + * Find a budget or return NULL + * + * @param int $budgetId + * + * @return Budget|null + */ + public function findNull(int $budgetId): ?Budget; + /** * This method returns the oldest journal or transaction date known to this budget. * Will cache result. diff --git a/app/Repositories/Category/CategoryRepository.php b/app/Repositories/Category/CategoryRepository.php index c591141a8b..72f8f5c33a 100644 --- a/app/Repositories/Category/CategoryRepository.php +++ b/app/Repositories/Category/CategoryRepository.php @@ -23,10 +23,13 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Category; use Carbon\Carbon; +use FireflyIII\Factory\CategoryFactory; use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Models\Category; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionType; +use FireflyIII\Services\Internal\Destroy\CategoryDestroyService; +use FireflyIII\Services\Internal\Update\CategoryUpdateService; use FireflyIII\User; use Illuminate\Support\Collection; use Log; @@ -49,7 +52,9 @@ class CategoryRepository implements CategoryRepositoryInterface */ public function destroy(Category $category): bool { - $category->delete(); + /** @var CategoryDestroyService $service */ + $service = app(CategoryDestroyService::class); + $service->destroy($category); return true; } @@ -444,15 +449,12 @@ class CategoryRepository implements CategoryRepositoryInterface */ public function store(array $data): Category { - $newCategory = Category::firstOrCreateEncrypted( - [ - 'user_id' => $this->user->id, - 'name' => $data['name'], - ] - ); - $newCategory->save(); + /** @var CategoryFactory $factory */ + $factory = app(CategoryFactory::class); + $factory->setUser($this->user); + $category = $factory->findOrCreate(null, $data['name']); - return $newCategory; + return $category; } /** @@ -463,11 +465,10 @@ class CategoryRepository implements CategoryRepositoryInterface */ public function update(Category $category, array $data): Category { - // update the account: - $category->name = $data['name']; - $category->save(); + /** @var CategoryUpdateService $service */ + $service = app(CategoryUpdateService::class); - return $category; + return $service->update($category, $data); } /** diff --git a/app/Repositories/Category/CategoryRepositoryInterface.php b/app/Repositories/Category/CategoryRepositoryInterface.php index 84e3f1d922..e224ef84e7 100644 --- a/app/Repositories/Category/CategoryRepositoryInterface.php +++ b/app/Repositories/Category/CategoryRepositoryInterface.php @@ -53,20 +53,12 @@ interface CategoryRepositoryInterface * Find a category. * * @param int $categoryId + * * @deprecated * @return Category */ public function find(int $categoryId): Category; - /** - * Find a category or return NULL - * - * @param int $categoryId - * - * @return Category|null - */ - public function findNull(int $categoryId): ?Category; - /** * Find a category. * @@ -76,6 +68,15 @@ interface CategoryRepositoryInterface */ public function findByName(string $name): ?Category; + /** + * Find a category or return NULL + * + * @param int $categoryId + * + * @return Category|null + */ + public function findNull(int $categoryId): ?Category; + /** * @param Category $category * diff --git a/app/Repositories/Currency/CurrencyRepository.php b/app/Repositories/Currency/CurrencyRepository.php index 37af7d2f9b..f0da06ba51 100644 --- a/app/Repositories/Currency/CurrencyRepository.php +++ b/app/Repositories/Currency/CurrencyRepository.php @@ -23,9 +23,12 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Currency; use Carbon\Carbon; +use FireflyIII\Factory\TransactionCurrencyFactory; use FireflyIII\Models\CurrencyExchangeRate; use FireflyIII\Models\Preference; use FireflyIII\Models\TransactionCurrency; +use FireflyIII\Services\Internal\Destroy\CurrencyDestroyService; +use FireflyIII\Services\Internal\Update\CurrencyUpdateService; use FireflyIII\User; use Illuminate\Support\Collection; use Log; @@ -96,7 +99,9 @@ class CurrencyRepository implements CurrencyRepositoryInterface public function destroy(TransactionCurrency $currency): bool { if ($this->user->hasRole('owner')) { - $currency->forceDelete(); + /** @var CurrencyDestroyService $service */ + $service = app(CurrencyDestroyService::class); + $service->destroy($currency); } return true; @@ -107,6 +112,8 @@ class CurrencyRepository implements CurrencyRepositoryInterface * * @param int $currencyId * + * @deprecated + * * @return TransactionCurrency */ public function find(int $currencyId): TransactionCurrency @@ -122,6 +129,8 @@ class CurrencyRepository implements CurrencyRepositoryInterface /** * Find by currency code. * + * @deprecated + * * @param string $currencyCode * * @return TransactionCurrency @@ -138,6 +147,7 @@ class CurrencyRepository implements CurrencyRepositoryInterface /** * Find by currency code, return NULL if unfound. + * Used in Import Currency! * * @param string $currencyCode * @@ -153,6 +163,8 @@ class CurrencyRepository implements CurrencyRepositoryInterface * * @param string $currencyName * + * @deprecated + * * @return TransactionCurrency */ public function findByName(string $currencyName): TransactionCurrency @@ -165,9 +177,24 @@ class CurrencyRepository implements CurrencyRepositoryInterface return $preferred; } + /** + * Find by currency name or return null. + * Used in Import Currency! + * + * @param string $currencyName + * + * @return TransactionCurrency + */ + public function findByNameNull(string $currencyName): ?TransactionCurrency + { + return TransactionCurrency::whereName($currencyName)->first(); + } + /** * Find by currency symbol. * + * @deprecated + * * @param string $currencySymbol * * @return TransactionCurrency @@ -182,8 +209,22 @@ class CurrencyRepository implements CurrencyRepositoryInterface return $currency; } + /** + * Find by currency symbol or return NULL + * Used in Import Currency! + * + * @param string $currencySymbol + * + * @return TransactionCurrency + */ + public function findBySymbolNull(string $currencySymbol): ?TransactionCurrency + { + return TransactionCurrency::whereSymbol($currencySymbol)->first(); + } + /** * Find by ID, return NULL if not found. + * Used in Import Currency! * * @param int $currencyId * @@ -275,17 +316,10 @@ class CurrencyRepository implements CurrencyRepositoryInterface */ public function store(array $data): TransactionCurrency { - /** @var TransactionCurrency $currency */ - $currency = TransactionCurrency::create( - [ - 'name' => $data['name'], - 'code' => $data['code'], - 'symbol' => $data['symbol'], - 'decimal_places' => $data['decimal_places'], - ] - ); + /** @var TransactionCurrencyFactory $factory */ + $factory = app(TransactionCurrencyFactory::class); - return $currency; + return $factory->create($data); } /** @@ -296,12 +330,9 @@ class CurrencyRepository implements CurrencyRepositoryInterface */ public function update(TransactionCurrency $currency, array $data): TransactionCurrency { - $currency->code = $data['code']; - $currency->symbol = $data['symbol']; - $currency->name = $data['name']; - $currency->decimal_places = $data['decimal_places']; - $currency->save(); + /** @var CurrencyUpdateService $service */ + $service = app(CurrencyUpdateService::class); - return $currency; + return $service->update($currency, $data); } } diff --git a/app/Repositories/Currency/CurrencyRepositoryInterface.php b/app/Repositories/Currency/CurrencyRepositoryInterface.php index 60df5cf396..39d3f78a47 100644 --- a/app/Repositories/Currency/CurrencyRepositoryInterface.php +++ b/app/Repositories/Currency/CurrencyRepositoryInterface.php @@ -87,13 +87,31 @@ interface CurrencyRepositoryInterface /** * Find by currency name. - * + * @deprecated * @param string $currencyName * * @return TransactionCurrency */ public function findByName(string $currencyName): TransactionCurrency; + /** + * Find by currency name. + * + * @param string $currencyName + * + * @return TransactionCurrency + */ + public function findByNameNull(string $currencyName): ?TransactionCurrency; + + /** + * Find by currency symbol. + * @deprecated + * @param string $currencySymbol + * + * @return TransactionCurrency + */ + public function findBySymbol(string $currencySymbol): TransactionCurrency; + /** * Find by currency symbol. * @@ -101,7 +119,7 @@ interface CurrencyRepositoryInterface * * @return TransactionCurrency */ - public function findBySymbol(string $currencySymbol): TransactionCurrency; + public function findBySymbolNull(string $currencySymbol): ?TransactionCurrency; /** * Find by ID, return NULL if not found. diff --git a/app/Repositories/ImportJob/ImportJobRepository.php b/app/Repositories/ImportJob/ImportJobRepository.php index 9eee6714e5..a034fc64bf 100644 --- a/app/Repositories/ImportJob/ImportJobRepository.php +++ b/app/Repositories/ImportJob/ImportJobRepository.php @@ -210,6 +210,8 @@ class ImportJobRepository implements ImportJobRepositoryInterface * @param UploadedFile $file * * @return bool + * @throws \RuntimeException + * @throws \LogicException */ public function processConfiguration(ImportJob $job, UploadedFile $file): bool { @@ -247,6 +249,9 @@ class ImportJobRepository implements ImportJobRepositoryInterface * * @return bool * + * @throws \RuntimeException + * @throws \LogicException + * @throws \Illuminate\Contracts\Encryption\EncryptException * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException */ public function processFile(ImportJob $job, ?UploadedFile $file): bool @@ -311,19 +316,11 @@ class ImportJobRepository implements ImportJobRepositoryInterface */ public function setExtendedStatus(ImportJob $job, array $array): ImportJob { - // remove 'errors' because it gets larger and larger and larger... - $display = $array; - unset($display['errors']); - Log::debug(sprintf('Incoming extended status for job "%s" is (except errors): ', $job->key), $display); $currentStatus = $job->extended_status; $newStatus = array_merge($currentStatus, $array); $job->extended_status = $newStatus; $job->save(); - // remove 'errors' because it gets larger and larger and larger... - unset($newStatus['errors']); - Log::debug(sprintf('Set extended status of job "%s" to (except errors): ', $job->key), $newStatus); - return $job; } diff --git a/app/Repositories/Journal/JournalRepository.php b/app/Repositories/Journal/JournalRepository.php index d46576e4b7..ed47af2193 100644 --- a/app/Repositories/Journal/JournalRepository.php +++ b/app/Repositories/Journal/JournalRepository.php @@ -23,10 +23,13 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Journal; use Carbon\Carbon; +use Exception; use FireflyIII\Factory\TransactionJournalFactory; +use FireflyIII\Factory\TransactionJournalMetaFactory; use FireflyIII\Models\Account; use FireflyIII\Models\AccountType; use FireflyIII\Models\Note; +use FireflyIII\Models\PiggyBankEvent; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionType; @@ -366,6 +369,35 @@ class JournalRepository implements JournalRepositoryInterface return $amount; } + /** + * Return Carbon value of a meta field (or NULL). + * + * @param TransactionJournal $journal + * @param string $field + * + * @return null|Carbon + */ + public function getMetaDate(TransactionJournal $journal, string $field): ?Carbon + { + $cache = new CacheProperties; + $cache->addProperty('journal-meta-updated'); + $cache->addProperty($journal->id); + $cache->addProperty($field); + + if ($cache->has()) { + return new Carbon($cache->get()); // @codeCoverageIgnore + } + + $entry = $journal->transactionJournalMeta()->where('name', $field)->first(); + if (is_null($entry)) { + return null; + } + $value = new Carbon($entry->data); + $cache->store($entry->data); + + return $value; + } + /** * Return value of a meta field (or NULL) as a string. * @@ -376,9 +408,8 @@ class JournalRepository implements JournalRepositoryInterface */ public function getMetaField(TransactionJournal $journal, string $field): ?string { - $value = null; $cache = new CacheProperties; - $cache->addProperty('journal-meta'); + $cache->addProperty('journal-meta-updated'); $cache->addProperty($journal->id); $cache->addProperty($field); @@ -386,15 +417,32 @@ class JournalRepository implements JournalRepositoryInterface return $cache->get(); // @codeCoverageIgnore } - Log::debug(sprintf('Looking for journal #%d meta field "%s".', $journal->id, $field)); $entry = $journal->transactionJournalMeta()->where('name', $field)->first(); if (is_null($entry)) { return null; } - $value = $entry->data; - $cache->store($value); - return $value; + $value = $entry->data; + + // return when array: + if (is_array($value)) { + $return = join(',', $value); + $cache->store($return); + + return $return; + } + + // return when something else: + try { + $return = strval($value); + $cache->store($return); + } catch (Exception $e) { + Log::error($e->getMessage()); + + return ''; + } + + return $return; } /** @@ -408,22 +456,40 @@ class JournalRepository implements JournalRepositoryInterface } /** - * Return text of a note attached to journal, or ''. + * Return text of a note attached to journal, or NULL * * @param TransactionJournal $journal * - * @return string + * @return string|null */ - public function getNoteText(TransactionJournal $journal): string + public function getNoteText(TransactionJournal $journal): ?string { $note = $this->getNote($journal); if (is_null($note)) { - return ''; + return null; } return $note->text; } + /** + * @param TransactionJournal $journal + * + * @return Collection + */ + public function getPiggyBankEvents(TransactionJournal $journal): Collection + { + /** @var Collection $set */ + $events = $journal->piggyBankEvents()->get(); + $events->each( + function (PiggyBankEvent $event) { + $event->piggyBank = $event->piggyBank()->withTrashed()->first(); + } + ); + + return $events; + } + /** * Return all tags as strings in an array. * @@ -532,6 +598,52 @@ class JournalRepository implements JournalRepositoryInterface return false; } + /** + * Set meta field for journal that contains a date. + * + * @param TransactionJournal $journal + * @param string $name + * @param Carbon $date + * + * @return void + */ + public function setMetaDate(TransactionJournal $journal, string $name, Carbon $date): void + { + /** @var TransactionJournalMetaFactory $factory */ + $factory = app(TransactionJournalMetaFactory::class); + $factory->updateOrCreate( + [ + 'data' => $date, + 'journal' => $journal, + 'name' => $name, + ] + ); + + return; + } + + /** + * Set meta field for journal that contains string. + * + * @param TransactionJournal $journal + * @param string $name + * @param string $value + */ + public function setMetaString(TransactionJournal $journal, string $name, string $value): void + { + /** @var TransactionJournalMetaFactory $factory */ + $factory = app(TransactionJournalMetaFactory::class); + $factory->updateOrCreate( + [ + 'data' => $value, + 'journal' => $journal, + 'name' => $name, + ] + ); + + return; + } + /** * @param TransactionJournal $journal * @param int $order @@ -577,7 +689,6 @@ class JournalRepository implements JournalRepositoryInterface * * @return TransactionJournal * - * @throws \FireflyIII\Exceptions\FireflyException */ public function update(TransactionJournal $journal, array $data): TransactionJournal { diff --git a/app/Repositories/Journal/JournalRepositoryInterface.php b/app/Repositories/Journal/JournalRepositoryInterface.php index 3d71181414..b0ddcfd54f 100644 --- a/app/Repositories/Journal/JournalRepositoryInterface.php +++ b/app/Repositories/Journal/JournalRepositoryInterface.php @@ -22,6 +22,7 @@ declare(strict_types=1); namespace FireflyIII\Repositories\Journal; +use Carbon\Carbon; use FireflyIII\Models\Account; use FireflyIII\Models\Note; use FireflyIII\Models\Transaction; @@ -36,6 +37,7 @@ use Illuminate\Support\MessageBag; */ interface JournalRepositoryInterface { + /** * @param TransactionJournal $journal * @param TransactionType $type @@ -164,6 +166,16 @@ interface JournalRepositoryInterface */ public function getJournalTotal(TransactionJournal $journal): string; + /** + * Return Carbon value of a meta field (or NULL). + * + * @param TransactionJournal $journal + * @param string $field + * + * @return null|Carbon + */ + public function getMetaDate(TransactionJournal $journal, string $field): ?Carbon; + /** * Return value of a meta field (or NULL). * @@ -182,13 +194,20 @@ interface JournalRepositoryInterface public function getNote(TransactionJournal $journal): ?Note; /** - * Return text of a note attached to journal, or ''. + * Return text of a note attached to journal, or NULL * * @param TransactionJournal $journal * - * @return string + * @return string|null */ - public function getNoteText(TransactionJournal $journal): string; + public function getNoteText(TransactionJournal $journal): ?string; + + /** + * @param TransactionJournal $journal + * + * @return Collection + */ + public function getPiggyBankEvents(TransactionJournal $journal): Collection; /** * Return all tags as strings in an array. @@ -243,6 +262,26 @@ interface JournalRepositoryInterface */ public function reconcileById(int $transactionId): bool; + /** + * Set meta field for journal that contains a date. + * + * @param TransactionJournal $journal + * @param string $name + * @param Carbon $date + * + * @return void + */ + public function setMetaDate(TransactionJournal $journal, string $name, Carbon $date): void; + + /** + * Set meta field for journal that contains string. + * + * @param TransactionJournal $journal + * @param string $name + * @param string $value + */ + public function setMetaString(TransactionJournal $journal, string $name, string $value): void; + /** * @param TransactionJournal $journal * @param int $order diff --git a/app/Repositories/Journal/JournalTasker.php b/app/Repositories/Journal/JournalTasker.php deleted file mode 100644 index d360490e0f..0000000000 --- a/app/Repositories/Journal/JournalTasker.php +++ /dev/null @@ -1,245 +0,0 @@ -. - */ -declare(strict_types=1); - -namespace FireflyIII\Repositories\Journal; - -use DB; -use FireflyIII\Models\AccountType; -use FireflyIII\Models\PiggyBankEvent; -use FireflyIII\Models\Transaction; -use FireflyIII\Models\TransactionJournal; -use FireflyIII\User; -use Illuminate\Database\Eloquent\Builder; -use Illuminate\Database\Query\JoinClause; -use Illuminate\Support\Collection; -use Steam; - -/** - * Class JournalTasker. - */ -class JournalTasker implements JournalTaskerInterface -{ - /** @var User */ - private $user; - - /** - * @deprecated - * - * @param TransactionJournal $journal - * - * @return Collection - */ - public function getPiggyBankEvents(TransactionJournal $journal): Collection - { - /** @var Collection $set */ - $events = $journal->piggyBankEvents()->get(); - $events->each( - function (PiggyBankEvent $event) { - $event->piggyBank = $event->piggyBank()->withTrashed()->first(); - } - ); - - return $events; - } - - /** - * Get an overview of the transactions of a journal, tailored to the view - * that shows a transaction (transaction/show/xx). - * - * @param TransactionJournal $journal - * - * @deprecated - * - * @return array - */ - public function getTransactionsOverview(TransactionJournal $journal): array - { - $set = $journal - ->transactions()// "source" - ->leftJoin( - 'transactions as destination', - function (JoinClause $join) { - $join - ->on('transactions.transaction_journal_id', '=', 'destination.transaction_journal_id') - ->where('transactions.amount', '=', DB::raw('destination.amount * -1')) - ->where('transactions.identifier', '=', DB::raw('destination.identifier')) - ->whereNull('destination.deleted_at'); - } - ) - ->with(['budgets', 'categories']) - ->leftJoin('accounts as source_accounts', 'transactions.account_id', '=', 'source_accounts.id') - ->leftJoin('account_types as source_account_types', 'source_accounts.account_type_id', '=', 'source_account_types.id') - ->leftJoin('accounts as destination_accounts', 'destination.account_id', '=', 'destination_accounts.id') - ->leftJoin('account_types as destination_account_types', 'destination_accounts.account_type_id', '=', 'destination_account_types.id') - ->leftJoin('transaction_currencies as native_currencies', 'transactions.transaction_currency_id', '=', 'native_currencies.id') - ->leftJoin('transaction_currencies as foreign_currencies', 'transactions.foreign_currency_id', '=', 'foreign_currencies.id') - ->where('transactions.amount', '<', 0) - ->whereNull('transactions.deleted_at') - ->get( - [ - 'transactions.id', - 'transactions.account_id', - 'source_accounts.name as account_name', - 'source_accounts.encrypted as account_encrypted', - 'source_account_types.type as account_type', - 'transactions.amount', - 'transactions.foreign_amount', - 'transactions.description', - 'destination.id as destination_id', - 'destination.account_id as destination_account_id', - 'destination_accounts.name as destination_account_name', - 'destination_accounts.encrypted as destination_account_encrypted', - 'destination_account_types.type as destination_account_type', - 'native_currencies.id as transaction_currency_id', - 'native_currencies.decimal_places as transaction_currency_dp', - 'native_currencies.code as transaction_currency_code', - 'native_currencies.symbol as transaction_currency_symbol', - - 'foreign_currencies.id as foreign_currency_id', - 'foreign_currencies.decimal_places as foreign_currency_dp', - 'foreign_currencies.code as foreign_currency_code', - 'foreign_currencies.symbol as foreign_currency_symbol', - ] - ); - - $transactions = []; - $transactionType = $journal->transactionType->type; - - /** @var Transaction $entry */ - foreach ($set as $entry) { - $sourceBalance = $this->getBalance(intval($entry->id)); - $destinationBalance = $this->getBalance(intval($entry->destination_id)); - $budget = $entry->budgets->first(); - $category = $entry->categories->first(); - $transaction = [ - 'journal_type' => $transactionType, - 'updated_at' => $journal->updated_at, - 'source_id' => $entry->id, - 'source' => $journal->transactions()->find($entry->id), - 'source_amount' => $entry->amount, - 'foreign_source_amount' => $entry->foreign_amount, - 'description' => $entry->description, - 'source_account_id' => $entry->account_id, - 'source_account_name' => Steam::decrypt(intval($entry->account_encrypted), $entry->account_name), - 'source_account_type' => $entry->account_type, - 'source_account_before' => $sourceBalance, - 'source_account_after' => bcadd($sourceBalance, $entry->amount), - 'destination_id' => $entry->destination_id, - 'destination_amount' => bcmul($entry->amount, '-1'), - 'foreign_destination_amount' => null === $entry->foreign_amount ? null : bcmul($entry->foreign_amount, '-1'), - 'destination_account_id' => $entry->destination_account_id, - 'destination_account_type' => $entry->destination_account_type, - 'destination_account_name' => Steam::decrypt(intval($entry->destination_account_encrypted), $entry->destination_account_name), - 'destination_account_before' => $destinationBalance, - 'destination_account_after' => bcadd($destinationBalance, bcmul($entry->amount, '-1')), - 'budget_id' => null === $budget ? 0 : $budget->id, - 'category' => null === $category ? '' : $category->name, - 'transaction_currency_id' => $entry->transaction_currency_id, - 'transaction_currency_code' => $entry->transaction_currency_code, - 'transaction_currency_symbol' => $entry->transaction_currency_symbol, - 'transaction_currency_dp' => $entry->transaction_currency_dp, - 'foreign_currency_id' => $entry->foreign_currency_id, - 'foreign_currency_code' => $entry->foreign_currency_code, - 'foreign_currency_symbol' => $entry->foreign_currency_symbol, - 'foreign_currency_dp' => $entry->foreign_currency_dp, - ]; - if (AccountType::CASH === $entry->destination_account_type) { - $transaction['destination_account_name'] = ''; - } - - if (AccountType::CASH === $entry->account_type) { - $transaction['source_account_name'] = ''; - } - - $transactions[] = $transaction; - } - - return $transactions; - } - - /** - * @param User $user - */ - public function setUser(User $user) - { - $this->user = $user; - } - - /** - * Collect the balance of an account before the given transaction has hit. This is tricky, because - * the balance does not depend on the transaction itself but the journal it's part of. And of course - * the order of transactions within the journal. So the query is pretty complex:. - * - * @param int $transactionId - * - * @deprecated - * @deprecated - * @return string - */ - private function getBalance(int $transactionId): string - { - // find the transaction first: - $transaction = Transaction::find($transactionId); - $date = $transaction->transactionJournal->date->format('Y-m-d'); - $order = intval($transaction->transactionJournal->order); - $journalId = intval($transaction->transaction_journal_id); - $identifier = intval($transaction->identifier); - - // also add the virtual balance to the balance: - $virtualBalance = strval($transaction->account->virtual_balance); - - // go! - $sum = Transaction::leftJoin('transaction_journals', 'transaction_journals.id', '=', 'transactions.transaction_journal_id') - ->where('account_id', $transaction->account_id) - ->whereNull('transactions.deleted_at') - ->whereNull('transaction_journals.deleted_at') - ->where('transactions.id', '!=', $transactionId) - ->where( - function (Builder $q1) use ($date, $order, $journalId, $identifier) { - $q1->where('transaction_journals.date', '<', $date); // date - $q1->orWhere( - function (Builder $q2) use ($date, $order) { // function 1 - $q2->where('transaction_journals.date', $date); - $q2->where('transaction_journals.order', '>', $order); - } - ); - $q1->orWhere( - function (Builder $q3) use ($date, $order, $journalId) { // function 2 - $q3->where('transaction_journals.date', $date); - $q3->where('transaction_journals.order', $order); - $q3->where('transaction_journals.id', '<', $journalId); - } - ); - $q1->orWhere( - function (Builder $q4) use ($date, $order, $journalId, $identifier) { // function 3 - $q4->where('transaction_journals.date', $date); - $q4->where('transaction_journals.order', $order); - $q4->where('transaction_journals.id', $journalId); - $q4->where('transactions.identifier', '>', $identifier); - } - ); - } - )->sum('transactions.amount'); - - return bcadd(strval($sum), $virtualBalance); - } -} diff --git a/app/Repositories/Journal/JournalTaskerInterface.php b/app/Repositories/Journal/JournalTaskerInterface.php deleted file mode 100644 index 06d9294654..0000000000 --- a/app/Repositories/Journal/JournalTaskerInterface.php +++ /dev/null @@ -1,55 +0,0 @@ -. - */ -declare(strict_types=1); - -namespace FireflyIII\Repositories\Journal; - -use FireflyIII\Models\TransactionJournal; -use FireflyIII\User; -use Illuminate\Support\Collection; - -/** - * Interface JournalTaskerInterface. - */ -interface JournalTaskerInterface -{ - /** - * @param TransactionJournal $journal - * - * @return Collection - */ - public function getPiggyBankEvents(TransactionJournal $journal): Collection; - - /** - * Get an overview of the transactions of a journal, tailored to the view - * that shows a transaction (transaction/show/xx). - * - * @param TransactionJournal $journal - * - * @return array - */ - public function getTransactionsOverview(TransactionJournal $journal): array; - - /** - * @param User $user - */ - public function setUser(User $user); -} diff --git a/app/Repositories/PiggyBank/PiggyBankRepository.php b/app/Repositories/PiggyBank/PiggyBankRepository.php index 23c3b7c0eb..2ad4a71bb3 100644 --- a/app/Repositories/PiggyBank/PiggyBankRepository.php +++ b/app/Repositories/PiggyBank/PiggyBankRepository.php @@ -129,7 +129,11 @@ class PiggyBankRepository implements PiggyBankRepositoryInterface { /** @var PiggyBankEvent $event */ $event = PiggyBankEvent::create( - ['piggy_bank_id' => $piggyBank->id, 'transaction_journal_id' => $journal->id, 'date' => $journal->date, 'amount' => $amount] + [ + 'piggy_bank_id' => $piggyBank->id, + 'transaction_journal_id' => $journal->id, + 'date' => $journal->date->format('Y-m-d'), + 'amount' => $amount] ); return $event; diff --git a/app/Repositories/Rule/RuleRepository.php b/app/Repositories/Rule/RuleRepository.php index 3d92220a51..50fa719748 100644 --- a/app/Repositories/Rule/RuleRepository.php +++ b/app/Repositories/Rule/RuleRepository.php @@ -129,13 +129,13 @@ class RuleRepository implements RuleRepositoryInterface $order = $rule->order; // find the rule with order+1 and give it order-1 - $other = $rule->ruleGroup->rules()->where('order', ($order + 1))->first(); + $other = $rule->ruleGroup->rules()->where('order', $order + 1)->first(); if ($other) { - $other->order = $other->order - 1; + --$other->order; $other->save(); } - $rule->order = ($rule->order + 1); + ++$rule->order; $rule->save(); $this->resetRulesInGroupOrder($rule->ruleGroup); @@ -152,13 +152,13 @@ class RuleRepository implements RuleRepositoryInterface $order = $rule->order; // find the rule with order-1 and give it order+1 - $other = $rule->ruleGroup->rules()->where('order', ($order - 1))->first(); + $other = $rule->ruleGroup->rules()->where('order', $order - 1)->first(); if ($other) { - $other->order = ($other->order + 1); + ++$other->order; $other->save(); } - $rule->order = ($rule->order - 1); + --$rule->order; $rule->save(); $this->resetRulesInGroupOrder($rule->ruleGroup); diff --git a/app/Repositories/RuleGroup/RuleGroupRepository.php b/app/Repositories/RuleGroup/RuleGroupRepository.php index f271e7d893..9d1268d19f 100644 --- a/app/Repositories/RuleGroup/RuleGroupRepository.php +++ b/app/Repositories/RuleGroup/RuleGroupRepository.php @@ -185,13 +185,13 @@ class RuleGroupRepository implements RuleGroupRepositoryInterface $order = $ruleGroup->order; // find the rule with order+1 and give it order-1 - $other = $this->user->ruleGroups()->where('order', ($order + 1))->first(); + $other = $this->user->ruleGroups()->where('order', $order + 1)->first(); if ($other) { - $other->order = ($other->order - 1); + --$other->order; $other->save(); } - $ruleGroup->order = ($ruleGroup->order + 1); + ++$ruleGroup->order; $ruleGroup->save(); $this->resetRuleGroupOrder(); @@ -208,13 +208,13 @@ class RuleGroupRepository implements RuleGroupRepositoryInterface $order = $ruleGroup->order; // find the rule with order-1 and give it order+1 - $other = $this->user->ruleGroups()->where('order', ($order - 1))->first(); + $other = $this->user->ruleGroups()->where('order', $order - 1)->first(); if ($other) { - $other->order = ($other->order + 1); + ++$other->order; $other->save(); } - $ruleGroup->order = ($ruleGroup->order - 1); + --$ruleGroup->order; $ruleGroup->save(); $this->resetRuleGroupOrder(); @@ -286,7 +286,7 @@ class RuleGroupRepository implements RuleGroupRepositoryInterface 'user_id' => $this->user->id, 'title' => $data['title'], 'description' => $data['description'], - 'order' => ($order + 1), + 'order' => $order + 1, 'active' => 1, ] ); diff --git a/app/Repositories/Tag/TagRepository.php b/app/Repositories/Tag/TagRepository.php index 901d43221c..af5391c1fd 100644 --- a/app/Repositories/Tag/TagRepository.php +++ b/app/Repositories/Tag/TagRepository.php @@ -375,7 +375,7 @@ class TagRepository implements TagRepositoryInterface /** @var array $entry */ foreach ($temporary as $entry) { - $scale = $this->cloudScale([12, 20], floatval($entry['amount']), floatval($min), floatval($max)); + $scale = $this->cloudScale([12, 20], (float)$entry['amount'], (float)$min, (float)$max); $tagId = $entry['tag']['id']; $return[$tagId] = [ 'scale' => $scale, @@ -424,14 +424,15 @@ class TagRepository implements TagRepositoryInterface $diff = $range[1] - $range[0]; $step = 1; - if (0 != $diff) { + if (0.0 !== $diff) { $step = $amountDiff / $diff; } - if (0 == $step) { + if (0.0 === $step) { $step = 1; } - $extra = round($amount / $step); - return intval($range[0] + $extra); + $extra = $step / $amount; + $result = (int)($range[0] + $extra); + return $result; } } diff --git a/app/Repositories/User/UserRepository.php b/app/Repositories/User/UserRepository.php index 4f664f4570..4a3d865606 100644 --- a/app/Repositories/User/UserRepository.php +++ b/app/Repositories/User/UserRepository.php @@ -158,6 +158,7 @@ class UserRepository implements UserRepositoryInterface /** * @param int $userId * + * @deprecated * @return User */ public function find(int $userId): User @@ -180,6 +181,16 @@ class UserRepository implements UserRepositoryInterface return User::where('email', $email)->first(); } + /** + * @param int $userId + * + * @return User|null + */ + public function findNull(int $userId): ?User + { + return User::find($userId); + } + /** * Returns the first user in the DB. Generally only works when there is just one. * diff --git a/app/Repositories/User/UserRepositoryInterface.php b/app/Repositories/User/UserRepositoryInterface.php index 46d261d006..3582dc509e 100644 --- a/app/Repositories/User/UserRepositoryInterface.php +++ b/app/Repositories/User/UserRepositoryInterface.php @@ -103,11 +103,17 @@ interface UserRepositoryInterface /** * @param int $userId - * + * @deprecated * @return User */ public function find(int $userId): User; + /** + * @param int $userId + * @return User|null + */ + public function findNull(int $userId): ?User; + /** * @param string $email * diff --git a/app/Rules/BelongsUser.php b/app/Rules/BelongsUser.php index 5b0b26ce7f..1607a29bf0 100644 --- a/app/Rules/BelongsUser.php +++ b/app/Rules/BelongsUser.php @@ -2,7 +2,6 @@ declare(strict_types=1); - /** * BelongsUser.php * Copyright (c) 2018 thegrumpydictator@gmail.com @@ -60,7 +59,7 @@ class BelongsUser implements Rule /** * Determine if the validation rule passes. - * TODO use repositories? + * * @param string $attribute * @param mixed $value * diff --git a/app/Rules/UniqueIban.php b/app/Rules/UniqueIban.php index 63bd4319af..8cd5312b80 100644 --- a/app/Rules/UniqueIban.php +++ b/app/Rules/UniqueIban.php @@ -23,9 +23,11 @@ declare(strict_types=1); namespace FireflyIII\Rules; +use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\Account; +use FireflyIII\Models\AccountType; use Illuminate\Contracts\Validation\Rule; -use Illuminate\Support\Collection; +use Log; /** * Class UniqueIban @@ -35,14 +37,19 @@ class UniqueIban implements Rule /** @var Account */ private $account; + /** @var string */ + private $expectedType; + /** * Create a new rule instance. * - * @return void + * @param Account|null $account + * @param string|null $expectedType */ - public function __construct(?Account $account) + public function __construct(?Account $account, ?string $expectedType) { - $this->account = $account; + $this->account = $account; + $this->expectedType = $expectedType; } /** @@ -62,24 +69,68 @@ class UniqueIban implements Rule * @param mixed $value * * @return bool + * @throws FireflyException */ public function passes($attribute, $value) { if (!auth()->check()) { return true; // @codeCoverageIgnore } + if (is_null($this->expectedType)) { + return true; + } + $maxCounts = [ + AccountType::ASSET => 0, + AccountType::EXPENSE => 0, + AccountType::REVENUE => 0, + ]; + switch ($this->expectedType) { + case 'asset': + case AccountType::ASSET: + // iban should be unique amongst asset accounts + // should not be in use with expense or revenue accounts. + // ie: must be totally unique. + break; + case 'expense': + case AccountType::EXPENSE: + // should be unique amongst expense and asset accounts. + // may appear once in revenue accounts + $maxCounts[AccountType::REVENUE] = 1; + break; + case 'revenue': + case AccountType::REVENUE: + // should be unique amongst revenue and asset accounts. + // may appear once in expense accounts + $maxCounts[AccountType::EXPENSE] = 1; + break; + default: - $query = auth()->user()->accounts(); - if (!is_null($this->account)) { - $query->where('accounts.id', '!=', $this->account->id); + throw new FireflyException(sprintf('UniqueIban cannot handle type "%s"', $this->expectedType)); } - /** @var Collection $accounts */ - $accounts = $query->get(); + foreach ($maxCounts as $type => $max) { + $count = 0; + $query = auth()->user() + ->accounts() + ->leftJoin('account_types', 'account_types.id', '=', 'accounts.account_type_id') + ->where('account_types.type', $type); + if (!is_null($this->account)) { + $query->where('accounts.id', '!=', $this->account->id); + } + $result = $query->get(['accounts.*']); + foreach ($result as $account) { + if ($account->iban === $value) { + $count++; + } + } + if ($count > $max) { + Log::debug( + sprintf( + 'IBAN "%s" is in use with %d account(s) of type "%s", which is too much for expected type "%s"', + $value, $count, $type, $this->expectedType + ) + ); - /** @var Account $account */ - foreach ($accounts as $account) { - if ($account->iban === $value) { return false; } } diff --git a/app/Rules/ValidTransactions.php b/app/Rules/ValidTransactions.php index 1ffb21b0cd..471e328d89 100644 --- a/app/Rules/ValidTransactions.php +++ b/app/Rules/ValidTransactions.php @@ -2,7 +2,6 @@ declare(strict_types=1); - /** * ValidTransactions.php * Copyright (c) 2018 thegrumpydictator@gmail.com @@ -75,10 +74,12 @@ class ValidTransactions implements Rule ->where('accounts.user_id', $userId)->count(); if ($count === 0) { Log::debug(sprintf('Count for transaction #%d and user #%d is zero! Return FALSE', $transactionId, $userId)); + return false; } } Log::debug('Return true!'); + return true; } } diff --git a/app/Services/Bunq/Id/BunqId.php b/app/Services/Bunq/Id/BunqId.php index da63a6b43c..02c263cf23 100644 --- a/app/Services/Bunq/Id/BunqId.php +++ b/app/Services/Bunq/Id/BunqId.php @@ -31,6 +31,18 @@ class BunqId /** @var int */ private $id = 0; + /** + * BunqId constructor. + * + * @param null $data + */ + public function __construct($data = null) + { + if (!is_null($data)) { + $this->id = $data['id']; + } + } + /** * @return int */ @@ -46,4 +58,14 @@ class BunqId { $this->id = $id; } + + /** + * @return array + */ + public function toArray(): array + { + return [ + 'id' => $this->id, + ]; + } } diff --git a/app/Services/Bunq/Id/DeviceSessionId.php b/app/Services/Bunq/Id/DeviceSessionId.php index 91c5233870..7ac7d73ed1 100644 --- a/app/Services/Bunq/Id/DeviceSessionId.php +++ b/app/Services/Bunq/Id/DeviceSessionId.php @@ -27,4 +27,13 @@ namespace FireflyIII\Services\Bunq\Id; */ class DeviceSessionId extends BunqId { + /** + * DeviceSessionId constructor. + * + * @param null $data + */ + public function __construct($data = null) + { + parent::__construct($data); + } } diff --git a/app/Services/Bunq/Object/Alias.php b/app/Services/Bunq/Object/Alias.php index 7457eb0cda..a0d3877f06 100644 --- a/app/Services/Bunq/Object/Alias.php +++ b/app/Services/Bunq/Object/Alias.php @@ -71,4 +71,16 @@ class Alias extends BunqObject { return $this->value; } + + /** + * @return array + */ + public function toArray(): array + { + return [ + 'type' => $this->type, + 'name' => $this->name, + 'value' => $this->value, + ]; + } } diff --git a/app/Services/Bunq/Object/Amount.php b/app/Services/Bunq/Object/Amount.php index 2875472c69..f142424d8f 100644 --- a/app/Services/Bunq/Object/Amount.php +++ b/app/Services/Bunq/Object/Amount.php @@ -60,4 +60,15 @@ class Amount extends BunqObject { return $this->value; } + + /** + * @return array + */ + public function toArray(): array + { + return [ + 'currency' => $this->currency, + 'value' => $this->value, + ]; + } } diff --git a/app/Services/Bunq/Object/Avatar.php b/app/Services/Bunq/Object/Avatar.php index 67048f95ff..7231c763b3 100644 --- a/app/Services/Bunq/Object/Avatar.php +++ b/app/Services/Bunq/Object/Avatar.php @@ -27,4 +27,30 @@ namespace FireflyIII\Services\Bunq\Object; */ class Avatar extends BunqObject { + /** @var string */ + private $anchorUuid; + /** @var Image */ + private $image; + /** @var string */ + private $uuid; + + /** + * Avatar constructor. + * + * @param array $data + */ + public function __construct(array $data) + { + $this->uuid = $data['uuid']; + $this->anchorUuid = $data['anchor_uuid']; + $this->image = new Image($data['image']); + } + + /** + * @return array + */ + public function toArray(): array + { + die(sprintf('Cannot convert %s to array.', get_class($this))); + } } diff --git a/app/Services/Bunq/Object/BunqObject.php b/app/Services/Bunq/Object/BunqObject.php index 81af013f22..41b1d4a855 100644 --- a/app/Services/Bunq/Object/BunqObject.php +++ b/app/Services/Bunq/Object/BunqObject.php @@ -25,6 +25,12 @@ namespace FireflyIII\Services\Bunq\Object; /** * Class BunqObject. */ -class BunqObject +abstract class BunqObject { + /** + * Convert this object to array. + * + * @return array + */ + abstract public function toArray(): array; } diff --git a/app/Services/Bunq/Object/DeviceServer.php b/app/Services/Bunq/Object/DeviceServer.php index 44617cd66c..64bf9dced0 100644 --- a/app/Services/Bunq/Object/DeviceServer.php +++ b/app/Services/Bunq/Object/DeviceServer.php @@ -47,6 +47,8 @@ class DeviceServer extends BunqObject * DeviceServer constructor. * * @param array $data + * + * @throws \InvalidArgumentException */ public function __construct(array $data) { @@ -75,4 +77,12 @@ class DeviceServer extends BunqObject { return $this->ip; } + + /** + * @return array + */ + public function toArray(): array + { + die(sprintf('Cannot convert %s to array.', get_class($this))); + } } diff --git a/app/Services/Bunq/Object/Image.php b/app/Services/Bunq/Object/Image.php new file mode 100644 index 0000000000..11d83f9e5b --- /dev/null +++ b/app/Services/Bunq/Object/Image.php @@ -0,0 +1,62 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Services\Bunq\Object; + + +/** + * Class Image + */ +class Image extends BunqObject +{ + /** @var string */ + private $attachmentPublicUuid; + /** @var string */ + private $contentType; + /** @var int */ + private $height; + /** @var int */ + private $width; + + /** + * Image constructor. + * + * @param array $data + */ + public function __construct(array $data) + { + $this->attachmentPublicUuid = $data['attachment_public_uuid'] ?? null; + $this->height = $data['height'] ?? null; + $this->width = $data['width'] ?? null; + $this->contentType = $data['content_type'] ?? null; + } + + /** + * @return array + */ + public function toArray(): array + { + die(sprintf('Cannot convert %s to array.', get_class($this))); + } + +} diff --git a/app/Services/Bunq/Object/LabelMonetaryAccount.php b/app/Services/Bunq/Object/LabelMonetaryAccount.php new file mode 100644 index 0000000000..a8023dbd7c --- /dev/null +++ b/app/Services/Bunq/Object/LabelMonetaryAccount.php @@ -0,0 +1,82 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Services\Bunq\Object; + + +/** + * Class LabelMonetaryAccount + */ +class LabelMonetaryAccount extends BunqObject +{ + /** @var Avatar */ + private $avatar; + /** @var string */ + private $country; + /** @var string */ + private $iban; + /** @var bool */ + private $isLight; + /** @var LabelUser */ + private $labelUser; + + /** + * @return LabelUser + */ + public function getLabelUser(): LabelUser + { + return $this->labelUser; + } + + + /** + * LabelMonetaryAccount constructor. + * + * @param array $data + */ + public function __construct(array $data) + { + $this->iban = $data['iban']; + $this->isLight = $data['is_light']; + $this->avatar = new Avatar($data['avatar']); + $this->labelUser = new LabelUser($data['label_user']); + $this->country = $data['country']; + } + + /** + * @return string + */ + public function getIban(): string + { + return $this->iban; + } + + /** + * @return array + */ + public function toArray(): array + { + die(sprintf('Cannot convert %s to array.', get_class($this))); + } + +} diff --git a/app/Services/Bunq/Object/LabelUser.php b/app/Services/Bunq/Object/LabelUser.php new file mode 100644 index 0000000000..c3eaacc5d9 --- /dev/null +++ b/app/Services/Bunq/Object/LabelUser.php @@ -0,0 +1,90 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Services\Bunq\Object; + + +/** + * Class LabelUser + */ +class LabelUser extends BunqObject +{ + /** @var Avatar */ + private $avatar; + /** @var string */ + private $country; + /** @var string */ + private $displayName; + /** @var string */ + private $publicNickName; + /** @var string */ + private $uuid; + + /** + * @return Avatar + */ + public function getAvatar(): Avatar + { + return $this->avatar; + } + + /** + * @return string + */ + public function getDisplayName(): string + { + return $this->displayName; + } + + /** + * @return string + */ + public function getPublicNickName(): string + { + return $this->publicNickName; + } + + + + /** + * LabelUser constructor. + * + * @param array $data + */ + public function __construct(array $data) + { + $this->uuid = $data['uuid']; + $this->displayName = $data['display_name']; + $this->country = $data['country']; + $this->publicNickName = $data['public_nick_name']; + $this->avatar = new Avatar($data['avatar']); + } + + /** + * @return array + */ + public function toArray(): array + { + die(sprintf('Cannot convert %s to array.', get_class($this))); + } +} diff --git a/app/Services/Bunq/Object/MonetaryAccountBank.php b/app/Services/Bunq/Object/MonetaryAccountBank.php index 092572b455..2d0fddef6b 100644 --- a/app/Services/Bunq/Object/MonetaryAccountBank.php +++ b/app/Services/Bunq/Object/MonetaryAccountBank.php @@ -74,6 +74,8 @@ class MonetaryAccountBank extends BunqObject * MonetaryAccountBank constructor. * * @param array $data + * + * @throws \InvalidArgumentException */ public function __construct(array $data) { @@ -89,13 +91,12 @@ class MonetaryAccountBank extends BunqObject $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']; + $this->avatar = new Avatar($data['avatar']); + $this->reason = $data['reason']; + $this->reasonDescription = $data['reason_description']; // create aliases: foreach ($data['alias'] as $alias) { @@ -156,4 +157,45 @@ class MonetaryAccountBank extends BunqObject { return $this->setting; } + + /** + * @return array + */ + public function toArray(): array + { + $data = [ + 'id' => $this->id, + 'created' => $this->created->format('Y-m-d H:i:s.u'), + 'updated' => $this->updated->format('Y-m-d H:i:s.u'), + 'balance' => $this->balance->toArray(), + 'currency' => $this->currency, + 'daily_limit' => $this->dailyLimit->toArray(), + 'daily_spent' => $this->dailySpent->toArray(), + 'description' => $this->description, + 'public_uuid' => $this->publicUuid, + 'status' => $this->status, + 'sub_status' => $this->subStatus, + 'user_id' => $this->userId, + 'monetary_account_profile' => $this->monetaryAccountProfile->toArray(), + 'setting' => $this->setting->toArray(), + 'overdraft_limit' => $this->overdraftLimit->toArray(), + 'avatar' => $this->avatar->toArray(), + 'reason' => $this->reason, + 'reason_description' => $this->reasonDescription, + 'alias' => [], + 'notification_filters' => [], + ]; + + /** @var Alias $alias */ + foreach ($this->aliases as $alias) { + $data['alias'][] = $alias->toArray(); + } + + /** @var NotificationFilter $filter */ + foreach ($this->notificationFilters as $filter) { + $data['notification_filters'][] = $filter->toArray(); + } + + return $data; + } } diff --git a/app/Services/Bunq/Object/MonetaryAccountProfile.php b/app/Services/Bunq/Object/MonetaryAccountProfile.php index 1de1fb4099..c51223671b 100644 --- a/app/Services/Bunq/Object/MonetaryAccountProfile.php +++ b/app/Services/Bunq/Object/MonetaryAccountProfile.php @@ -54,4 +54,15 @@ class MonetaryAccountProfile extends BunqObject return; } + + /** + * @return array + */ + public function toArray(): array + { + return [ + 'profile_action_required' => $this->profileActionRequired, + 'profile_amount_required' => $this->profileAmountRequired->toArray(), + ]; + } } diff --git a/app/Services/Bunq/Object/MonetaryAccountSetting.php b/app/Services/Bunq/Object/MonetaryAccountSetting.php index ac189a7477..2fb81df801 100644 --- a/app/Services/Bunq/Object/MonetaryAccountSetting.php +++ b/app/Services/Bunq/Object/MonetaryAccountSetting.php @@ -71,4 +71,16 @@ class MonetaryAccountSetting extends BunqObject { return $this->restrictionChat; } + + /** + * @return array + */ + public function toArray(): array + { + return [ + 'color' => $this->color, + 'default_avatar_status' => $this->defaultAvatarStatus, + 'restriction_chat' => $this->restrictionChat, + ]; + } } diff --git a/app/Services/Bunq/Object/NotificationFilter.php b/app/Services/Bunq/Object/NotificationFilter.php index 11ec026496..b61dbf0664 100644 --- a/app/Services/Bunq/Object/NotificationFilter.php +++ b/app/Services/Bunq/Object/NotificationFilter.php @@ -36,4 +36,12 @@ class NotificationFilter extends BunqObject { unset($data); } + + /** + * @return array + */ + public function toArray(): array + { + return []; + } } diff --git a/app/Services/Bunq/Object/Payment.php b/app/Services/Bunq/Object/Payment.php new file mode 100644 index 0000000000..a5e1763ed2 --- /dev/null +++ b/app/Services/Bunq/Object/Payment.php @@ -0,0 +1,145 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Services\Bunq\Object; + +use Carbon\Carbon; + + +/** + * Class Payment + */ +class Payment extends BunqObject +{ + /** @var LabelMonetaryAccount */ + private $alias; + /** @var Amount */ + private $amount; + /** @var array */ + private $attachments = []; + /** @var LabelMonetaryAccount */ + private $counterParty; + /** @var Carbon */ + private $created; + /** @var string */ + private $description; + /** @var int */ + private $id; + /** @var string */ + private $merchantReference; + /** @var int */ + private $monetaryAccountId; + /** @var string */ + private $subType; + /** @var string */ + private $type; + /** @var Carbon */ + private $updated; + + /** + * Payment constructor. + * + * @param array $data + * + * @throws \InvalidArgumentException + */ + public function __construct(array $data) + { + $this->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->monetaryAccountId = (int)$data['monetary_account_id']; + $this->amount = new Amount($data['amount']); + $this->description = $data['description']; + $this->type = $data['type']; + $this->merchantReference = $data['merchant_reference']; + $this->alias = new LabelMonetaryAccount($data['alias']); + $this->counterParty = new LabelMonetaryAccount($data['counterparty_alias']); + $this->subType = $data['sub_type']; + } + + /** + * @return Amount + */ + public function getAmount(): Amount + { + return $this->amount; + } + + /** + * @return LabelMonetaryAccount|null + */ + public function getCounterParty(): ?LabelMonetaryAccount + { + return $this->counterParty; + } + + /** + * @return Carbon + */ + public function getCreated(): Carbon + { + return $this->created; + } + + /** + * @return string + */ + public function getDescription(): string + { + return $this->description; + } + + /** + * @return int + */ + public function getId(): int + { + return $this->id; + } + + /** + * @return string + */ + public function getSubType(): string + { + return $this->subType; + } + + /** + * @return string + */ + public function getType(): string + { + return $this->type; + } + + /** + * @return array + */ + public function toArray(): array + { + die(sprintf('Cannot convert %s to array.', get_class($this))); + } + +} diff --git a/app/Services/Bunq/Object/ServerPublicKey.php b/app/Services/Bunq/Object/ServerPublicKey.php index 89e16e1c27..0a89187145 100644 --- a/app/Services/Bunq/Object/ServerPublicKey.php +++ b/app/Services/Bunq/Object/ServerPublicKey.php @@ -55,4 +55,12 @@ class ServerPublicKey extends BunqObject { $this->publicKey = $publicKey; } + + /** + * @return array + */ + public function toArray(): array + { + die(sprintf('Cannot convert %s to array.', get_class($this))); + } } diff --git a/app/Services/Bunq/Object/UserCompany.php b/app/Services/Bunq/Object/UserCompany.php index 44d2341703..fee6c445be 100644 --- a/app/Services/Bunq/Object/UserCompany.php +++ b/app/Services/Bunq/Object/UserCompany.php @@ -94,6 +94,8 @@ class UserCompany extends BunqObject * UserCompany constructor. * * @param array $data + * + * @throws \InvalidArgumentException */ public function __construct(array $data) { @@ -114,6 +116,19 @@ class UserCompany extends BunqObject $this->sectorOfIndustry = $data['sector_of_industry'] ?? ''; $this->counterBankIban = $data['counter_bank_iban']; $this->name = $data['name']; + + // TODO alias + // TODO avatar + // TODO daily_limit_without_confirmation_login + // TODO notification_filters + // TODO address_main + // TODO address_postal + // TODO director_alias + // TODO ubo + // TODO customer + // TODO customer_limit + // TODO billing_contract + // TODO pack_membership } /** @@ -123,4 +138,45 @@ class UserCompany extends BunqObject { return $this->id; } + + /** + * @return array + */ + public function toArray(): array + { + $data = [ + 'id' => $this->id, + 'created' => $this->created->format('Y-m-d H:i:s.u'), + 'updated' => $this->updated->format('Y-m-d H:i:s.u'), + 'status' => $this->status, + 'sub_status' => $this->subStatus, + 'public_uuid' => $this->publicUuid, + 'display_name' => $this->displayName, + 'public_nick_name' => $this->publicNickName, + 'language' => $this->language, + 'region' => $this->region, + 'session_timeout' => $this->sessionTimeout, + 'version_terms_of_service' => $this->versionTos, + 'chamber_of_commerce_number' => $this->cocNumber, + 'type_of_business_entity' => $this->typeOfBusinessEntity, + 'sector_of_industry' => $this->sectorOfIndustry, + 'counter_bank_iban' => $this->counterBankIban, + 'name' => $this->name, + ]; + + // TODO alias + // TODO avatar + // TODO daily_limit_without_confirmation_login + // TODO notification_filters + // TODO address_main + // TODO address_postal + // TODO director_alias + // TODO ubo + // TODO customer + // TODO customer_limit + // TODO billing_contract + // TODO pack_membership + + return $data; + } } diff --git a/app/Services/Bunq/Object/UserLight.php b/app/Services/Bunq/Object/UserLight.php index 576b32b641..e6ff84b504 100644 --- a/app/Services/Bunq/Object/UserLight.php +++ b/app/Services/Bunq/Object/UserLight.php @@ -56,6 +56,8 @@ class UserLight extends BunqObject * UserLight constructor. * * @param array $data + * + * @throws \InvalidArgumentException */ public function __construct(array $data) { @@ -74,4 +76,12 @@ class UserLight extends BunqObject $this->legalName = $data['legal_name']; // aliases } + + /** + * @return array + */ + public function toArray(): array + { + die(sprintf('Cannot convert %s to array.', get_class($this))); + } } diff --git a/app/Services/Bunq/Object/UserPerson.php b/app/Services/Bunq/Object/UserPerson.php index 66d7e5ac13..265c31429e 100644 --- a/app/Services/Bunq/Object/UserPerson.php +++ b/app/Services/Bunq/Object/UserPerson.php @@ -116,12 +116,19 @@ class UserPerson extends BunqObject * UserPerson constructor. * * @param array $data + * + * @throws \InvalidArgumentException */ public function __construct(array $data) { if (0 === count($data)) { + $this->created = new Carbon; + $this->updated = new Carbon; + $this->dateOfBirth = new Carbon; + return; } + $this->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']); @@ -148,14 +155,14 @@ class UserPerson extends BunqObject $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 + // TODO create aliases + // TODO create avatar + // TODO create daily limit + // TODO create notification filters + // TODO create address main, postal + // TODO document front, back attachment + // TODO customer, customer_limit + // TODO billing contracts } /** @@ -165,4 +172,40 @@ class UserPerson extends BunqObject { return $this->id; } + + /** + * @return array + */ + public function toArray(): array + { + $data = [ + 'id' => $this->id, + 'created' => $this->created->format('Y-m-d H:i:s.u'), + 'updated' => $this->updated->format('Y-m-d H:i:s.u'), + 'status' => $this->status, + 'sub_status' => $this->subStatus, + 'public_uuid' => $this->publicUuid, + 'display_name' => $this->displayName, + 'public_nick_name' => $this->publicNickName, + 'language' => $this->language, + 'region' => $this->region, + 'session_timeout' => $this->sessionTimeout, + 'first_name' => $this->firstName, + 'middle_name' => $this->middleName, + 'last_name' => $this->lastName, + 'legal_name' => $this->legalName, + 'tax_resident' => $this->taxResident, + 'date_of_birth' => $this->dateOfBirth->format('Y-m-d'), + 'place_of_birth' => $this->placeOfBirth, + 'country_of_birth' => $this->countryOfBirth, + 'nationality' => $this->nationality, + 'gender' => $this->gender, + 'version_terms_of_service' => $this->versionTos, + 'document_number' => $this->documentNumber, + 'document_type' => $this->documentType, + 'document_country_of_issuance' => $this->documentCountry, + ]; + + return $data; + } } diff --git a/app/Services/Bunq/Request/BunqRequest.php b/app/Services/Bunq/Request/BunqRequest.php index ef30bf91b9..ca132487de 100644 --- a/app/Services/Bunq/Request/BunqRequest.php +++ b/app/Services/Bunq/Request/BunqRequest.php @@ -50,13 +50,17 @@ abstract class BunqRequest 'x-bunq-client-response-id' => 'X-Bunq-Client-Response-Id', 'x-bunq-client-request-id' => 'X-Bunq-Client-Request-Id', ]; + /** @var string */ + private $version = 'v1'; /** * BunqRequest constructor. */ public function __construct() { - $this->server = config('firefly.bunq.server'); + $this->server = strval(config('import.options.bunq.server')); + $this->version = strval(config('import.options.bunq.version')); + Log::debug(sprintf('Created new BunqRequest with server "%s" and version "%s"', $this->server, $this->version)); } /** @@ -122,9 +126,11 @@ abstract class BunqRequest if ('get' === strtolower($method) || 'delete' === strtolower($method)) { $data = ''; } + $uri = sprintf('/%s/%s', $this->version, $uri); + $toSign = sprintf("%s %s\n", strtoupper($method), $uri); + + Log::debug(sprintf('Message to sign (without data): %s', $toSign)); - $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) { @@ -135,6 +141,7 @@ abstract class BunqRequest $toSign .= "\n" . $data; $signature = ''; + openssl_sign($toSign, $signature, $this->privateKey, OPENSSL_ALGO_SHA256); $signature = base64_encode($signature); @@ -171,7 +178,7 @@ abstract class BunqRequest $userAgent = sprintf('FireflyIII v%s', config('firefly.version')); return [ - 'X-Bunq-Client-Request-Id' => uniqid('FFIII'), + 'X-Bunq-Client-Request-Id' => uniqid('FFIII', true), 'Cache-Control' => 'no-cache', 'User-Agent' => $userAgent, 'X-Bunq-Language' => 'en_US', @@ -207,7 +214,7 @@ abstract class BunqRequest * * @return array * - * @throws Exception + * @throws FireflyException */ protected function sendSignedBunqDelete(string $uri, array $headers): array { @@ -215,9 +222,12 @@ abstract class BunqRequest throw new FireflyException('No bunq server defined'); } - $fullUri = $this->server . $uri; + $fullUri = $this->makeUri($uri); $signature = $this->generateSignature('delete', $uri, $headers, ''); $headers['X-Bunq-Client-Signature'] = $signature; + + Log::debug(sprintf('Going to send a signed bunq DELETE to %s', $fullUri)); + try { $response = Requests::delete($fullUri, $headers); } catch (Requests_Exception $e) { @@ -250,7 +260,7 @@ abstract class BunqRequest * * @return array * - * @throws Exception + * @throws FireflyException */ protected function sendSignedBunqGet(string $uri, array $data, array $headers): array { @@ -259,9 +269,12 @@ abstract class BunqRequest } $body = json_encode($data); - $fullUri = $this->server . $uri; + $fullUri = $this->makeUri($uri); $signature = $this->generateSignature('get', $uri, $headers, $body); $headers['X-Bunq-Client-Signature'] = $signature; + + Log::debug(sprintf('Going to send a signed bunq GET to %s', $fullUri)); + try { $response = Requests::get($fullUri, $headers); } catch (Requests_Exception $e) { @@ -292,21 +305,23 @@ abstract class BunqRequest * @param array $headers * * @return array - * - * @throws Exception + * @throws FireflyException */ protected function sendSignedBunqPost(string $uri, array $data, array $headers): array { $body = json_encode($data); - $fullUri = $this->server . $uri; + $fullUri = $this->makeUri($uri); $signature = $this->generateSignature('post', $uri, $headers, $body); $headers['X-Bunq-Client-Signature'] = $signature; + + Log::debug(sprintf('Going to send a signed bunq POST request to: %s', $fullUri), $headers); + try { $response = Requests::post($fullUri, $headers, $body); - } catch (Requests_Exception $e) { + } catch (Requests_Exception|Exception $e) { return ['Error' => [0 => ['error_description' => $e->getMessage(), 'error_description_translated' => $e->getMessage()]]]; } - + Log::debug('Seems to have NO exceptions in Response'); $body = $response->body; $array = json_decode($body, true); $responseHeaders = $response->headers->getAll(); @@ -330,15 +345,17 @@ abstract class BunqRequest * @param array $headers * * @return array - * - * @throws Exception + * @throws FireflyException */ protected function sendUnsignedBunqDelete(string $uri, array $headers): array { - $fullUri = $this->server . $uri; + $fullUri = $this->makeUri($uri); + + Log::debug(sprintf('Going to send a UNsigned bunq DELETE to %s', $fullUri)); + try { $response = Requests::delete($fullUri, $headers); - } catch (Requests_Exception $e) { + } catch (Requests_Exception|Exception $e) { return ['Error' => [0 => ['error_description' => $e->getMessage(), 'error_description_translated' => $e->getMessage()]]]; } $body = $response->body; @@ -361,16 +378,18 @@ abstract class BunqRequest * @param array $headers * * @return array - * - * @throws Exception + * @throws FireflyException */ protected function sendUnsignedBunqPost(string $uri, array $data, array $headers): array { $body = json_encode($data); - $fullUri = $this->server . $uri; + $fullUri = $this->makeUri($uri); + + Log::debug(sprintf('Going to send an UNsigned bunq POST to: %s', $fullUri)); + try { $response = Requests::post($fullUri, $headers, $body); - } catch (Requests_Exception $e) { + } catch (Requests_Exception|Exception $e) { return ['Error' => [0 => ['error_description' => $e->getMessage(), 'error_description_translated' => $e->getMessage()]]]; } $body = $response->body; @@ -394,10 +413,14 @@ abstract class BunqRequest */ private function isErrorResponse(array $response): bool { + $key = key($response); if ('Error' === $key) { + Log::error('Response IS an error response!'); + return true; } + Log::debug('Response is not an error response'); return false; } @@ -417,10 +440,22 @@ abstract class BunqRequest return $string; } + /** + * Make full API URI + * + * @param string $uri + * + * @return string + */ + private function makeUri(string $uri): string + { + return 'https://' . $this->server . '/' . $this->version . '/' . $uri; + } + /** * @param array $response * - * @throws Exception + * @throws FireflyException */ private function throwResponseError(array $response) { @@ -439,8 +474,7 @@ abstract class BunqRequest * @param int $statusCode * * @return bool - * - * @throws Exception + * @throws FireflyException */ private function verifyServerSignature(string $body, array $headers, int $statusCode): bool { diff --git a/app/Services/Bunq/Request/DeleteDeviceSessionRequest.php b/app/Services/Bunq/Request/DeleteDeviceSessionRequest.php index 0351dc4d52..545b9e7814 100644 --- a/app/Services/Bunq/Request/DeleteDeviceSessionRequest.php +++ b/app/Services/Bunq/Request/DeleteDeviceSessionRequest.php @@ -39,7 +39,7 @@ class DeleteDeviceSessionRequest extends BunqRequest public function call(): void { Log::debug('Going to send bunq delete session request.'); - $uri = sprintf('/v1/session/%d', $this->sessionToken->getId()); + $uri = sprintf('session/%d', $this->sessionToken->getId()); $headers = $this->getDefaultHeaders(); $headers['X-Bunq-Client-Authentication'] = $this->sessionToken->getToken(); $this->sendSignedBunqDelete($uri, $headers); diff --git a/app/Services/Bunq/Request/DeviceServerRequest.php b/app/Services/Bunq/Request/DeviceServerRequest.php index e17cd8b42e..7e8600d7c9 100644 --- a/app/Services/Bunq/Request/DeviceServerRequest.php +++ b/app/Services/Bunq/Request/DeviceServerRequest.php @@ -24,6 +24,7 @@ namespace FireflyIII\Services\Bunq\Request; use FireflyIII\Services\Bunq\Id\DeviceServerId; use FireflyIII\Services\Bunq\Token\InstallationToken; +use Log; /** * Class DeviceServerRequest. @@ -40,16 +41,18 @@ class DeviceServerRequest extends BunqRequest private $permittedIps = []; /** - * @throws \Exception + * @throws \FireflyIII\Exceptions\FireflyException */ public function call(): void { - $uri = '/v1/device-server'; - $data = ['description' => $this->description, 'secret' => $this->secret, 'permitted_ips' => $this->permittedIps]; + Log::debug('Now in DeviceServerRequest::call()'); + $uri = 'device-server'; + $data = ['description' => $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; + + $response = $this->sendSignedBunqPost($uri, $data, $headers); + $deviceServerId = new DeviceServerId; $deviceServerId->setId(intval($response['Response'][0]['Id']['id'])); $this->deviceServerId = $deviceServerId; diff --git a/app/Services/Bunq/Request/DeviceSessionRequest.php b/app/Services/Bunq/Request/DeviceSessionRequest.php index 4f6bf028b5..d67c14c8d1 100644 --- a/app/Services/Bunq/Request/DeviceSessionRequest.php +++ b/app/Services/Bunq/Request/DeviceSessionRequest.php @@ -22,12 +22,12 @@ declare(strict_types=1); namespace FireflyIII\Services\Bunq\Request; +use FireflyIII\Exceptions\FireflyException; use FireflyIII\Services\Bunq\Id\DeviceSessionId; use FireflyIII\Services\Bunq\Object\UserCompany; use FireflyIII\Services\Bunq\Object\UserPerson; use FireflyIII\Services\Bunq\Token\InstallationToken; use FireflyIII\Services\Bunq\Token\SessionToken; -use Log; /** * Class DeviceSessionRequest. @@ -46,11 +46,11 @@ class DeviceSessionRequest extends BunqRequest private $userPerson; /** - * @throws \Exception + * @throws FireflyException */ public function call(): void { - $uri = '/v1/session-server'; + $uri = 'session-server'; $data = ['secret' => $this->secret]; $headers = $this->getDefaultHeaders(); $headers['X-Bunq-Client-Authentication'] = $this->installationToken->getToken(); @@ -61,11 +61,6 @@ class DeviceSessionRequest extends BunqRequest $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; } @@ -85,6 +80,14 @@ class DeviceSessionRequest extends BunqRequest return $this->sessionToken; } + /** + * @return UserCompany + */ + public function getUserCompany(): UserCompany + { + return $this->userCompany; + } + /** * @return UserPerson */ diff --git a/app/Services/Bunq/Request/InstallationTokenRequest.php b/app/Services/Bunq/Request/InstallationTokenRequest.php index 03eef6d185..8eb54531ff 100644 --- a/app/Services/Bunq/Request/InstallationTokenRequest.php +++ b/app/Services/Bunq/Request/InstallationTokenRequest.php @@ -40,23 +40,24 @@ class InstallationTokenRequest extends BunqRequest private $publicKey = ''; /** - * @throws \Exception + * @throws \FireflyIII\Exceptions\FireflyException */ public function call(): void { - $uri = '/v1/installation'; + Log::debug('Now in InstallationTokenRequest::call()'); + $uri = 'installation'; $data = ['client_public_key' => $this->publicKey]; $headers = $this->getDefaultHeaders(); $response = $this->sendUnsignedBunqPost($uri, $data, $headers); - Log::debug('Installation request response', $response); + //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))); + Log::debug('No errors! We have installation ID!'); + Log::debug(sprintf('Installation ID: %s', $this->installationId->getId())); + Log::debug(sprintf('Installation token: %s', $this->installationToken->getToken())); + Log::debug('Server public key: (not included)'); return; } diff --git a/app/Services/Bunq/Request/ListDeviceServerRequest.php b/app/Services/Bunq/Request/ListDeviceServerRequest.php index dd72623152..1c7664379b 100644 --- a/app/Services/Bunq/Request/ListDeviceServerRequest.php +++ b/app/Services/Bunq/Request/ListDeviceServerRequest.php @@ -25,6 +25,7 @@ namespace FireflyIII\Services\Bunq\Request; use FireflyIII\Services\Bunq\Object\DeviceServer; use FireflyIII\Services\Bunq\Token\InstallationToken; use Illuminate\Support\Collection; +use Log; /** * Class ListDeviceServerRequest. @@ -40,24 +41,30 @@ class ListDeviceServerRequest extends BunqRequest { parent::__construct(); $this->devices = new Collection; + Log::debug('Constructed ListDeviceServerRequest'); } /** - * @throws \Exception + * @throws \FireflyIII\Exceptions\FireflyException */ public function call(): void { - $uri = '/v1/device-server'; + Log::debug('Now in ListDeviceServerRequest::call()'); + $uri = 'device-server'; $data = []; $headers = $this->getDefaultHeaders(); $headers['X-Bunq-Client-Authentication'] = $this->installationToken->getToken(); $response = $this->sendSignedBunqGet($uri, $data, $headers); - + Log::debug('Returned from sending device-server list request!'); // create device server objects: $raw = $this->getArrayFromResponse('DeviceServer', $response); + Log::debug(sprintf('Count %d entries in response array.', count($raw))); + Log::debug('Full response', $response); /** @var array $entry */ foreach ($raw as $entry) { - $this->devices->push(new DeviceServer($entry)); + $server = new DeviceServer($entry); + Log::debug(sprintf('Created server "%s" with IP "%s"', $server->getId()->getId(), $server->getIp())); + $this->devices->push($server); } return; diff --git a/app/Services/Bunq/Request/ListMonetaryAccountRequest.php b/app/Services/Bunq/Request/ListMonetaryAccountRequest.php index a1c92be526..d51df9d792 100644 --- a/app/Services/Bunq/Request/ListMonetaryAccountRequest.php +++ b/app/Services/Bunq/Request/ListMonetaryAccountRequest.php @@ -39,12 +39,12 @@ class ListMonetaryAccountRequest extends BunqRequest private $userId = 0; /** - * @throws \Exception + * @throws \FireflyIII\Exceptions\FireflyException */ public function call(): void { $this->monetaryAccounts = new Collection; - $uri = sprintf('/v1/user/%d/monetary-account', $this->userId); + $uri = sprintf('user/%d/monetary-account', $this->userId); $data = []; $headers = $this->getDefaultHeaders(); $headers['X-Bunq-Client-Authentication'] = $this->sessionToken->getToken(); diff --git a/app/Services/Bunq/Request/ListPaymentRequest.php b/app/Services/Bunq/Request/ListPaymentRequest.php new file mode 100644 index 0000000000..5394ff928c --- /dev/null +++ b/app/Services/Bunq/Request/ListPaymentRequest.php @@ -0,0 +1,108 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Services\Bunq\Request; + +use FireflyIII\Services\Bunq\Object\MonetaryAccountBank; +use FireflyIII\Services\Bunq\Object\Payment; +use FireflyIII\Services\Bunq\Token\SessionToken; +use Illuminate\Support\Collection; + + +/** + * Class ListPaymentRequest + */ +class ListPaymentRequest extends BunqRequest +{ + + /** @var MonetaryAccountBank */ + private $account; + /** @var Collection */ + private $payments; + /** @var SessionToken */ + private $sessionToken; + /** @var int */ + private $userId = 0; + + /** + * TODO support pagination. + * TODO impose limits on import. + * + * @throws \FireflyIII\Exceptions\FireflyException + */ + public function call(): void + { + $break = false; + $this->payments = new Collection; + $uri = sprintf('user/%d/monetary-account/%d/payment', $this->userId, $this->account->getId()); + $headers = $this->getDefaultHeaders(); + $headers['X-Bunq-Client-Authentication'] = $this->sessionToken->getToken(); + while ($break === false) { + $response = $this->sendSignedBunqGet($uri, [], $headers); + $uri = str_replace('/v1/', '', $response['Pagination']['future_url']); + $break = true; + + // create payment objects: + $raw = $this->getArrayFromResponse('Payment', $response); + foreach ($raw as $entry) { + $payment = new Payment($entry); + $this->payments->push($payment); + } + } + + return; + } + + /** + * @return Collection + */ + public function getPayments(): Collection + { + return $this->payments; + } + + + /** + * @param MonetaryAccountBank $account + */ + public function setAccount(MonetaryAccountBank $account): void + { + $this->account = $account; + } + + /** + * @param SessionToken $sessionToken + */ + public function setSessionToken(SessionToken $sessionToken): void + { + $this->sessionToken = $sessionToken; + } + + /** + * @param int $userId + */ + public function setUserId(int $userId): void + { + $this->userId = $userId; + } +} diff --git a/app/Services/Bunq/Request/ListUserRequest.php b/app/Services/Bunq/Request/ListUserRequest.php index 514b62a533..241a819129 100644 --- a/app/Services/Bunq/Request/ListUserRequest.php +++ b/app/Services/Bunq/Request/ListUserRequest.php @@ -46,7 +46,7 @@ class ListUserRequest extends BunqRequest */ public function call(): void { - $uri = '/v1/user'; + $uri = 'user'; $data = []; $headers = $this->getDefaultHeaders(); $headers['X-Bunq-Client-Authentication'] = $this->sessionToken->getToken(); diff --git a/app/Services/Bunq/Token/BunqToken.php b/app/Services/Bunq/Token/BunqToken.php index 1352958902..7b4ee2efe9 100644 --- a/app/Services/Bunq/Token/BunqToken.php +++ b/app/Services/Bunq/Token/BunqToken.php @@ -80,8 +80,23 @@ class BunqToken return $this->updated; } + /** + * @return array + */ + public function toArray(): array + { + return [ + 'id' => $this->id, + 'created' => $this->created->format('Y-m-d H:i:s.u'), + 'updated' => $this->updated->format('Y-m-d H:i:s.u'), + 'token' => $this->token, + ]; + } + /** * @param array $response + * + * @throws \InvalidArgumentException */ protected function makeTokenFromResponse(array $response): void { diff --git a/app/Services/Currency/FixerIOv2.php b/app/Services/Currency/FixerIOv2.php new file mode 100644 index 0000000000..12b9b76dbd --- /dev/null +++ b/app/Services/Currency/FixerIOv2.php @@ -0,0 +1,115 @@ +. + */ +declare(strict_types=1); + +namespace FireflyIII\Services\Currency; + +use Carbon\Carbon; +use FireflyIII\Models\CurrencyExchangeRate; +use FireflyIII\Models\TransactionCurrency; +use FireflyIII\User; +use Log; +use Requests; +use Requests_Exception; + +/** + * Class FixerIOv2. + */ +class FixerIOv2 implements ExchangeRateInterface +{ + /** @var User */ + protected $user; + + /** + * @param TransactionCurrency $fromCurrency + * @param TransactionCurrency $toCurrency + * @param Carbon $date + * + * @return CurrencyExchangeRate + */ + public function getRate(TransactionCurrency $fromCurrency, TransactionCurrency $toCurrency, Carbon $date): CurrencyExchangeRate + { + // create new exchange rate with default values. + // create new currency exchange rate object: + $exchangeRate = new CurrencyExchangeRate; + $exchangeRate->user()->associate($this->user); + $exchangeRate->fromCurrency()->associate($fromCurrency); + $exchangeRate->toCurrency()->associate($toCurrency); + $exchangeRate->date = $date; + $exchangeRate->rate = 0; + + // get API key + $apiKey = env('FIXER_API_KEY', ''); + + // if no API key, return unsaved exchange rate. + if (strlen($apiKey) === 0) { + return $exchangeRate; + } + + // build URI + $uri = sprintf( + 'http://data.fixer.io/api/%s?access_key=%s&base=%s&symbols=%s', + $date->format('Y-m-d'), $apiKey, $fromCurrency->code, $toCurrency->code + ); + $statusCode = -1; + Log::debug(sprintf('Going to request exchange rate using URI %s', str_replace($apiKey, 'xxxx', $uri))); + try { + $result = Requests::get($uri); + $statusCode = $result->status_code; + $body = $result->body; + Log::debug(sprintf('Result status code is %d', $statusCode)); + } catch (Requests_Exception $e) { + // don't care about error + $body = sprintf('Requests_Exception: %s', $e->getMessage()); + } + + // Requests_Exception + $content = null; + if (200 !== $statusCode) { + Log::error(sprintf('Something went wrong. Received error code %d and body "%s" from FixerIO.', $statusCode, $body)); + } + // get rate from body: + if (200 === $statusCode) { + $content = json_decode($body, true); + } + if (null !== $content) { + $code = $toCurrency->code; + $rate = $content['rates'][$code] ?? 0; + } + Log::debug('Got the following rates from Fixer: ', $content['rates'] ?? []); + $exchangeRate->rate = $rate; + if ($rate !== 0) { + $exchangeRate->save(); + } + + return $exchangeRate; + } + + /** + * @param User $user + * + * @return mixed|void + */ + public function setUser(User $user) + { + $this->user = $user; + } +} diff --git a/app/Services/Internal/Destroy/AccountDestroyService.php b/app/Services/Internal/Destroy/AccountDestroyService.php index 3b476c4092..8006315735 100644 --- a/app/Services/Internal/Destroy/AccountDestroyService.php +++ b/app/Services/Internal/Destroy/AccountDestroyService.php @@ -39,9 +39,9 @@ class AccountDestroyService * @param Account $account * @param Account|null $moveTo * - * @return bool + * @return void */ - public function destroy(Account $account, ?Account $moveTo): bool + public function destroy(Account $account, ?Account $moveTo): void { if (null !== $moveTo) { DB::table('transactions')->where('account_id', $account->id)->update(['account_id' => $moveTo->id]); @@ -63,10 +63,10 @@ class AccountDestroyService try { $account->delete(); } catch (Exception $e) { // @codeCoverageIgnore - Log::error(sprintf('Could not delete account: %s',$e->getMessage())); // @codeCoverageIgnore + Log::error(sprintf('Could not delete account: %s', $e->getMessage())); // @codeCoverageIgnore } - return true; + return; } } diff --git a/app/Services/Internal/Destroy/BillDestroyService.php b/app/Services/Internal/Destroy/BillDestroyService.php index d7f6c8f42e..061d7d21cd 100644 --- a/app/Services/Internal/Destroy/BillDestroyService.php +++ b/app/Services/Internal/Destroy/BillDestroyService.php @@ -26,6 +26,7 @@ namespace FireflyIII\Services\Internal\Destroy; use Exception; use FireflyIII\Models\Bill; use Log; + /** * @codeCoverageIgnore * Class BillDestroyService @@ -40,7 +41,7 @@ class BillDestroyService try { $bill->delete(); } catch (Exception $e) { // @codeCoverageIgnore - Log::error(sprintf('Could not delete bill: %s',$e->getMessage())); // @codeCoverageIgnore + Log::error(sprintf('Could not delete bill: %s', $e->getMessage())); // @codeCoverageIgnore } } diff --git a/app/Services/Internal/Destroy/CategoryDestroyService.php b/app/Services/Internal/Destroy/CategoryDestroyService.php new file mode 100644 index 0000000000..2f1440a513 --- /dev/null +++ b/app/Services/Internal/Destroy/CategoryDestroyService.php @@ -0,0 +1,46 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Services\Internal\Destroy; + +use Exception; +use FireflyIII\Models\Category; +use Log; + +/** + * Class CategoryDestroyService + */ +class CategoryDestroyService +{ + /** + * @param Category $category + */ + public function destroy(Category $category): void + { + try { + $category->delete(); + } catch (Exception $e) { // @codeCoverageIgnore + Log::error(sprintf('Could not delete category: %s', $e->getMessage())); // @codeCoverageIgnore + } + } +} diff --git a/app/Services/Internal/Destroy/CurrencyDestroyService.php b/app/Services/Internal/Destroy/CurrencyDestroyService.php new file mode 100644 index 0000000000..04cf37b279 --- /dev/null +++ b/app/Services/Internal/Destroy/CurrencyDestroyService.php @@ -0,0 +1,48 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Services\Internal\Destroy; + +use Exception; +use FireflyIII\Models\TransactionCurrency; +use Log; + +/** + * Class CurrencyDestroyService + */ +class CurrencyDestroyService +{ + /** + * @param TransactionCurrency $currency + */ + public function destroy(TransactionCurrency $currency): void + { + + try { + $currency->forceDelete(); + } catch (Exception $e) { // @codeCoverageIgnore + Log::error(sprintf('Could not delete transaction currency: %s', $e->getMessage())); // @codeCoverageIgnore + } + } + +} diff --git a/app/Services/Internal/Destroy/JournalDestroyService.php b/app/Services/Internal/Destroy/JournalDestroyService.php index 6ebd9a8aa6..a85c988514 100644 --- a/app/Services/Internal/Destroy/JournalDestroyService.php +++ b/app/Services/Internal/Destroy/JournalDestroyService.php @@ -56,7 +56,7 @@ class JournalDestroyService } $journal->delete(); } catch (Exception $e) { - Log::error(sprintf('Could not delete bill: %s',$e->getMessage())); // @codeCoverageIgnore + Log::error(sprintf('Could not delete bill: %s', $e->getMessage())); // @codeCoverageIgnore } return; diff --git a/app/Services/Internal/File/EncryptService.php b/app/Services/Internal/File/EncryptService.php new file mode 100644 index 0000000000..64300c2d7b --- /dev/null +++ b/app/Services/Internal/File/EncryptService.php @@ -0,0 +1,52 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Services\Internal\File; + +use FireflyIII\Exceptions\FireflyException; + +/** + * Class EncryptService + */ +class EncryptService +{ + /** + * @param string $file + * @param string $key + * + * @throws FireflyException + */ + public function encrypt(string $file, string $key): void + { + if (!file_exists($file)) { + throw new FireflyException(sprintf('File "%s" does not seem to exist.', $file)); + } + $content = file_get_contents($file); + $content = Crypt::encrypt($content); + $newName = sprintf('%s.upload', $key); + $path = storage_path('upload') . '/' . $newName; + + file_put_contents($path, $content); + } + +} diff --git a/app/Services/Internal/Support/AccountServiceTrait.php b/app/Services/Internal/Support/AccountServiceTrait.php index 6d32b6978a..3f06ad1f14 100644 --- a/app/Services/Internal/Support/AccountServiceTrait.php +++ b/app/Services/Internal/Support/AccountServiceTrait.php @@ -23,7 +23,6 @@ declare(strict_types=1); namespace FireflyIII\Services\Internal\Support; -use Exception; use FireflyIII\Factory\AccountFactory; use FireflyIII\Factory\AccountMetaFactory; use FireflyIII\Factory\TransactionFactory; @@ -128,6 +127,7 @@ trait AccountServiceTrait * @param array $data * * @return TransactionJournal|null + * @throws \FireflyIII\Exceptions\FireflyException */ public function storeIBJournal(Account $account, array $data): ?TransactionJournal { @@ -211,8 +211,6 @@ trait AccountServiceTrait } /** - * TODO make sure this works (user ID, etc.) - * * @param User $user * @param string $name * @@ -220,7 +218,7 @@ trait AccountServiceTrait */ public function storeOpposingAccount(User $user, string $name): Account { - $name = $name . ' initial balance'; + $name .= ' initial balance'; Log::debug('Going to create an opening balance opposing account.'); /** @var AccountFactory $factory */ $factory = app(AccountFactory::class); @@ -234,6 +232,7 @@ trait AccountServiceTrait * @param array $data * * @return bool + * @throws \FireflyIII\Exceptions\FireflyException */ public function updateIB(Account $account, array $data): bool { @@ -255,6 +254,7 @@ trait AccountServiceTrait return true; } + return true; // @codeCoverageIgnore } diff --git a/app/Services/Internal/Support/BillServiceTrait.php b/app/Services/Internal/Support/BillServiceTrait.php index 83b17ec90e..e6ec02c8d0 100644 --- a/app/Services/Internal/Support/BillServiceTrait.php +++ b/app/Services/Internal/Support/BillServiceTrait.php @@ -22,6 +22,7 @@ declare(strict_types=1); namespace FireflyIII\Services\Internal\Support; + use FireflyIII\Models\Bill; use FireflyIII\Models\Note; diff --git a/app/Services/Internal/Support/TransactionServiceTrait.php b/app/Services/Internal/Support/TransactionServiceTrait.php index 640ab43e12..f14da605c0 100644 --- a/app/Services/Internal/Support/TransactionServiceTrait.php +++ b/app/Services/Internal/Support/TransactionServiceTrait.php @@ -217,6 +217,7 @@ trait TransactionServiceTrait { if (is_null($budget)) { $transaction->budgets()->sync([]); + return; } $transaction->budgets()->sync([$budget->id]); @@ -233,6 +234,7 @@ trait TransactionServiceTrait { if (is_null($category)) { $transaction->categories()->sync([]); + return; } $transaction->categories()->sync([$category->id]); @@ -258,8 +260,12 @@ trait TransactionServiceTrait protected function setForeignCurrency(Transaction $transaction, ?TransactionCurrency $currency): void { if (is_null($currency)) { + $transaction->foreign_currency_id = null; + $transaction->save(); + return; } + $transaction->foreign_currency_id = $currency->id; $transaction->save(); diff --git a/app/Services/Internal/Update/AccountUpdateService.php b/app/Services/Internal/Update/AccountUpdateService.php index 1c179ed997..1c57223155 100644 --- a/app/Services/Internal/Update/AccountUpdateService.php +++ b/app/Services/Internal/Update/AccountUpdateService.php @@ -23,14 +23,8 @@ declare(strict_types=1); namespace FireflyIII\Services\Internal\Update; -use Exception; -use FireflyIII\Exceptions\FireflyException; -use FireflyIII\Factory\AccountMetaFactory; use FireflyIII\Models\Account; -use FireflyIII\Models\AccountMeta; -use FireflyIII\Models\AccountType; use FireflyIII\Services\Internal\Support\AccountServiceTrait; -use Log; /** * Class AccountUpdateService @@ -40,7 +34,6 @@ class AccountUpdateService use AccountServiceTrait; - /** * Update account data. * @@ -48,6 +41,7 @@ class AccountUpdateService * @param array $data * * @return Account + * @throws \FireflyIII\Exceptions\FireflyException */ public function update(Account $account, array $data): Account { diff --git a/app/Services/Internal/Update/CategoryUpdateService.php b/app/Services/Internal/Update/CategoryUpdateService.php new file mode 100644 index 0000000000..677a71d4b8 --- /dev/null +++ b/app/Services/Internal/Update/CategoryUpdateService.php @@ -0,0 +1,48 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Services\Internal\Update; + +use FireflyIII\Models\Category; + + +/** + * Class CategoryUpdateService + */ +class CategoryUpdateService +{ + /** + * @param Category $category + * @param array $data + * + * @return Category + */ + public function update(Category $category, array $data): Category + { + $category->name = $data['name']; + $category->save(); + + return $category; + } + +} diff --git a/app/Services/Internal/Update/CurrencyUpdateService.php b/app/Services/Internal/Update/CurrencyUpdateService.php new file mode 100644 index 0000000000..c5be7786ba --- /dev/null +++ b/app/Services/Internal/Update/CurrencyUpdateService.php @@ -0,0 +1,50 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Services\Internal\Update; + +use FireflyIII\Models\TransactionCurrency; + +/** + * Class CurrencyUpdateService + */ +class CurrencyUpdateService +{ + /** + * @param TransactionCurrency $currency + * @param array $data + * + * @return TransactionCurrency + */ + public function update(TransactionCurrency $currency, array $data): TransactionCurrency + { + $currency->code = $data['code']; + $currency->symbol = $data['symbol']; + $currency->name = $data['name']; + $currency->decimal_places = $data['decimal_places']; + $currency->save(); + + return $currency; + } + +} diff --git a/app/Services/Internal/Update/TransactionUpdateService.php b/app/Services/Internal/Update/TransactionUpdateService.php index cc590af100..6a31e71d06 100644 --- a/app/Services/Internal/Update/TransactionUpdateService.php +++ b/app/Services/Internal/Update/TransactionUpdateService.php @@ -107,11 +107,11 @@ class TransactionUpdateService // set foreign currency $foreign = $this->findCurrency($data['foreign_currency_id'], $data['foreign_currency_code']); // set foreign amount: - if (!is_null($data['foreign_amount'])) { + if (!is_null($data['foreign_amount']) && !is_null($foreign)) { $this->setForeignCurrency($transaction, $foreign); $this->setForeignAmount($transaction, $foreignAmount); } - if (is_null($data['foreign_amount'])) { + if (is_null($data['foreign_amount']) || is_null($foreign)) { $this->setForeignCurrency($transaction, null); $this->setForeignAmount($transaction, null); } @@ -154,8 +154,8 @@ class TransactionUpdateService */ public function updateCategory(Transaction $transaction, string $category): Transaction { - $category = $this->findCategory(0, $category); - $this->setCategory($transaction, $category); + $found = $this->findCategory(0, $category); + $this->setCategory($transaction, $found); return $transaction; } diff --git a/app/Services/Password/PwndVerifier.php b/app/Services/Password/PwndVerifier.php index b79a157327..b3ba550255 100644 --- a/app/Services/Password/PwndVerifier.php +++ b/app/Services/Password/PwndVerifier.php @@ -50,10 +50,7 @@ class PwndVerifier implements Verifier return true; } Log::debug(sprintf('Status code returned is %d', $result->status_code)); - if (404 === $result->status_code) { - return true; - } - return false; + return 404 === $result->status_code; } } diff --git a/app/Services/Password/PwndVerifierV2.php b/app/Services/Password/PwndVerifierV2.php new file mode 100644 index 0000000000..09686d6a66 --- /dev/null +++ b/app/Services/Password/PwndVerifierV2.php @@ -0,0 +1,71 @@ +. + */ +declare(strict_types=1); + +namespace FireflyIII\Services\Password; + +use Log; +use Requests; +use Requests_Exception; + +/** + * Class PwndVerifierV2. + */ +class PwndVerifierV2 implements Verifier +{ + /** + * Verify the given password against (some) service. + * + * @param string $password + * + * @return bool + */ + public function validPassword(string $password): bool + { + $hash = sha1($password); + $prefix = substr($hash, 0, 5); + $rest = substr($hash, 5); + $uri = sprintf('https://api.pwnedpasswords.com/range/%s', $prefix); + $opt = ['useragent' => 'Firefly III v' . config('firefly.version'), 'timeout' => 2]; + + Log::debug(sprintf('hash prefix is %s', $prefix)); + Log::debug(sprintf('rest is %s', $rest)); + + try { + $result = Requests::get($uri, $opt); + } catch (Requests_Exception $e) { + return true; + } + Log::debug(sprintf('Status code returned is %d', $result->status_code)); + if (404 === $result->status_code) { + return true; + } + $strpos = stripos($result->body, $rest); + if ($strpos === false) { + Log::debug(sprintf('%s was not found in result body. Return true.', $rest)); + + return true; + } + Log::debug('Could not find %s, return FALSE.'); + + return false; + } +} diff --git a/app/Services/Spectre/Request/ListLoginsRequest.php b/app/Services/Spectre/Request/ListLoginsRequest.php index 04c3d92853..14b9761a6b 100644 --- a/app/Services/Spectre/Request/ListLoginsRequest.php +++ b/app/Services/Spectre/Request/ListLoginsRequest.php @@ -40,6 +40,8 @@ class ListLoginsRequest extends SpectreRequest /** * + * @throws \FireflyIII\Services\Spectre\Exception\SpectreException + * @throws \FireflyIII\Exceptions\FireflyException */ public function call(): void { diff --git a/app/Services/Spectre/Request/SpectreRequest.php b/app/Services/Spectre/Request/SpectreRequest.php index 5f00a09200..772bb52c39 100644 --- a/app/Services/Spectre/Request/SpectreRequest.php +++ b/app/Services/Spectre/Request/SpectreRequest.php @@ -55,6 +55,8 @@ abstract class SpectreRequest * * @param User $user * + * @throws \Psr\Container\NotFoundExceptionInterface + * @throws \Psr\Container\ContainerExceptionInterface * @throws \Illuminate\Container\EntryNotFoundException */ public function __construct(User $user) @@ -180,7 +182,6 @@ abstract class SpectreRequest * @return array * * @throws FireflyException - * @throws SpectreException */ protected function sendSignedSpectreGet(string $uri, array $data): array { @@ -224,7 +225,6 @@ abstract class SpectreRequest * @return array * * @throws FireflyException - * @throws SpectreException */ protected function sendSignedSpectrePost(string $uri, array $data): array { @@ -258,7 +258,6 @@ abstract class SpectreRequest * @param Requests_Response $response * * @throws FireflyException - * @throws SpectreException */ private function detectError(Requests_Response $response): void { diff --git a/app/Support/Amount.php b/app/Support/Amount.php index a9d066e557..5feec11237 100644 --- a/app/Support/Amount.php +++ b/app/Support/Amount.php @@ -166,19 +166,18 @@ class Amount $cache->addProperty('getCurrencyCode'); if ($cache->has()) { return $cache->get(); // @codeCoverageIgnore - } else { - $currencyPreference = Prefs::get('currencyPreference', config('firefly.default_currency', 'EUR')); - - $currency = TransactionCurrency::where('code', $currencyPreference->data)->first(); - if ($currency) { - $cache->store($currency->code); - - return $currency->code; - } - $cache->store(config('firefly.default_currency', 'EUR')); - - return strval(config('firefly.default_currency', 'EUR')); } + $currencyPreference = Prefs::get('currencyPreference', config('firefly.default_currency', 'EUR')); + + $currency = TransactionCurrency::where('code', $currencyPreference->data)->first(); + if ($currency) { + $cache->store($currency->code); + + return $currency->code; + } + $cache->store(config('firefly.default_currency', 'EUR')); + + return (string)config('firefly.default_currency', 'EUR'); } /** diff --git a/app/Support/Binder/AccountList.php b/app/Support/Binder/AccountList.php index e667ac9a9e..2cf2052cad 100644 --- a/app/Support/Binder/AccountList.php +++ b/app/Support/Binder/AccountList.php @@ -39,6 +39,7 @@ class AccountList implements BinderInterface * @param Route $route * * @return Collection + * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException */ public static function routeBinder(string $value, Route $route): Collection { diff --git a/app/Support/Binder/BudgetList.php b/app/Support/Binder/BudgetList.php index f02cd32765..26ba5a927f 100644 --- a/app/Support/Binder/BudgetList.php +++ b/app/Support/Binder/BudgetList.php @@ -37,6 +37,7 @@ class BudgetList implements BinderInterface * @param Route $route * * @return Collection + * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException */ public static function routeBinder(string $value, Route $route): Collection { diff --git a/app/Support/Binder/CategoryList.php b/app/Support/Binder/CategoryList.php index 3ce93ce553..11a88681c2 100644 --- a/app/Support/Binder/CategoryList.php +++ b/app/Support/Binder/CategoryList.php @@ -37,6 +37,7 @@ class CategoryList implements BinderInterface * @param Route $route * * @return Collection + * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException */ public static function routeBinder(string $value, Route $route): Collection { diff --git a/app/Support/Binder/CurrencyCode.php b/app/Support/Binder/CurrencyCode.php index 988a296aac..1240a4cc8a 100644 --- a/app/Support/Binder/CurrencyCode.php +++ b/app/Support/Binder/CurrencyCode.php @@ -36,8 +36,9 @@ class CurrencyCode implements BinderInterface * @param Route $route * * @return TransactionCurrency + * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException */ - public static function routeBinder(string $value, Route $route): TransactionCurrency + public static function routeBinder(string $value, Route $route): TransactionCurrency { if (auth()->check()) { $currency = TransactionCurrency::where('code', trim($value))->first(); diff --git a/app/Support/Binder/Date.php b/app/Support/Binder/Date.php index 9d9cedfe03..39ee1a704f 100644 --- a/app/Support/Binder/Date.php +++ b/app/Support/Binder/Date.php @@ -39,8 +39,9 @@ class Date implements BinderInterface * @param Route $route * * @return Carbon + * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException */ - public static function routeBinder(string $value, Route $route): Carbon + public static function routeBinder(string $value, Route $route): Carbon { /** @var FiscalHelperInterface $fiscalHelper */ $fiscalHelper = app(FiscalHelperInterface::class); diff --git a/app/Support/Binder/JournalList.php b/app/Support/Binder/JournalList.php index a0f89dfe79..df130fd200 100644 --- a/app/Support/Binder/JournalList.php +++ b/app/Support/Binder/JournalList.php @@ -36,8 +36,9 @@ class JournalList implements BinderInterface * @param Route $route * * @return mixed + * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException */ - public static function routeBinder(string $value, Route $route): Collection + public static function routeBinder(string $value, Route $route): Collection { if (auth()->check()) { $list = []; diff --git a/app/Support/Binder/TagList.php b/app/Support/Binder/TagList.php index 60eb79420e..0db60e1041 100644 --- a/app/Support/Binder/TagList.php +++ b/app/Support/Binder/TagList.php @@ -39,8 +39,9 @@ class TagList implements BinderInterface * @param Route $route * * @return Collection + * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException */ - public static function routeBinder(string $value, Route $route): Collection + public static function routeBinder(string $value, Route $route): Collection { if (auth()->check()) { $list = []; diff --git a/app/Support/Binder/UnfinishedJournal.php b/app/Support/Binder/UnfinishedJournal.php index abcc002eb7..f14fdf526f 100644 --- a/app/Support/Binder/UnfinishedJournal.php +++ b/app/Support/Binder/UnfinishedJournal.php @@ -36,8 +36,9 @@ class UnfinishedJournal implements BinderInterface * @param Route $route * * @return TransactionJournal + * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException */ - public static function routeBinder(string $value, Route $route): TransactionJournal + public static function routeBinder(string $value, Route $route): TransactionJournal { if (auth()->check()) { $journal = auth()->user()->transactionJournals()->where('transaction_journals.id', $value) diff --git a/app/Support/ChartColour.php b/app/Support/ChartColour.php index ace9884d81..5f0ab48904 100644 --- a/app/Support/ChartColour.php +++ b/app/Support/ChartColour.php @@ -58,7 +58,7 @@ class ChartColour */ public static function getColour(int $index): string { - $index = $index % count(self::$colours); + $index %= count(self::$colours); $row = self::$colours[$index]; return sprintf('rgba(%d, %d, %d, 0.7)', $row[0], $row[1], $row[2]); diff --git a/app/Support/ExpandedForm.php b/app/Support/ExpandedForm.php index b04e92b11d..5f4210e65c 100644 --- a/app/Support/ExpandedForm.php +++ b/app/Support/ExpandedForm.php @@ -25,6 +25,10 @@ namespace FireflyIII\Support; use Amount as Amt; use Carbon\Carbon; use Eloquent; +use FireflyIII\Models\Account; +use FireflyIII\Models\AccountType; +use FireflyIII\Repositories\Account\AccountRepositoryInterface; +use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use Illuminate\Support\Collection; use Illuminate\Support\MessageBag; use RuntimeException; @@ -42,6 +46,7 @@ class ExpandedForm * * @return string * @throws \FireflyIII\Exceptions\FireflyException + * @throws \Throwable */ public function amount(string $name, $value = null, array $options = []): string { @@ -49,12 +54,13 @@ class ExpandedForm } /** - * @param $name - * @param null $value - * @param array $options + * @param string $name + * @param null $value + * @param array $options * * @return string * @throws \FireflyIII\Exceptions\FireflyException + * @throws \Throwable */ public function amountSmall(string $name, $value = null, array $options = []): string { @@ -62,13 +68,65 @@ class ExpandedForm } /** - * @param $name - * @param null $value - * @param array $options + * @param string $name + * @param null $value + * @param array $options + * + * @return string + * @throws \Throwable + */ + public function assetAccountList(string $name, $value = null, array $options = []): string + { + // properties for cache + $cache = new CacheProperties; + $cache->addProperty('exp-form-asset-list'); + $cache->addProperty($name); + $cache->addProperty($value); + $cache->addProperty($options); + + if ($cache->has()) { + return $cache->get(); + } + // make repositories + /** @var AccountRepositoryInterface $repository */ + $repository = app(AccountRepositoryInterface::class); + /** @var CurrencyRepositoryInterface $currencyRepos */ + $currencyRepos = app(CurrencyRepositoryInterface::class); + + $assetAccounts = $repository->getAccountsByType([AccountType::ASSET, AccountType::DEFAULT]); + $defaultCurrency = app('amount')->getDefaultCurrency(); + $grouped = []; + // group accounts: + /** @var Account $account */ + foreach ($assetAccounts as $account) { + $balance = app('steam')->balance($account, new Carbon); + $currencyId = intval($account->getMeta('currency_id')); + $currency = $currencyRepos->findNull($currencyId); + $role = $account->getMeta('accountRole'); + if (0 === strlen($role)) { + $role = 'no_account_type'; // @codeCoverageIgnore + } + if (is_null($currency)) { + $currency = $defaultCurrency; + } + + $key = strval(trans('firefly.opt_group_' . $role)); + $grouped[$key][$account->id] = $account->name . ' (' . app('amount')->formatAnything($currency, $balance, false) . ')'; + } + $res = $this->select($name, $grouped, $value, $options); + $cache->store($res); + + return $res; + } + + /** + * @param string $name + * @param null $value + * @param array $options * * @return string * @throws \FireflyIII\Exceptions\FireflyException - * + * @throws \Throwable */ public function balance(string $name, $value = null, array $options = []): string { @@ -296,8 +354,7 @@ class ExpandedForm $value = $this->fillFieldValue($name, $value); $options['step'] = 'any'; $selectedCurrency = isset($options['currency']) ? $options['currency'] : Amt::getDefaultCurrency(); - unset($options['currency']); - unset($options['placeholder']); + unset($options['currency'], $options['placeholder']); // make sure value is formatted nicely: if (null !== $value && '' !== $value) { @@ -326,8 +383,7 @@ class ExpandedForm $value = $this->fillFieldValue($name, $value); $options['step'] = 'any'; $selectedCurrency = isset($options['currency']) ? $options['currency'] : Amt::getDefaultCurrency(); - unset($options['currency']); - unset($options['placeholder']); + unset($options['currency'], $options['placeholder']); // make sure value is formatted nicely: if (null !== $value && '' !== $value) { @@ -421,8 +477,7 @@ class ExpandedForm $options = $this->expandOptionArray($name, $label, $options); $classes = $this->getHolderClasses($name); $selected = $this->fillFieldValue($name, $selected); - unset($options['autocomplete']); - unset($options['placeholder']); + unset($options['autocomplete'], $options['placeholder']); $html = view('form.select', compact('classes', 'name', 'label', 'selected', 'options', 'list'))->render(); return $html; @@ -597,6 +652,7 @@ class ExpandedForm * @return string * * @throws \FireflyIII\Exceptions\FireflyException + * @throws \Throwable */ private function currencyField(string $name, string $view, $value = null, array $options = []): string { @@ -607,8 +663,7 @@ class ExpandedForm $options['step'] = 'any'; $defaultCurrency = isset($options['currency']) ? $options['currency'] : Amt::getDefaultCurrency(); $currencies = app('amount')->getAllCurrencies(); - unset($options['currency']); - unset($options['placeholder']); + unset($options['currency'], $options['placeholder']); // perhaps the currency has been sent to us in the field $amount_currency_id_$name (amount_currency_id_amount) $preFilled = session('preFilled'); diff --git a/app/Support/FireflyConfig.php b/app/Support/FireflyConfig.php index 193aa10ae0..c74febbc69 100644 --- a/app/Support/FireflyConfig.php +++ b/app/Support/FireflyConfig.php @@ -77,6 +77,27 @@ class FireflyConfig return $this->set($name, $default); } + /** + * @param $name + * @param null $default + * + * @return \FireflyIII\Models\Configuration|null + */ + public function getFresh($name, $default = null) + { + $config = Configuration::where('name', $name)->first(['id', 'name', 'data']); + if ($config) { + + return $config; + } + // no preference found and default is null: + if (null === $default) { + return null; + } + + return $this->set($name, $default); + } + /** * @param $name * @param $value diff --git a/app/Support/Import/Configuration/Bunq/HaveAccounts.php b/app/Support/Import/Configuration/Bunq/HaveAccounts.php new file mode 100644 index 0000000000..8dc16ccf7e --- /dev/null +++ b/app/Support/Import/Configuration/Bunq/HaveAccounts.php @@ -0,0 +1,154 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Support\Import\Configuration\Bunq; + +use FireflyIII\Models\Account; +use FireflyIII\Models\AccountType; +use FireflyIII\Models\ImportJob; +use FireflyIII\Repositories\Account\AccountRepositoryInterface; +use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; +use FireflyIII\Support\Import\Configuration\ConfigurationInterface; +use Illuminate\Support\Collection; + +/** + * Class HaveAccounts + */ +class HaveAccounts implements ConfigurationInterface +{ + /** @var ImportJob */ + private $job; + + /** + * Get the data necessary to show the configuration screen. + * + * @return array + */ + public function getData(): array + { + /** @var AccountRepositoryInterface $accountRepository */ + $accountRepository = app(AccountRepositoryInterface::class); + /** @var CurrencyRepositoryInterface $currencyRepository */ + $currencyRepository = app(CurrencyRepositoryInterface::class); + $config = $this->job->configuration; + $collection = $accountRepository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); + $defaultCurrency = app('amount')->getDefaultCurrency(); + $dbAccounts = []; + /** @var Account $dbAccount */ + foreach ($collection as $dbAccount) { + $id = $dbAccount->id; + $currencyId = intval($accountRepository->getMetaValue($dbAccount, 'currency_id')); + $currency = $currencyRepository->findNull($currencyId); + $dbAccounts[$id] = [ + 'account' => $dbAccount, + 'currency' => is_null($currency) ? $defaultCurrency : $currency, + ]; + } + + // loop Bunq accounts: + /** + * @var int $index + * @var array $bunqAccount + */ + foreach ($config['accounts'] as $index => $bunqAccount) { + // find accounts with currency code + $code = $bunqAccount['currency']; + $selection = $this->filterAccounts($dbAccounts, $code); + $config['accounts'][$index]['options'] = app('expandedform')->makeSelectList($selection); + } + + + $data = [ + 'config' => $config, + ]; + + return $data; + } + + /** + * Return possible warning to user. + * + * @return string + */ + public function getWarningMessage(): string + { + return ''; + } + + /** + * @param ImportJob $job + * + * @return ConfigurationInterface + */ + public function setJob(ImportJob $job) + { + $this->job = $job; + + return $this; + } + + /** + * Store the result. + * + * @param array $data + * + * @return bool + */ + public function storeConfiguration(array $data): bool + { + $accounts = $data['bunq_account_id'] ?? []; + $mapping = []; + foreach ($accounts as $bunqId) { + $bunqId = intval($bunqId); + $doImport = intval($data['do_import'][$bunqId] ?? 0) === 1; + $account = intval($data['import'][$bunqId] ?? 0); + if ($doImport) { + $mapping[$bunqId] = $account; + } + } + $config = $this->job->configuration; + $config['accounts-mapped'] = $mapping; + $this->job->configuration = $config; + $this->job->save(); + + return true; + } + + /** + * @param array $dbAccounts + * @param string $code + * + * @return Collection + */ + private function filterAccounts(array $dbAccounts, string $code): Collection + { + $collection = new Collection; + foreach ($dbAccounts as $accountId => $data) { + if ($data['currency']->code === $code) { + $collection->push($data['account']); + } + } + + return $collection; + } +} diff --git a/app/Support/Import/Configuration/File/Map.php b/app/Support/Import/Configuration/File/Map.php index 6770d5fa6d..670f3c8dbf 100644 --- a/app/Support/Import/Configuration/File/Map.php +++ b/app/Support/Import/Configuration/File/Map.php @@ -52,7 +52,6 @@ class Map implements ConfigurationInterface * * @throws FireflyException * @throws \League\Csv\Exception - * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException */ public function getData(): array { diff --git a/app/Support/Import/Configuration/File/Roles.php b/app/Support/Import/Configuration/File/Roles.php index 68910c0937..3b33805840 100644 --- a/app/Support/Import/Configuration/File/Roles.php +++ b/app/Support/Import/Configuration/File/Roles.php @@ -52,26 +52,28 @@ class Roles implements ConfigurationInterface * @return array * * @throws \League\Csv\Exception - * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException */ public function getData(): array { $content = $this->repository->uploadFileContents($this->job); $config = $this->getConfig(); $headers = []; + $offset = 0; // create CSV reader. $reader = Reader::createFromString($content); $reader->setDelimiter($config['delimiter']); + // CSV headers. Ignore reader. Simply get the first row. if ($config['has-headers']) { - // get headers: - $reader->setHeaderOffset(0); - $headers = $reader->getHeader(); + $offset = 1; + $stmt = (new Statement)->limit(1)->offset(0); + $records = $stmt->process($reader); + $headers = $records->fetchOne(0); } // example rows: - $stmt = (new Statement)->limit(intval(config('csv.example_rows', 5)))->offset(0); + $stmt = (new Statement)->limit(intval(config('csv.example_rows', 5)))->offset($offset); // set data: $roles = $this->getRoles(); asort($roles); @@ -182,6 +184,7 @@ class Roles implements ConfigurationInterface */ private function ignoreUnmappableColumns(): bool { + Log::debug('Now in ignoreUnmappableColumns()'); $config = $this->getConfig(); $count = $config['column-count']; for ($i = 0; $i < $count; ++$i) { @@ -252,24 +255,38 @@ class Roles implements ConfigurationInterface $hasForeignAmount = true; } } - if ($assigned > 0 && $hasAmount && ($hasForeignCode === false && $hasForeignAmount === false)) { + Log::debug( + sprintf( + 'Assigned is %d, hasAmount %s, hasForeignCode %s, hasForeignAmount %s', + $assigned, + var_export($hasAmount, true), + var_export($hasForeignCode, true), + var_export($hasForeignAmount, true) + ) + ); + // all assigned and correct foreign info + if ($assigned > 0 && $hasAmount && ($hasForeignCode === $hasForeignAmount)) { $this->warning = ''; $this->saveConfig($config); + Log::debug('isRolesComplete() returns true.'); return true; } // warn if has foreign amount but no currency code: if ($hasForeignAmount && !$hasForeignCode) { $this->warning = strval(trans('import.foreign_amount_warning')); + Log::debug('isRolesComplete() returns FALSE because foreign amount present without foreign code.'); return false; } if (0 === $assigned || !$hasAmount) { $this->warning = strval(trans('import.roles_warning')); + Log::debug('isRolesComplete() returns FALSE because no amount present.'); return false; } + Log::debug('isRolesComplete() returns FALSE because no reason.'); return false; } diff --git a/app/Support/Models/TransactionJournalTrait.php b/app/Support/Models/TransactionJournalTrait.php index 006288e478..943d5d9568 100644 --- a/app/Support/Models/TransactionJournalTrait.php +++ b/app/Support/Models/TransactionJournalTrait.php @@ -24,11 +24,9 @@ namespace FireflyIII\Support\Models; use Carbon\Carbon; use FireflyIII\Models\Transaction; -use FireflyIII\Models\TransactionJournalMeta; use FireflyIII\Models\TransactionType; use FireflyIII\Support\CacheProperties; use Illuminate\Database\Eloquent\Builder; -use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Support\Collection; @@ -63,16 +61,6 @@ trait TransactionJournalTrait return false; } - /** - * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany - */ - abstract public function budgets(): BelongsToMany; - - /** - * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany - */ - abstract public function categories(): BelongsToMany; - /** * @deprecated * @return Collection @@ -117,78 +105,6 @@ trait TransactionJournalTrait return $list; } - /** - * - * @param string $name - * - * @return string - */ - abstract public function getMeta(string $name); - - /** - * @return bool - */ - abstract public function isDeposit(): bool; - - /** - * @return bool - */ - abstract public function isOpeningBalance(): bool; - - /** - * @return bool - */ - abstract public function isTransfer(): bool; - - /** - * @return bool - */ - abstract public function isWithdrawal(): bool; - - /** - * @return \Illuminate\Database\Eloquent\Relations\HasMany - */ - abstract public function piggyBankEvents(): HasMany; - - /** - * @deprecated - * @return int - */ - public function piggyBankId(): int - { - if ($this->piggyBankEvents()->count() > 0) { - return $this->piggyBankEvents()->orderBy('date', 'DESC')->first()->piggy_bank_id; - } - - return 0; - } - - /** - * @deprecated - * @return Transaction - */ - public function positiveTransaction(): Transaction - { - return $this->transactions()->where('amount', '>', 0)->first(); - } - - /** - * Save the model to the database. - * - * @param array $options - * - * @return bool - */ - abstract public function save(array $options = []): bool; - - /** - * @param string $name - * @param $value - * - * @return TransactionJournalMeta - */ - abstract public function setMeta(string $name, $value): TransactionJournalMeta; - /** * @deprecated * @return Collection diff --git a/app/Support/Navigation.php b/app/Support/Navigation.php index f543a706f7..8390252ad5 100644 --- a/app/Support/Navigation.php +++ b/app/Support/Navigation.php @@ -65,7 +65,7 @@ class Navigation throw new FireflyException(sprintf('Cannot do addPeriod for $repeat_freq "%s"', $repeatFreq)); } if (isset($modifierMap[$repeatFreq])) { - $add = $add * $modifierMap[$repeatFreq]; + $add *= $modifierMap[$repeatFreq]; } $function = $functionMap[$repeatFreq]; $date->$function($add); @@ -99,7 +99,7 @@ class Navigation */ $perMonthEnd = clone $end; $perMonthStart = clone $end; - $perMonthStart->startOfyear()->subYear(); + $perMonthStart->startOfYear()->subYear(); $perMonthStart = $start->lt($perMonthStart) ? $perMonthStart : $start; // loop first set: @@ -537,7 +537,7 @@ class Navigation return $date; } if (isset($modifierMap[$repeatFreq])) { - $subtract = $subtract * $modifierMap[$repeatFreq]; + $subtract *= $modifierMap[$repeatFreq]; $date->subMonths($subtract); Log::debug(sprintf('%s is in modifier map with value %d, execute subMonths with argument %d', $repeatFreq, $modifierMap[$repeatFreq], $subtract)); Log::debug(sprintf('subtractPeriod: resulting date is %s', $date->format('Y-m-d'))); diff --git a/app/Support/Preferences.php b/app/Support/Preferences.php index f5cd8f454a..1f7048c922 100644 --- a/app/Support/Preferences.php +++ b/app/Support/Preferences.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace FireflyIII\Support; use Cache; +use Exception; use FireflyIII\Models\Preference; use FireflyIII\User; use Illuminate\Support\Collection; @@ -50,8 +51,6 @@ class Preferences * @param $name * * @return bool - * - * @throws \Exception */ public function delete(string $name): bool { @@ -59,7 +58,11 @@ class Preferences if (Cache::has($fullName)) { Cache::forget($fullName); } - Preference::where('user_id', auth()->user()->id)->where('name', $name)->delete(); + try { + Preference::where('user_id', auth()->user()->id)->where('name', $name)->delete(); + } catch (Exception $e) { + // don't care. + } return true; } diff --git a/app/Support/Search/Search.php b/app/Support/Search/Search.php index 0b2e0c2b2e..30c259200d 100644 --- a/app/Support/Search/Search.php +++ b/app/Support/Search/Search.php @@ -261,7 +261,6 @@ class Search implements SearchInterface * * @return bool * - * @throws FireflyException */ private function matchModifiers(Transaction $transaction): bool { diff --git a/app/Support/Steam.php b/app/Support/Steam.php index e3453c7f2b..ffdd0c6be4 100644 --- a/app/Support/Steam.php +++ b/app/Support/Steam.php @@ -242,6 +242,7 @@ class Steam * @param $value * * @return string + * @throws \Illuminate\Contracts\Encryption\DecryptException */ public function decrypt(int $isEncrypted, string $value) { @@ -290,10 +291,13 @@ class Steam /** * @param string $amount * - * @return string + * @return string|null */ - public function opposite(string $amount): string + public function opposite(string $amount = null): ?string { + if (is_null($amount)) { + return null; + } $amount = bcmul($amount, '-1'); return $amount; diff --git a/app/Support/Twig/AmountFormat.php b/app/Support/Twig/AmountFormat.php index a65587b9f0..7cc70d7dd4 100644 --- a/app/Support/Twig/AmountFormat.php +++ b/app/Support/Twig/AmountFormat.php @@ -24,6 +24,8 @@ namespace FireflyIII\Support\Twig; use FireflyIII\Models\Account as AccountModel; use FireflyIII\Models\TransactionCurrency; +use FireflyIII\Repositories\Account\AccountRepositoryInterface; +use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use Twig_Extension; use Twig_SimpleFilter; use Twig_SimpleFunction; @@ -52,24 +54,10 @@ class AmountFormat extends Twig_Extension return [ $this->formatAmountByAccount(), $this->formatAmountBySymbol(), - $this->formatDestinationAfter(), - $this->formatDestinationBefore(), - $this->formatSourceAfter(), - $this->formatSourceBefore(), $this->formatAmountByCurrency(), ]; } - /** - * Returns the name of the extension. - * - * @return string The extension name - */ - public function getName(): string - { - return 'FireflyIII\Support\Twig\AmountFormat'; - } - /** * @return Twig_SimpleFilter */ @@ -96,14 +84,19 @@ class AmountFormat extends Twig_Extension return new Twig_SimpleFunction( 'formatAmountByAccount', function (AccountModel $account, string $amount, bool $coloured = true): string { - $currencyId = intval($account->getMeta('currency_id')); - + /** @var AccountRepositoryInterface $accountRepos */ + $accountRepos = app(AccountRepositoryInterface::class); + /** @var CurrencyRepositoryInterface $currencyRepos */ + $currencyRepos = app(CurrencyRepositoryInterface::class); + $currency = app('amount')->getDefaultCurrency(); + $currencyId = (int)$accountRepos->getMetaValue($account, 'currency_id'); + $accountCurrency = null; if (0 !== $currencyId) { - $currency = TransactionCurrency::find($currencyId); - - return app('amount')->formatAnything($currency, $amount, $coloured); + $accountCurrency = $currencyRepos->findNull($currencyId); + } + if (null !== $accountCurrency) { + $currency = $accountCurrency; } - $currency = app('amount')->getDefaultCurrency(); return app('amount')->formatAnything($currency, $amount, $coloured); }, @@ -162,100 +155,4 @@ class AmountFormat extends Twig_Extension ['is_safe' => ['html']] ); } - - /** - * @return Twig_SimpleFunction - */ - protected function formatDestinationAfter(): Twig_SimpleFunction - { - return new Twig_SimpleFunction( - 'formatDestinationAfter', - function (array $transaction): string { - // build fake currency for main amount. - $format = new TransactionCurrency; - $format->decimal_places = $transaction['transaction_currency_dp']; - $format->symbol = $transaction['transaction_currency_symbol']; - $string = app('amount')->formatAnything($format, $transaction['destination_account_after'], true); - - // also append foreign amount for clarity: - if (null !== $transaction['foreign_destination_amount']) { - // build fake currency for foreign amount - $format = new TransactionCurrency; - $format->decimal_places = $transaction['foreign_currency_dp']; - $format->symbol = $transaction['foreign_currency_symbol']; - $string .= ' (' . app('amount')->formatAnything($format, $transaction['foreign_destination_amount'], true) . ')'; - } - - return $string; - }, - ['is_safe' => ['html']] - ); - } - - /** - * @return Twig_SimpleFunction - */ - protected function formatDestinationBefore(): Twig_SimpleFunction - { - return new Twig_SimpleFunction( - 'formatDestinationBefore', - function (array $transaction): string { - // build fake currency for main amount. - $format = new TransactionCurrency; - $format->decimal_places = $transaction['transaction_currency_dp']; - $format->symbol = $transaction['transaction_currency_symbol']; - - return app('amount')->formatAnything($format, $transaction['destination_account_before'], true); - }, - ['is_safe' => ['html']] - ); - } - - /** - * @return Twig_SimpleFunction - */ - protected function formatSourceAfter(): Twig_SimpleFunction - { - return new Twig_SimpleFunction( - 'formatSourceAfter', - function (array $transaction): string { - // build fake currency for main amount. - $format = new TransactionCurrency; - $format->decimal_places = $transaction['transaction_currency_dp']; - $format->symbol = $transaction['transaction_currency_symbol']; - $string = app('amount')->formatAnything($format, $transaction['source_account_after'], true); - - // also append foreign amount for clarity: - if (null !== $transaction['foreign_source_amount']) { - // build fake currency for foreign amount - $format = new TransactionCurrency; - $format->decimal_places = $transaction['foreign_currency_dp']; - $format->symbol = $transaction['foreign_currency_symbol']; - $string .= ' (' . app('amount')->formatAnything($format, $transaction['foreign_source_amount'], true) . ')'; - } - - return $string; - }, - ['is_safe' => ['html']] - ); - } - - /** - * @return Twig_SimpleFunction - */ - protected function formatSourceBefore(): Twig_SimpleFunction - { - return new Twig_SimpleFunction( - 'formatSourceBefore', - function (array $transaction): string { - // build fake currency for main amount. - $format = new TransactionCurrency; - $format->decimal_places = $transaction['transaction_currency_dp']; - $format->symbol = $transaction['transaction_currency_symbol']; - - return app('amount')->formatAnything($format, $transaction['source_account_before'], true); - }, - ['is_safe' => ['html']] - ); - } } diff --git a/app/Support/Twig/Extension/Transaction.php b/app/Support/Twig/Extension/Transaction.php index 8d4ca0e84d..042f28fb39 100644 --- a/app/Support/Twig/Extension/Transaction.php +++ b/app/Support/Twig/Extension/Transaction.php @@ -28,6 +28,7 @@ use FireflyIII\Models\Transaction as TransactionModel; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionType; use Lang; +use Log; use Twig_Extension; /** @@ -100,17 +101,15 @@ class Transaction extends Twig_Extension public function amountArray(array $transaction): string { // first display amount: - $amount = TransactionType::WITHDRAWAL === $transaction['journal_type'] ? $transaction['source_amount'] - : $transaction['destination_amount']; + $amount = strval($transaction['amount']); $fakeCurrency = new TransactionCurrency; - $fakeCurrency->decimal_places = $transaction['transaction_currency_dp']; - $fakeCurrency->symbol = $transaction['transaction_currency_symbol']; + $fakeCurrency->decimal_places = $transaction['currency_dp']; + $fakeCurrency->symbol = $transaction['currency_symbol']; $string = app('amount')->formatAnything($fakeCurrency, $amount, true); // then display (if present) the foreign amount: - if (null !== $transaction['foreign_source_amount']) { - $amount = TransactionType::WITHDRAWAL === $transaction['journal_type'] ? $transaction['foreign_source_amount'] - : $transaction['foreign_destination_amount']; + if (null !== $transaction['foreign_amount']) { + $amount = strval($transaction['foreign_amount']); $fakeCurrency = new TransactionCurrency; $fakeCurrency->decimal_places = $transaction['foreign_currency_dp']; $fakeCurrency->symbol = $transaction['foreign_currency_symbol']; @@ -121,44 +120,40 @@ class Transaction extends Twig_Extension } /** + * * @param TransactionModel $transaction * * @return string */ public function budgets(TransactionModel $transaction): string { + $txt = ''; // journal has a budget: - if (isset($transaction->transaction_journal_budget_id)) { + if (null !== $transaction->transaction_journal_budget_id) { $name = app('steam')->tryDecrypt($transaction->transaction_journal_budget_name); $txt = sprintf('%s', route('budgets.show', [$transaction->transaction_journal_budget_id]), $name, $name); - - return $txt; } // transaction has a budget - if (isset($transaction->transaction_budget_id)) { + if (null !== $transaction->transaction_budget_id && $txt === '') { $name = app('steam')->tryDecrypt($transaction->transaction_budget_name); $txt = sprintf('%s', route('budgets.show', [$transaction->transaction_budget_id]), $name, $name); - - return $txt; } - // see if the transaction has a budget: - $budgets = $transaction->budgets()->get(); - if (0 === $budgets->count()) { - $budgets = $transaction->transactionJournal()->first()->budgets()->get(); - } - if ($budgets->count() > 0) { - $str = []; - foreach ($budgets as $budget) { - $str[] = sprintf('%s', route('budgets.show', [$budget->id]), $budget->name, $budget->name); + if ($txt === '') { + // see if the transaction has a budget: + $budgets = $transaction->budgets()->get(); + if (0 === $budgets->count()) { + $budgets = $transaction->transactionJournal()->first()->budgets()->get(); + } + if ($budgets->count() > 0) { + $str = []; + foreach ($budgets as $budget) { + $str[] = sprintf('%s', route('budgets.show', [$budget->id]), $budget->name, $budget->name); + } + $txt = implode(', ', $str); } - - $txt = join(', ', $str); - - return $txt; } - $txt = ''; return $txt; } @@ -170,40 +165,35 @@ class Transaction extends Twig_Extension */ public function categories(TransactionModel $transaction): string { + $txt = ''; // journal has a category: - if (isset($transaction->transaction_journal_category_id)) { + if (null !== $transaction->transaction_journal_category_id) { $name = app('steam')->tryDecrypt($transaction->transaction_journal_category_name); $txt = sprintf('%s', route('categories.show', [$transaction->transaction_journal_category_id]), $name, $name); - - return $txt; } // transaction has a category: - if (isset($transaction->transaction_category_id)) { + if (null !== $transaction->transaction_category_id && $txt === '') { $name = app('steam')->tryDecrypt($transaction->transaction_category_name); $txt = sprintf('%s', route('categories.show', [$transaction->transaction_category_id]), $name, $name); - - return $txt; } - // see if the transaction has a category: - $categories = $transaction->categories()->get(); - if (0 === $categories->count()) { - $categories = $transaction->transactionJournal()->first()->categories()->get(); - } - if ($categories->count() > 0) { - $str = []; - foreach ($categories as $category) { - $str[] = sprintf('%s', route('categories.show', [$category->id]), $category->name, $category->name); + if ($txt === '') { + // see if the transaction has a category: + $categories = $transaction->categories()->get(); + if (0 === $categories->count()) { + $categories = $transaction->transactionJournal()->first()->categories()->get(); } + if ($categories->count() > 0) { + $str = []; + foreach ($categories as $category) { + $str[] = sprintf('%s', route('categories.show', [$category->id]), $category->name, $category->name); + } - $txt = join(', ', $str); - - return $txt; + $txt = implode(', ', $str); + } } - $txt = ''; - return $txt; } @@ -223,6 +213,8 @@ class Transaction extends Twig_Extension } /** + * TODO improve code + * * @param TransactionModel $transaction * * @return string @@ -249,14 +241,19 @@ class Transaction extends Twig_Extension // if the amount is negative, find the opposing account and use that one: $journalId = $transaction->journal_id; /** @var TransactionModel $other */ - $other = TransactionModel::where('transaction_journal_id', $journalId)->where('transactions.id', '!=', $transaction->id) - ->where('amount', '=', bcmul($transaction->transaction_amount, '-1'))->where( - 'identifier', - $transaction->identifier - ) - ->leftJoin('accounts', 'accounts.id', '=', 'transactions.account_id') - ->leftJoin('account_types', 'account_types.id', '=', 'accounts.account_type_id') - ->first(['transactions.account_id', 'accounts.encrypted', 'accounts.name', 'account_types.type']); + $other = TransactionModel + ::where('transaction_journal_id', $journalId) + ->where('transactions.id', '!=', $transaction->id) + ->where('amount', '=', bcmul($transaction->transaction_amount, '-1')) + ->where('identifier', $transaction->identifier) + ->leftJoin('accounts', 'accounts.id', '=', 'transactions.account_id') + ->leftJoin('account_types', 'account_types.id', '=', 'accounts.account_type_id') + ->first(['transactions.account_id', 'accounts.encrypted', 'accounts.name', 'account_types.type']); + if (is_null($other)) { + Log::error(sprintf('Cannot find other transaction for journal #%d', $journalId)); + + return ''; + } $name = app('steam')->tryDecrypt($other->name); $transactionId = $other->account_id; $type = $other->type; @@ -280,18 +277,25 @@ class Transaction extends Twig_Extension */ public function hasAttachments(TransactionModel $transaction): string { - $journalId = intval($transaction->journal_id); - $count = Attachment::whereNull('deleted_at') - ->where('attachable_type', 'FireflyIII\Models\TransactionJournal') - ->where('attachable_id', $journalId) - ->count(); - if ($count > 0) { - $res = sprintf('', Lang::choice('firefly.nr_of_attachments', $count, ['count' => $count])); - - return $res; - } - $res = ''; + if (is_int($transaction->attachmentCount) && $transaction->attachmentCount > 0) { + $res = sprintf( + '', Lang::choice( + 'firefly.nr_of_attachments', + $transaction->attachmentCount, ['count' => $transaction->attachmentCount] + ) + ); + } + if ($transaction->attachmentCount === null) { + $journalId = (int)$transaction->journal_id; + $count = Attachment::whereNull('deleted_at') + ->where('attachable_type', 'FireflyIII\Models\TransactionJournal') + ->where('attachable_id', $journalId) + ->count(); + if ($count > 0) { + $res = sprintf('', Lang::choice('firefly.nr_of_attachments', $count, ['count' => $count])); + } + } return $res; } @@ -335,7 +339,7 @@ class Transaction extends Twig_Extension public function isReconciled(TransactionModel $transaction): string { $icon = ''; - if (1 === intval($transaction->reconciled)) { + if (1 === (int)$transaction->reconciled) { $icon = ''; } @@ -343,21 +347,26 @@ class Transaction extends Twig_Extension } /** + * Returns an icon when the transaction is a split transaction. + * * @param TransactionModel $transaction * * @return string */ public function isSplit(TransactionModel $transaction): string { - $journalId = intval($transaction->journal_id); - $count = TransactionModel::where('transaction_journal_id', $journalId)->whereNull('deleted_at')->count(); - if ($count > 2) { - $res = ''; - - return $res; + $res = ''; + if ($transaction->is_split === true) { + $res = '!!!'; } - $res = ''; + if ($transaction->is_split === null) { + $journalId = (int)$transaction->journal_id; + $count = TransactionModel::where('transaction_journal_id', $journalId)->whereNull('deleted_at')->count(); + if ($count > 2) { + $res = ''; + } + } return $res; } diff --git a/app/Support/Twig/Extension/TransactionJournal.php b/app/Support/Twig/Extension/TransactionJournal.php index 925b1613f0..6e8d9a9ede 100644 --- a/app/Support/Twig/Extension/TransactionJournal.php +++ b/app/Support/Twig/Extension/TransactionJournal.php @@ -22,9 +22,11 @@ declare(strict_types=1); namespace FireflyIII\Support\Twig\Extension; +use Carbon\Carbon; use FireflyIII\Models\Transaction as TransactionModel; use FireflyIII\Models\TransactionJournal as JournalModel; use FireflyIII\Models\TransactionType; +use FireflyIII\Repositories\Journal\JournalRepositoryInterface; use Twig_Extension; /** @@ -32,6 +34,62 @@ use Twig_Extension; */ class TransactionJournal extends Twig_Extension { + /** + * @param JournalModel $journal + * @param string $field + * + * @return null|Carbon + */ + public function getMetaDate(JournalModel $journal, string $field): ?Carbon + { + /** @var JournalRepositoryInterface $repository */ + $repository = app(JournalRepositoryInterface::class); + + return $repository->getMetaDate($journal, $field); + } + + /** + * @param JournalModel $journal + * @param string $field + * + * @return string + */ + public function getMetaField(JournalModel $journal, string $field): string + { + /** @var JournalRepositoryInterface $repository */ + $repository = app(JournalRepositoryInterface::class); + $result = $repository->getMetaField($journal, $field); + if (is_null($result)) { + return ''; + } + + return $result; + } + + /** + * Return if journal HAS field. + * + * @param JournalModel $journal + * @param string $field + * + * @return bool + */ + public function hasMetaField(JournalModel $journal, string $field): bool + { + // HIER BEN JE + /** @var JournalRepositoryInterface $repository */ + $repository = app(JournalRepositoryInterface::class); + $result = $repository->getMetaField($journal, $field); + if (is_null($result)) { + return false; + } + if (strlen(strval($result)) === 0) { + return false; + } + + return true; + } + /** * @param JournalModel $journal * @@ -66,7 +124,8 @@ class TransactionJournal extends Twig_Extension } $totals[$foreignId]['amount'] = bcadd( $transaction->foreign_amount, - $totals[$foreignId]['amount']); + $totals[$foreignId]['amount'] + ); } } $array = []; diff --git a/app/Support/Twig/General.php b/app/Support/Twig/General.php index 07a5ffe8e1..eb53c2311d 100644 --- a/app/Support/Twig/General.php +++ b/app/Support/Twig/General.php @@ -24,10 +24,8 @@ namespace FireflyIII\Support\Twig; use Carbon\Carbon; use FireflyIII\Models\Account; -use FireflyIII\Models\TransactionJournal; use League\CommonMark\CommonMarkConverter; use Route; -use Steam; use Twig_Extension; use Twig_SimpleFilter; use Twig_SimpleFunction; @@ -69,14 +67,6 @@ class General extends Twig_Extension ]; } - /** - * {@inheritdoc} - */ - public function getName(): string - { - return 'FireflyIII\Support\Twig\General'; - } - /** * Will return "active" when a part of the route matches the argument. * ie. "accounts" will match "accounts.index". diff --git a/app/Support/Twig/Journal.php b/app/Support/Twig/Journal.php index c098b2d96b..d37e071a45 100644 --- a/app/Support/Twig/Journal.php +++ b/app/Support/Twig/Journal.php @@ -94,21 +94,14 @@ class Journal extends Twig_Extension $this->getDestinationAccount(), $this->journalBudgets(), $this->journalCategories(), + new Twig_SimpleFunction('journalGetMetaField', [TransactionJournalExtension::class, 'getMetaField']), + new Twig_SimpleFunction('journalHasMeta', [TransactionJournalExtension::class, 'hasMetaField']), + new Twig_SimpleFunction('journalGetMetaDate', [TransactionJournalExtension::class, 'getMetaDate']), ]; return $functions; } - /** - * Returns the name of the extension. - * - * @return string The extension name - */ - public function getName(): string - { - return 'FireflyIII\Support\Twig\Journals'; - } - /** * @return Twig_SimpleFunction */ diff --git a/app/Support/Twig/PiggyBank.php b/app/Support/Twig/PiggyBank.php index 9d5d3abc8c..4b5f7dd711 100644 --- a/app/Support/Twig/PiggyBank.php +++ b/app/Support/Twig/PiggyBank.php @@ -55,13 +55,4 @@ class PiggyBank extends Twig_Extension return $functions; } - /** - * Returns the name of the extension. - * - * @return string The extension name - */ - public function getName(): string - { - return 'FireflyIII\Support\Twig\PiggyBank'; - } } diff --git a/app/Support/Twig/Rule.php b/app/Support/Twig/Rule.php index dc115318f8..bb6830bc92 100644 --- a/app/Support/Twig/Rule.php +++ b/app/Support/Twig/Rule.php @@ -103,14 +103,4 @@ class Rule extends Twig_Extension $this->allActionTriggers(), ]; } - - /** - * Returns the name of the extension. - * - * @return string The extension name - */ - public function getName(): string - { - return 'FireflyIII\Support\Twig\Rule'; - } } diff --git a/app/Support/Twig/Transaction.php b/app/Support/Twig/Transaction.php index ec20cf3c04..ffe6b046fd 100644 --- a/app/Support/Twig/Transaction.php +++ b/app/Support/Twig/Transaction.php @@ -52,14 +52,4 @@ class Transaction extends Twig_Extension return $filters; } - - /** - * Returns the name of the extension. - * - * @return string The extension name - */ - public function getName(): string - { - return 'transaction'; - } } diff --git a/app/Support/Twig/Translation.php b/app/Support/Twig/Translation.php index d910ff054e..74198da564 100644 --- a/app/Support/Twig/Translation.php +++ b/app/Support/Twig/Translation.php @@ -41,7 +41,7 @@ class Translation extends Twig_Extension $filters[] = new Twig_SimpleFilter( '_', function ($name) { - return strval(trans(sprintf('firefly.%s', $name))); + return (string)trans(sprintf('firefly.%s', $name)); }, ['is_safe' => ['html']] ); @@ -59,13 +59,6 @@ class Translation extends Twig_Extension ]; } - /** - * {@inheritdoc} - */ - public function getName(): string - { - return 'FireflyIII\Support\Twig\Translation'; - } /** * @return Twig_SimpleFunction diff --git a/app/TransactionRules/Actions/AppendDescription.php b/app/TransactionRules/Actions/AppendDescription.php index 16b9054b62..887620a62a 100644 --- a/app/TransactionRules/Actions/AppendDescription.php +++ b/app/TransactionRules/Actions/AppendDescription.php @@ -54,7 +54,7 @@ class AppendDescription implements ActionInterface public function act(TransactionJournal $journal): bool { Log::debug(sprintf('RuleAction AppendDescription appended "%s" to "%s".', $this->action->action_value, $journal->description)); - $journal->description = $journal->description . $this->action->action_value; + $journal->description .= $this->action->action_value; $journal->save(); return true; diff --git a/app/TransactionRules/Actions/AppendNotes.php b/app/TransactionRules/Actions/AppendNotes.php index 9c779760d8..b1ff09df5c 100644 --- a/app/TransactionRules/Actions/AppendNotes.php +++ b/app/TransactionRules/Actions/AppendNotes.php @@ -61,7 +61,7 @@ class AppendNotes implements ActionInterface } $notes = $dbNote->text; Log::debug(sprintf('RuleAction AppendNotes appended "%s" to "%s".', $this->action->action_value, $notes)); - $notes = $notes . $this->action->action_value; + $notes .= $this->action->action_value; $dbNote->text = $notes; $dbNote->save(); $journal->save(); diff --git a/app/TransactionRules/Actions/ClearBudget.php b/app/TransactionRules/Actions/ClearBudget.php index 61a282eae3..e2366b7397 100644 --- a/app/TransactionRules/Actions/ClearBudget.php +++ b/app/TransactionRules/Actions/ClearBudget.php @@ -59,7 +59,7 @@ class ClearBudget implements ActionInterface // also remove categories from transactions: /** @var Transaction $transaction */ - foreach($journal->transactions as $transaction) { + foreach ($journal->transactions as $transaction) { $transaction->budgets()->detach(); } diff --git a/app/TransactionRules/Actions/ClearCategory.php b/app/TransactionRules/Actions/ClearCategory.php index 90ec0bb066..df9637c448 100644 --- a/app/TransactionRules/Actions/ClearCategory.php +++ b/app/TransactionRules/Actions/ClearCategory.php @@ -59,7 +59,7 @@ class ClearCategory implements ActionInterface // also remove categories from transactions: /** @var Transaction $transaction */ - foreach($journal->transactions as $transaction) { + foreach ($journal->transactions as $transaction) { $transaction->categories()->detach(); } diff --git a/app/TransactionRules/Processor.php b/app/TransactionRules/Processor.php index 0c35753533..2c4d343765 100644 --- a/app/TransactionRules/Processor.php +++ b/app/TransactionRules/Processor.php @@ -67,6 +67,7 @@ final class Processor * @param bool $includeActions * * @return Processor + * @throws \FireflyIII\Exceptions\FireflyException */ public static function make(Rule $rule, $includeActions = true) { @@ -173,6 +174,7 @@ final class Processor * @param Transaction $transaction * * @return bool + * @throws \FireflyIII\Exceptions\FireflyException */ public function handleTransaction(Transaction $transaction): bool { @@ -207,6 +209,7 @@ final class Processor * @param TransactionJournal $journal * * @return bool + * @throws \FireflyIII\Exceptions\FireflyException */ public function handleTransactionJournal(TransactionJournal $journal): bool { @@ -229,6 +232,7 @@ final class Processor * Run the actions * * @return bool + * @throws \FireflyIII\Exceptions\FireflyException */ private function actions() { diff --git a/app/TransactionRules/TransactionMatcher.php b/app/TransactionRules/TransactionMatcher.php index 11a8ed8a9d..3ad8033ec5 100644 --- a/app/TransactionRules/TransactionMatcher.php +++ b/app/TransactionRules/TransactionMatcher.php @@ -26,7 +26,6 @@ use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Models\Rule; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionType; -use FireflyIII\Repositories\Journal\JournalTaskerInterface; use Illuminate\Support\Collection; use Log; @@ -42,29 +41,18 @@ class TransactionMatcher private $range = 200; /** @var Rule The rule to apply */ private $rule; - /** @var JournalTaskerInterface Tasker for some related tasks */ - private $tasker; /** @var array Types that can be matched using this matcher */ private $transactionTypes = [TransactionType::DEPOSIT, TransactionType::WITHDRAWAL, TransactionType::TRANSFER]; /** @var array List of triggers to match */ private $triggers = []; - /** - * TransactionMatcher constructor. Typehint the repository. - * - * @param JournalTaskerInterface $tasker - */ - public function __construct(JournalTaskerInterface $tasker) - { - $this->tasker = $tasker; - } - /** * This method will search the user's transaction journal (with an upper limit of $range) for * transaction journals matching the given rule. This is accomplished by trying to fire these * triggers onto each transaction journal until enough matches are found ($limit). * * @return Collection + * @throws \FireflyIII\Exceptions\FireflyException */ public function findTransactionsByRule() { @@ -89,6 +77,7 @@ class TransactionMatcher * triggers onto each transaction journal until enough matches are found ($limit). * * @return Collection + * @throws \FireflyIII\Exceptions\FireflyException */ public function findTransactionsByTriggers(): Collection { @@ -195,6 +184,7 @@ class TransactionMatcher * @param Processor $processor * * @return Collection + * @throws \FireflyIII\Exceptions\FireflyException */ private function runProcessor(Processor $processor): Collection { diff --git a/app/TransactionRules/Triggers/AbstractTrigger.php b/app/TransactionRules/Triggers/AbstractTrigger.php index 0177db9860..fcf626618b 100644 --- a/app/TransactionRules/Triggers/AbstractTrigger.php +++ b/app/TransactionRules/Triggers/AbstractTrigger.php @@ -29,7 +29,7 @@ use FireflyIII\Models\TransactionJournal; * This class will be magical! * * Class AbstractTrigger - * @method triggered + * @method bool triggered($object) */ class AbstractTrigger { diff --git a/app/TransactionRules/Triggers/NotesContain.php b/app/TransactionRules/Triggers/NotesContain.php index cb6b324455..e17babae41 100644 --- a/app/TransactionRules/Triggers/NotesContain.php +++ b/app/TransactionRules/Triggers/NotesContain.php @@ -72,7 +72,7 @@ final class NotesContain extends AbstractTrigger implements TriggerInterface */ public function triggered(TransactionJournal $journal): bool { - $search = trim(strtolower($this->triggerValue)); + $search = strtolower(trim($this->triggerValue)); if (0 === strlen($search)) { Log::debug(sprintf('RuleTrigger NotesContain for journal #%d: "%s" is empty, return false.', $journal->id, $search)); diff --git a/app/Transformers/AccountTransformer.php b/app/Transformers/AccountTransformer.php index dae5b8f5fb..6f64a76e39 100644 --- a/app/Transformers/AccountTransformer.php +++ b/app/Transformers/AccountTransformer.php @@ -25,11 +25,9 @@ namespace FireflyIII\Transformers; use Carbon\Carbon; -use FireflyIII\Helpers\Collector\JournalCollector; use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Models\Account; use FireflyIII\Models\AccountType; -use FireflyIII\Models\Note; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use Illuminate\Support\Collection; @@ -43,6 +41,7 @@ use Symfony\Component\HttpFoundation\ParameterBag; */ class AccountTransformer extends TransformerAbstract { + /** @noinspection ClassOverridesFieldOfSuperClassInspection */ /** * List of resources possible to include. * @@ -58,6 +57,9 @@ class AccountTransformer extends TransformerAbstract /** @var ParameterBag */ protected $parameters; + /** @var AccountRepositoryInterface */ + protected $repository; + /** * * AccountTransformer constructor. @@ -68,6 +70,7 @@ class AccountTransformer extends TransformerAbstract */ public function __construct(ParameterBag $parameters) { + $this->repository = app(AccountRepositoryInterface::class); $this->parameters = $parameters; } @@ -141,12 +144,14 @@ class AccountTransformer extends TransformerAbstract */ public function transform(Account $account): array { + $this->repository->setUser($account->user); + $type = $account->accountType->type; - $role = $account->getMeta('accountRole'); + $role = $this->repository->getMetaValue($account, 'accountRole'); if (strlen($role) === 0 || $type !== AccountType::ASSET) { $role = null; } - $currencyId = (int)$account->getMeta('currency_id'); + $currencyId = intval($this->repository->getMetaValue($account, 'currency_id')); $currencyCode = null; $decimalPlaces = 2; if ($currencyId > 0) { @@ -167,8 +172,8 @@ class AccountTransformer extends TransformerAbstract $monthlyPaymentDate = null; $creditCardType = null; if ($role === 'ccAsset' && $type === AccountType::ASSET) { - $creditCardType = $this->getMeta($account, 'ccType'); - $monthlyPaymentDate = $this->getMeta($account, 'ccMonthlyPaymentDate'); + $creditCardType = $this->repository->getMetaValue($account, 'ccType'); + $monthlyPaymentDate = $this->repository->getMetaValue($account, 'ccMonthlyPaymentDate'); } $openingBalance = null; @@ -176,7 +181,7 @@ class AccountTransformer extends TransformerAbstract if ($type === AccountType::ASSET) { /** @var AccountRepositoryInterface $repository */ $repository = app(AccountRepositoryInterface::class); - $repository->setuser($account->user); + $repository->setUser($account->user); $amount = $repository->getOpeningBalanceAmount($account); $openingBalance = is_null($amount) ? null : round($amount, $decimalPlaces); $openingBalanceDate = $repository->getOpeningBalanceDate($account); @@ -193,12 +198,12 @@ class AccountTransformer extends TransformerAbstract 'currency_code' => $currencyCode, 'current_balance' => round(app('steam')->balance($account, $date), $decimalPlaces), 'current_balance_date' => $date->format('Y-m-d'), - 'notes' => null, + 'notes' => $this->repository->getNoteText($account), 'monthly_payment_date' => $monthlyPaymentDate, 'credit_card_type' => $creditCardType, - 'account_number' => $this->getMeta($account, 'accountNumber'), + 'account_number' => $this->repository->getMetaValue($account, 'accountNumber'), 'iban' => $account->iban, - 'bic' => $this->getMeta($account, 'BIC'), + 'bic' => $this->repository->getMetaValue($account, 'BIC'), 'virtual_balance' => round($account->virtual_balance, $decimalPlaces), 'opening_balance' => $openingBalance, 'opening_balance_date' => $openingBalanceDate, @@ -211,33 +216,6 @@ class AccountTransformer extends TransformerAbstract ], ]; - /** @var Note $note */ - $note = $account->notes()->first(); - if (!is_null($note)) { - $data['notes'] = $note->text; // @codeCoverageIgnore - } - return $data; } - - /** - * Get meta data field for account. - * - * @codeCoverageIgnore - * - * @param Account $account - * @param string $field - * - * @return null|string - */ - private function getMeta(Account $account, string $field): ?string - { - $result = $account->getMeta($field); - if (strlen($result) === 0) { - return null; - } - - return $result; - } - } diff --git a/app/Transformers/BillTransformer.php b/app/Transformers/BillTransformer.php index bffa784cd7..45b9a89182 100644 --- a/app/Transformers/BillTransformer.php +++ b/app/Transformers/BillTransformer.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace FireflyIII\Transformers; use Carbon\Carbon; -use FireflyIII\Helpers\Collector\JournalCollector; use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Models\Bill; use FireflyIII\Models\Note; diff --git a/app/Transformers/BudgetTransformer.php b/app/Transformers/BudgetTransformer.php index 4163973ecc..7fc3d82db7 100644 --- a/app/Transformers/BudgetTransformer.php +++ b/app/Transformers/BudgetTransformer.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace FireflyIII\Transformers; -use FireflyIII\Helpers\Collector\JournalCollector; use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Models\Budget; use Illuminate\Support\Collection; diff --git a/app/Transformers/CategoryTransformer.php b/app/Transformers/CategoryTransformer.php index 1d7c3bde8b..8c7ea8d6dc 100644 --- a/app/Transformers/CategoryTransformer.php +++ b/app/Transformers/CategoryTransformer.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace FireflyIII\Transformers; -use FireflyIII\Helpers\Collector\JournalCollector; use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Models\Category; use Illuminate\Support\Collection; diff --git a/app/Transformers/JournalMetaTransformer.php b/app/Transformers/JournalMetaTransformer.php index 3985b4ab2a..09de3a397a 100644 --- a/app/Transformers/JournalMetaTransformer.php +++ b/app/Transformers/JournalMetaTransformer.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace FireflyIII\Transformers; -use FireflyIII\Helpers\Collector\JournalCollector; use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Models\TransactionJournalMeta; use Illuminate\Support\Collection; diff --git a/app/Transformers/PiggyBankEventTransformer.php b/app/Transformers/PiggyBankEventTransformer.php index 4f20f73885..2fad262ebd 100644 --- a/app/Transformers/PiggyBankEventTransformer.php +++ b/app/Transformers/PiggyBankEventTransformer.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace FireflyIII\Transformers; -use FireflyIII\Helpers\Collector\JournalCollector; use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Models\PiggyBankEvent; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; diff --git a/app/Transformers/TagTransformer.php b/app/Transformers/TagTransformer.php index 6cc8cff5ef..d57b6f2599 100644 --- a/app/Transformers/TagTransformer.php +++ b/app/Transformers/TagTransformer.php @@ -24,7 +24,6 @@ declare(strict_types=1); namespace FireflyIII\Transformers; -use FireflyIII\Helpers\Collector\JournalCollector; use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Models\Tag; use League\Fractal\Resource\Collection as FractalCollection; diff --git a/app/Transformers/TransactionTransformer.php b/app/Transformers/TransactionTransformer.php index e4f99fbcd2..29a1333ad9 100644 --- a/app/Transformers/TransactionTransformer.php +++ b/app/Transformers/TransactionTransformer.php @@ -170,37 +170,40 @@ class TransactionTransformer extends TransformerAbstract } /** @var Note $dbNote */ $dbNote = $transaction->transactionJournal->notes()->first(); - $notes = null; - if(!is_null($dbNote)) { + $notes = null; + if (!is_null($dbNote)) { $notes = $dbNote->text; } $data = [ - 'id' => (int)$transaction->id, - 'updated_at' => $transaction->updated_at->toAtomString(), - 'created_at' => $transaction->created_at->toAtomString(), - 'description' => $transaction->description, - 'date' => $transaction->date->format('Y-m-d'), - 'type' => $transaction->transaction_type_type, - 'identifier' => $transaction->identifier, - 'journal_id' => (int)$transaction->journal_id, - 'reconciled' => (bool)$transaction->reconciled, - 'amount' => round($transaction->transaction_amount, intval($transaction->transaction_currency_dp)), - 'currency_id' => $transaction->transaction_currency_id, - 'currency_code' => $transaction->transaction_currency_code, - 'currency_dp' => $transaction->transaction_currency_dp, - 'foreign_amount' => null, - 'foreign_currency_id' => $transaction->foreign_currency_id, - 'foreign_currency_code' => $transaction->foreign_currency_code, - 'foreign_currency_dp' => $transaction->foreign_currency_dp, - 'bill_id' => $transaction->bill_id, - 'bill_name' => $transaction->bill_name, - 'category_id' => $categoryId, - 'category_name' => $categoryName, - 'budget_id' => $budgetId, - 'budget_name' => $budgetName, - 'notes' => $notes, - 'links' => [ + 'id' => (int)$transaction->id, + 'updated_at' => $transaction->updated_at->toAtomString(), + 'created_at' => $transaction->created_at->toAtomString(), + 'description' => $transaction->description, + 'transaction_description' => $transaction->transaction_description, + 'date' => $transaction->date->format('Y-m-d'), + 'type' => $transaction->transaction_type_type, + 'identifier' => $transaction->identifier, + 'journal_id' => (int)$transaction->journal_id, + 'reconciled' => (bool)$transaction->reconciled, + 'amount' => round($transaction->transaction_amount, intval($transaction->transaction_currency_dp)), + 'currency_id' => $transaction->transaction_currency_id, + 'currency_code' => $transaction->transaction_currency_code, + 'currency_symbol' => $transaction->transaction_currency_symbol, + 'currency_dp' => $transaction->transaction_currency_dp, + 'foreign_amount' => null, + 'foreign_currency_id' => $transaction->foreign_currency_id, + 'foreign_currency_code' => $transaction->foreign_currency_code, + 'foreign_currency_symbol' => $transaction->foreign_currency_symbol, + 'foreign_currency_dp' => $transaction->foreign_currency_dp, + 'bill_id' => $transaction->bill_id, + 'bill_name' => $transaction->bill_name, + 'category_id' => $categoryId, + 'category_name' => $categoryName, + 'budget_id' => $budgetId, + 'budget_name' => $budgetName, + 'notes' => $notes, + 'links' => [ [ 'rel' => 'self', 'uri' => '/transactions/' . $transaction->id, diff --git a/app/User.php b/app/User.php index d8d76af5e7..c5dbe49ad7 100644 --- a/app/User.php +++ b/app/User.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); namespace FireflyIII; @@ -76,6 +76,7 @@ class User extends Authenticatable * @param string $value * * @return User + * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException */ public static function routeBinder(string $value): User { @@ -222,6 +223,7 @@ class User extends Authenticatable * * @param string $name * + * @deprecated * @return bool */ public function hasRole(string $name): bool diff --git a/app/Validation/FireflyValidator.php b/app/Validation/FireflyValidator.php index ff07c8321b..061857c346 100644 --- a/app/Validation/FireflyValidator.php +++ b/app/Validation/FireflyValidator.php @@ -93,11 +93,8 @@ class FireflyValidator extends Validator return true; } $count = DB::table($parameters[0])->where('user_id', auth()->user()->id)->where($field, $value)->count(); - if (1 === $count) { - return true; - } - return false; + return 1 === $count; } /** @@ -234,11 +231,8 @@ class FireflyValidator extends Validator return true; } $count = DB::table($parameters[0])->where($field, $value)->count(); - if (1 === $count) { - return true; - } - return false; + return 1 === $count; } /** @@ -323,7 +317,7 @@ class FireflyValidator extends Validator /** @var TriggerInterface $class */ $class = $classes[$name]; - return !($class::willMatchEverything($value)); + return !$class::willMatchEverything($value); } return false; @@ -396,7 +390,7 @@ class FireflyValidator extends Validator public function validateUniqueAccountNumberForUser($attribute, $value, $parameters): bool { $accountId = $this->data['id'] ?? 0; - if($accountId === 0) { + if ($accountId === 0) { $accountId = $parameters[0] ?? 0; } diff --git a/bootstrap/app.php b/bootstrap/app.php index aefb6a0580..f1d4085827 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -33,9 +33,6 @@ declare(strict_types=1); | */ -use Monolog\Formatter\LineFormatter; -use Monolog\Handler\RotatingFileHandler; -use Monolog\Logger; bcscale(12); @@ -70,38 +67,6 @@ $app->singleton( FireflyIII\Exceptions\Handler::class ); -/* Overrule logging if not Sandstorm */ -if (!(env('IS_SANDSTORM') === true)) { - $app->configureMonologUsing( - function (Logger $monolog) use ($app) { - - $interface = php_sapi_name(); - $path = $app->storagePath() . '/logs/ff3-' . $interface . '.log'; - $level = 'debug'; - if ($app->bound('config')) { - $level = $app->make('config')->get('app.log_level', 'debug'); - } - $levels = [ - 'debug' => Logger::DEBUG, - 'info' => Logger::INFO, - 'notice' => Logger::NOTICE, - 'warning' => Logger::WARNING, - 'error' => Logger::ERROR, - 'critical' => Logger::CRITICAL, - 'alert' => Logger::ALERT, - 'emergency' => Logger::EMERGENCY, - ]; - - $useLevel = $levels[$level]; - - $formatter = new LineFormatter(null, null, true, true); - $handler = new RotatingFileHandler($path, 5, $useLevel); - $handler->setFormatter($formatter); - $monolog->pushHandler($handler); - } - ); -} - /* |-------------------------------------------------------------------------- | Return The Application diff --git a/changelog.md b/changelog.md index c94884e46a..8f78da8813 100644 --- a/changelog.md +++ b/changelog.md @@ -2,6 +2,58 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). + +## [4.7.2] - 2018-04-01 +### Added +- [Issue 1123](https://github.com/firefly-iii/firefly-iii/issues/1123) First browser based update routine. +- Add support for Italian. +- [Issue 1232](https://github.com/firefly-iii/firefly-iii/issues/1232) Allow user to specify Docker database port. +- [Issue 1197](https://github.com/firefly-iii/firefly-iii/issues/1197) Beter account list overview +- [Issue 1202](https://github.com/firefly-iii/firefly-iii/issues/1202) Some budgetary warnings +- [Issue 1284](https://github.com/firefly-iii/firefly-iii/issues/1284) Experimental support for bunq import +- [Issue 1248](https://github.com/firefly-iii/firefly-iii/issues/1248) Ability to import BIC, ability to import SEPA fields. +- [Issue 1102](https://github.com/firefly-iii/firefly-iii/issues/1102) Summary line for bills +- More info to debug page. +- [Issue 1186](https://github.com/firefly-iii/firefly-iii/issues/1186) You can see the latest account balance in CRUD forms +- Add Kubernetes YAML files, kindly created by a FF3 user. + +### Changed +- [Issue 1244](https://github.com/firefly-iii/firefly-iii/issues/1244) Better line for "today" marker and add it to other chart as well ([issue 1214](https://github.com/firefly-iii/firefly-iii/issues/1214)) +- [Issue 1219](https://github.com/firefly-iii/firefly-iii/issues/1219) Languages in dropdown +- [Issue 1189](https://github.com/firefly-iii/firefly-iii/issues/1189) Inactive accounts get removed from net worth +- [Issue 1220](https://github.com/firefly-iii/firefly-iii/issues/1220) Attachment description and notes migrated to just "notes". +- [Issue 1236](https://github.com/firefly-iii/firefly-iii/issues/1236) Multi currency balance box +- [Issue 1240](https://github.com/firefly-iii/firefly-iii/issues/1240) Better overview for accounts. +- [Issue 1292](https://github.com/firefly-iii/firefly-iii/issues/1292) Removed some charts from the "all"-overview of budgets and categories +- [Issue 1245](https://github.com/firefly-iii/firefly-iii/issues/1245) Improved recognition of IBANs +- Improved import routine. +- Update notifier will wait three days before notifying users. +- [Issue 1300](https://github.com/firefly-iii/firefly-iii/issues/1300) Virtual balance of credit cards does not count for net worth +- [Issue 1247](https://github.com/firefly-iii/firefly-iii/issues/1247) Can now see overspent amount +- [Issue 1221](https://github.com/firefly-iii/firefly-iii/issues/1221) Upgrade to Laravel 5.6 +- [Issue 1187](https://github.com/firefly-iii/firefly-iii/issues/1187) Updated the password verifier to use Troy Hunt's new API +- Revenue chart is now on frontpage permanently +- [Issue 1153](https://github.com/firefly-iii/firefly-iii/issues/1153) 2FA settings are in your profile now +- [Issue 1227](https://github.com/firefly-iii/firefly-iii/issues/1227) Can set the timezone in config or in Docker + +### Fixed +- [Issue 1294](https://github.com/firefly-iii/firefly-iii/issues/1294) Ability to link a transaction to itself +- Correct reference to journal description in split form. +- [Issue 1234](https://github.com/firefly-iii/firefly-iii/issues/1234) Fix budget page issues in SQLite +- [Issue 1262](https://github.com/firefly-iii/firefly-iii/issues/1262) Can now use double and epty headers in CSV files +- [Issue 1258](https://github.com/firefly-iii/firefly-iii/issues/1258) Fixed a possible date mismatch in piggy banks +- [Issue 1283](https://github.com/firefly-iii/firefly-iii/issues/1283) Bulk delete was broken +- [Issue 1293](https://github.com/firefly-iii/firefly-iii/issues/1293) Layout problem with notes +- [Issue 1257](https://github.com/firefly-iii/firefly-iii/issues/1257) Improve transaction lists query count +- [Issue 1291](https://github.com/firefly-iii/firefly-iii/issues/1291) Fixer IO problems +- [Issue 1239](https://github.com/firefly-iii/firefly-iii/issues/1239) Could not edit expense or revenue accounts ([issue 1298](https://github.com/firefly-iii/firefly-iii/issues/1298)) +- [Issue 1297](https://github.com/firefly-iii/firefly-iii/issues/1297) Could not convert to withdrawal +- [Issue 1226](https://github.com/firefly-iii/firefly-iii/issues/1226) Category overview in default report shows no income. +- Various other bugs and problems ([issue 1198](https://github.com/firefly-iii/firefly-iii/issues/1198), [issue 1213](https://github.com/firefly-iii/firefly-iii/issues/1213), [issue 1237](https://github.com/firefly-iii/firefly-iii/issues/1237), [issue 1238](https://github.com/firefly-iii/firefly-iii/issues/1238), [issue 1199](https://github.com/firefly-iii/firefly-iii/issues/1199), [issue 1200](https://github.com/firefly-iii/firefly-iii/issues/1200)) + +### Security +- Fixed an issue with token validation on the command line. + ## [4.7.1] - 2018-03-04 ### Added - A brand new API. Read about it in the [documentation](http://firefly-iii.readthedocs.io/en/latest/). diff --git a/composer.json b/composer.json index 3d619ba29c..9b90499718 100644 --- a/composer.json +++ b/composer.json @@ -49,15 +49,15 @@ "ext-curl": "*", "ext-gd": "*", "ext-intl": "*", - "ext-mbstring": "*", "ext-zip": "*", + "ext-xml": "*", "bacon/bacon-qr-code": "1.*", - "davejamesmiller/laravel-breadcrumbs": "4.*", + "davejamesmiller/laravel-breadcrumbs": "5.*", "doctrine/dbal": "2.*", - "fideloper/proxy": "3.*", - "laravel/framework": "5.5.*", - "laravel/passport": "^4.0", - "laravelcollective/html": "5.5.*", + "fideloper/proxy": "4.*", + "laravel/framework": "5.6.*", + "laravel/passport": "^5.0", + "laravelcollective/html": "5.6.*", "league/commonmark": "0.*", "league/csv": "9.*", "league/fractal": "^0.17.0", @@ -75,7 +75,7 @@ "fzaninotto/faker": "1.*", "mockery/mockery": "^1.0", "php-coveralls/php-coveralls": "^2.0", - "phpunit/phpunit": "~6.0" + "phpunit/phpunit": "~7.0" }, "autoload": { "classmap": [ @@ -113,11 +113,9 @@ "php artisan firefly:upgrade-database", "php artisan firefly:verify", "php artisan firefly:instructions update", - "php artisan optimize", "php artisan passport:install" ], "post-install-cmd": [ - "php artisan optimize", "php artisan firefly:instructions install" ] }, diff --git a/composer.lock b/composer.lock index 88e62967f1..5fd1caf2fb 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "content-hash": "40e3a639ee41d56a8253f5fe431f53f9", + "content-hash": "823070d72a990bfa26bdf63404e50651", "packages": [ { "name": "bacon/bacon-qr-code", @@ -54,28 +54,28 @@ }, { "name": "davejamesmiller/laravel-breadcrumbs", - "version": "4.2.0", + "version": "5.0.0", "source": { "type": "git", "url": "https://github.com/davejamesmiller/laravel-breadcrumbs.git", - "reference": "368d7b3a2cd21fe2e648756e5d01d3fe4fbe98e1" + "reference": "590cb313d783460bdac4d3a801c83e6ecf561eb7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/davejamesmiller/laravel-breadcrumbs/zipball/368d7b3a2cd21fe2e648756e5d01d3fe4fbe98e1", - "reference": "368d7b3a2cd21fe2e648756e5d01d3fe4fbe98e1", + "url": "https://api.github.com/repos/davejamesmiller/laravel-breadcrumbs/zipball/590cb313d783460bdac4d3a801c83e6ecf561eb7", + "reference": "590cb313d783460bdac4d3a801c83e6ecf561eb7", "shasum": "" }, "require": { - "illuminate/support": "5.5.*", - "illuminate/view": "5.5.*", - "php": ">=7.0.0" + "illuminate/support": "5.6.*", + "illuminate/view": "5.6.*", + "php": ">=7.1.3" }, "require-dev": { - "laravel/framework": "5.5.*", - "orchestra/testbench": "3.5.*", - "phpunit/phpunit": "6.*", - "satooshi/php-coveralls": "1.0.*" + "laravel/framework": "5.6.*", + "orchestra/testbench": "3.6.*", + "php-coveralls/php-coveralls": "^1.0", + "phpunit/phpunit": "7.*" }, "type": "library", "extra": { @@ -95,7 +95,7 @@ }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT License" + "MIT" ], "authors": [ { @@ -109,7 +109,7 @@ "keywords": [ "laravel" ], - "time": "2017-09-14T08:23:50+00:00" + "time": "2018-02-10T19:00:08+00:00" }, { "name": "defuse/php-encryption", @@ -650,6 +650,55 @@ ], "time": "2014-09-09T13:34:57+00:00" }, + { + "name": "dragonmantank/cron-expression", + "version": "v2.0.0", + "source": { + "type": "git", + "url": "https://github.com/dragonmantank/cron-expression.git", + "reference": "8a84aee649c3a3ba03a721c1fb080e08dfbcd68b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dragonmantank/cron-expression/zipball/8a84aee649c3a3ba03a721c1fb080e08dfbcd68b", + "reference": "8a84aee649c3a3ba03a721c1fb080e08dfbcd68b", + "shasum": "" + }, + "require": { + "php": ">=7.0.0" + }, + "require-dev": { + "phpunit/phpunit": "~5.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Cron\\": "src/Cron/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Chris Tankersley", + "email": "chris@ctankersley.com", + "homepage": "https://github.com/dragonmantank" + } + ], + "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", + "keywords": [ + "cron", + "schedule" + ], + "time": "2017-10-12T15:59:13+00:00" + }, { "name": "egulias/email-validator", "version": "2.1.3", @@ -709,19 +758,20 @@ }, { "name": "erusev/parsedown", - "version": "1.7.0", + "version": "1.7.1", "source": { "type": "git", "url": "https://github.com/erusev/parsedown.git", - "reference": "6678d59be48c4be64eaca6ce70bea48a09488cc2" + "reference": "92e9c27ba0e74b8b028b111d1b6f956a15c01fc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/erusev/parsedown/zipball/6678d59be48c4be64eaca6ce70bea48a09488cc2", - "reference": "6678d59be48c4be64eaca6ce70bea48a09488cc2", + "url": "https://api.github.com/repos/erusev/parsedown/zipball/92e9c27ba0e74b8b028b111d1b6f956a15c01fc1", + "reference": "92e9c27ba0e74b8b028b111d1b6f956a15c01fc1", "shasum": "" }, "require": { + "ext-mbstring": "*", "php": ">=5.3.0" }, "require-dev": { @@ -750,20 +800,20 @@ "markdown", "parser" ], - "time": "2018-02-28T11:41:37+00:00" + "time": "2018-03-08T01:11:30+00:00" }, { "name": "fideloper/proxy", - "version": "3.3.4", + "version": "4.0.0", "source": { "type": "git", "url": "https://github.com/fideloper/TrustedProxy.git", - "reference": "9cdf6f118af58d89764249bbcc7bb260c132924f" + "reference": "cf8a0ca4b85659b9557e206c90110a6a4dba980a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/9cdf6f118af58d89764249bbcc7bb260c132924f", - "reference": "9cdf6f118af58d89764249bbcc7bb260c132924f", + "url": "https://api.github.com/repos/fideloper/TrustedProxy/zipball/cf8a0ca4b85659b9557e206c90110a6a4dba980a", + "reference": "cf8a0ca4b85659b9557e206c90110a6a4dba980a", "shasum": "" }, "require": { @@ -771,15 +821,12 @@ "php": ">=5.4.0" }, "require-dev": { - "illuminate/http": "~5.0", - "mockery/mockery": "~0.9.3", - "phpunit/phpunit": "^5.7" + "illuminate/http": "~5.6", + "mockery/mockery": "~1.0", + "phpunit/phpunit": "^6.0" }, "type": "library", "extra": { - "branch-alias": { - "dev-master": "3.3-dev" - }, "laravel": { "providers": [ "Fideloper\\Proxy\\TrustedProxyServiceProvider" @@ -807,7 +854,7 @@ "proxy", "trusted proxy" ], - "time": "2017-06-15T17:19:42+00:00" + "time": "2018-02-07T20:20:57+00:00" }, { "name": "firebase/php-jwt", @@ -857,16 +904,16 @@ }, { "name": "guzzlehttp/guzzle", - "version": "6.3.0", + "version": "6.3.2", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699" + "reference": "68d0ea14d5a3f42a20e87632a5f84931e2709c90" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f4db5a78a5ea468d4831de7f0bf9d9415e348699", - "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/68d0ea14d5a3f42a20e87632a5f84931e2709c90", + "reference": "68d0ea14d5a3f42a20e87632a5f84931e2709c90", "shasum": "" }, "require": { @@ -876,7 +923,7 @@ }, "require-dev": { "ext-curl": "*", - "phpunit/phpunit": "^4.0 || ^5.0", + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4", "psr/log": "^1.0" }, "suggest": { @@ -885,7 +932,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "6.2-dev" + "dev-master": "6.3-dev" } }, "autoload": { @@ -918,7 +965,7 @@ "rest", "web service" ], - "time": "2017-06-22T18:50:49+00:00" + "time": "2018-03-26T16:33:04+00:00" }, { "name": "guzzlehttp/promises", @@ -1038,43 +1085,46 @@ }, { "name": "laravel/framework", - "version": "v5.5.36", + "version": "v5.6.15", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "9283cea4a5727aaf1def60a8fa820e49df2cf874" + "reference": "baa42cf6bdd942523fafece21ec16a1843c6db0f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/9283cea4a5727aaf1def60a8fa820e49df2cf874", - "reference": "9283cea4a5727aaf1def60a8fa820e49df2cf874", + "url": "https://api.github.com/repos/laravel/framework/zipball/baa42cf6bdd942523fafece21ec16a1843c6db0f", + "reference": "baa42cf6bdd942523fafece21ec16a1843c6db0f", "shasum": "" }, "require": { "doctrine/inflector": "~1.1", + "dragonmantank/cron-expression": "~2.0", "erusev/parsedown": "~1.7", "ext-mbstring": "*", "ext-openssl": "*", - "league/flysystem": "~1.0", + "league/flysystem": "^1.0.8", "monolog/monolog": "~1.12", - "mtdowling/cron-expression": "~1.0", - "nesbot/carbon": "~1.20", - "php": ">=7.0", + "nesbot/carbon": "^1.24.1", + "php": "^7.1.3", "psr/container": "~1.0", "psr/simple-cache": "^1.0", - "ramsey/uuid": "~3.0", + "ramsey/uuid": "^3.7", "swiftmailer/swiftmailer": "~6.0", - "symfony/console": "~3.3", - "symfony/debug": "~3.3", - "symfony/finder": "~3.3", - "symfony/http-foundation": "~3.3", - "symfony/http-kernel": "~3.3", - "symfony/process": "~3.3", - "symfony/routing": "~3.3", - "symfony/var-dumper": "~3.3", - "tijsverkoyen/css-to-inline-styles": "~2.2", + "symfony/console": "~4.0", + "symfony/debug": "~4.0", + "symfony/finder": "~4.0", + "symfony/http-foundation": "~4.0", + "symfony/http-kernel": "~4.0", + "symfony/process": "~4.0", + "symfony/routing": "~4.0", + "symfony/var-dumper": "~4.0", + "tijsverkoyen/css-to-inline-styles": "^2.2.1", "vlucas/phpdotenv": "~2.2" }, + "conflict": { + "tightenco/collect": "<5.5.33" + }, "replace": { "illuminate/auth": "self.version", "illuminate/broadcasting": "self.version", @@ -1103,24 +1153,24 @@ "illuminate/support": "self.version", "illuminate/translation": "self.version", "illuminate/validation": "self.version", - "illuminate/view": "self.version", - "tightenco/collect": "<5.5.33" + "illuminate/view": "self.version" }, "require-dev": { "aws/aws-sdk-php": "~3.0", - "doctrine/dbal": "~2.5", + "doctrine/dbal": "~2.6", "filp/whoops": "^2.1.4", "mockery/mockery": "~1.0", - "orchestra/testbench-core": "3.5.*", + "moontoast/math": "^1.1", + "orchestra/testbench-core": "3.6.*", "pda/pheanstalk": "~3.0", - "phpunit/phpunit": "~6.0", + "phpunit/phpunit": "~7.0", "predis/predis": "^1.1.1", - "symfony/css-selector": "~3.3", - "symfony/dom-crawler": "~3.3" + "symfony/css-selector": "~4.0", + "symfony/dom-crawler": "~4.0" }, "suggest": { "aws/aws-sdk-php": "Required to use the SQS queue driver and SES mail driver (~3.0).", - "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.5).", + "doctrine/dbal": "Required to rename columns and drop SQLite columns (~2.6).", "ext-pcntl": "Required to use all features of the queue worker.", "ext-posix": "Required to use all features of the queue worker.", "fzaninotto/faker": "Required to use the eloquent factory builder (~1.4).", @@ -1129,18 +1179,19 @@ "league/flysystem-aws-s3-v3": "Required to use the Flysystem S3 driver (~1.0).", "league/flysystem-cached-adapter": "Required to use Flysystem caching (~1.0).", "league/flysystem-rackspace": "Required to use the Flysystem Rackspace driver (~1.0).", + "league/flysystem-sftp": "Required to use the Flysystem SFTP driver (~1.0).", "nexmo/client": "Required to use the Nexmo transport (~1.0).", "pda/pheanstalk": "Required to use the beanstalk queue driver (~3.0).", "predis/predis": "Required to use the redis cache and queue drivers (~1.0).", "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (~3.0).", - "symfony/css-selector": "Required to use some of the crawler integration testing tools (~3.3).", - "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (~3.3).", + "symfony/css-selector": "Required to use some of the crawler integration testing tools (~4.0).", + "symfony/dom-crawler": "Required to use most of the crawler integration testing tools (~4.0).", "symfony/psr-http-message-bridge": "Required to psr7 bridging features (~1.0)." }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.5-dev" + "dev-master": "5.6-dev" } }, "autoload": { @@ -1168,47 +1219,47 @@ "framework", "laravel" ], - "time": "2018-03-01T13:59:00+00:00" + "time": "2018-03-30T13:29:58+00:00" }, { "name": "laravel/passport", - "version": "v4.0.3", + "version": "v5.0.3", "source": { "type": "git", "url": "https://github.com/laravel/passport.git", - "reference": "0542f1f82edfbf857d0197c34a3d41f549aff30a" + "reference": "9dbcc3d6f8f20f1a83cbef73bbb563ce59e43ded" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/passport/zipball/0542f1f82edfbf857d0197c34a3d41f549aff30a", - "reference": "0542f1f82edfbf857d0197c34a3d41f549aff30a", + "url": "https://api.github.com/repos/laravel/passport/zipball/9dbcc3d6f8f20f1a83cbef73bbb563ce59e43ded", + "reference": "9dbcc3d6f8f20f1a83cbef73bbb563ce59e43ded", "shasum": "" }, "require": { "firebase/php-jwt": "~3.0|~4.0|~5.0", "guzzlehttp/guzzle": "~6.0", - "illuminate/auth": "~5.4", - "illuminate/console": "~5.4", - "illuminate/container": "~5.4", - "illuminate/contracts": "~5.4", - "illuminate/database": "~5.4", - "illuminate/encryption": "~5.4", - "illuminate/http": "~5.4", - "illuminate/support": "~5.4", + "illuminate/auth": "~5.6", + "illuminate/console": "~5.6", + "illuminate/container": "~5.6", + "illuminate/contracts": "~5.6", + "illuminate/database": "~5.6", + "illuminate/encryption": "~5.6", + "illuminate/http": "~5.6", + "illuminate/support": "~5.6", "league/oauth2-server": "^6.0", - "php": ">=5.6.4", + "php": ">=7.0", "phpseclib/phpseclib": "^2.0", "symfony/psr-http-message-bridge": "~1.0", "zendframework/zend-diactoros": "~1.0" }, "require-dev": { - "mockery/mockery": "~0.9", - "phpunit/phpunit": "~5.0" + "mockery/mockery": "~1.0", + "phpunit/phpunit": "~6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "4.0-dev" + "dev-master": "6.0-dev" }, "laravel": { "providers": [ @@ -1237,38 +1288,40 @@ "oauth", "passport" ], - "time": "2017-09-24T14:21:39+00:00" + "time": "2018-03-15T12:39:02+00:00" }, { "name": "laravelcollective/html", - "version": "v5.5.3", + "version": "v5.6.5", "source": { "type": "git", "url": "https://github.com/LaravelCollective/html.git", - "reference": "b79edc7acf574144c9811277286b4cafee8a07cc" + "reference": "623a150c91e2d3f92eeee9f9eda58a841e3cb548" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/LaravelCollective/html/zipball/b79edc7acf574144c9811277286b4cafee8a07cc", - "reference": "b79edc7acf574144c9811277286b4cafee8a07cc", + "url": "https://api.github.com/repos/LaravelCollective/html/zipball/623a150c91e2d3f92eeee9f9eda58a841e3cb548", + "reference": "623a150c91e2d3f92eeee9f9eda58a841e3cb548", "shasum": "" }, "require": { - "illuminate/http": "5.5.*", - "illuminate/routing": "5.5.*", - "illuminate/session": "5.5.*", - "illuminate/support": "5.5.*", - "illuminate/view": "5.5.*", - "php": ">=7.0.0" + "illuminate/http": "5.6.*", + "illuminate/routing": "5.6.*", + "illuminate/session": "5.6.*", + "illuminate/support": "5.6.*", + "illuminate/view": "5.6.*", + "php": ">=7.1.3" }, "require-dev": { - "illuminate/database": "5.5.*", - "mockery/mockery": "~0.9.4", + "illuminate/database": "5.6.*", + "mockery/mockery": "~1.0", "phpunit/phpunit": "~5.4" }, "type": "library", "extra": { - "branch-alias": [], + "branch-alias": { + "dev-master": "5.6-dev" + }, "laravel": { "providers": [ "Collective\\Html\\HtmlServiceProvider" @@ -1303,7 +1356,7 @@ ], "description": "HTML and Form Builders for the Laravel Framework", "homepage": "https://laravelcollective.com", - "time": "2018-02-12T14:19:55+00:00" + "time": "2018-03-16T16:57:31+00:00" }, { "name": "lcobucci/jwt", @@ -1365,16 +1418,16 @@ }, { "name": "league/commonmark", - "version": "0.17.0", + "version": "0.17.5", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "3b4c2224524776a584de663c7a04bc8eb2e1544d" + "reference": "82d7ab62d7f68391cb9d323f3ccce50be24a5369" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/3b4c2224524776a584de663c7a04bc8eb2e1544d", - "reference": "3b4c2224524776a584de663c7a04bc8eb2e1544d", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/82d7ab62d7f68391cb9d323f3ccce50be24a5369", + "reference": "82d7ab62d7f68391cb9d323f3ccce50be24a5369", "shasum": "" }, "require": { @@ -1389,10 +1442,10 @@ "commonmark/commonmark.js": "0.28", "erusev/parsedown": "~1.0", "michelf/php-markdown": "~1.4", - "mikehaertl/php-shellcommand": "~1.2.0", - "phpunit/phpunit": "~5.7|~6.5", - "scrutinizer/ocular": "~1.1", - "symfony/finder": "~3.0|~4.0" + "mikehaertl/php-shellcommand": "^1.2", + "phpunit/phpunit": "^5.7|^6.5", + "scrutinizer/ocular": "^1.1", + "symfony/finder": "^3.0|^4.0" }, "suggest": { "league/commonmark-extras": "Library of useful extensions including smart punctuation" @@ -1430,20 +1483,20 @@ "markdown", "parser" ], - "time": "2017-12-30T22:08:48+00:00" + "time": "2018-03-29T14:35:19+00:00" }, { "name": "league/csv", - "version": "9.1.2", + "version": "9.1.3", "source": { "type": "git", "url": "https://github.com/thephpleague/csv.git", - "reference": "90bedd96fa3e3d2a988be985b9b1ee29cdb38301" + "reference": "0d0b12f1a0093a6c39014a5d118f6ba4274539ee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/csv/zipball/90bedd96fa3e3d2a988be985b9b1ee29cdb38301", - "reference": "90bedd96fa3e3d2a988be985b9b1ee29cdb38301", + "url": "https://api.github.com/repos/thephpleague/csv/zipball/0d0b12f1a0093a6c39014a5d118f6ba4274539ee", + "reference": "0d0b12f1a0093a6c39014a5d118f6ba4274539ee", "shasum": "" }, "require": { @@ -1453,6 +1506,9 @@ "require-dev": { "ext-curl": "*", "friendsofphp/php-cs-fixer": "^2.0", + "phpstan/phpstan": "^0.9.2", + "phpstan/phpstan-phpunit": "^0.9.4", + "phpstan/phpstan-strict-rules": "^0.9.0", "phpunit/phpunit": "^6.0" }, "suggest": { @@ -1494,7 +1550,7 @@ "read", "write" ], - "time": "2018-02-05T14:07:11+00:00" + "time": "2018-03-12T07:20:01+00:00" }, { "name": "league/event", @@ -1840,66 +1896,22 @@ ], "time": "2017-06-19T01:22:40+00:00" }, - { - "name": "mtdowling/cron-expression", - "version": "v1.2.1", - "source": { - "type": "git", - "url": "https://github.com/mtdowling/cron-expression.git", - "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/mtdowling/cron-expression/zipball/9504fa9ea681b586028adaaa0877db4aecf32bad", - "reference": "9504fa9ea681b586028adaaa0877db4aecf32bad", - "shasum": "" - }, - "require": { - "php": ">=5.3.2" - }, - "require-dev": { - "phpunit/phpunit": "~4.0|~5.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Cron\\": "src/Cron/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "CRON for PHP: Calculate the next or previous run date and determine if a CRON expression is due", - "keywords": [ - "cron", - "schedule" - ], - "time": "2017-01-23T04:29:33+00:00" - }, { "name": "nesbot/carbon", - "version": "1.23.0", + "version": "1.25.0", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "4a874a39b2b00d7e0146cd46fab6f47c41ce9e65" + "reference": "cbcf13da0b531767e39eb86e9687f5deba9857b4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/4a874a39b2b00d7e0146cd46fab6f47c41ce9e65", - "reference": "4a874a39b2b00d7e0146cd46fab6f47c41ce9e65", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/cbcf13da0b531767e39eb86e9687f5deba9857b4", + "reference": "cbcf13da0b531767e39eb86e9687f5deba9857b4", "shasum": "" }, "require": { - "php": ">=5.3.0", + "php": ">=5.3.9", "symfony/translation": "~2.6 || ~3.0 || ~4.0" }, "require-dev": { @@ -1935,28 +1947,28 @@ "datetime", "time" ], - "time": "2018-02-28T09:22:05+00:00" + "time": "2018-03-19T15:50:49+00:00" }, { "name": "paragonie/constant_time_encoding", - "version": "v2.2.1", + "version": "v2.2.2", "source": { "type": "git", "url": "https://github.com/paragonie/constant_time_encoding.git", - "reference": "7c74c5d08761ead7b5e89d07c854bc28eb0b2186" + "reference": "eccf915f45f911bfb189d1d1638d940ec6ee6e33" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/7c74c5d08761ead7b5e89d07c854bc28eb0b2186", - "reference": "7c74c5d08761ead7b5e89d07c854bc28eb0b2186", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/eccf915f45f911bfb189d1d1638d940ec6ee6e33", + "reference": "eccf915f45f911bfb189d1d1638d940ec6ee6e33", "shasum": "" }, "require": { "php": "^7" }, "require-dev": { - "phpunit/phpunit": "^6", - "vimeo/psalm": "^0.3|^1" + "phpunit/phpunit": "^6|^7", + "vimeo/psalm": "^1" }, "type": "library", "autoload": { @@ -1997,7 +2009,7 @@ "hex2bin", "rfc4648" ], - "time": "2018-01-23T00:54:57+00:00" + "time": "2018-03-10T19:47:49+00:00" }, { "name": "paragonie/random_compat", @@ -2419,16 +2431,16 @@ }, { "name": "psr/simple-cache", - "version": "1.0.0", + "version": "1.0.1", "source": { "type": "git", "url": "https://github.com/php-fig/simple-cache.git", - "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24" + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/753fa598e8f3b9966c886fe13f370baa45ef0e24", - "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24", + "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", + "reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b", "shasum": "" }, "require": { @@ -2463,7 +2475,7 @@ "psr-16", "simple-cache" ], - "time": "2017-01-02T13:31:39+00:00" + "time": "2017-10-23T01:57:42+00:00" }, { "name": "ramsey/uuid", @@ -2723,21 +2735,20 @@ }, { "name": "symfony/console", - "version": "v3.4.5", + "version": "v4.0.6", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "067339e9b8ec30d5f19f5950208893ff026b94f7" + "reference": "555c8dbe0ae9e561740451eabdbed2cc554b6a51" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/067339e9b8ec30d5f19f5950208893ff026b94f7", - "reference": "067339e9b8ec30d5f19f5950208893ff026b94f7", + "url": "https://api.github.com/repos/symfony/console/zipball/555c8dbe0ae9e561740451eabdbed2cc554b6a51", + "reference": "555c8dbe0ae9e561740451eabdbed2cc554b6a51", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/debug": "~2.8|~3.0|~4.0", + "php": "^7.1.3", "symfony/polyfill-mbstring": "~1.0" }, "conflict": { @@ -2746,11 +2757,11 @@ }, "require-dev": { "psr/log": "~1.0", - "symfony/config": "~3.3|~4.0", + "symfony/config": "~3.4|~4.0", "symfony/dependency-injection": "~3.4|~4.0", - "symfony/event-dispatcher": "~2.8|~3.0|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", "symfony/lock": "~3.4|~4.0", - "symfony/process": "~3.3|~4.0" + "symfony/process": "~3.4|~4.0" }, "suggest": { "psr/log": "For using the console logger", @@ -2761,7 +2772,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -2788,11 +2799,11 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2018-02-26T15:46:28+00:00" + "time": "2018-02-26T15:55:47+00:00" }, { "name": "symfony/css-selector", - "version": "v4.0.5", + "version": "v4.0.6", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", @@ -2845,32 +2856,32 @@ }, { "name": "symfony/debug", - "version": "v3.4.5", + "version": "v4.0.6", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "9b1071f86e79e1999b3d3675d2e0e7684268b9bc" + "reference": "1721e4e7effb23480966690cdcdc7d2a4152d489" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/9b1071f86e79e1999b3d3675d2e0e7684268b9bc", - "reference": "9b1071f86e79e1999b3d3675d2e0e7684268b9bc", + "url": "https://api.github.com/repos/symfony/debug/zipball/1721e4e7effb23480966690cdcdc7d2a4152d489", + "reference": "1721e4e7effb23480966690cdcdc7d2a4152d489", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", + "php": "^7.1.3", "psr/log": "~1.0" }, "conflict": { - "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" + "symfony/http-kernel": "<3.4" }, "require-dev": { - "symfony/http-kernel": "~2.8|~3.0|~4.0" + "symfony/http-kernel": "~3.4|~4.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -2897,11 +2908,11 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2018-02-28T21:49:22+00:00" + "time": "2018-02-28T21:50:02+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v4.0.5", + "version": "v4.0.6", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", @@ -2964,25 +2975,25 @@ }, { "name": "symfony/finder", - "version": "v3.4.5", + "version": "v4.0.6", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "6a615613745cef820d807443f32076bb9f5d0a38" + "reference": "44a796d2ecc2a16a5fc8f2956a34ee617934d55f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/6a615613745cef820d807443f32076bb9f5d0a38", - "reference": "6a615613745cef820d807443f32076bb9f5d0a38", + "url": "https://api.github.com/repos/symfony/finder/zipball/44a796d2ecc2a16a5fc8f2956a34ee617934d55f", + "reference": "44a796d2ecc2a16a5fc8f2956a34ee617934d55f", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^7.1.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -3009,34 +3020,33 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "time": "2018-02-11T17:15:12+00:00" + "time": "2018-03-05T18:28:26+00:00" }, { "name": "symfony/http-foundation", - "version": "v3.4.5", + "version": "v4.0.6", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "6f5935723c11b4125fc9927db6ad2feaa196e175" + "reference": "6c181e81a3a9a7996c62ebd7803592536e729c5a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/6f5935723c11b4125fc9927db6ad2feaa196e175", - "reference": "6f5935723c11b4125fc9927db6ad2feaa196e175", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/6c181e81a3a9a7996c62ebd7803592536e729c5a", + "reference": "6c181e81a3a9a7996c62ebd7803592536e729c5a", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/polyfill-mbstring": "~1.1", - "symfony/polyfill-php70": "~1.6" + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.1" }, "require-dev": { - "symfony/expression-language": "~2.8|~3.0|~4.0" + "symfony/expression-language": "~3.4|~4.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -3063,33 +3073,33 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2018-02-22T10:48:49+00:00" + "time": "2018-03-05T16:01:10+00:00" }, { "name": "symfony/http-kernel", - "version": "v3.4.5", + "version": "v4.0.6", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "494f950becf513c174f52f9010cedb9026c12a92" + "reference": "2a1ebfe8c37240500befcb17bceb3893adacffa3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/494f950becf513c174f52f9010cedb9026c12a92", - "reference": "494f950becf513c174f52f9010cedb9026c12a92", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/2a1ebfe8c37240500befcb17bceb3893adacffa3", + "reference": "2a1ebfe8c37240500befcb17bceb3893adacffa3", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", + "php": "^7.1.3", "psr/log": "~1.0", - "symfony/debug": "~2.8|~3.0|~4.0", - "symfony/event-dispatcher": "~2.8|~3.0|~4.0", - "symfony/http-foundation": "^3.4.4|^4.0.4" + "symfony/debug": "~3.4|~4.0", + "symfony/event-dispatcher": "~3.4|~4.0", + "symfony/http-foundation": "~3.4.4|~4.0.4" }, "conflict": { - "symfony/config": "<2.8", + "symfony/config": "<3.4", "symfony/dependency-injection": "<3.4.5|<4.0.5,>=4", - "symfony/var-dumper": "<3.3", + "symfony/var-dumper": "<3.4", "twig/twig": "<1.34|<2.4,>=2" }, "provide": { @@ -3097,34 +3107,32 @@ }, "require-dev": { "psr/cache": "~1.0", - "symfony/browser-kit": "~2.8|~3.0|~4.0", - "symfony/class-loader": "~2.8|~3.0", - "symfony/config": "~2.8|~3.0|~4.0", - "symfony/console": "~2.8|~3.0|~4.0", - "symfony/css-selector": "~2.8|~3.0|~4.0", + "symfony/browser-kit": "~3.4|~4.0", + "symfony/config": "~3.4|~4.0", + "symfony/console": "~3.4|~4.0", + "symfony/css-selector": "~3.4|~4.0", "symfony/dependency-injection": "^3.4.5|^4.0.5", - "symfony/dom-crawler": "~2.8|~3.0|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/finder": "~2.8|~3.0|~4.0", - "symfony/process": "~2.8|~3.0|~4.0", + "symfony/dom-crawler": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/finder": "~3.4|~4.0", + "symfony/process": "~3.4|~4.0", "symfony/routing": "~3.4|~4.0", - "symfony/stopwatch": "~2.8|~3.0|~4.0", - "symfony/templating": "~2.8|~3.0|~4.0", - "symfony/translation": "~2.8|~3.0|~4.0", - "symfony/var-dumper": "~3.3|~4.0" + "symfony/stopwatch": "~3.4|~4.0", + "symfony/templating": "~3.4|~4.0", + "symfony/translation": "~3.4|~4.0", + "symfony/var-dumper": "~3.4|~4.0" }, "suggest": { "symfony/browser-kit": "", "symfony/config": "", "symfony/console": "", "symfony/dependency-injection": "", - "symfony/finder": "", "symfony/var-dumper": "" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -3151,7 +3159,7 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2018-03-01T19:23:56+00:00" + "time": "2018-03-05T22:27:01+00:00" }, { "name": "symfony/polyfill-mbstring", @@ -3269,21 +3277,20 @@ "time": "2018-01-30T19:27:44+00:00" }, { - "name": "symfony/polyfill-php70", + "name": "symfony/polyfill-php72", "version": "v1.7.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php70.git", - "reference": "3532bfcd8f933a7816f3a0a59682fc404776600f" + "url": "https://github.com/symfony/polyfill-php72.git", + "reference": "8eca20c8a369e069d4f4c2ac9895144112867422" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php70/zipball/3532bfcd8f933a7816f3a0a59682fc404776600f", - "reference": "3532bfcd8f933a7816f3a0a59682fc404776600f", + "url": "https://api.github.com/repos/symfony/polyfill-php72/zipball/8eca20c8a369e069d4f4c2ac9895144112867422", + "reference": "8eca20c8a369e069d4f4c2ac9895144112867422", "shasum": "" }, "require": { - "paragonie/random_compat": "~1.0|~2.0", "php": ">=5.3.3" }, "type": "library", @@ -3294,13 +3301,10 @@ }, "autoload": { "psr-4": { - "Symfony\\Polyfill\\Php70\\": "" + "Symfony\\Polyfill\\Php72\\": "" }, "files": [ "bootstrap.php" - ], - "classmap": [ - "Resources/stubs" ] }, "notification-url": "https://packagist.org/downloads/", @@ -3317,7 +3321,7 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 7.0+ features to lower PHP versions", + "description": "Symfony polyfill backporting some PHP 7.2+ features to lower PHP versions", "homepage": "https://symfony.com", "keywords": [ "compatibility", @@ -3325,7 +3329,7 @@ "portable", "shim" ], - "time": "2018-01-30T19:27:44+00:00" + "time": "2018-01-31T17:43:24+00:00" }, { "name": "symfony/polyfill-util", @@ -3381,25 +3385,25 @@ }, { "name": "symfony/process", - "version": "v3.4.5", + "version": "v4.0.6", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "cc4aea21f619116aaf1c58016a944e4821c8e8af" + "reference": "6ed08502a7c9559da8e60ea343bdbd19c3350b3e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/cc4aea21f619116aaf1c58016a944e4821c8e8af", - "reference": "cc4aea21f619116aaf1c58016a944e4821c8e8af", + "url": "https://api.github.com/repos/symfony/process/zipball/6ed08502a7c9559da8e60ea343bdbd19c3350b3e", + "reference": "6ed08502a7c9559da8e60ea343bdbd19c3350b3e", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^7.1.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -3426,7 +3430,7 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2018-02-12T17:55:00+00:00" + "time": "2018-02-19T12:18:43+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -3490,34 +3494,34 @@ }, { "name": "symfony/routing", - "version": "v3.4.5", + "version": "v4.0.6", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "8773a9d52715f1a579576ce0e60213de34f5ef3e" + "reference": "9c6268c1970c7e507bedc8946bece32a7db23515" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/8773a9d52715f1a579576ce0e60213de34f5ef3e", - "reference": "8773a9d52715f1a579576ce0e60213de34f5ef3e", + "url": "https://api.github.com/repos/symfony/routing/zipball/9c6268c1970c7e507bedc8946bece32a7db23515", + "reference": "9c6268c1970c7e507bedc8946bece32a7db23515", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8" + "php": "^7.1.3" }, "conflict": { - "symfony/config": "<2.8", - "symfony/dependency-injection": "<3.3", + "symfony/config": "<3.4", + "symfony/dependency-injection": "<3.4", "symfony/yaml": "<3.4" }, "require-dev": { "doctrine/annotations": "~1.0", "doctrine/common": "~2.2", "psr/log": "~1.0", - "symfony/config": "~2.8|~3.0|~4.0", - "symfony/dependency-injection": "~3.3|~4.0", - "symfony/expression-language": "~2.8|~3.0|~4.0", - "symfony/http-foundation": "~2.8|~3.0|~4.0", + "symfony/config": "~3.4|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/expression-language": "~3.4|~4.0", + "symfony/http-foundation": "~3.4|~4.0", "symfony/yaml": "~3.4|~4.0" }, "suggest": { @@ -3531,7 +3535,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -3564,11 +3568,11 @@ "uri", "url" ], - "time": "2018-02-28T21:49:22+00:00" + "time": "2018-02-28T21:50:02+00:00" }, { "name": "symfony/translation", - "version": "v4.0.5", + "version": "v4.0.6", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", @@ -3636,21 +3640,22 @@ }, { "name": "symfony/var-dumper", - "version": "v3.4.5", + "version": "v4.0.6", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "80964679d81da3d5618519e0e4be488c3d7ecd7d" + "reference": "c7d89044ed6ed3b7d8b558d509cca0666b947e58" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/80964679d81da3d5618519e0e4be488c3d7ecd7d", - "reference": "80964679d81da3d5618519e0e4be488c3d7ecd7d", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/c7d89044ed6ed3b7d8b558d509cca0666b947e58", + "reference": "c7d89044ed6ed3b7d8b558d509cca0666b947e58", "shasum": "" }, "require": { - "php": "^5.5.9|>=7.0.8", - "symfony/polyfill-mbstring": "~1.0" + "php": "^7.1.3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php72": "~1.5" }, "conflict": { "phpunit/phpunit": "<4.8.35|<5.4.3,>=5.0" @@ -3661,13 +3666,12 @@ }, "suggest": { "ext-iconv": "To convert non-UTF-8 strings to UTF-8 (or symfony/polyfill-iconv in case ext-iconv cannot be used).", - "ext-intl": "To show region name in time zone dump", - "ext-symfony_debug": "" + "ext-intl": "To show region name in time zone dump" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.4-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -3701,7 +3705,7 @@ "debug", "dump" ], - "time": "2018-02-22T17:29:24+00:00" + "time": "2018-02-26T15:55:47+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", @@ -3752,16 +3756,16 @@ }, { "name": "twig/twig", - "version": "v1.35.2", + "version": "v1.35.3", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "9c24f2cd39dc1906b76879e099970b7e53724601" + "reference": "b48680b6eb7d16b5025b9bfc4108d86f6b8af86f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/9c24f2cd39dc1906b76879e099970b7e53724601", - "reference": "9c24f2cd39dc1906b76879e099970b7e53724601", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/b48680b6eb7d16b5025b9bfc4108d86f6b8af86f", + "reference": "b48680b6eb7d16b5025b9bfc4108d86f6b8af86f", "shasum": "" }, "require": { @@ -3769,8 +3773,8 @@ }, "require-dev": { "psr/container": "^1.0", - "symfony/debug": "~2.7", - "symfony/phpunit-bridge": "~3.3@dev" + "symfony/debug": "^2.7", + "symfony/phpunit-bridge": "^3.3" }, "type": "library", "extra": { @@ -3813,7 +3817,7 @@ "keywords": [ "templating" ], - "time": "2018-03-03T16:21:29+00:00" + "time": "2018-03-20T04:25:58+00:00" }, { "name": "vlucas/phpdotenv", @@ -3971,16 +3975,16 @@ "packages-dev": [ { "name": "barryvdh/laravel-debugbar", - "version": "v3.1.3", + "version": "v3.1.4", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "664fa434e26febf04d60df0368303cf0fe14f63a" + "reference": "7a91480cc6e597caed5117a3c5d685f06d35c5a1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/664fa434e26febf04d60df0368303cf0fe14f63a", - "reference": "664fa434e26febf04d60df0368303cf0fe14f63a", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/7a91480cc6e597caed5117a3c5d685f06d35c5a1", + "reference": "7a91480cc6e597caed5117a3c5d685f06d35c5a1", "shasum": "" }, "require": { @@ -4035,7 +4039,7 @@ "profiler", "webprofiler" ], - "time": "2018-02-25T13:31:58+00:00" + "time": "2018-03-06T08:35:31+00:00" }, { "name": "barryvdh/laravel-ide-helper", @@ -4945,40 +4949,40 @@ }, { "name": "phpunit/php-code-coverage", - "version": "5.3.0", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "661f34d0bd3f1a7225ef491a70a020ad23a057a1" + "reference": "f8ca4b604baf23dab89d87773c28cc07405189ba" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/661f34d0bd3f1a7225ef491a70a020ad23a057a1", - "reference": "661f34d0bd3f1a7225ef491a70a020ad23a057a1", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f8ca4b604baf23dab89d87773c28cc07405189ba", + "reference": "f8ca4b604baf23dab89d87773c28cc07405189ba", "shasum": "" }, "require": { "ext-dom": "*", "ext-xmlwriter": "*", - "php": "^7.0", + "php": "^7.1", "phpunit/php-file-iterator": "^1.4.2", "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^2.0.1", + "phpunit/php-token-stream": "^3.0", "sebastian/code-unit-reverse-lookup": "^1.0.1", "sebastian/environment": "^3.0", "sebastian/version": "^2.0.1", "theseer/tokenizer": "^1.1" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^7.0" }, "suggest": { - "ext-xdebug": "^2.5.5" + "ext-xdebug": "^2.6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "5.3.x-dev" + "dev-master": "6.0-dev" } }, "autoload": { @@ -5004,7 +5008,7 @@ "testing", "xunit" ], - "time": "2017-12-06T09:29:45+00:00" + "time": "2018-02-02T07:01:41+00:00" }, { "name": "phpunit/php-file-iterator", @@ -5096,28 +5100,28 @@ }, { "name": "phpunit/php-timer", - "version": "1.0.9", + "version": "2.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" + "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", - "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/8b8454ea6958c3dee38453d3bd571e023108c91f", + "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f", "shasum": "" }, "require": { - "php": "^5.3.3 || ^7.0" + "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" + "phpunit/phpunit": "^7.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -5132,7 +5136,7 @@ "authors": [ { "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", + "email": "sebastian@phpunit.de", "role": "lead" } ], @@ -5141,33 +5145,33 @@ "keywords": [ "timer" ], - "time": "2017-02-26T11:10:40+00:00" + "time": "2018-02-01T13:07:23+00:00" }, { "name": "phpunit/php-token-stream", - "version": "2.0.2", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "791198a2c6254db10131eecfe8c06670700904db" + "reference": "21ad88bbba7c3d93530d93994e0a33cd45f02ace" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/791198a2c6254db10131eecfe8c06670700904db", - "reference": "791198a2c6254db10131eecfe8c06670700904db", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/21ad88bbba7c3d93530d93994e0a33cd45f02ace", + "reference": "21ad88bbba7c3d93530d93994e0a33cd45f02ace", "shasum": "" }, "require": { "ext-tokenizer": "*", - "php": "^7.0" + "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "^6.2.4" + "phpunit/phpunit": "^7.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -5190,20 +5194,20 @@ "keywords": [ "tokenizer" ], - "time": "2017-11-27T05:48:46+00:00" + "time": "2018-02-01T13:16:43+00:00" }, { "name": "phpunit/phpunit", - "version": "6.5.7", + "version": "7.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "6bd77b57707c236833d2b57b968e403df060c9d9" + "reference": "536f4d853c12d8189963435088e8ff7c0daeab2e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/6bd77b57707c236833d2b57b968e403df060c9d9", - "reference": "6bd77b57707c236833d2b57b968e403df060c9d9", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/536f4d853c12d8189963435088e8ff7c0daeab2e", + "reference": "536f4d853c12d8189963435088e8ff7c0daeab2e", "shasum": "" }, "require": { @@ -5215,15 +5219,15 @@ "myclabs/deep-copy": "^1.6.1", "phar-io/manifest": "^1.0.1", "phar-io/version": "^1.0", - "php": "^7.0", + "php": "^7.1", "phpspec/prophecy": "^1.7", - "phpunit/php-code-coverage": "^5.3", + "phpunit/php-code-coverage": "^6.0.1", "phpunit/php-file-iterator": "^1.4.3", "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^1.0.9", - "phpunit/phpunit-mock-objects": "^5.0.5", + "phpunit/php-timer": "^2.0", + "phpunit/phpunit-mock-objects": "^6.0", "sebastian/comparator": "^2.1", - "sebastian/diff": "^2.0", + "sebastian/diff": "^3.0", "sebastian/environment": "^3.1", "sebastian/exporter": "^3.1", "sebastian/global-state": "^2.0", @@ -5231,16 +5235,12 @@ "sebastian/resource-operations": "^1.0", "sebastian/version": "^2.0.1" }, - "conflict": { - "phpdocumentor/reflection-docblock": "3.0.2", - "phpunit/dbunit": "<3.0" - }, "require-dev": { "ext-pdo": "*" }, "suggest": { "ext-xdebug": "*", - "phpunit/php-invoker": "^1.1" + "phpunit/php-invoker": "^2.0" }, "bin": [ "phpunit" @@ -5248,7 +5248,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "6.5.x-dev" + "dev-master": "7.0-dev" } }, "autoload": { @@ -5274,33 +5274,30 @@ "testing", "xunit" ], - "time": "2018-02-26T07:01:09+00:00" + "time": "2018-03-26T07:36:48+00:00" }, { "name": "phpunit/phpunit-mock-objects", - "version": "5.0.6", + "version": "6.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "33fd41a76e746b8fa96d00b49a23dadfa8334cdf" + "reference": "e3249dedc2d99259ccae6affbc2684eac37c2e53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/33fd41a76e746b8fa96d00b49a23dadfa8334cdf", - "reference": "33fd41a76e746b8fa96d00b49a23dadfa8334cdf", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/e3249dedc2d99259ccae6affbc2684eac37c2e53", + "reference": "e3249dedc2d99259ccae6affbc2684eac37c2e53", "shasum": "" }, "require": { "doctrine/instantiator": "^1.0.5", - "php": "^7.0", + "php": "^7.1", "phpunit/php-text-template": "^1.2.1", "sebastian/exporter": "^3.1" }, - "conflict": { - "phpunit/phpunit": "<6.0" - }, "require-dev": { - "phpunit/phpunit": "^6.5" + "phpunit/phpunit": "^7.0" }, "suggest": { "ext-soap": "*" @@ -5308,7 +5305,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "5.0.x-dev" + "dev-master": "6.0.x-dev" } }, "autoload": { @@ -5333,7 +5330,7 @@ "mock", "xunit" ], - "time": "2018-01-06T05:45:45+00:00" + "time": "2018-02-15T05:27:38+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -5446,28 +5443,29 @@ }, { "name": "sebastian/diff", - "version": "2.0.1", + "version": "3.0.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd" + "reference": "e09160918c66281713f1c324c1f4c4c3037ba1e8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", - "reference": "347c1d8b49c5c3ee30c7040ea6fc446790e6bddd", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/e09160918c66281713f1c324c1f4c4c3037ba1e8", + "reference": "e09160918c66281713f1c324c1f4c4c3037ba1e8", "shasum": "" }, "require": { - "php": "^7.0" + "php": "^7.1" }, "require-dev": { - "phpunit/phpunit": "^6.2" + "phpunit/phpunit": "^7.0", + "symfony/process": "^2 || ^3.3 || ^4" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -5492,9 +5490,12 @@ "description": "Diff implementation", "homepage": "https://github.com/sebastianbergmann/diff", "keywords": [ - "diff" + "diff", + "udiff", + "unidiff", + "unified diff" ], - "time": "2017-08-03T08:09:46+00:00" + "time": "2018-02-01T13:45:15+00:00" }, { "name": "sebastian/environment", @@ -5896,7 +5897,7 @@ }, { "name": "symfony/class-loader", - "version": "v3.4.5", + "version": "v3.4.6", "source": { "type": "git", "url": "https://github.com/symfony/class-loader.git", @@ -5952,7 +5953,7 @@ }, { "name": "symfony/config", - "version": "v4.0.5", + "version": "v4.0.6", "source": { "type": "git", "url": "https://github.com/symfony/config.git", @@ -6014,7 +6015,7 @@ }, { "name": "symfony/filesystem", - "version": "v4.0.5", + "version": "v4.0.6", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", @@ -6063,7 +6064,7 @@ }, { "name": "symfony/stopwatch", - "version": "v4.0.5", + "version": "v4.0.6", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", @@ -6112,7 +6113,7 @@ }, { "name": "symfony/yaml", - "version": "v4.0.5", + "version": "v4.0.6", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", @@ -6270,8 +6271,8 @@ "ext-curl": "*", "ext-gd": "*", "ext-intl": "*", - "ext-mbstring": "*", - "ext-zip": "*" + "ext-zip": "*", + "ext-xml": "*" }, "platform-dev": [] } diff --git a/config/csv.php b/config/csv.php index 3b72a48efd..32404f3738 100644 --- a/config/csv.php +++ b/config/csv.php @@ -174,6 +174,24 @@ return [ 'converter' => 'Date', 'field' => 'date-process', ], + 'date-due' => [ + 'mappable' => false, + 'pre-process-map' => false, + 'converter' => 'Date', + 'field' => 'date-due', + ], + 'date-payment' => [ + 'mappable' => false, + 'pre-process-map' => false, + 'converter' => 'Date', + 'field' => 'date-payment', + ], + 'date-invoice' => [ + 'mappable' => false, + 'pre-process-map' => false, + 'converter' => 'Date', + 'field' => 'date-invoice', + ], 'budget-id' => [ 'mappable' => true, 'pre-process-map' => false, @@ -266,6 +284,12 @@ return [ 'converter' => 'AccountId', 'mapper' => 'OpposingAccounts', ], + 'opposing-bic' => [ + 'mappable' => false, + 'pre-process-map' => false, + 'field' => 'opposing-account-bic', + 'converter' => 'AccountBic', + ], 'opposing-name' => [ 'mappable' => true, 'pre-process-map' => false, @@ -311,23 +335,62 @@ return [ 'converter' => 'Amount', 'field' => 'amount_foreign', ], + + // SEPA end to end ID 'sepa-ct-id' => [ 'mappable' => false, 'pre-process-map' => false, 'converter' => 'Description', - 'field' => 'description', + 'field' => 'sepa_ct_id', ], + // SEPA opposing account identifier 'sepa-ct-op' => [ 'mappable' => false, 'pre-process-map' => false, 'converter' => 'Description', - 'field' => 'description', + 'field' => 'sepa_ct_op', ], + // SEPA Direct Debit Mandate Identifier 'sepa-db' => [ 'mappable' => false, 'pre-process-map' => false, 'converter' => 'Description', - 'field' => 'description', + 'field' => 'sepa_db', + ], + // SEPA clearing code + 'sepa-cc' => [ + 'mappable' => false, + 'pre-process-map' => false, + 'converter' => 'Description', + 'field' => 'sepa_cc', + ], + // SEPA country + 'sepa-country' => [ + 'mappable' => false, + 'pre-process-map' => false, + 'converter' => 'Description', + 'field' => 'sepa_country', + ], + // SEPA external purpose + 'sepa-ep' => [ + 'mappable' => false, + 'pre-process-map' => false, + 'converter' => 'Description', + 'field' => 'sepa_ep', + ], + // SEPA creditor identifier + 'sepa-ci' => [ + 'mappable' => false, + 'pre-process-map' => false, + 'converter' => 'Description', + 'field' => 'sepa_ci', + ], + // Internal reference + 'internal-reference' => [ + 'mappable' => false, + 'pre-process-map' => false, + 'converter' => 'Description', + 'field' => 'internal_reference', ], ], diff --git a/config/firefly.php b/config/firefly.php index 7e2a1a94ee..1b0a7639b7 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -32,9 +32,10 @@ return [ 'single_user_mode' => true, 'is_demo_site' => false, ], - 'encryption' => (is_null(env('USE_ENCRYPTION')) || env('USE_ENCRYPTION') === true), - 'version' => '4.7.1.4', + 'encryption' => null === env('USE_ENCRYPTION') || env('USE_ENCRYPTION') === true, + 'version' => '4.7.2', 'api_version' => '0.1', + 'db_version' => 2, 'maxUploadSize' => 15242880, 'allowedMimes' => [ /* plain files */ @@ -102,9 +103,6 @@ return [ 'export_formats' => [ 'csv' => 'FireflyIII\Export\Exporter\CsvExporter', ], - 'bunq' => [ - 'server' => 'https://sandbox.public.api.bunq.com', - ], 'spectre' => [ 'server' => 'https://www.saltedge.com', ], @@ -180,6 +178,7 @@ return [ 'de_DE' => ['name_locale' => 'Deutsch', 'name_english' => 'German'], 'fr_FR' => ['name_locale' => 'Français', 'name_english' => 'French'], 'id_ID' => ['name_locale' => 'Bahasa Indonesia', 'name_english' => 'Indonesian'], + 'it_IT' => ['name_locale' => 'Italiano', 'name_english' => 'Italian'], 'nl_NL' => ['name_locale' => 'Nederlands', 'name_english' => 'Dutch'], 'pl_PL' => ['name_locale' => 'Polski', 'name_english' => 'Polish '], 'pt_BR' => ['name_locale' => 'Português do Brasil', 'name_english' => 'Portuguese (Brazil)'], diff --git a/config/hashing.php b/config/hashing.php new file mode 100644 index 0000000000..77a4458077 --- /dev/null +++ b/config/hashing.php @@ -0,0 +1,21 @@ + 'bcrypt', + +]; diff --git a/config/import.php b/config/import.php index 003d0ac062..e078a78ea1 100644 --- a/config/import.php +++ b/config/import.php @@ -24,7 +24,7 @@ declare(strict_types=1); return [ 'enabled' => [ 'file' => true, - 'bunq' => false, + 'bunq' => true, 'spectre' => true, 'plaid' => false, ], @@ -52,10 +52,14 @@ return [ 'file' => [ 'import_formats' => ['csv'], // mt940 'default_import_format' => 'csv', - 'processors' => [ + 'processors' => [ 'csv' => 'FireflyIII\Import\FileProcessor\CsvProcessor', ], ], + 'bunq' => [ + 'server' => 'api.bunq.com', + 'version' => 'v1', + ], ], 'default_config' => [ 'file' => [ diff --git a/config/logging.php b/config/logging.php new file mode 100644 index 0000000000..ca24db1b5e --- /dev/null +++ b/config/logging.php @@ -0,0 +1,97 @@ +. + */ + +declare(strict_types=1); + +return [ + + /* + |-------------------------------------------------------------------------- + | Default Log Channel + |-------------------------------------------------------------------------- + | + | This option defines the default log channel that gets used when writing + | messages to the logs. The name specified in this option should match + | one of the channels defined in the "channels" configuration array. + | + */ + + 'default' => env('LOG_CHANNEL', 'daily'), + + /* + |-------------------------------------------------------------------------- + | Log Channels + |-------------------------------------------------------------------------- + | + | Here you may configure the log channels for your application. Out of + | the box, Laravel uses the Monolog PHP logging library. This gives + | you a variety of powerful log handlers / formatters to utilize. + | + | Available Drivers: "single", "daily", "slack", "syslog", + | "errorlog", "custom", "stack" + | + */ + + 'channels' => [ + 'stack' => [ + 'driver' => 'stack', + 'channels' => ['single'], + ], + + 'single' => [ + 'driver' => 'single', + 'path' => storage_path('logs/laravel.log'), + 'level' => 'debug', + ], + + 'daily' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/ff3-' . PHP_SAPI . '.log'), + 'level' => env('APP_LOG_LEVEL', 'info'), + 'days' => 7, + ], + 'dailytest' => [ + 'driver' => 'daily', + 'path' => storage_path('logs/test-ff3-' . PHP_SAPI . '.log'), + 'level' => env('APP_LOG_LEVEL', 'info'), + 'days' => 7, + ], + + 'slack' => [ + 'driver' => 'slack', + 'url' => env('LOG_SLACK_WEBHOOK_URL'), + 'username' => 'Laravel Log', + 'emoji' => ':boom:', + 'level' => 'critical', + ], + + 'syslog' => [ + 'driver' => 'syslog', + 'level' => env('APP_LOG_LEVEL', 'info'), + ], + + 'errorlog' => [ + 'driver' => 'errorlog', + 'level' => env('APP_LOG_LEVEL', 'info'), + ], + ], + +]; diff --git a/config/mail.php b/config/mail.php index 642a58be96..fb87f15799 100644 --- a/config/mail.php +++ b/config/mail.php @@ -38,7 +38,7 @@ return [ | */ - 'driver' => env('MAIL_DRIVER', 'smtp'), + 'driver' => env('MAIL_DRIVER', 'log'), /* |-------------------------------------------------------------------------- diff --git a/config/twigbridge.php b/config/twigbridge.php index 5d7467be5b..2433a298c2 100644 --- a/config/twigbridge.php +++ b/config/twigbridge.php @@ -176,7 +176,7 @@ return [ 'is_safe' => [ 'date', 'text', 'select', 'balance', 'optionsList', 'checkbox', 'amount', 'tags', 'integer', 'textarea', 'location', 'multiRadio', 'file', 'multiCheckbox', 'staticText', 'amountSmall', 'password', 'nonSelectableBalance', 'nonSelectableAmount', - 'number', + 'number', 'assetAccountList', ], ], 'Form' => [ diff --git a/crowdin.yml b/crowdin.yml index c4313cfa93..96738fb211 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -126,4 +126,4 @@ files: [ # # "scheme" : "", } -] \ No newline at end of file +] diff --git a/database/factories/ModelFactory.php b/database/factories/ModelFactory.php index 923658054f..bcd5edae50 100644 --- a/database/factories/ModelFactory.php +++ b/database/factories/ModelFactory.php @@ -118,17 +118,17 @@ $factory->define( FireflyIII\Models\Bill::class, function (Faker\Generator $faker) { return [ - 'created_at' => new Carbon, - 'updated_at' => new Carbon, - 'user_id' => 1, - 'name' => $faker->words(3, true), - 'match' => $faker->words(3, true), - 'amount_min' => '100.00', - 'amount_max' => '100.00', - 'date' => '2017-01-01', - 'repeat_freq' => 'monthly', - 'skip' => 0, - 'automatch' => 1 + 'created_at' => new Carbon, + 'updated_at' => new Carbon, + 'user_id' => 1, + 'name' => $faker->words(3, true), + 'match' => $faker->words(3, true), + 'amount_min' => '100.00', + 'amount_max' => '100.00', + 'date' => '2017-01-01', + 'repeat_freq' => 'monthly', + 'skip' => 0, + 'automatch' => 1, ]; } ); diff --git a/database/migrations/2018_01_01_000001_create_oauth_auth_codes_table.php b/database/migrations/2018_01_01_000001_create_oauth_auth_codes_table.php index 3562b28bca..9ea338668d 100644 --- a/database/migrations/2018_01_01_000001_create_oauth_auth_codes_table.php +++ b/database/migrations/2018_01_01_000001_create_oauth_auth_codes_table.php @@ -1,9 +1,7 @@ . */ -use Illuminate\Support\Facades\Schema; -use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; +use Illuminate\Database\Schema\Blueprint; +use Illuminate\Support\Facades\Schema; /** * Class CreateOauthAuthCodesTable */ class CreateOauthAuthCodesTable extends Migration { + /** + * Reverse the migrations. + */ + public function down() + { + Schema::drop('oauth_auth_codes'); + } + /** * Run the migrations. - * - * @return void */ public function up() { - Schema::create('oauth_auth_codes', function (Blueprint $table) { + Schema::create( + 'oauth_auth_codes', function (Blueprint $table) { $table->string('id', 100)->primary(); $table->integer('user_id'); $table->integer('client_id'); $table->text('scopes')->nullable(); $table->boolean('revoked'); $table->dateTime('expires_at')->nullable(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::drop('oauth_auth_codes'); + } + ); } } diff --git a/database/migrations/2018_01_01_000002_create_oauth_access_tokens_table.php b/database/migrations/2018_01_01_000002_create_oauth_access_tokens_table.php index 4fa3229a52..4c9574d3e8 100644 --- a/database/migrations/2018_01_01_000002_create_oauth_access_tokens_table.php +++ b/database/migrations/2018_01_01_000002_create_oauth_access_tokens_table.php @@ -1,9 +1,7 @@ . */ -use Illuminate\Support\Facades\Schema; -use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; +use Illuminate\Database\Schema\Blueprint; +use Illuminate\Support\Facades\Schema; /** * Class CreateOauthAccessTokensTable */ class CreateOauthAccessTokensTable extends Migration { + /** + * Reverse the migrations. + */ + public function down() + { + Schema::drop('oauth_access_tokens'); + } + /** * Run the migrations. - * - * @return void */ public function up() { - Schema::create('oauth_access_tokens', function (Blueprint $table) { + Schema::create( + 'oauth_access_tokens', function (Blueprint $table) { $table->string('id', 100)->primary(); $table->integer('user_id')->index()->nullable(); $table->integer('client_id'); @@ -48,16 +53,7 @@ class CreateOauthAccessTokensTable extends Migration $table->boolean('revoked'); $table->timestamps(); $table->dateTime('expires_at')->nullable(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::drop('oauth_access_tokens'); + } + ); } } diff --git a/database/migrations/2018_01_01_000003_create_oauth_refresh_tokens_table.php b/database/migrations/2018_01_01_000003_create_oauth_refresh_tokens_table.php index eb739dc23c..db3a09a15e 100644 --- a/database/migrations/2018_01_01_000003_create_oauth_refresh_tokens_table.php +++ b/database/migrations/2018_01_01_000003_create_oauth_refresh_tokens_table.php @@ -1,9 +1,7 @@ . */ -use Illuminate\Support\Facades\Schema; -use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; +use Illuminate\Database\Schema\Blueprint; +use Illuminate\Support\Facades\Schema; /** * Class CreateOauthRefreshTokensTable */ class CreateOauthRefreshTokensTable extends Migration { - /** - * Run the migrations. - * - * @return void - */ - public function up() - { - Schema::create('oauth_refresh_tokens', function (Blueprint $table) { - $table->string('id', 100)->primary(); - $table->string('access_token_id', 100)->index(); - $table->boolean('revoked'); - $table->dateTime('expires_at')->nullable(); - }); - } - /** * Reverse the migrations. - * - * @return void */ public function down() { Schema::drop('oauth_refresh_tokens'); } + + /** + * Run the migrations. + */ + public function up() + { + Schema::create( + 'oauth_refresh_tokens', function (Blueprint $table) { + $table->string('id', 100)->primary(); + $table->string('access_token_id', 100)->index(); + $table->boolean('revoked'); + $table->dateTime('expires_at')->nullable(); + } + ); + } } diff --git a/database/migrations/2018_01_01_000004_create_oauth_clients_table.php b/database/migrations/2018_01_01_000004_create_oauth_clients_table.php index 3d7cd186cd..7a93146474 100644 --- a/database/migrations/2018_01_01_000004_create_oauth_clients_table.php +++ b/database/migrations/2018_01_01_000004_create_oauth_clients_table.php @@ -1,9 +1,7 @@ . */ -use Illuminate\Support\Facades\Schema; -use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; +use Illuminate\Database\Schema\Blueprint; +use Illuminate\Support\Facades\Schema; /** * Class CreateOauthClientsTable */ class CreateOauthClientsTable extends Migration { + /** + * Reverse the migrations. + */ + public function down() + { + Schema::drop('oauth_clients'); + } + /** * Run the migrations. - * - * @return void */ public function up() { - Schema::create('oauth_clients', function (Blueprint $table) { + Schema::create( + 'oauth_clients', function (Blueprint $table) { $table->increments('id'); $table->integer('user_id')->index()->nullable(); $table->string('name'); @@ -49,16 +54,7 @@ class CreateOauthClientsTable extends Migration $table->boolean('password_client'); $table->boolean('revoked'); $table->timestamps(); - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::drop('oauth_clients'); + } + ); } } diff --git a/database/migrations/2018_01_01_000005_create_oauth_personal_access_clients_table.php b/database/migrations/2018_01_01_000005_create_oauth_personal_access_clients_table.php index c1191fbad5..9ec29ce525 100644 --- a/database/migrations/2018_01_01_000005_create_oauth_personal_access_clients_table.php +++ b/database/migrations/2018_01_01_000005_create_oauth_personal_access_clients_table.php @@ -1,9 +1,7 @@ . */ -use Illuminate\Support\Facades\Schema; -use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; +use Illuminate\Database\Schema\Blueprint; +use Illuminate\Support\Facades\Schema; /** * Class CreateOauthPersonalAccessClientsTable */ class CreateOauthPersonalAccessClientsTable extends Migration { - /** - * Run the migrations. - * - * @return void - */ - public function up() - { - Schema::create('oauth_personal_access_clients', function (Blueprint $table) { - $table->increments('id'); - $table->integer('client_id')->index(); - $table->timestamps(); - }); - } - /** * Reverse the migrations. - * - * @return void */ public function down() { Schema::drop('oauth_personal_access_clients'); } + + /** + * Run the migrations. + */ + public function up() + { + Schema::create( + 'oauth_personal_access_clients', function (Blueprint $table) { + $table->increments('id'); + $table->integer('client_id')->index(); + $table->timestamps(); + } + ); + } } diff --git a/database/migrations/2018_03_19_141348_changes_for_v472.php b/database/migrations/2018_03_19_141348_changes_for_v472.php new file mode 100644 index 0000000000..0960d6e381 --- /dev/null +++ b/database/migrations/2018_03_19_141348_changes_for_v472.php @@ -0,0 +1,43 @@ +dropColumn('notes'); + } + ); + + Schema::table( + 'budgets', + function (Blueprint $table) { + $table->mediumInteger('order', false, true)->default(0); + } + ); + } +} diff --git a/database/seeds/ConfigSeeder.php b/database/seeds/ConfigSeeder.php new file mode 100644 index 0000000000..73a3955c03 --- /dev/null +++ b/database/seeds/ConfigSeeder.php @@ -0,0 +1,35 @@ +first(); + if (is_null($entry)) { + Log::warning('No database version entry is present. Database is assumed to be OLD (version 1).'); + // FF old or no version present. Put at 1: + Configuration::create( + [ + 'name' => 'db_version', + 'data' => 1, + ] + ); + } + if (!is_null($entry)) { + $version = intval(config('firefly.db_version')); + $entry->data = $version; + $entry->save(); + + Log::warning(sprintf('Database entry exists. Update to latest version (%d)', $version)); + } + } +} diff --git a/database/seeds/DatabaseSeeder.php b/database/seeds/DatabaseSeeder.php index de5a134985..32cdf152a5 100644 --- a/database/seeds/DatabaseSeeder.php +++ b/database/seeds/DatabaseSeeder.php @@ -37,5 +37,6 @@ class DatabaseSeeder extends Seeder $this->call(TransactionTypeSeeder::class); $this->call(PermissionSeeder::class); $this->call(LinkTypeSeeder::class); + $this->call(ConfigSeeder::class); } } diff --git a/database/seeds/LinkTypeSeeder.php b/database/seeds/LinkTypeSeeder.php index 56fe78d7e8..9528a46fb7 100644 --- a/database/seeds/LinkTypeSeeder.php +++ b/database/seeds/LinkTypeSeeder.php @@ -65,6 +65,5 @@ class LinkTypeSeeder extends Seeder Log::warning(sprintf('Could not create link type "%s". It might exist already.', $type['name'])); } } - } } diff --git a/database/seeds/PermissionSeeder.php b/database/seeds/PermissionSeeder.php index 2b8e1c202d..445251b585 100644 --- a/database/seeds/PermissionSeeder.php +++ b/database/seeds/PermissionSeeder.php @@ -49,6 +49,5 @@ class PermissionSeeder extends Seeder Log::warning(sprintf('Could not create role "%s". It might exist already.', $role['display_name'])); } } - } } diff --git a/database/seeds/TransactionTypeSeeder.php b/database/seeds/TransactionTypeSeeder.php index 809e5260cb..879e29733e 100644 --- a/database/seeds/TransactionTypeSeeder.php +++ b/database/seeds/TransactionTypeSeeder.php @@ -45,6 +45,5 @@ class TransactionTypeSeeder extends Seeder Log::warning(sprintf('Could not create transaction type "%s". It might exist already.', $type)); } } - } } diff --git a/docker-compose.yml b/docker-compose.yml index 80ead689d7..3363a4094d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,7 @@ --- +networks: + firefly_iii_net: + driver: bridge services: firefly_iii_app: environment: @@ -11,6 +14,8 @@ services: image: jc5x/firefly-iii links: - firefly_iii_db + networks: + - firefly_iii_net ports: - "80:80" volumes: @@ -29,6 +34,8 @@ services: - MYSQL_PASSWORD=firefly_db_secret - MYSQL_RANDOM_ROOT_PASSWORD=yes image: "mysql:latest" + networks: + - firefly_iii_net volumes: - "firefly_iii_db:/var/lib/mysql" version: "3.2" diff --git a/index.php b/index.php index 811130c7c4..d588e4711a 100644 --- a/index.php +++ b/index.php @@ -1,4 +1,5 @@ . */ -declare(strict_types=1); - echo '
@@ -51,4 +50,4 @@ Please 0) { link.attr('href', 'budgets/show/' + id + '/' + data.limit); } + + // update the warning if relevant: + if (data.large_diff === true) { + $('span[class$="budget_warning"][data-id="' + id + '"]').html(data.warn_text).show(); + console.log('Show warning for budget'); + } else { + $('span[class$="budget_warning"][data-id="' + id + '"]').empty().hide(); + } }); } diff --git a/public/js/ff/budgets/show.js b/public/js/ff/budgets/show.js index 75ac5ade1b..07c18bd6be 100644 --- a/public/js/ff/budgets/show.js +++ b/public/js/ff/budgets/show.js @@ -30,9 +30,10 @@ $(function () { } // other three charts: - pieChart(expenseCategoryUri, 'budget-cat-out'); - pieChart(expenseAssetUri, 'budget-asset-out'); - pieChart(expenseExpenseUri, 'budget-expense-out'); - + if (budgetLimitID > 0) { + pieChart(expenseCategoryUri, 'budget-cat-out'); + pieChart(expenseAssetUri, 'budget-asset-out'); + pieChart(expenseExpenseUri, 'budget-expense-out'); + } }); diff --git a/public/js/ff/charts.js b/public/js/ff/charts.js index bec7c03c18..67e4805c53 100644 --- a/public/js/ff/charts.js +++ b/public/js/ff/charts.js @@ -58,49 +58,6 @@ Chart.defaults.global.animation.duration = 0; Chart.defaults.global.responsive = true; Chart.defaults.global.maintainAspectRatio = false; - -/** - * Chart line thing - */ -const verticalLinePlugin = { - getLinePosition: function (chart, pointIndex) { - const meta = chart.getDatasetMeta(0); // first dataset is used to discover X coordinate of a point - const data = meta.data; - return data[pointIndex]._model.x; - }, - renderVerticalLine: function (chartInstance, pointIndex) { - const lineLeftOffset = this.getLinePosition(chartInstance, pointIndex); - const scale = chartInstance.scales['y-axis-0']; - const context = chartInstance.chart.ctx; - - // render vertical line - context.beginPath(); - context.strokeStyle = fillColors[3]; - context.moveTo(lineLeftOffset, scale.top); - context.lineTo(lineLeftOffset, scale.bottom); - context.stroke(); - - // write label - context.fillStyle = "#444444"; - context.textAlign = 'left'; - if(pointIndex > 23) { - todayText = todayText + ' '; - context.textAlign = 'right'; - } - context.fillText(todayText, lineLeftOffset, scale.top * 3); // (scale.bottom - scale.top) / 2 + scale.top - }, - - afterDatasetsDraw: function (chart, easing) { - if (chart.config.lineAtIndex) { - chart.config.lineAtIndex.forEach(function(pointIndex) { - this.renderVerticalLine(chart, pointIndex); - }, this); - } - } -}; - -Chart.plugins.register(verticalLinePlugin); - /** * * @param data @@ -132,16 +89,7 @@ function lineChart(URI, container) { var options = $.extend(true, {}, defaultChartOptions); var chartType = 'line'; - drawAChart(URI, container, chartType, options, colorData, -1); -} - -function lineChartWithDay(URI, container, today) { - "use strict"; - var colorData = true; - var options = $.extend(true, {}, defaultChartOptions); - var chartType = 'line'; - - drawAChart(URI, container, chartType, options, colorData, today); + drawAChart(URI, container, chartType, options, colorData); } /** @@ -302,7 +250,7 @@ function pieChart(URI, container) { * @param colorData * @param today */ -function drawAChart(URI, container, chartType, options, colorData, today) { +function drawAChart(URI, container, chartType, options, colorData) { var containerObj = $('#' + container); if (containerObj.length === 0) { return; @@ -343,10 +291,36 @@ function drawAChart(URI, container, chartType, options, colorData, today) { type: chartType, data: data, options: options, - lineAtIndex: [] + lineAtIndex: [], + annotation: {}, }; - if (today >= 0) { - chartOpts.lineAtIndex.push(today - 1); + if (typeof drawVerticalLine !== 'undefined') { + if (drawVerticalLine !== '') { + // draw line using annotation plugin. + console.log('Will draw line'); + chartOpts.options.annotation = { + annotations: [{ + type: 'line', + id: 'a-line-1', + mode: 'vertical', + scaleID: 'x-axis-0', + value: drawVerticalLine, + borderColor: 'red', + borderWidth: 1, + label: { + backgroundColor: 'rgba(0,0,0,0)', + fontFamily: "sans-serif", + fontSize: 12, + fontColor: "#333", + position: "right", + xAdjust: -20, + yAdjust: -125, + enabled: true, + content: todayText + } + }] + }; + } } allCharts[container] = new Chart(ctx, chartOpts); } diff --git a/public/js/ff/import/status.js b/public/js/ff/import/status.js index 99deca6f09..73f621239c 100644 --- a/public/js/ff/import/status.js +++ b/public/js/ff/import/status.js @@ -51,6 +51,10 @@ $(function () { * Downloads some JSON and responds to its content to see what the status is of the current import. */ function checkJobStatus() { + console.log('In checkJobStatus()'); + if(jobFailed) { + return; + } $.getJSON(jobStatusUri).done(reportOnJobStatus).fail(reportFailedJob); } @@ -58,6 +62,7 @@ function checkJobStatus() { * This method is called when the JSON query returns an error. If possible, this error is relayed to the user. */ function reportFailedJob(jqxhr, textStatus, error) { + console.log('In reportFailedJob()'); // hide all possible boxes: $('.statusbox').hide(); @@ -77,9 +82,10 @@ function reportFailedJob(jqxhr, textStatus, error) { * @param data */ function reportOnJobStatus(data) { - + console.log('In reportOnJobStatus()'); switch (data.status) { case "configured": + console.log('Job reports configured.'); // job is ready. Do not check again, just show the start-box. Hide the rest. if (!job.configuration['auto-start']) { $('.statusbox').hide(); @@ -95,6 +101,7 @@ function reportOnJobStatus(data) { } break; case "running": + console.log('Job reports running.'); // job is running! Show the running box: $('.statusbox').hide(); $('.status_running').show(); @@ -117,6 +124,7 @@ function reportOnJobStatus(data) { } break; case "finished": + console.log('Job reports finished.'); $('.statusbox').hide(); $('.status_finished').show(); // report on detected errors: @@ -125,6 +133,7 @@ function reportOnJobStatus(data) { $('#import-status-more-info').html(data.finishedText); break; case "error": + console.log('Job reports ERROR.'); // hide all possible boxes: $('.statusbox').hide(); @@ -137,6 +146,7 @@ function reportOnJobStatus(data) { $('.fatal_error').show(); break; case "configuring": + console.log('Job reports configuring.'); // redirect back to configure screen. window.location = jobConfigureUri; break; @@ -151,6 +161,7 @@ function reportOnJobStatus(data) { * Shows a fatal error when the job seems to be stalled. */ function showStalledBox() { + console.log('In showStalledBox().'); $('.statusbox').hide(); $('.fatal_error').show(); $('.fatal_error_txt').text(langImportTimeOutError); @@ -162,17 +173,21 @@ function showStalledBox() { * @param data */ function jobIsStalled(data) { + console.log('In jobIsStalled().'); if (data.done === numberOfSteps) { numberOfReports++; + console.log('Number of reports ' + numberOfReports); } if (data.done !== numberOfSteps) { numberOfReports = 0; + console.log('Number of reports ' + numberOfReports); } if (numberOfReports > 20) { + console.log('Number of reports > 20! ' + numberOfReports); return true; } numberOfSteps = data.done; - + console.log('Number of steps ' + numberOfSteps); return false; } @@ -181,7 +196,9 @@ function jobIsStalled(data) { * Only when job is in "configured" state. */ function startJob() { + console.log('In startJob().'); if (job.status === "configured") { + console.log('Job status = configured.'); // disable the button, add loading thing. $('.start-job').prop('disabled', true).text('...'); $.post(jobStartUri, {_token: token}).fail(reportOnSubmitError); @@ -190,12 +207,14 @@ function startJob() { timeOutId = setTimeout(checkJobStatus, startInterval); return; } + console.log('Job.status = ' + job.status); } /** * When the start button fails (returns error code) this function reports. It assumes a time out. */ function reportOnSubmitError(jqxhr, textStatus, error) { + console.log('In reportOnSubmitError().'); // stop the refresh thing clearTimeout(timeOutId); @@ -217,6 +236,7 @@ function reportOnSubmitError(jqxhr, textStatus, error) { * This method updates the percentage bar thing if the job is running! */ function updateBar(data) { + console.log('In updateBar().'); var bar = $('#import-status-bar'); if (data.show_percentage) { bar.addClass('progress-bar-success').removeClass('progress-bar-info'); @@ -238,6 +258,7 @@ function updateBar(data) { */ function updateStatusText(data) { "use strict"; + console.log('In updateStatusText().'); $('#import-status-txt').removeClass('text-danger').text(data.statusText); } @@ -246,6 +267,7 @@ function updateStatusText(data) { * @param data */ function reportOnErrors(data) { + console.log('In reportOnErrors().'); if (knownErrors === data.errors.length) { return; } diff --git a/public/js/ff/index.js b/public/js/ff/index.js index 38765985d1..34f743f1e8 100644 --- a/public/js/ff/index.js +++ b/public/js/ff/index.js @@ -29,11 +29,7 @@ $(function () { function drawChart() { "use strict"; - if (today >= 0) { - lineChartWithDay(accountFrontpageUri, 'accounts-chart', today); - } else { - lineChart(accountFrontpageUri, 'accounts-chart'); - } + lineChart(accountFrontpageUri, 'accounts-chart'); if (billCount > 0) { pieChart('chart/bill/frontpage', 'bills-chart'); @@ -80,6 +76,10 @@ function getAvailableBox() { $.getJSON('json/box/available').done(function (data) { $('#box-left-to-spend').html(data.left); $('#box-left-per-day').html(data.perDay); + $('#box-left-to-spend-text').text(data.text); + if(data.overspent === true) { + $('#box-left-to-spend-box').removeClass('bg-green-gradient').addClass('bg-red-gradient'); + } }); } @@ -99,12 +99,34 @@ function getBillsBox() { * */ function getBalanceBox() { - // box-balance-total - // box-balance-out - // box-balance-in + // box-balance-sums + // box-balance-list $.getJSON('json/box/balance').done(function (data) { - $('#box-balance-total').html(data.combined); - $('#box-balance-in').html(data.income); - $('#box-balance-out').html(data.expense); + if (data.size === 1) { + // show balance in "sums", show single entry in list. + for (x in data.sums) { + $('#box-balance-sums').html(data.sums[x]); + $('#box-balance-list').html(data.incomes[x] + ' / ' + data.expenses[x]); + } + return; + } + // do not use "sums", only use list. + $('#box-balance-progress').remove(); + var expense, string, sum, income, current; + var count = 0; + for (x in data.sums) { + if (count > 1) { + return; + } + current = $('#box-balance-list').html(); + sum = data.sums[x]; + expense = data.expenses[x]; + income = data.incomes[x]; + string = income + ' / ' + expense + ': ' + sum; + + $('#box-balance-list').html(current + '' + string + '' + '.env Datei und geben Sie diesen Code unter MAPBOX_API_KEY= ein.',
- 'press_tag_location' => 'Right click or long press to set the tag\'s location.',
- 'clear_location' => 'Clear location',
+ 'store_new_tag' => 'Neues Schlagwort speichern',
+ 'update_tag' => 'Schlüsselwort aktualisieren',
+ 'no_location_set' => 'Kein Ort gesetzt.',
+ 'meta_data' => 'Metadaten',
+ 'location' => 'Standort',
+ 'without_date' => 'Ohne Datum',
+ 'result' => 'Ergebnis',
+ 'sums_apply_to_range' => 'Alle Summen beziehen sich auf den ausgewählten Bereich.',
+ 'mapbox_api_key' => 'Um die Karte zu verwenden, besorgen Sie sich einen API-Schlüssel von Mapbox. Öffnen Sie Ihre .env Datei und geben Sie diesen Code unter MAPBOX_API_KEY= ein.',
+ 'press_tag_location' => 'Rechtsklick oder langer Druck, um den Speicherort des Schlagworts festzulegen.',
+ 'clear_location' => 'Speicherort leeren',
// 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 Diagramme werden automatisch nach Zeiträumen gruppiert. Welchen Zeitraum wollen Sie festlegen?',
- 'pref_1D' => 'Ein Tag',
- 'pref_1W' => 'Eine Woche',
- 'pref_1M' => 'Ein Monat',
- 'pref_3M' => 'Drei Monate (Quartal)',
- 'pref_6M' => 'Sechs Monate',
- 'pref_1Y' => 'Ein Jahr',
- 'pref_languages' => 'Sprachen',
- '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. 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.',
- 'pref_enable_two_factor_auth' => 'Aktiviere Zwei-Faktor-Authentifizierung',
- 'pref_two_factor_auth_disabled' => 'Der Code für die Zwei-Faktor-Authentifizierung wurde gelöscht und gesperrt',
- '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' => '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!',
- 'preferences_general' => 'Allgemein',
- 'preferences_frontpage' => 'Startbildschirm',
- 'preferences_security' => 'Sicherheit',
- 'preferences_layout' => 'Layout',
- 'pref_home_show_deposits' => 'Einnahmen auf dem Startbildschirm anzeigen',
- 'pref_home_show_deposits_info' => 'Der Startbildschirm zeigt schon Ihre Ausgabenkonten an.
+ '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 Diagramme werden automatisch nach Zeiträumen gruppiert. Welchen Zeitraum wollen Sie festlegen?',
+ 'pref_1D' => 'Ein Tag',
+ 'pref_1W' => 'Eine Woche',
+ 'pref_1M' => 'Ein Monat',
+ 'pref_3M' => 'Drei Monate (Quartal)',
+ 'pref_6M' => 'Sechs Monate',
+ 'pref_1Y' => 'Ein Jahr',
+ 'pref_languages' => 'Sprachen',
+ '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. 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.',
+ 'pref_enable_two_factor_auth' => 'Aktiviere Zwei-Faktor-Authentifizierung',
+ 'pref_two_factor_auth_disabled' => 'Der Code für die Zwei-Faktor-Authentifizierung wurde gelöscht und gesperrt',
+ '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' => 'Verifizierungscode zurücksetzen',
+ 'pref_two_factor_auth_disable_2fa' => '2FA deaktivieren',
+ 'pref_save_settings' => 'Einstellungen speichern',
+ 'saved_preferences' => 'Einstellungen gespeichert!',
+ 'preferences_general' => 'Allgemein',
+ 'preferences_frontpage' => 'Startbildschirm',
+ 'preferences_security' => 'Sicherheit',
+ 'preferences_layout' => 'Anordnung',
+ 'pref_home_show_deposits' => 'Einnahmen auf dem Startbildschirm anzeigen',
+ 'pref_home_show_deposits_info' => 'Der Startbildschirm zeigt schon Ihre Ausgabenkonten an.
Sollen zusätzlich Ihre Girokonten angezeigt werden?',
- 'pref_home_do_show_deposits' => 'Ja, zeige sie an',
- 'successful_count' => 'davon :count erfolgreich',
- 'list_page_size_title' => 'Einträge pro Seite',
- 'list_page_size_help' => 'Jede Liste von Einträgen (Konten, Transaktionen, usw.) zeigt höchstens so viele Einträge pro Seite.',
- 'list_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.',
- 'optional_tj_date_fields' => 'Datumsfeld',
- 'optional_tj_business_fields' => 'Geschäftsfelder',
- 'optional_tj_attachment_fields' => 'Anlage-Felder',
- 'pref_optional_tj_interest_date' => 'Zinstermin',
- 'pref_optional_tj_book_date' => 'Buchungstermin',
- 'pref_optional_tj_process_date' => 'Bearbeitungsdatum',
- 'pref_optional_tj_due_date' => 'Fälligkeitstermin',
- 'pref_optional_tj_payment_date' => 'Zahlungsdatum',
- 'pref_optional_tj_invoice_date' => 'Rechnungsdatum',
- 'pref_optional_tj_internal_reference' => 'Interner Verweis',
- 'pref_optional_tj_notes' => 'Notizen',
- 'pref_optional_tj_attachments' => 'Anhänge',
- 'optional_field_meta_dates' => 'Daten',
- 'optional_field_meta_business' => 'Geschäftlich',
- 'optional_field_attachments' => 'Anhänge',
- 'optional_field_meta_data' => 'Optionale Metadaten',
+ 'pref_home_do_show_deposits' => 'Ja, zeige sie an',
+ 'successful_count' => 'davon :count erfolgreich',
+ 'list_page_size_title' => 'Einträge pro Seite',
+ 'list_page_size_help' => 'Jede Liste von Elementen (Konten, Buchungen, usw.) zeigt höchstens so viele Elemente je Seite.',
+ 'list_page_size_label' => 'Einträge pro Seite',
+ 'between_dates' => '(:start und :end)',
+ 'pref_optional_fields_transaction' => 'Optionale Felder für Buchungen',
+ '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.',
+ 'optional_tj_date_fields' => 'Datumsfeld',
+ 'optional_tj_business_fields' => 'Geschäftsfelder',
+ 'optional_tj_attachment_fields' => 'Anlage-Felder',
+ 'pref_optional_tj_interest_date' => 'Zinstermin',
+ 'pref_optional_tj_book_date' => 'Buchungstermin',
+ 'pref_optional_tj_process_date' => 'Bearbeitungsdatum',
+ 'pref_optional_tj_due_date' => 'Fälligkeitstermin',
+ 'pref_optional_tj_payment_date' => 'Zahlungsdatum',
+ 'pref_optional_tj_invoice_date' => 'Rechnungsdatum',
+ 'pref_optional_tj_internal_reference' => 'Interner Verweis',
+ 'pref_optional_tj_notes' => 'Notizen',
+ 'pref_optional_tj_attachments' => 'Anhänge',
+ 'optional_field_meta_dates' => 'Daten',
+ 'optional_field_meta_business' => 'Geschäftlich',
+ 'optional_field_attachments' => 'Anhänge',
+ 'optional_field_meta_data' => 'Optionale Metadaten',
// profile:
- 'change_your_password' => 'Passwort ändern',
- 'delete_account' => 'Konto löschen',
- 'current_password' => 'Derzeitiges Passwort',
- 'new_password' => 'Neues Passwort',
- 'new_password_again' => 'Neues Passwort (wiederholen)',
- 'delete_your_account' => 'Ihren Account löschen',
- 'delete_your_account_help' => 'Das Löschen ihres Benutzerkontos wird ebenfalls alle Konten, Überweisungen, alles was Sie in Firefly gespeichert haben löschen. Alles ist WEG.',
- 'delete_your_account_password' => 'Geben Sie Ihr Kennwort ein um fortzufahren.',
- 'password' => 'Passwort',
- 'are_you_sure' => 'Sind Sie sicher? Sie können diesen Schritt nicht rückgängig machen.',
- 'delete_account_button' => 'LÖSCHEN Sie ihr Benutzerkonto',
- 'invalid_current_password' => 'Aktuelles Passwort ist ungültig!',
- 'password_changed' => 'Passwort geändert!',
- 'should_change' => 'Ziel ist es, ihr Passwort zu ändern.',
- 'invalid_password' => 'Ungültiges Passwort!',
- 'what_is_pw_security' => 'Was ist "Passwortsicherheit ü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' => 'Wenn Sie das Kontrollkästchen aktivieren, wird Firefly III den SHA1-Hash Ihres Passworts an die Website von Troy Hunt senden, um zu sehen, ob es auf der Liste steht. Dies verhindert, dass Sie unsichere Passwörter verwenden, was in der aktuellen NIST-Sonderveröffentlichung zu diesem Thema empfohlen wird.',
- 'secure_pw_sha1' => 'Aber ich dachte, dass SHA1 schon geknackt wurde?',
- 'secure_pw_hash_speed' => 'Ja, aber nicht in diesem Zusammenhang. Wie Sie auf auf der Website, die erklärt, wie SHA1 gebrochen wurde, lesen können, ist es jetzt etwas leichter, eine "Kollision" zu finden: eine andere Zeichenfolge, die zu demselben SHA1-Hash führt. Es dauert nur mehr 10.000 Jahre mit einer Single-GPU-Maschine.',
- 'secure_pw_hash_security' => 'Diese Kollision wäre nicht gleich Ihrem Passwort, noch wäre es nützlich auf (einer Seite wie) Firefly III. Diese Anwendung verwendet SHA1 nicht zur Passwortüberprüfung. Es ist also sicher, dieses Kästchen zu aktivieren. Ihr Passwort wird gehasht und über HTTPS übertragen.',
- 'secure_pw_should' => 'Soll ich die Box ankreuzen?',
- 'secure_pw_long_password' => 'Wenn Sie gerade ein langes, Single-Use-Passwort für Firefly III mit einem Kennwortgenerator generiert haben: Nein.',
- 'secure_pw_short' => 'Wenn Sie gerade das Passwort eingegeben haben, welches Sie immer verwenden: Bitte ja.',
- 'command_line_token' => 'Befehlszeilen Token',
- 'explain_command_line_token' => 'You need this token to perform command line options, such as importing or exporting data. Without it, such sensitive commands will not work. Do not share your command line token. Nobody will ask you for this token, not even me. If you fear you lost this, or when you\'re paranoid, regenerate this token using the button.',
- 'regenerate_command_line_token' => 'Befehlszeilen-Token erneut generieren',
- 'token_regenerated' => 'Ein neues Befehlszeilen-Token wurde generiert',
- 'change_your_email' => 'E-Mail Adresse ändern',
- 'email_verification' => 'Eine E-Mail-Nachricht wird an Ihre alte UND neue E-Mail-Adresse gesendet. Aus Sicherheitsgründen können Sie sich erst anmelden, wenn Sie Ihre neue E-Mail-Adresse bestätigt haben. Wenn Sie sich nicht sicher sind, ob Ihre Firefly III-Installation E-Mails versenden kann, verwenden Sie bitte diese Funktion nicht. Wenn Sie Administrator sind, können Sie dies in der Administration testen.',
- 'email_changed_logout' => 'Sie müssen Ihre E-Mail-Adresse bestätigen, um sich anmelden zu können.',
- 'login_with_new_email' => 'Sie können sich jetzt mit Ihrer neuen E-Mail-Adresse anmelden.',
- 'login_with_old_email' => 'Sie können sich jetzt wieder mit Ihrer alten E-Mail-Adresse anmelden.',
+ 'change_your_password' => 'Passwort ändern',
+ 'delete_account' => 'Konto löschen',
+ 'current_password' => 'Derzeitiges Passwort',
+ 'new_password' => 'Neues Passwort',
+ 'new_password_again' => 'Neues Passwort (wiederholen)',
+ 'delete_your_account' => 'Ihren Account löschen',
+ 'delete_your_account_help' => 'Das Löschen ihres Benutzerkontos wird ebenfalls alle Konten, Buchungen, alles was Sie in Firefly gespeichert haben löschen. Alles geht verloren und kann nicht widerrufen werden.',
+ 'delete_your_account_password' => 'Geben Sie Ihr Kennwort ein um fortzufahren.',
+ 'password' => 'Passwort',
+ 'are_you_sure' => 'Sind Sie sicher? Sie können diesen Schritt nicht rückgängig machen.',
+ 'delete_account_button' => 'LÖSCHEN Sie ihr Benutzerkonto',
+ 'invalid_current_password' => 'Aktuelles Passwort ist ungültig!',
+ 'password_changed' => 'Passwort geändert!',
+ 'should_change' => 'Ziel ist es, ihr Passwort zu ändern.',
+ 'invalid_password' => 'Ungültiges Passwort!',
+ 'what_is_pw_security' => 'Was ist "Passwortsicherheit ü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' => 'Durch Ankreuzen des Kästchens sendet Firefly III die ersten fünf Zeichen des SHA1-Hash Ihres Passworts an die Website von Troy Hunt, um festzustellen, ob es auf der Liste enthalten ist. Dies wird Sie davon abhalten, unsichere Passwörter zu verwenden, wie es in der neuesten NIST Sonderveröffentlichung zu diesem Thema empfohlen wird.',
+ 'secure_pw_sha1' => 'Aber ich dachte, dass SHA1 schon geknackt wurde?',
+ 'secure_pw_hash_speed' => 'Ja, aber nicht in diesem Zusammenhang. Wie Sie auf auf der Website, die erklärt, wie SHA1 gebrochen wurde, lesen können, ist es jetzt etwas leichter, eine "Kollision" zu finden: eine andere Zeichenfolge, die zu demselben SHA1-Hash führt. Es dauert nur mehr 10.000 Jahre mit einer Single-GPU-Maschine.',
+ 'secure_pw_hash_security' => 'Diese Kollision wäre weder mit Ihrem Passwort gleichzusetzen, noch wäre sie auf einer Seite wie Firefly III nützlich. Diese Anwendung verwendet SHA1 nicht zur Passwortverifizierung. Es ist also sicher, dieses Kontrollkästchen zu aktivieren. Ihr Passwort wird verschlüsselt und nur die ersten fünf Zeichen dieses Hashes werden über HTTPS gesendet.',
+ 'secure_pw_should' => 'Soll ich die Box ankreuzen?',
+ 'secure_pw_long_password' => 'Wenn Sie gerade ein langes, Single-Use-Passwort für Firefly III mit einem Kennwortgenerator generiert haben: Nein.',
+ 'secure_pw_short' => 'Wenn Sie gerade das Passwort eingegeben haben, welches Sie immer verwenden: Bitte ja.',
+ 'command_line_token' => 'Kommandozeilen-Authentifizierungsschlüssel',
+ 'explain_command_line_token' => 'Sie benötigen dieses Token, um Kommandozeilenoptionen auszuführen, wie z. B. den Import oder Export von Daten. Ohne diese werden solche sensiblen Befehle nicht funktionieren. Teilen Sie Ihren Kommandozeilen-Authentifizierungsschlüssel nicht mit anderen. Niemand wird Sie um dieses Zeichen bitten, nicht einmal ich. Wenn Sie befürchten, dass Sie diese verloren haben, oder wenn Sie verängstigt sind, erneuern Sie dieses Token mit der Schaltfläche.',
+ 'regenerate_command_line_token' => 'Kommandozeilen-Authentifizierungsschlüssel erneut generieren',
+ 'token_regenerated' => 'Ein neuer Kommandozeilen-Authentifizierungsschlüssel wurde generiert',
+ 'change_your_email' => 'E-Mail Adresse ändern',
+ 'email_verification' => 'Eine E-Mail-Nachricht wird an Ihre alte UND neue E-Mail-Adresse gesendet. Aus Sicherheitsgründen können Sie sich erst anmelden, wenn Sie Ihre neue E-Mail-Adresse bestätigt haben. Wenn Sie sich nicht sicher sind, ob Ihre Firefly III-Installation E-Mails versenden kann, verwenden Sie bitte diese Funktion nicht. Wenn Sie Administrator sind, können Sie dies in der Administration testen.',
+ 'email_changed_logout' => 'Sie müssen Ihre E-Mail-Adresse bestätigen, um sich anmelden zu können.',
+ 'login_with_new_email' => 'Sie können sich jetzt mit Ihrer neuen E-Mail-Adresse anmelden.',
+ 'login_with_old_email' => 'Sie können sich jetzt wieder mit Ihrer alten E-Mail-Adresse anmelden.',
// attachments
- 'nr_of_attachments' => 'Ein Anhang |:count Anhänge',
- 'attachments' => 'Anhänge',
- 'edit_attachment' => 'Anhang ":name" bearbeiten',
- 'update_attachment' => 'Anhang aktualisieren',
- 'delete_attachment' => 'Anhang ":name" löschen',
- 'attachment_deleted' => 'Anhang ":name" gelöscht',
- 'attachment_updated' => 'Anhang ":name" aktualisiert',
- 'upload_max_file_size' => 'Maximale Dateigröße: :size',
+ 'nr_of_attachments' => 'Ein Anhang |:count Anhänge',
+ 'attachments' => 'Anhänge',
+ 'edit_attachment' => 'Anhang „:name” bearbeiten',
+ 'update_attachment' => 'Anhang aktualisieren',
+ 'delete_attachment' => 'Anhang „:name” löschen',
+ 'attachment_deleted' => 'Anhang „:name” gelöscht',
+ 'attachment_updated' => 'Anhang „:name” aktualisiert',
+ 'upload_max_file_size' => 'Maximale Dateigröße: :size',
// transaction index
- 'title_expenses' => 'Ausgaben',
- 'title_withdrawal' => 'Ausgaben',
- 'title_revenue' => 'Einnahmen / Einkommen',
- 'title_deposit' => 'Einnahmen / Einkommen',
- 'title_transfer' => 'Umbuchungen',
- 'title_transfers' => 'Umbuchungen',
+ 'title_expenses' => 'Ausgaben',
+ 'title_withdrawal' => 'Ausgaben',
+ 'title_revenue' => 'Einnahmen / Einkommen',
+ 'title_deposit' => 'Einnahmen / Einkommen',
+ 'title_transfer' => 'Umbuchungen',
+ 'title_transfers' => 'Umbuchungen',
// convert stuff:
- 'convert_is_already_type_Withdrawal' => 'Diese Transaktion ist bereits eine Ausgabe',
- 'convert_is_already_type_Deposit' => 'Diese Transaktion ist bereits eine Einzahlung',
- 'convert_is_already_type_Transfer' => 'Diese Transaktion ist bereits eine Umbuchung',
- 'convert_to_Withdrawal' => '":description" zu einer Ausgabe konvertieren',
- 'convert_to_Deposit' => '":description" zu einer Einzahlung konvertieren',
- 'convert_to_Transfer' => '":description" zu einer Umbuchung konvertieren',
- 'convert_options_WithdrawalDeposit' => 'Konvertieren Sie eine Ausgabe in eine Einzahlung',
- 'convert_options_WithdrawalTransfer' => 'Konvertieren Sie eine Ausgabe in eine Umbuchung',
- 'convert_options_DepositTransfer' => 'Konvertieren Sie eine Einzahlung in eine Umbuchung',
- 'convert_options_DepositWithdrawal' => 'Konvertieren Sie eine Einzahlung in eine Ausgabe',
- 'convert_options_TransferWithdrawal' => 'Konvertieren Sie eine Umbuchung in eine Ausgabe',
- 'convert_options_TransferDeposit' => 'Konvertieren Sie eine Umbuchung in eine Einzahlung',
- 'convert_Withdrawal_to_deposit' => 'Konvertieren Sie diese Ausgabe zu einer Einzahlung',
- 'convert_Withdrawal_to_transfer' => 'Konvertieren Sie diese Ausgabe in eine Umbuchung',
- 'convert_Deposit_to_withdrawal' => 'Konvertieren Sie diese Einzahlung zu einer Ausgabe',
- 'convert_Deposit_to_transfer' => 'Konvertieren Sie diese Einzahlung in eine Umbuchung',
- 'convert_Transfer_to_deposit' => 'Konvertieren Sie diese Umbuchung in eine Einzahlung',
- 'convert_Transfer_to_withdrawal' => 'Konvertieren Sie diese Umbuchung in eine 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.',
- 'convert_please_set_asset_source' => 'Bitte wählen Sie ein Bestandskonto wo das Geld herkommen wird.',
- 'convert_explanation_withdrawal_deposit' => 'Falls Sie diese Ausgabe in eine Einlage konvertieren, wird :amount in sourceName eingezahlt statt davon abgezogen zu werden.',
- 'convert_explanation_withdrawal_transfer' => 'Falls Sie diese Ausgabe in eine Umbuchung konvertieren, wird :amount von :sourceName auf ein neues Girokonto überwiesen, statt :destinationName zu bezahlen.',
- 'convert_explanation_deposit_withdrawal' => 'Falls Sie diese Einlage in eine Ausgabe konvertieren, wird :amount von :destinationName abgezogen statt darauf eingezahlt zu werden.',
- 'convert_explanation_deposit_transfer' => 'Falls Sie diese Einlage in eine Umbuchung konvertieren, wird :amount von einem Girokonto Ihrer Wahl auf :destinationName umgebucht.',
- 'convert_explanation_transfer_withdrawal' => 'Falls sie diese Umbuchung in Ausgabe konvertieren, wird :amount von :sourceName zu einem neuen Ziel geleitet, statt auf :destinationName umgebucht zu werden.',
- 'convert_explanation_transfer_deposit' => 'Wenn sie diese Umbuchung in eine Einlage konvertieren, wird :amount auf das Konto :destinationName eingezahlt, statt dorthin umgebucht zu werden.',
- 'converted_to_Withdrawal' => 'Die Transaktion wurde in eine Ausgabe konvertiert',
- 'converted_to_Deposit' => 'Die Transaktion wurde in eine Einzahlung konvertiert',
- 'converted_to_Transfer' => 'Die Transaktion wurde in eine Umbuchung konvertiert',
- 'invalid_convert_selection' => 'The account you have selected is already used in this transaction or does not exist.',
+ 'convert_is_already_type_Withdrawal' => 'Diese Transaktion ist bereits eine Ausgabe',
+ 'convert_is_already_type_Deposit' => 'Diese Transaktion ist bereits eine Einzahlung',
+ 'convert_is_already_type_Transfer' => 'Diese Transaktion ist bereits eine Umbuchung',
+ 'convert_to_Withdrawal' => '":description" zu einer Ausgabe konvertieren',
+ 'convert_to_Deposit' => '":description" zu einer Einzahlung konvertieren',
+ 'convert_to_Transfer' => '":description" zu einer Umbuchung konvertieren',
+ 'convert_options_WithdrawalDeposit' => 'Konvertieren Sie eine Ausgabe in eine Einzahlung',
+ 'convert_options_WithdrawalTransfer' => 'Konvertieren Sie eine Ausgabe in eine Umbuchung',
+ 'convert_options_DepositTransfer' => 'Konvertieren Sie eine Einzahlung in eine Umbuchung',
+ 'convert_options_DepositWithdrawal' => 'Konvertieren Sie eine Einzahlung in eine Ausgabe',
+ 'convert_options_TransferWithdrawal' => 'Konvertieren Sie eine Umbuchung in eine Ausgabe',
+ 'convert_options_TransferDeposit' => 'Konvertieren Sie eine Umbuchung in eine Einzahlung',
+ 'convert_Withdrawal_to_deposit' => 'Konvertieren Sie diese Ausgabe zu einer Einzahlung',
+ 'convert_Withdrawal_to_transfer' => 'Konvertieren Sie diese Ausgabe in eine Umbuchung',
+ 'convert_Deposit_to_withdrawal' => 'Konvertieren Sie diese Einzahlung zu einer Ausgabe',
+ 'convert_Deposit_to_transfer' => 'Konvertieren Sie diese Einzahlung in eine Umbuchung',
+ 'convert_Transfer_to_deposit' => 'Konvertieren Sie diese Umbuchung in eine Einzahlung',
+ 'convert_Transfer_to_withdrawal' => 'Konvertieren Sie diese Umbuchung in eine 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 das Bestandskonto, auf das das Geld überwiesen werden soll.',
+ 'convert_please_set_expense_destination' => 'Bitte wählen Sie ein Spesenkonto wo das Geld hingehen wird.',
+ 'convert_please_set_asset_source' => 'Bitte das Bestandskonto wählen, von dem das Geld kommt.',
+ 'convert_explanation_withdrawal_deposit' => 'Falls Sie diese Ausgabe in eine Einlage konvertieren, wird :amount in sourceName eingezahlt statt davon abgezogen zu werden.',
+ 'convert_explanation_withdrawal_transfer' => 'Falls Sie diese Ausgabe in eine Umbuchung konvertieren, wird :amount von :sourceName auf ein neues Bestandskonto überwiesen, statt auf das Bestandskonto :destinationName.',
+ 'convert_explanation_deposit_withdrawal' => 'Falls Sie diese Einlage in eine Ausgabe konvertieren, wird :amount von :destinationName abgezogen statt darauf eingezahlt zu werden.',
+ 'convert_explanation_deposit_transfer' => 'Falls Sie diese Einlage in eine Umbuchung konvertieren, wird :amount von einem Bestandskonto Ihrer Wahl auf :destinationName umgebucht.',
+ 'convert_explanation_transfer_withdrawal' => 'Falls sie diese Umbuchung in Ausgabe konvertieren, wird :amount von :sourceName zu einem neuen Ziel geleitet, statt auf :destinationName umgebucht zu werden.',
+ 'convert_explanation_transfer_deposit' => 'Wenn sie diese Umbuchung in eine Einlage konvertieren, wird :amount auf das Konto :destinationName eingezahlt, statt dorthin umgebucht zu werden.',
+ 'converted_to_Withdrawal' => 'Die Transaktion wurde in eine Ausgabe konvertiert',
+ 'converted_to_Deposit' => 'Die Transaktion wurde in eine Einzahlung konvertiert',
+ 'converted_to_Transfer' => 'Die Transaktion wurde in eine Umbuchung konvertiert',
+ 'invalid_convert_selection' => 'Das von Ihnen ausgewählte Konto wird für diese Transaktion bereits verwendet oder ist nicht vorhanden.',
// create new stuff:
- 'create_new_withdrawal' => 'Erstelle eine neue Ausgabe',
- 'create_new_deposit' => 'Erstelle ein neues Einkommen',
- 'create_new_transfer' => 'Eine neue Umbuchung erstellen',
- 'create_new_asset' => 'Neues Girokonto erstellen',
- 'create_new_expense' => 'Neuen Debitor (Ausgabe) erstellen',
- 'create_new_revenue' => 'Neuen Schuldner erstellen',
- 'create_new_piggy_bank' => 'Ein neues Sparschwein erstellen',
- 'create_new_bill' => 'Eine neue Rechnung erstellen',
+ 'create_new_withdrawal' => 'Erstelle eine neue Ausgabe',
+ 'create_new_deposit' => 'Erstelle ein neues Einkommen',
+ 'create_new_transfer' => 'Eine neue Umbuchung erstellen',
+ 'create_new_asset' => 'Neues Bestandskonto erstellen',
+ 'create_new_expense' => 'Neuen Debitor (Ausgabe) erstellen',
+ 'create_new_revenue' => 'Neuen Schuldner erstellen',
+ 'create_new_piggy_bank' => 'Ein neues Sparschwein erstellen',
+ 'create_new_bill' => 'Eine neue Rechnung erstellen',
// currencies:
- 'create_currency' => 'Eine neue Währung erstellen',
- 'store_currency' => 'Eine neue Währung speichern',
- 'update_currency' => 'Währung aktualisieren',
- 'new_default_currency' => ':name ist jetzt die Standardwährung.',
- 'cannot_delete_currency' => ':name kann nicht gelöscht werden, da Sie noch in Gebrauch ist.',
- 'deleted_currency' => 'Währung :name gelöscht',
- 'created_currency' => 'Währung :name erstellt',
- 'updated_currency' => 'Währung :name aktualisiert',
- 'ask_site_owner' => 'Bitte fragen sie :owner zum Hinzufügen, Entfernen oder Bearbeiten von Währungen.',
- 'currencies_intro' => 'Firefly III unterstützt verschiedene Währungen, welche hier eingestellt und aktiviert werden können.',
- 'make_default_currency' => 'als Standard festlegen',
- 'default_currency' => 'Standard',
+ 'create_currency' => 'Eine neue Währung erstellen',
+ 'store_currency' => 'Eine neue Währung speichern',
+ 'update_currency' => 'Währung aktualisieren',
+ 'new_default_currency' => '„:name” wir nun als Standardwährung verwendet',
+ 'cannot_delete_currency' => '„:name” konnte nicht gelöscht werden, da dieser noch verwendet wird',
+ 'deleted_currency' => 'Währung :name gelöscht',
+ 'created_currency' => 'Währung :name erstellt',
+ 'updated_currency' => 'Währung :name aktualisiert',
+ 'ask_site_owner' => 'Bitte fragen sie :owner zum Hinzufügen, Entfernen oder Bearbeiten von Währungen.',
+ 'currencies_intro' => 'Firefly III unterstützt verschiedene Währungen, welche hier eingestellt und aktiviert werden können.',
+ 'make_default_currency' => 'als Standard festlegen',
+ 'default_currency' => 'Standard',
// forms:
- 'mandatoryFields' => 'Pflichtfelder',
- 'optionalFields' => 'Optionale Felder',
- 'options' => 'Einstellungen',
+ 'mandatoryFields' => 'Pflichtfelder',
+ 'optionalFields' => 'Optionale Felder',
+ 'options' => 'Einstellungen',
// budgets:
- 'create_new_budget' => 'Ein neues Budget erstellen',
- 'store_new_budget' => 'Ein neues Budget speichern',
- 'stored_new_budget' => 'Speichere neues Budget ":name"',
- 'available_between' => 'Verfügbar zwischen :start und :end',
- 'transactionsWithoutBudget' => 'Ausgaben ohne Budget',
- 'transactions_no_budget' => 'Ausgaben ohne Budget zwischen :start und :end',
- 'spent_between' => 'Ausgegeben zwischen :start und :end',
- 'createBudget' => 'Neues Budget',
- 'inactiveBudgets' => 'Inaktive Budgets',
- 'without_budget_between' => 'Überweisungen ohne Budget zwischen :start und :end',
- 'delete_budget' => 'Budget ":name" löschen',
- 'deleted_budget' => 'Budget ":name" gelöscht',
- 'edit_budget' => 'Budget ":name" bearbeiten',
- 'updated_budget' => 'Budget ":name" bearbeitet',
- 'update_amount' => 'Betrag aktualisieren',
- 'update_budget' => 'Budget aktualisieren',
- 'update_budget_amount_range' => 'Aktualisiere (erwarteten) verfügbaren Betrag zwischen :start und :end',
- 'budget_period_navigator' => 'Zeitraum-navigator',
- 'info_on_available_amount' => 'Was habe ich verfügbar?',
- 'available_amount_indication' => 'Use these amounts to get an indication of what your total budget could be.',
- 'suggested' => 'Vorgeschlagen',
- 'average_between' => 'Average between :start and :end',
+ 'create_new_budget' => 'Neuen Kostenrahmen erstellen',
+ 'store_new_budget' => 'Neuen Kostenrahmen speichern',
+ 'stored_new_budget' => 'Neuen Kostenrahmen „:name” speichern',
+ 'available_between' => 'Verfügbar zwischen :start und :end',
+ 'transactionsWithoutBudget' => 'Ausgaben ohne Kostenrahmen',
+ 'transactions_no_budget' => 'Ausgaben ohne Kostenrahmen zwischen :start und :end',
+ 'spent_between' => 'Ausgegeben zwischen :start und :end',
+ 'createBudget' => 'Neuer Kostenrahmen',
+ 'inactiveBudgets' => 'Inaktive Kostenrahmen',
+ 'without_budget_between' => 'Buchungen ohne Kostenrahmen zwischen :start und :end',
+ 'delete_budget' => 'Kostenrahmen „:name” löschen',
+ 'deleted_budget' => 'Kostenrahmen „:name” gelöscht',
+ 'edit_budget' => 'Kostenrahmen „:name” bearbeiten',
+ 'updated_budget' => 'Kostenrahmen „:name” bearbeitet',
+ 'update_amount' => 'Betrag aktualisieren',
+ 'update_budget' => 'Kostenrahmen aktualisieren',
+ 'update_budget_amount_range' => '(Erwarteter) Verfügbaren Betrag zwischen :start und :end aktualisieren',
+ 'budget_period_navigator' => 'Zeitraum-Navigator',
+ 'info_on_available_amount' => 'Was habe ich verfügbar?',
+ 'available_amount_indication' => 'Verwenden Sie diese Angaben, um einen Anhaltspunkt dafür zu erhalten, wie hoch Ihr Gesamtsumme sein könnte.',
+ 'suggested' => 'Vorgeschlagen',
+ 'average_between' => 'Durchschnitt zwischen :start und :end',
+ 'over_budget_warn' => ' Normalerweise veranschlagen Sie ca. :amount pro Tag. Aktuell sind es aber :over_amount pro Tag.',
// bills:
- 'matching_on' => 'Reagiert auf',
- 'between_amounts' => 'zwischen :low und :high.',
- 'repeats' => 'Wiederholungen',
- 'connected_journals' => 'Verknüpfte Überweisungen',
- 'auto_match_on' => 'Automatisch von Firefly III zugeordnet',
- 'auto_match_off' => 'Nicht automatisch von Firefly III zugeordnet',
- 'next_expected_match' => 'Nächste erwartete Übereinstimmung',
- 'delete_bill' => 'Rechnung ":name" löschen',
- 'deleted_bill' => 'Rechnung ":name" gelöscht',
- 'edit_bill' => 'Rechnung ":name" bearbeiten',
- 'more' => 'Weitere',
- 'rescan_old' => 'Ältere Transaktionen Scannen',
- 'update_bill' => 'Aktualisieren Sie eine Rechnung',
- 'updated_bill' => 'Rechnung ":name" aktualisiert',
- 'store_new_bill' => 'Neue Rechnung speichern',
- '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)',
- 'bill_is_active' => 'Rechnung ist aktiv',
- 'bill_expected_between' => 'Expected between :start and :end',
- 'bill_will_automatch' => 'Rechnung wird automatisch mit passenden Transaktionen verknüpft',
- 'skips_over' => 'skips over',
-
+ 'matching_on' => 'Reagiert auf',
+ 'between_amounts' => 'zwischen :low und :high.',
+ 'repeats' => 'Wiederholungen',
+ 'connected_journals' => 'Verknüpfte Buchungen',
+ 'auto_match_on' => 'Automatisch von Firefly III zugeordnet',
+ 'auto_match_off' => 'Nicht automatisch von Firefly III zugeordnet',
+ 'next_expected_match' => 'Nächste erwartete Übereinstimmung',
+ 'delete_bill' => 'Rechnung „:name” löschen',
+ 'deleted_bill' => 'Rechnung „:name” gelöscht',
+ 'edit_bill' => 'Rechnung „:name” bearbeiten',
+ 'more' => 'Weitere',
+ 'rescan_old' => 'Ältere Buchungen überprüfen',
+ 'update_bill' => 'Aktualisieren Sie eine Rechnung',
+ 'updated_bill' => 'Rechnung „:name” aktualisiert',
+ 'store_new_bill' => 'Neue Rechnung speichern',
+ '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)',
+ 'bill_is_active' => 'Rechnung ist aktiv',
+ 'bill_expected_between' => 'Erwartet zwischen :start und :end',
+ 'bill_will_automatch' => 'Rechnung wird automatisch mit passenden Buchungen verknüpft',
+ 'skips_over' => 'überschreitet',
// accounts:
- 'details_for_asset' => 'Details für Girokonto ":name"',
- 'details_for_expense' => 'Details für Debitor ":name"',
- 'details_for_revenue' => 'Details für Schuldner ":name"',
- 'details_for_cash' => 'Details für das Bargeldkonto ":name"',
- 'store_new_asset_account' => 'Speichere neues Girokonto',
- 'store_new_expense_account' => 'Speichere neuen Debitor (Ausgabe)',
- 'store_new_revenue_account' => 'Speichere neuen Schuldner',
- 'edit_asset_account' => 'Bearbeite Girokonto ":name"',
- 'edit_expense_account' => 'Debitor (Ausgabe) ":name" bearbeiten',
- 'edit_revenue_account' => 'Schuldner ":name" bearbeiten',
- 'delete_asset_account' => 'Lösche Girokonto ":name"',
- 'delete_expense_account' => 'Debitor (Ausgabe) ":name" löschen',
- 'delete_revenue_account' => 'Schuldner ":name" löschen',
- 'asset_deleted' => 'Girokonto ":name" wurde erfolgreich gelöscht',
- 'expense_deleted' => 'Debitor (Ausgabe) ":name" erfolgreich gelöscht',
- 'revenue_deleted' => 'Schuldner ":name" erfolgreich gelöscht',
- 'update_asset_account' => 'Girokonto aktualisieren',
- 'update_expense_account' => 'Debitor (Ausgabe) bearbeiten',
- 'update_revenue_account' => 'Schuldner bearbeiten',
- 'make_new_asset_account' => 'Neues Girokonto erstellen',
- 'make_new_expense_account' => 'Neuen Debitor (Ausgabe) erstellen',
- 'make_new_revenue_account' => 'Neuen Schuldner erstellen',
- 'asset_accounts' => 'Girokonten',
- 'expense_accounts' => 'Debitoren (Ausgaben)',
- 'revenue_accounts' => 'Schuldner',
- 'cash_accounts' => 'Bargeldkonten',
- 'Cash account' => 'Bargeldkonto',
- 'reconcile_account' => 'Konto ":account" ausgleichen',
- 'delete_reconciliation' => 'Delete reconciliation',
- 'update_reconciliation' => 'Update reconciliation',
- 'amount_cannot_be_zero' => 'Der Betrag darf nicht Null sein',
- 'end_of_reconcile_period' => 'End of reconcile period: :period',
- 'start_of_reconcile_period' => 'Start of reconcile period: :period',
- 'start_balance' => 'Startguthaben',
- 'end_balance' => 'Endsaldo',
- 'update_balance_dates_instruction' => 'Match the amounts and dates above to your bank statement, and press "Start reconciling"',
- 'select_transactions_instruction' => 'Select the transactions that appear on your bank statement.',
- 'select_range_and_balance' => 'First verify the date-range and balances. Then press "Start reconciling"',
- 'date_change_instruction' => 'If you change the date range now, any progress will be lost.',
- 'update_selection' => 'Auswahl aktualisieren',
- 'store_reconcile' => 'Store reconciliation',
- 'reconciliation_transaction' => 'Reconciliation transaction',
- 'Reconciliation' => 'Kontenabgleich',
- 'reconciliation' => 'Kontenabgleich',
- 'reconcile_options' => 'Reconciliation options',
- 'reconcile_range' => 'Reconciliation range',
- 'start_reconcile' => 'Start reconciling',
- 'cash' => 'cash',
- 'account_type' => 'Kontotyp',
- 'save_transactions_by_moving' => 'Speichern Sie diese Transaktion(en), indem Sie sie auf ein anderes Konto verschieben:',
- 'stored_new_account' => 'Neues Konto ":name" gespeichert!',
- 'updated_account' => 'Konto ":name" aktualisiert',
- 'credit_card_options' => 'Kreditkartenoptionen',
- 'no_transactions_account' => 'Es gibt keine Transaktionen (in diesem Zeitraum) für das Girokonto ":name".',
- 'no_data_for_chart' => 'Es gibt derzeit (noch) nicht genügend Informationen, um dieses Diagramm zu generieren.',
- 'select_more_than_one_account' => 'Bitte wählen Sie mehr als einen Konto aus',
- 'select_more_than_one_category' => 'Bitte wählen Sie mehr als eine Kategorie aus',
- 'select_more_than_one_budget' => 'Bitte wählen Sie mehr als einen Budget aus',
- 'select_more_than_one_tag' => 'Bitte wählen Sie mehr als einen Tag aus',
- '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.',
- 'reconcile_has_more' => 'Your Firefly III ledger has more money in it than your bank claims you should have. There are several options. Please choose what to do. Then, press "Confirm reconciliation".',
- 'reconcile_has_less' => 'Your Firefly III ledger has less money in it than your bank claims you should have. There are several options. Please choose what to do. Then, press "Confirm reconciliation".',
- 'reconcile_is_equal' => 'Your Firefly III ledger and your bank statements match. There is nothing to do. Please press "Confirm reconciliation" to confirm your input.',
- 'create_pos_reconcile_transaction' => 'Clear the selected transactions, and create a correction adding :amount to this asset account.',
- 'create_neg_reconcile_transaction' => 'Clear the selected transactions, and create a correction removing :amount from this asset account.',
- 'reconcile_do_nothing' => 'Clear the selected transactions, but do not correct.',
- 'reconcile_go_back' => 'Sie können dies jederzeit später bearbeiten oder löschen.',
- 'must_be_asset_account' => 'You can only reconcile asset accounts',
- 'reconciliation_stored' => 'Reconciliation stored',
- 'reconcilliation_transaction_title' => 'Reconciliation (:from to :to)',
- 'reconcile_this_account' => 'Reconcile this account',
- 'confirm_reconciliation' => 'Confirm reconciliation',
- 'submitted_start_balance' => 'Submitted start balance',
- 'selected_transactions' => 'Selected transactions (:count)',
- 'already_cleared_transactions' => 'Already cleared transactions (:count)',
- 'submitted_end_balance' => 'Submitted end balance',
- 'initial_balance_description' => 'Initial balance for ":account"',
+ 'details_for_asset' => 'Informationen zum Bestandskonto „:name”',
+ 'details_for_expense' => 'Angaben zum Spesenkonto „:name”',
+ 'details_for_revenue' => 'Angaben zum Erlöskonto „:name”',
+ 'details_for_cash' => 'Angaben zum Kassenkonto „:name”',
+ 'store_new_asset_account' => 'Neues Bestandskonto speichern',
+ 'store_new_expense_account' => 'Speichere neuen Debitor (Ausgabe)',
+ 'store_new_revenue_account' => 'Speichere neuen Schuldner',
+ 'edit_asset_account' => 'Bestandskonto „:name” bearbeiten',
+ 'edit_expense_account' => 'Spesenkonto „:name” bearbeiten',
+ 'edit_revenue_account' => 'Erlöskonto „:name” bearbeiten',
+ 'delete_asset_account' => 'Bestandskonto „:name” löschen',
+ 'delete_expense_account' => 'Spesenkonto „:name” löschen',
+ 'delete_revenue_account' => 'Erlöskonto „:name” löschen',
+ 'asset_deleted' => 'Bestandskonto „:name” erfolgreich gelöscht',
+ 'expense_deleted' => 'Spesenkonto „:name” erfolgreich gelöscht',
+ 'revenue_deleted' => 'Erlöskonto „:name” erfolgreich gelöscht',
+ 'update_asset_account' => 'Bestandskonto aktualisieren',
+ 'update_expense_account' => 'Debitor (Ausgabe) bearbeiten',
+ 'update_revenue_account' => 'Schuldner bearbeiten',
+ 'make_new_asset_account' => 'Neues Bestandskonto erstellen',
+ 'make_new_expense_account' => 'Neuen Debitor (Ausgabe) erstellen',
+ 'make_new_revenue_account' => 'Neuen Schuldner erstellen',
+ 'asset_accounts' => 'Bestandskonten',
+ 'expense_accounts' => 'Debitoren (Ausgaben)',
+ 'revenue_accounts' => 'Schuldner',
+ 'cash_accounts' => 'Bargeldkonten',
+ 'Cash account' => 'Bargeldkonto',
+ 'reconcile_account' => 'Konto ":account" ausgleichen',
+ 'delete_reconciliation' => 'Kontenabgleich löschen',
+ 'update_reconciliation' => 'Kontenabgleich aktualisieren',
+ 'amount_cannot_be_zero' => 'Der Betrag darf nicht Null sein',
+ 'end_of_reconcile_period' => 'Ende des Abstimmzeitraums: :period',
+ 'start_of_reconcile_period' => 'Beginn der Abstimmzeitraums: :period',
+ 'start_balance' => 'Startguthaben',
+ 'end_balance' => 'Endguthaben',
+ 'update_balance_dates_instruction' => 'Ordnen Sie die oben genannten Beträge und Daten Ihrem Kontoauszug zu und klicken Sie auf „Jetzt ausgleichen”',
+ 'select_transactions_instruction' => 'Wählen Sie die Buchungen aus, die auf Ihrem Kontoauszug angezeigt werden.',
+ 'select_range_and_balance' => 'Überprüfen Sie zunächst den Datumsbereich und das Guthaben. Anschließend drücken Sie auf „Jetzt ausgleichen”',
+ 'date_change_instruction' => 'Wenn Sie den Datumsbereich jetzt ändern, geht der gesamte Verlauf verloren.',
+ 'update_selection' => 'Auswahl aktualisieren',
+ 'store_reconcile' => 'Kontenabgleich speichern',
+ 'reconciliation_transaction' => 'Ausgleichende Kontobewegung',
+ 'Reconciliation' => 'Kontenabgleich',
+ 'reconciliation' => 'Kontenabgleich',
+ 'reconcile_options' => 'Kontenabgleich Optionen',
+ 'reconcile_range' => 'Kontenabgleich-Bereich',
+ 'start_reconcile' => 'Jetzt ausgleichen',
+ 'cash' => 'Bar',
+ 'account_type' => 'Kontotyp',
+ 'save_transactions_by_moving' => 'Speichern Sie diese Transaktion(en), indem Sie sie auf ein anderes Konto verschieben:',
+ 'stored_new_account' => 'Neues Konto „:name” gespeichert!',
+ 'updated_account' => 'Konto „:name” aktualisiert',
+ 'credit_card_options' => 'Kreditkartenoptionen',
+ 'no_transactions_account' => 'Es liegen (in diesem Zeitraum) keine Buchungen für das Anlagenkonto „:name” vor.',
+ 'no_data_for_chart' => 'Es gibt derzeit (noch) nicht genügend Informationen, um dieses Diagramm zu generieren.',
+ 'select_more_than_one_account' => 'Bitte wählen Sie mehr als einen Konto aus',
+ 'select_more_than_one_category' => 'Bitte wählen Sie mehr als eine Kategorie aus',
+ 'select_more_than_one_budget' => 'Bitte wählen Sie mehr als einen Kostenrahmen aus',
+ 'select_more_than_one_tag' => 'Bitte wählen Sie mehr als ein Schlüsselwort aus',
+ 'account_default_currency' => 'Wenn Sie eine andere Währung wählen, wird bei neuen Buchungen auf diesem Konto diese Währung vorausgewählt.',
+ 'reconcile_has_more' => 'Ihr Firefly III-Konto verfügt über mehr Geld, als Ihre Bank behauptet. Es gibt mehrere Möglichkeiten. Bitte wählen Sie aus, was Sie tun möchten. Drücken Sie anschließend auf „Ausgleich bestätigen”.',
+ 'reconcile_has_less' => 'Ihr Firefly III-Konto verfügt über weniger Geld, als Ihre Bank behauptet. Es gibt mehrere Möglichkeiten. Bitte wählen Sie aus, was Sie tun möchten. Drücken Sie dann auf „Ausgleich bestätigen”.',
+ 'reconcile_is_equal' => 'Ihr Firefly III-Konto und Ihre Kontoauszüge stimmen überein. Es gibt nichts zu tun. Bitte drücken Sie auf „Ausgleich bestätigen”, um Ihre Eingaben zu bestätigen.',
+ 'create_pos_reconcile_transaction' => 'Ausgewählten Umsätze bereinigen und einen Korrekturbetrag in Höhe von :amount auf dieses Bestandskonto überweisen.',
+ 'create_neg_reconcile_transaction' => 'Ausgewählten Umsätze bereinigen und einen Korrekturbetrag in Höhe von :amount von diesem Anlagenkonto zurücküberweisen.',
+ 'reconcile_do_nothing' => 'Ausgewählten Umsätze bereinigen, aber nicht korrigieren.',
+ 'reconcile_go_back' => 'Sie können dies jederzeit später bearbeiten oder löschen.',
+ 'must_be_asset_account' => 'Sie können nur Bestandskonten ausgleichen',
+ 'reconciliation_stored' => 'Kontenabgleich gespeichert',
+ 'reconcilliation_transaction_title' => 'Ausgleich (:from zu :to)',
+ 'reconcile_this_account' => 'Dieses Konto abgleichen',
+ 'confirm_reconciliation' => 'Kontenabgleich bestätigen',
+ 'submitted_start_balance' => 'Übermitteltes Startguthaben',
+ 'selected_transactions' => 'Ausgewählte Umsätze (:count)',
+ 'already_cleared_transactions' => 'Bereits ausgeglichene Umsätze (:count)',
+ 'submitted_end_balance' => 'Übermittelter Abschlussguthaben',
+ 'initial_balance_description' => 'Anfangsguthaben für „:account”',
// categories:
- 'new_category' => 'Neue Kategorie',
- 'create_new_category' => 'Eine neue Kategorie herstellen',
- 'without_category' => 'Ohne Kategorie',
- 'update_category' => 'Kategorie aktualisieren',
- 'updated_category' => 'Kategorie ":name" aktualisiert',
- 'categories' => 'Kategorien',
- 'edit_category' => 'Kategorie ":name" bearbeiten',
- 'no_category' => '(keine Kategorie)',
- 'category' => 'Kategorie',
- 'delete_category' => 'Kategorie ":name" löschen',
- 'deleted_category' => 'Kategorie ":name" gelöscht',
- 'store_category' => 'Speichere neue Kategorie',
- 'stored_category' => 'Neue Kategorie ":name" gespeichert',
- 'without_category_between' => 'Ohne Kategorie zwischen :start und :end',
+ 'new_category' => 'Neue Kategorie',
+ 'create_new_category' => 'Eine neue Kategorie herstellen',
+ 'without_category' => 'Ohne Kategorie',
+ 'update_category' => 'Kategorie aktualisieren',
+ 'updated_category' => 'Kategorie „:name” aktualisiert',
+ 'categories' => 'Kategorien',
+ 'edit_category' => 'Kategorie „:name” bearbeiten',
+ 'no_category' => '(keine Kategorie)',
+ 'category' => 'Kategorie',
+ 'delete_category' => 'Kategorie „:name” löschen',
+ 'deleted_category' => 'Kategorie „:name” gelöscht',
+ 'store_category' => 'Speichere neue Kategorie',
+ 'stored_category' => 'Neue Kategorie „:name” gespeichert',
+ 'without_category_between' => 'Ohne Kategorie zwischen :start und :end',
// transactions:
- 'update_withdrawal' => 'Ausgaben aktualisieren',
- 'update_deposit' => 'Einnahmen aktualisieren',
- 'update_transfer' => 'Umbuchung aktualisieren',
- 'updated_withdrawal' => 'Ausgabe ":description" aktualisiert',
- 'updated_deposit' => 'Einnahme ":description" aktualisiert',
- 'updated_transfer' => 'Umbuchung ":description" aktualisiert',
- 'delete_withdrawal' => 'Ausgabe ":description" löschen',
- 'delete_deposit' => 'Einnahme ":description" löschen',
- 'delete_transfer' => 'Umbuchung ":description" löschen',
- 'deleted_withdrawal' => 'Ausgabe ":description" erfolgreich gelöscht',
- 'deleted_deposit' => 'Einnahme ":description" erfolgreich gelöscht',
- 'deleted_transfer' => 'Umbuchung ":description" erfolgreich gelöscht',
- 'stored_journal' => 'Neue Überweisung ":description" erfolgreich erstellt',
- 'select_transactions' => 'Überweisungen auswählen',
- 'rule_group_select_transactions' => '":title" auf Transaktionen anwenden',
- 'rule_select_transactions' => '":title" auf Transaktionen anwenden',
- 'stop_selection' => 'Auswahl von Überweisungen stoppen',
- 'reconcile_selected' => 'Ausgleichen',
- 'mass_delete_journals' => 'Löschen Sie eine Reihe von Überweisungen',
- 'mass_edit_journals' => 'Bearbeiten Sie eine Reihe von Überweisungen',
- 'mass_bulk_journals' => 'Bulk edit a number of transactions',
- 'mass_bulk_journals_explain' => 'If you do not want to change your transactions one-by-one using the mass-edit function, you can update them in one go. Simply select the preferred category, tag(s) or budget in the fields below, and all the transactions in the table will be updated.',
- 'bulk_set_new_values' => 'Use the inputs below to set new values. If you leave them empty, they will be made empty for all. Also, note that only withdrawals will be given a budget.',
- 'no_bulk_category' => 'Kategorie nicht aktualisieren',
- 'no_bulk_budget' => 'Budget nicht aktualisieren',
- 'no_bulk_tags' => 'Don\'t update tag(s)',
- 'bulk_edit' => 'Massenbearbeitung',
- '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.',
- 'no_budget' => '(kein Budget)',
- 'no_budget_squared' => '(kein Budget)',
- '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' => 'Kreditkarten',
- 'notes' => 'Notizen',
+ 'update_withdrawal' => 'Ausgaben aktualisieren',
+ 'update_deposit' => 'Einnahmen aktualisieren',
+ 'update_transfer' => 'Umbuchung aktualisieren',
+ 'updated_withdrawal' => 'Ausgabe ":description" aktualisiert',
+ 'updated_deposit' => 'Einnahme ":description" aktualisiert',
+ 'updated_transfer' => 'Umbuchung ":description" aktualisiert',
+ 'delete_withdrawal' => 'Ausgabe ":description" löschen',
+ 'delete_deposit' => 'Einnahme ":description" löschen',
+ 'delete_transfer' => 'Umbuchung ":description" löschen',
+ 'deleted_withdrawal' => 'Ausgabe ":description" erfolgreich gelöscht',
+ 'deleted_deposit' => 'Einnahme ":description" erfolgreich gelöscht',
+ 'deleted_transfer' => 'Umbuchung ":description" erfolgreich gelöscht',
+ 'stored_journal' => 'Neue Überweisung ":description" erfolgreich erstellt',
+ 'select_transactions' => 'Buchungen auswählen',
+ 'rule_group_select_transactions' => '„:title” auf Buchungen anwenden',
+ 'rule_select_transactions' => '„:title” auf Buchungen anwenden',
+ 'stop_selection' => 'Auswählen von Buchungen anhalten',
+ 'reconcile_selected' => 'Ausgleichen',
+ 'mass_delete_journals' => 'Anzahl von Buchungen löschen',
+ 'mass_edit_journals' => 'Anzahl von Buchungen bearbeiten',
+ 'mass_bulk_journals' => 'Massenbearbeitung mehrerer Buchungen',
+ 'mass_bulk_journals_explain' => 'Wenn Sie Ihre Buchungen nicht einzeln mit der Massenbearbeitungsfunktion ändern möchten, können Sie diese in einem Schritt aktualisieren. Wählen Sie einfach in den untenstehenden Feldern die bevorzugte Kategorie, die Schlüsselwörter oder das zur Verfügung stehende Budget aus, und alle Umsätze in der Tabelle werden aktualisiert.',
+ 'bulk_set_new_values' => 'Verwenden Sie die folgenden Eingänge, um neue Werte einzustellen. Wenn Sie sie leer lassen, werden sie für alle geleert. Beachten Sie auch, dass nur Abhebungen mit einem Kostenrahmen versehen werden.',
+ 'no_bulk_category' => 'Kategorie nicht aktualisieren',
+ 'no_bulk_budget' => 'Kostenrahmen nicht aktualisieren',
+ 'no_bulk_tags' => 'Schlagwörter nicht aktualisieren',
+ 'bulk_edit' => 'Massenbearbeitung',
+ 'cannot_edit_other_fields' => 'Andere Felder als die hier gezeigten können Sie nicht gleichzeitig bearbeitet werden, da es keinen Platz gibt, diese anzuzeigen. Bitte folgen Sie dem Link und bearbeiten Sie die Felder einzeln, wenn Sie diese bearbeiten möchten.',
+ 'no_budget' => '(kein Budget)',
+ 'no_budget_squared' => '(kein Kostenrahmen)',
+ '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' => '(kein Kontotyp)',
+ 'opt_group_defaultAsset' => 'Standard-Anlagekonto',
+ 'opt_group_savingAsset' => 'Sparkonten',
+ 'opt_group_sharedAsset' => 'Gemeinsame Bestandskonten',
+ 'opt_group_ccAsset' => 'Kreditkarten',
+ 'notes' => 'Notizen',
// new user:
- 'welcome' => 'Willkommen bei Firefly III!',
- 'submit' => 'Absenden',
- 'getting_started' => 'Erste Schritte',
- 'to_get_started' => 'Es ist schön, dass Sie Firefly III erfolgreich installiert haben. Um mit diesem Tool zu beginnen, geben Sie bitte den Namen Ihrer Bank und das Guthaben Ihres Hauptkontos ein. Machen Sie sich keine Sorgen, wenn Sie mehrere Konten haben. Sie können diese später hinzufügen. Dies ist nur der Anfang.',
- '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' => 'Das war\'s! Sie können fortfahren, indem Sie Absenden drücken. Sie werden zur Startseite von Firefly III gebracht.',
- 'stored_new_accounts_new_user' => 'Yay! Ihre neuen Konten wurden gespeichert.',
+ 'welcome' => 'Willkommen bei Firefly III!',
+ 'submit' => 'Absenden',
+ 'getting_started' => 'Erste Schritte',
+ 'to_get_started' => 'Es ist schön, dass Sie Firefly III erfolgreich installiert haben. Um mit diesem Tool zu beginnen, geben Sie bitte den Namen Ihrer Bank und das Guthaben Ihres Hauptkontos ein. Machen Sie sich keine Sorgen, wenn Sie mehrere Konten haben. Sie können diese später hinzufügen. Dies ist nur der Anfang.',
+ 'savings_balance_text' => 'Firefly III erstellt automatisch ein Sparkonto für Sie. Standardmäßig befindet sich kein Geld auf Ihrem Sparkonto, aber wenn Sie Firefly III das Guthaben mitteilen, wird es als solches gespeichert.',
+ 'finish_up_new_user' => 'Das war\'s! Sie können fortfahren, indem Sie Absenden drücken. Sie werden zur Startseite von Firefly III gebracht.',
+ 'stored_new_accounts_new_user' => 'Yay! Ihre neuen Konten wurden gespeichert.',
// home page:
- 'yourAccounts' => 'Deine Konten',
- 'budgetsAndSpending' => 'Budgets und Ausgaben',
- 'savings' => 'Erspartes',
- 'newWithdrawal' => 'Neue Ausgabe',
- 'newDeposit' => 'Neue Einnahme',
- 'newTransfer' => 'Neue Umbuchung',
- 'bills_to_pay' => 'Unbezahlte Rechnungen',
- 'per_day' => 'Pro Tag',
- 'left_to_spend_per_day' => 'Left to spend per day',
- 'bills_paid' => 'Rechnungen bezahlt',
+ 'yourAccounts' => 'Deine Konten',
+ 'budgetsAndSpending' => 'Kostenrahmen und Ausgaben',
+ 'savings' => 'Erspartes',
+ 'newWithdrawal' => 'Neue Ausgabe',
+ 'newDeposit' => 'Neue Einnahme',
+ 'newTransfer' => 'Neue Umbuchung',
+ 'bills_to_pay' => 'Unbezahlte Rechnungen',
+ 'per_day' => 'Pro Tag',
+ 'left_to_spend_per_day' => 'Verbleibend zum Ausgeben je Tag',
+ 'bills_paid' => 'Rechnungen bezahlt',
// menu and titles, should be recycled as often as possible:
- 'currency' => 'Währung',
- 'preferences' => 'Einstellungen',
- 'logout' => 'Abmelden',
- 'toggleNavigation' => 'Navigation umschalten',
- 'searchPlaceholder' => 'Suchen...',
- 'version' => 'Version',
- 'dashboard' => 'Übersicht',
- 'currencies' => 'Währungen',
- 'accounts' => 'Konten',
- 'Asset account' => 'Girokonto',
- 'Default account' => 'Girokonto',
- 'Expense account' => 'Debitor (Ausgabe)',
- 'Revenue account' => 'Kreditor Einnahme',
- 'Initial balance account' => 'Eröffnungssaldo',
- 'budgets' => 'Budgets',
- 'tags' => 'Tags',
- 'reports' => 'Berichte',
- 'transactions' => 'Überweisungen',
- 'expenses' => 'Ausgaben',
- 'income' => 'Einnahmen / Einkommen',
- 'transfers' => 'Umbuchungen',
- 'moneyManagement' => 'Geldverwaltung',
- 'piggyBanks' => 'Sparschweine',
- 'bills' => 'Rechnungen',
- 'withdrawal' => 'Ausgabe',
- 'opening_balance' => 'Eröffnungsbilanz',
- 'deposit' => 'Einnahme',
- 'account' => 'Konto',
- 'transfer' => 'Umbuchung',
- 'Withdrawal' => 'Ausgabe',
- 'Deposit' => 'Einnahme',
- 'Transfer' => 'Umbuchung',
- 'bill' => 'Rechnung',
- 'yes' => 'Ja',
- 'no' => 'Nein',
- 'amount' => 'Betrag',
- 'overview' => 'Übersicht',
- 'saveOnAccount' => 'Rücklagen für Konto',
- 'unknown' => 'Unbekannt',
- 'daily' => 'Täglich',
- 'monthly' => 'Monatlich',
- 'profile' => 'Profil',
- 'errors' => 'Fehler',
+ 'currency' => 'Währung',
+ 'preferences' => 'Einstellungen',
+ 'logout' => 'Abmelden',
+ 'toggleNavigation' => 'Navigation umschalten',
+ 'searchPlaceholder' => 'Suchen...',
+ 'version' => 'Version',
+ 'dashboard' => 'Übersicht',
+ 'currencies' => 'Währungen',
+ 'accounts' => 'Konten',
+ 'Asset account' => 'Bestandskonto',
+ 'Default account' => 'Bestandskonto',
+ 'Expense account' => 'Debitor (Ausgabe)',
+ 'Revenue account' => 'Kreditor Einnahme',
+ 'Initial balance account' => 'Eröffnungssaldo',
+ 'budgets' => 'Kostenrahmen',
+ 'tags' => 'Schlagwörter',
+ 'reports' => 'Berichte',
+ 'transactions' => 'Buchungen',
+ 'expenses' => 'Ausgaben',
+ 'income' => 'Einnahmen / Einkommen',
+ 'transfers' => 'Umbuchungen',
+ 'moneyManagement' => 'Geldverwaltung',
+ 'piggyBanks' => 'Sparschweine',
+ 'bills' => 'Rechnungen',
+ 'withdrawal' => 'Ausgabe',
+ 'opening_balance' => 'Eröffnungsbilanz',
+ 'deposit' => 'Einnahme',
+ 'account' => 'Konto',
+ 'transfer' => 'Umbuchung',
+ 'Withdrawal' => 'Ausgabe',
+ 'Deposit' => 'Einnahme',
+ 'Transfer' => 'Umbuchung',
+ 'bill' => 'Rechnung',
+ 'yes' => 'Ja',
+ 'no' => 'Nein',
+ 'amount' => 'Betrag',
+ 'overview' => 'Übersicht',
+ 'saveOnAccount' => 'Rücklagen für Konto',
+ 'unknown' => 'Unbekannt',
+ 'daily' => 'Täglich',
+ 'monthly' => 'Monatlich',
+ 'profile' => 'Profil',
+ 'errors' => 'Fehler',
// 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_account' => 'Expense/revenue account report between :start and :end',
- 'report_budget' => 'Budget report between :start and :end',
- 'report_tag' => 'Tag report between :start and :end',
- 'quick_link_reports' => 'Schnellzugriff',
- 'quick_link_default_report' => 'Standard Finanzbericht',
- 'quick_link_audit_report' => 'Transaktionshistorie',
- 'report_this_month_quick' => 'Aktueller Monat, alle Konten',
- 'report_this_year_quick' => 'Aktuelles Jahr, alle Konten',
- 'report_this_fiscal_year_quick' => 'Aktuelles Geschäftsjahr, alle Konten',
- 'report_all_time_quick' => 'Gesamte Zeit, alle Konten',
- 'reports_can_bookmark' => 'Berichte können als Lesezeichen gespeichert werden.',
- 'incomeVsExpenses' => 'Einkommen vs Ausgaben',
- 'accountBalances' => 'Kontostände',
- 'balanceStart' => 'Bilanz zum Beginn der Periode',
- 'balanceEnd' => 'Bilanz zum Ende der Periode',
- 'splitByAccount' => 'Nach Konto aufteilen',
- 'coveredWithTags' => 'Abgedeckt durch Tags',
- 'leftUnbalanced' => 'Left unbalanced',
- 'leftInBudget' => 'Übrig im Budget',
- 'sumOfSums' => 'Summe der Summen',
- 'noCategory' => '(keine Kategorie)',
- 'notCharged' => '(Noch) nicht belastet',
- 'inactive' => 'Inaktiv',
- 'active' => 'Aktiv',
- 'difference' => 'Unterschied',
- 'money_flowing_in' => 'Rein',
- 'money_flowing_out' => 'Raus',
- 'topX' => 'Topnummer :number',
- 'show_full_list' => 'Zeige die gesamte Liste',
- 'show_only_top' => 'Nur die Top :number anzeigen',
- '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_account' => 'Expense/revenue account report',
- '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',
- 'report_preset_ranges' => 'Voreingestellte Bereiche',
- 'shared' => 'Geteilt',
- 'fiscal_year' => 'Geschäftsjahr',
- 'income_entry' => 'Income from account ":name" between :start and :end',
- 'expense_entry' => 'Expenses to account ":name" between :start and :end',
- 'category_entry' => 'Expenses in category ":name" between :start and :end',
- 'budget_spent_amount' => 'Expenses in budget ":budget" between :start and :end',
- 'balance_amount' => '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' => 'Kontostand von :account_name Ende war: :balance',
- 'reports_extra_options' => 'Zusatzoptionen',
- 'report_has_no_extra_options' => 'Dieser Bericht hat keine zusätzliche Optionen',
- 'reports_submit' => 'Zeige Bericht',
- 'end_after_start_date' => 'Enddatum des Berichts muss nach dem Startdatum liegen.',
- 'select_category' => 'Kategorie(n) auswählen',
- 'select_budget' => 'Select budget(s).',
- 'select_tag' => 'Schlagworte wählen.',
- 'income_per_category' => 'Einnahmen pro Kategorie',
- 'expense_per_category' => 'Ausgaben pro Kategorie',
- 'expense_per_budget' => 'Ausgaben pro Budget',
- 'income_per_account' => 'Einnahmen pro Konto',
- 'expense_per_account' => 'Ausgaben pro Konto',
- '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' => 'Der Rest',
- 'income_and_expenses' => 'Einkommen und Ausgaben',
- 'spent_average' => 'Ausgaben (Durchschnitt)',
- 'income_average' => 'Einkommen (Durchschnitt)',
- 'transaction_count' => 'Überweisungen',
- 'average_spending_per_account' => 'Durchschnittsausgaben pro Konto',
- 'average_income_per_account' => 'Durchschnittseinkommen pro Konto',
- 'total' => 'Gesamt',
- 'description' => 'Beschreibung',
- 'sum_of_period' => 'Summe des Zeitraums',
- 'average_in_period' => 'Durchschnitt im Zeitraum',
- 'account_role_defaultAsset' => 'Standard-Anlagekonto',
- 'account_role_sharedAsset' => 'Shared asset account',
- 'account_role_savingAsset' => 'Sparkonto',
- 'account_role_ccAsset' => 'Kreditkarte',
- 'budget_chart_click' => 'Klicken Sie auf einen Budgetnamen in der obigen Tabelle, um ein Diagramm anzuzeigen.',
- 'category_chart_click' => 'Klicken Sie auf einen Kategorienamen in der obigen Tabelle, um ein Diagramm zu sehen.',
- 'in_out_accounts' => 'Earned and spent per combination',
- 'in_out_per_category' => 'Earned and spent per category',
- 'out_per_budget' => 'Spent per budget',
- 'select_expense_revenue' => 'Select expense/revenue account',
+ 'report_default' => 'Standardfinanzbericht zwischen :start und :end',
+ 'report_audit' => 'Übersicht des Buchungsverlaufs zwischen :start und :end',
+ 'report_category' => 'Kategoriebericht zwischen :start und :end',
+ 'report_account' => 'Aufwands-/Erlöskontenbericht zwischen :start and :end',
+ 'report_budget' => 'Finanzbericht zwischen :start and :end',
+ 'report_tag' => 'Schlagwortbericht zwischen :start und :end',
+ 'quick_link_reports' => 'Schnellzugriff',
+ 'quick_link_default_report' => 'Standard Finanzbericht',
+ 'quick_link_audit_report' => 'Transaktionshistorie',
+ 'report_this_month_quick' => 'Aktueller Monat, alle Konten',
+ 'report_this_year_quick' => 'Aktuelles Jahr, alle Konten',
+ 'report_this_fiscal_year_quick' => 'Aktuelles Geschäftsjahr, alle Konten',
+ 'report_all_time_quick' => 'Gesamte Zeit, alle Konten',
+ 'reports_can_bookmark' => 'Berichte können als Lesezeichen gespeichert werden.',
+ 'incomeVsExpenses' => 'Einkommen vs Ausgaben',
+ 'accountBalances' => 'Kontostände',
+ 'balanceStart' => 'Bilanz zum Beginn der Periode',
+ 'balanceEnd' => 'Bilanz zum Ende der Periode',
+ 'splitByAccount' => 'Nach Konto aufteilen',
+ 'coveredWithTags' => 'Mit Schlagwörtern versehen',
+ 'leftUnbalanced' => 'Unausgeglichen belassen',
+ 'leftInBudget' => 'Verblieben im Kostenrahmen',
+ 'sumOfSums' => 'Summe der Summen',
+ 'noCategory' => '(keine Kategorie)',
+ 'notCharged' => '(Noch) nicht belastet',
+ 'inactive' => 'Inaktiv',
+ 'active' => 'Aktiv',
+ 'difference' => 'Unterschied',
+ 'money_flowing_in' => 'Rein',
+ 'money_flowing_out' => 'Raus',
+ 'topX' => 'Topnummer :number',
+ 'show_full_list' => 'Zeige die gesamte Liste',
+ 'show_only_top' => 'Nur die Top :number anzeigen',
+ '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' => 'Finanzbericht',
+ 'report_type_tag' => 'Schlagwortbericht',
+ 'report_type_account' => 'Aufwands-/Erlöskontenbericht',
+ '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',
+ 'report_preset_ranges' => 'Voreingestellte Bereiche',
+ 'shared' => 'Geteilt',
+ 'fiscal_year' => 'Geschäftsjahr',
+ 'income_entry' => 'Einnahmen aus dem Konto „:name” zwischen :start und :end',
+ 'expense_entry' => 'Aufwendungen auf Konto „:name” zwischen :start und :end',
+ 'category_entry' => 'Aufwendungen der Kategorie „:name” zwischen :start und :end',
+ 'budget_spent_amount' => 'Ausgaben im Haushalt „:budget” zwischen :start und :end',
+ 'balance_amount' => 'Ausgaben im Kostenrahmen „:budget” bezahlt von Konto „:account” zwischen :start und :end',
+ 'no_audit_activity' => 'Zwischen :start und :end wurde keine Aktivität auf dem Konto :account_name festgestellt.',
+ 'audit_end_balance' => 'Kontostand von :account_name Ende war: :balance',
+ 'reports_extra_options' => 'Zusatzoptionen',
+ 'report_has_no_extra_options' => 'Dieser Bericht hat keine zusätzliche Optionen',
+ 'reports_submit' => 'Zeige Bericht',
+ 'end_after_start_date' => 'Enddatum des Berichts muss nach dem Startdatum liegen.',
+ 'select_category' => 'Kategorie(n) auswählen',
+ 'select_budget' => 'Kostenpläne auswählen',
+ 'select_tag' => 'Schlagworte wählen.',
+ 'income_per_category' => 'Einnahmen pro Kategorie',
+ 'expense_per_category' => 'Ausgaben pro Kategorie',
+ 'expense_per_budget' => 'Ausgaben Je Kostenrahmen',
+ 'income_per_account' => 'Einnahmen pro Konto',
+ 'expense_per_account' => 'Ausgaben pro Konto',
+ 'expense_per_tag' => 'Ausgaben je Schlagwort',
+ 'income_per_tag' => 'Einnahmen je Schlagwort',
+ 'include_expense_not_in_budget' => 'Enthaltene Ausgaben, die nicht in dem/den ausgewählten Finanzrahmen enthalten sind',
+ 'include_expense_not_in_account' => 'Enthaltene Ausgaben, die nicht in den ausgewählten Konten enthalten sind',
+ 'include_expense_not_in_category' => 'Enthaltene Ausgaben, die nicht in die ausgewählte(n) Kategorie(n) fallen',
+ 'include_income_not_in_category' => 'Enthaltene Erträge, die nicht in die ausgewählte(n) Kategorie(n) fallen',
+ 'include_income_not_in_account' => 'Enthaltene Erträge, die nicht in dem/den ausgewählten Konto(en) enthalten sind',
+ 'include_income_not_in_tags' => 'Enthaltene Erträge, die nicht in den ausgewählten Schlagwörtern enthalten sind',
+ 'include_expense_not_in_tags' => 'Enthaltene Ausgaben, die nicht in den ausgewählten Schlagwörtern enthalten sind',
+ 'everything_else' => 'Der Rest',
+ 'income_and_expenses' => 'Einkommen und Ausgaben',
+ 'spent_average' => 'Ausgaben (Durchschnitt)',
+ 'income_average' => 'Einkommen (Durchschnitt)',
+ 'transaction_count' => 'Überweisungen',
+ 'average_spending_per_account' => 'Durchschnittsausgaben pro Konto',
+ 'average_income_per_account' => 'Durchschnittseinkommen pro Konto',
+ 'total' => 'Gesamt',
+ 'description' => 'Beschreibung',
+ 'sum_of_period' => 'Summe des Zeitraums',
+ 'average_in_period' => 'Durchschnitt im Zeitraum',
+ 'account_role_defaultAsset' => 'Standard-Bestandskonto',
+ 'account_role_sharedAsset' => 'Gemeinsames Bestandskonto',
+ 'account_role_savingAsset' => 'Sparkonto',
+ 'account_role_ccAsset' => 'Kreditkarte',
+ 'budget_chart_click' => 'Klicken Sie auf einen Namen des Kostenrahmen in der obigen Tabelle, um ein Diagramm anzuzeigen.',
+ 'category_chart_click' => 'Klicken Sie auf einen Kategorienamen in der obigen Tabelle, um ein Diagramm zu sehen.',
+ 'in_out_accounts' => 'Einnahmen und Ausgaben je Kombination',
+ 'in_out_per_category' => 'Einnahmen und Ausgaben je Kategorie',
+ 'out_per_budget' => 'Ausgaben je Kostenrahmen',
+ 'select_expense_revenue' => 'Aufwands-/Erlöskonto auswählen',
// charts:
- 'chart' => 'Diagram',
- 'month' => 'Monat',
- 'budget' => 'Budget',
- 'spent' => 'Ausgegeben',
- 'spent_in_budget' => 'Verbraucht im Budget',
- 'left_to_spend' => 'Übrig zum Ausgeben',
- 'earned' => 'Verdient',
- 'overspent' => 'Zuviel ausgegeben',
- 'left' => 'Übrig',
- 'max-amount' => 'Höchstbetrag',
- 'min-amount' => 'Mindestbetrag',
- 'journal-amount' => 'Aktueller Rechnungseintrag',
- 'name' => 'Name',
- 'date' => 'Datum',
- 'paid' => 'Bezahlt',
- 'unpaid' => 'Unbezahlt',
- 'day' => 'Tag',
- 'budgeted' => 'Budgetiert',
- 'period' => 'Zeitraum',
- 'balance' => 'Kontostand',
- 'sum' => 'Summe',
- 'average' => 'Durchschnitt',
- 'balanceFor' => 'Kontostand für :name',
+ 'chart' => 'Diagram',
+ 'month' => 'Monat',
+ 'budget' => 'Kostenrahmen',
+ 'spent' => 'Ausgegeben',
+ 'spent_in_budget' => 'Verbraucht im Kostenrahmen',
+ 'left_to_spend' => 'Verbleibend zum Ausgeben',
+ 'earned' => 'Verdient',
+ 'overspent' => 'Zuviel ausgegeben',
+ 'left' => 'Übrig',
+ 'max-amount' => 'Höchstbetrag',
+ 'min-amount' => 'Mindestbetrag',
+ 'journal-amount' => 'Aktueller Rechnungseintrag',
+ 'name' => 'Name',
+ 'date' => 'Datum',
+ 'paid' => 'Bezahlt',
+ 'unpaid' => 'Unbezahlt',
+ 'day' => 'Tag',
+ 'budgeted' => 'Vorgesehen',
+ 'period' => 'Zeitraum',
+ 'balance' => 'Kontostand',
+ 'sum' => 'Summe',
+ 'average' => 'Durchschnitt',
+ 'balanceFor' => 'Kontostand für „:name”',
// piggy banks:
- 'add_money_to_piggy' => 'Geld zum Sparschwein ":name" hinzufügen',
- 'piggy_bank' => 'Sparschwein',
- 'new_piggy_bank' => 'Neues Sparschwein',
- 'store_piggy_bank' => 'Speichere neues Sparschwein',
- 'stored_piggy_bank' => 'Speichere neues Sparschwein ":name"',
- 'account_status' => 'Kontostatus',
- 'left_for_piggy_banks' => 'Übrig für Sparschweine',
- 'sum_of_piggy_banks' => 'Summe der Sparschweine',
- 'saved_so_far' => 'Gespart',
- 'left_to_save' => 'Zu Sparen',
- 'suggested_amount' => 'Empfohlener monatliche Sparbetrag',
- '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' => 'Sie haben kein Geld, welches Sie in dieses Sparschwein geben können.',
+ 'add_money_to_piggy' => 'Geld zum Sparschwein „:name” übertragen',
+ 'piggy_bank' => 'Sparschwein',
+ 'new_piggy_bank' => 'Neues Sparschwein',
+ 'store_piggy_bank' => 'Speichere neues Sparschwein',
+ 'stored_piggy_bank' => 'Neues Sparschwein „:name” speichern',
+ 'account_status' => 'Kontostatus',
+ 'left_for_piggy_banks' => 'Übrig für Sparschweine',
+ 'sum_of_piggy_banks' => 'Summe der Sparschweine',
+ 'saved_so_far' => 'Gespart',
+ 'left_to_save' => 'Zu Sparen',
+ 'suggested_amount' => 'Empfohlener monatliche Sparbetrag',
+ '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' => 'Sie haben kein Geld, welches Sie in dieses Sparschwein geben können.',
'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',
+ 'update_piggy_title' => 'Sparschwein „:name” aktualisieren',
+ 'updated_piggy_bank' => 'Sparschwein „:name” aktualisiert',
'details' => 'Details',
'events' => 'Ereignisse',
'target_amount' => 'Zielbetrag',
@@ -1002,20 +1004,20 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?',
'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',
+ 'delete_piggy_bank' => 'Sparschwein „:name” löschen',
+ 'cannot_add_amount_piggy' => ':amount konnte nicht zu „:name” hinzugefügt werden.',
+ 'cannot_remove_from_piggy' => ':amount konnte nicht aus „:name” entfernt werden',
+ 'deleted_piggy_bank' => 'Sparschwein „:name” gelöscht',
+ 'added_amount_to_piggy' => ':amount zu „:name” hinzugefügt',
+ 'removed_amount_from_piggy' => ':amount aus „:name” entfernt',
// tags
- '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!',
+ 'delete_tag' => 'Schlagwort „:tag” entfernen',
+ 'deleted_tag' => 'Schlagwort „:tag” entfernt',
+ 'new_tag' => 'Neues Schlagwort erstellen',
+ 'edit_tag' => 'Schlagwort „:tag” bearbeiten',
+ 'updated_tag' => 'Schlagwort „:tag” aktualisiertern',
+ 'created_tag' => 'Schlagwort „:tag” wurde angelegt!',
'transaction_journal_information' => 'Transaktionsinformationen',
'transaction_journal_meta' => 'Metainformationen',
@@ -1023,7 +1025,7 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?',
'number_of_decimals' => 'Anzahl der Nachkommastellen',
// administration
- 'administration' => 'Administration',
+ 'administration' => 'Verwaltung',
'user_administration' => 'Nutzerinformation',
'list_all_users' => 'Alle Benutzer',
'all_users' => 'Alle Benutzer',
@@ -1038,10 +1040,10 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?',
'user_data_information' => 'Nutzerdaten',
'user_information' => 'Benutzerinformationen',
'total_size' => 'Gesamtgröße',
- 'budget_or_budgets' => 'Budget(s)',
- 'budgets_with_limits' => 'Budget(s) mit konfigurierten Betrag',
- 'nr_of_rules_in_total_groups' => ':count_rules rule(s) in :count_groups rule group(s)',
- 'tag_or_tags' => 'Tag(s)',
+ 'budget_or_budgets' => 'Kostenrahmen',
+ 'budgets_with_limits' => 'Kostenrahmen mit mit festgelegtem Betrag',
+ 'nr_of_rules_in_total_groups' => ':count_rules Regel(n) in :count_groups Gruppenregel(n)',
+ 'tag_or_tags' => 'Schlagwörter',
'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 ungewollte Auswirkungen haben kann.',
@@ -1060,72 +1062,73 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?',
'send_test_triggered' => 'Der Test wurde ausgelöst. Überprüfen Sie Ihren Posteingang und die Protokolldateien.',
// 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:',
+ 'journal_link_configuration' => 'Konfiguration der Buchungsverknüpfungen',
+ 'create_new_link_type' => 'Neuen Verknüpfungstyp erstellen',
+ 'store_new_link_type' => 'Neuen Verknüpfungstyp speichern',
+ 'update_link_type' => 'Verknüpfungstyp aktualisieren',
+ 'edit_link_type' => 'Verknüpfungstyp „:name” bearbeiten',
+ 'updated_link_type' => 'Verknüpfungstyp „:name” aktualisiert',
+ 'delete_link_type' => 'Verknüpfungstyp „:name” löschen',
+ 'deleted_link_type' => 'Verknüpfungstyp „:name” gelöscht',
+ 'stored_new_link_type' => 'Neuen Verknüpfungstyp „:name” speichern',
+ 'cannot_edit_link_type' => 'Verknüpfungstyp „:name” konnte nicht bearbeite werden',
+ 'link_type_help_name' => 'd.h. „Kopien”',
+ 'link_type_help_inward' => 'd.h. „Kopien”',
+ 'link_type_help_outward' => 'd.h. „wird kopiert durch”',
+ 'save_connections_by_moving' => 'Sichern Sie die Verknüpfung zwischen diese(r/n) Buchung(en), indem Sie sie auf einen anderen Verknüpfungstyp verschieben:',
'do_not_save_connection' => '(Verbindung nicht speichern)',
- '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',
+ 'link_transaction' => 'Überweisung verknüpfen',
+ 'link_to_other_transaction' => 'Diese Buchung mit einer anderen Zahlung verknüpfen',
+ 'select_transaction_to_link' => 'Wählen Sie eine Buchung aus, um diese Zahlung mit … zu verknüpfen',
'this_transaction' => 'Diese Transaktion',
- 'transaction' => 'Transaction',
+ 'transaction' => 'Überweisung',
'comments' => 'Kommentare',
- 'to_link_not_found' => 'If the transaction you want to link to is not listed, simply enter its ID.',
- 'invalid_link_selection' => 'Diese Transaktionen können nicht verknüpft werden',
- 'journals_linked' => 'Transactions are linked.',
- 'journals_error_linked' => 'These transactions are already linked.',
- 'journal_links' => 'Transaction links',
- 'this_withdrawal' => 'This withdrawal',
+ 'to_link_not_found' => 'Wenn die Überweisung, mit der Sie sie verknüpfen möchten, nicht aufgeführt ist, geben Sie einfach deren ID ein.',
+ 'invalid_link_selection' => 'Diese Buchungen konnten nicht verknüpft werden',
+ 'journals_linked' => 'Buchungen wurden verknüpft.',
+ 'journals_error_linked' => 'Diese Buchungen sind bereits verknüpft.',
+ 'journals_link_to_self' => 'Sie können eine Buchung nicht mit sich selbst verknüpfen.',
+ 'journal_links' => 'Buchungsverknüpfungen',
+ 'this_withdrawal' => 'Diese Ausgabe',
'this_deposit' => 'Diese Einnahme',
'this_transfer' => 'Diese Umbuchung',
- 'overview_for_link' => 'Overview for link type ":name"',
- 'source_transaction' => 'Source transaction',
+ 'overview_for_link' => 'Übersicht für den Verknüpfungstyp „:name”',
+ 'source_transaction' => 'Ursprungsüberweisung',
'link_description' => 'Linkbeschreibung',
- 'destination_transaction' => 'Destination transaction',
- 'delete_journal_link' => 'Delete the link between :source and :destination',
- 'deleted_link' => 'Deleted link',
+ 'destination_transaction' => 'Zielüberweisung',
+ 'delete_journal_link' => 'Löscht die Verknüpfung zwischen :source und :destination',
+ 'deleted_link' => 'Verknüpfung löschen',
// link translations:
- 'relates to_inward' => 'relates to',
- 'is (partially) refunded by_inward' => 'is (partially) refunded by',
- 'is (partially) paid for by_inward' => 'is (partially) paid for by',
- 'is (partially) reimbursed by_inward' => 'is (partially) reimbursed by',
- 'relates to_outward' => 'relates to',
- '(partially) refunds_outward' => '(partially) refunds',
- '(partially) pays for_outward' => '(partially) pays for',
- '(partially) reimburses_outward' => '(partially) reimburses',
+ 'relates to_inward' => 'bezieht sich auf',
+ 'is (partially) refunded by_inward' => 'wird (teilweise) erstattet durch',
+ 'is (partially) paid for by_inward' => 'wird (teilweise) bezahlt von',
+ 'is (partially) reimbursed by_inward' => 'wird (teilweise) erstattet durch',
+ 'relates to_outward' => 'bezieht sich auf',
+ '(partially) refunds_outward' => '(Teil-)Erstattungen',
+ '(partially) pays for_outward' => '(teilweise) bezahlt für',
+ '(partially) reimburses_outward' => '(Teil-)Erstattungen',
// split a transaction:
'splits' => 'Geteilte',
'add_another_split' => 'Eine weitere Aufteilung hinzufügen',
- 'split-transactions' => 'Transaktionen aufteilen',
+ 'split-transactions' => 'Buchungen aufteilen',
'do_split' => 'Aufteilen',
'split_this_withdrawal' => 'Diese Ausgabe aufteilen',
'split_this_deposit' => 'Diese Einnahme aufteilen',
'split_this_transfer' => 'Diese Umbuchung aufteilen',
- 'cannot_edit_multiple_source' => 'You cannot edit splitted transaction #:id with description ":description" because it contains multiple source accounts.',
- 'cannot_edit_multiple_dest' => 'You cannot edit splitted transaction #:id with description ":description" because it contains multiple destination accounts.',
- 'cannot_edit_reconciled' => 'You cannot edit transaction #:id with description ":description" because it has been marked as reconciled.',
+ 'cannot_edit_multiple_source' => 'Sie dürfen die aufgeteilte Buchung #:id mit der Beschreibung „:description” nicht bearbeiten, da sie mehreren Zielkonten zugeordnet ist.',
+ 'cannot_edit_multiple_dest' => 'Sie dürfen die aufgeteilte Buchung #:id mit der Beschreibung „:description” nicht bearbeiten, da sie mehreren Zielkonten zugeordnet ist.',
+ 'cannot_edit_reconciled' => 'Sie dürfen die Buchung #:id mit der Beschreibung „:description” nicht bearbeiten, da sie als „Abgeglichen” gekennzeichnet ist.',
'cannot_edit_opening_balance' => 'Sie können die Eröffnungsbilanz eines Kontos nicht bearbeiten.',
- 'no_edit_multiple_left' => 'You have selected no valid transactions to edit.',
- 'cannot_convert_split_journal' => 'Cannot convert a split transaction',
+ 'no_edit_multiple_left' => 'Sie haben keine gültigen Buchungen zur Bearbeitung ausgewählt.',
+ 'cannot_convert_split_journal' => 'Eine Splitbuchung konnte nicht umgesetzt werden',
// import bread crumbs and titles:
- 'import' => 'Import',
+ 'import' => 'Importieren',
'import_data' => 'Daten importieren',
'import_general_index_file' => 'Datei importieren',
- 'import_from_bunq' => 'Import mit bunq',
+ 'import_from_bunq' => 'Von „bunq” importieren',
'import_using_spectre' => 'Import mit Spectre',
'import_using_plaid' => 'Import mit Plaid',
'import_config_bread_crumb' => 'Import einrichten',
@@ -1139,47 +1142,47 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?',
'sandstorm_not_available' => 'Diese Funktion ist nicht verfügbar, wenn Sie Firefly III in einer Sandstorm.io-Umgebung verwenden.',
// empty lists? no objects? instructions:
- 'no_accounts_title_asset' => 'Let\'s create an asset account!',
- 'no_accounts_intro_asset' => 'You have no asset accounts yet. Asset accounts are your main accounts: your checking account, savings account, shared account or even your credit card.',
- 'no_accounts_imperative_asset' => 'To start using Firefly III you must create at least one asset account. Let\'s do so now:',
- 'no_accounts_create_asset' => 'Create an asset account',
- 'no_accounts_title_expense' => 'Let\'s create an expense account!',
- 'no_accounts_intro_expense' => 'You have no expense accounts yet. Expense accounts are the places where you spend money, such as shops and supermarkets.',
- 'no_accounts_imperative_expense' => 'Expense accounts are created automatically when you create transactions, but you can create one manually too, if you want. Let\'s create one now:',
- 'no_accounts_create_expense' => 'Create an expense account',
- 'no_accounts_title_revenue' => 'Let\'s create a revenue account!',
- 'no_accounts_intro_revenue' => 'You have no revenue accounts yet. Revenue accounts are the places where you receive money from, such as your employer.',
- 'no_accounts_imperative_revenue' => 'Revenue accounts are created automatically when you create transactions, but you can create one manually too, if you want. Let\'s create one now:',
- 'no_accounts_create_revenue' => 'Create a revenue account',
- 'no_budgets_title_default' => 'Let\'s create a budget',
- 'no_budgets_intro_default' => 'Sie haben noch keine Budgets. Budgets werden verwendet, um Ihre Ausgaben in logischen Gruppen zu organisieren, die Sie mit einem Limit versehen können, um Ihre Ausgaben zu begrenzen.',
- 'no_budgets_imperative_default' => 'Budgets are the basic tools of financial management. Let\'s create one now:',
- 'no_budgets_create_default' => 'Ein Budget erstellen',
+ 'no_accounts_title_asset' => 'Lassen Sie uns jetzt ein Bestandskonto anlegen!',
+ 'no_accounts_intro_asset' => 'Sie verfügen noch über keine Bestandskonten. Bestandskonten sind Ihre Hauptkonten: Ihr Girokonto, Sparkonto, Gemeinschaftskonto oder sogar Ihre Kreditkarte.',
+ 'no_accounts_imperative_asset' => 'Um Firefly III nutzen zu können, müssen Sie mindestens ein Bestandskonto anlegen. Lassen Sie uns das jetzt tun:',
+ 'no_accounts_create_asset' => 'Bestandskonto anlegen',
+ 'no_accounts_title_expense' => 'Lassen Sie uns jetzt ein Spesenkonto anlegen!',
+ 'no_accounts_intro_expense' => 'Sie besitzen noch keine Spesenkonten. Aufwandskonten sind die Orte, an denen Sie Geld ausgeben, wie z.B. in Geschäften und Supermärkten.',
+ 'no_accounts_imperative_expense' => 'Spesenkonten werden beim Anlegen von Buchungen automatisch angelegt, können aber auch manuell angelegt werden. Lassen Sie uns jetzt eines erstellen:',
+ 'no_accounts_create_expense' => 'Spesenkonto anlegen',
+ 'no_accounts_title_revenue' => 'Lassen Sie uns jetzt ein Einkommenskonto anlegen!',
+ 'no_accounts_intro_revenue' => 'Sie verfügen noch über keine Ertragskonten. Ertragskonten sind die Einrichtungen, von denen Sie Geld erhalten, wie z.B. von Ihrem Arbeitgeber.',
+ 'no_accounts_imperative_revenue' => 'Ertragskonten werden beim Anlegen von Buchungen automatisch angelegt, können aber auch manuell angelegt werden. Lassen Sie uns jetzt eines erstellen:',
+ 'no_accounts_create_revenue' => 'Neues Erlöskonto erstellen',
+ 'no_budgets_title_default' => 'Lassen Sie uns jetzt ein Haushaltsplan erstellen',
+ 'no_budgets_intro_default' => 'Sie verfügen noch über keine Kostenrahmen. Kostenrahmen werden verwendet, um Ihre Ausgaben in logische Gruppen zu gliedern, die Sie mit einem weichen Obergrenzemlimit versehen können, um Ihre Ausgaben zu begrenzen.',
+ 'no_budgets_imperative_default' => 'Die Kostenrahmen sind die grundlegenden Instrumente des Finanzmanagements. Lassen Sie uns jetzt einen erstellen:',
+ 'no_budgets_create_default' => 'Kostenrahmen erstellen',
'no_categories_title_default' => 'Erstellen wir eine Kategorie!',
- '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_intro_default' => 'Sie verfügen noch über keine Kategorien. Kategorien werden verwendet, um Ihre Buchungen zu verfeinern und mit der entsprechenden Kategorie zu kennzeichnen.',
+ 'no_categories_imperative_default' => 'Kategorien werden automatisch angelegt, wenn Sie Buchungen anlegen, können aber auch manuell angelegt werden. Lassen Sie uns jetzt eine erstellen:',
'no_categories_create_default' => 'Eine Kategorie erstellen',
- 'no_tags_title_default' => 'Erstellen wir einen 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' => 'Ein neues Tag erstellen',
- 'no_transactions_title_withdrawal' => 'Let\'s create an expense!',
+ 'no_tags_title_default' => 'Lassen Sie uns jetzt ein Schlagwort anlegen!',
+ 'no_tags_intro_default' => 'Sie haben noch keine Schlagwörter angelegt. Schlagwörter werden verwendet, um Ihre Umsätze zu verfeinern und mit bestimmten Schlüsselwörtern zu versehen.',
+ 'no_tags_imperative_default' => 'Schlagwörter werden automatisch erstellt, wenn Sie Buchungen anlegen, aber Sie können sie auch manuell erstellen. Lassen Sie uns jetzt eines erstellen:',
+ 'no_tags_create_default' => 'Neues Schlagwort erstellen',
+ 'no_transactions_title_withdrawal' => 'Lassen Sie uns jetzt eine Auslage erstellen!',
'no_transactions_intro_withdrawal' => 'Sie haben noch keine Ausgaben verbucht. Sie sollten Ausgabenseinträge erstellen, um Ihre Finanzen zu verwalten.',
'no_transactions_imperative_withdrawal' => 'Haben Sie Geld ausgegeben? Dann sollten Sie es aufschreiben:',
'no_transactions_create_withdrawal' => 'Eine neue Ausgabe erstellen',
- 'no_transactions_title_deposit' => 'Let\'s create some income!',
+ 'no_transactions_title_deposit' => 'Lassen Sie uns nun einige Einnahmen erstellen!',
'no_transactions_intro_deposit' => 'Sie haben noch keine Einnahmen verbucht. Sie sollten Einkommenseinträge erstellen, um Ihre Finanzen zu verwalten.',
'no_transactions_imperative_deposit' => 'Haben Sie Geld erhalten? Dann sollten Sie es aufschreiben:',
'no_transactions_create_deposit' => 'Eine Einnahme erstellen',
'no_transactions_title_transfers' => 'Erstellen wir eine Umbuchung!',
- 'no_transactions_intro_transfers' => 'Sie haben noch keine Umbuchungen. Wenn Sie Geld zwischen Ihren Konten bewegen, wird es als Umbuchung erfasst.',
+ 'no_transactions_intro_transfers' => 'Sie verfügen noch über keine Umbuchungen. Wenn Sie Geld zwischen Bestandskonten verschieben, wird es als Umbuchung erfasst.',
'no_transactions_imperative_transfers' => 'Haben Sie Geld umgebucht? Dann sollten Sie es eintragen:',
'no_transactions_create_transfers' => 'Eine Umbuchung erstellen',
- 'no_piggies_title_default' => 'Let\'s create a piggy bank!',
+ 'no_piggies_title_default' => 'Lassen Sie uns nun ein Sparschwein erstellen!',
'no_piggies_intro_default' => 'Sie haben noch keine Sparscheine. Sie können Sparschweine erstellen, um Ihre Ersparnisse zu teilen und den Überblick darüber zu behalten, wofür Sie sparen.',
'no_piggies_imperative_default' => 'Haben Sie Dinge, auf die Sie sparen? Erstellen Sie eine Sparschwein und behalten Sie den Überblick:',
'no_piggies_create_default' => 'Ein neues Sparschwein erstellen',
- 'no_bills_title_default' => 'Let\'s create a bill!',
+ 'no_bills_title_default' => 'Lassen Sie uns nun eine Rechnung erstellen!',
'no_bills_intro_default' => 'Du hast noch keine Rechnungen. Sie können Rechnungen erstellen, um die laufenden Ausgaben, wie zum Beispiel Ihre Versicherung oder Miete, nachzuverfolgen.',
'no_bills_imperative_default' => 'Haben Sie regelmäßige Rechnungen? Erstellen Sie eine Rechnung und verfolgen Sie Ihre Zahlungen:',
'no_bills_create_default' => 'Eine Rechnung erstellen',
diff --git a/resources/lang/de_DE/form.php b/resources/lang/de_DE/form.php
index 77eede5c96..1483646bdf 100644
--- a/resources/lang/de_DE/form.php
+++ b/resources/lang/de_DE/form.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// new user:
@@ -39,24 +39,24 @@ return [
'attachments' => 'Anhänge',
'journal_amount' => 'Betrag',
'journal_source_account_name' => 'Kreditor (Quelle)',
- 'journal_source_account_id' => 'Girokonto (Quelle)',
+ 'journal_source_account_id' => 'Bestandskonto (Quelle)',
'BIC' => 'BIC',
'verify_password' => 'Passwortsicherheit überprüfen',
'source_account' => 'Quellkonto',
'destination_account' => 'Zielkonto',
- 'journal_destination_account_id' => 'Girokonto (Ziel)',
- 'asset_destination_account' => 'Girokonto (Ziel)',
- 'asset_source_account' => 'Girokonto (Quelle)',
+ 'journal_destination_account_id' => 'Bestandskonto (Ziel)',
+ 'asset_destination_account' => 'Bestandskonto (Ziel)',
+ 'asset_source_account' => 'Bestandskonto (Quelle)',
'journal_description' => 'Beschreibung',
'note' => 'Notizen',
'split_journal' => 'Diese Überweisung aufteilen',
'split_journal_explanation' => 'Diese Überweisung in mehrere Teile aufteilen',
'currency' => 'Währung',
- 'account_id' => 'Girokonto',
- 'budget_id' => 'Budget',
+ 'account_id' => 'Bestandskonto',
+ 'budget_id' => 'Kostenrahmen',
'openingBalance' => 'Eröffnungsbilanz',
- 'tagMode' => 'Tag-Modus',
- 'tag_position' => 'Tag location',
+ 'tagMode' => 'Schlagwort-Modus',
+ 'tag_position' => 'Schlagwort-Speicherort',
'virtualBalance' => 'Virtueller Kontostand',
'targetamount' => 'Zielbetrag',
'accountRole' => 'Rolle des Kontos',
@@ -84,7 +84,7 @@ return [
'destination_account_expense' => 'Zielkonto (Unkostenkonto)',
'destination_account_asset' => 'Zielkonto (Bestandskonto)',
'source_account_revenue' => 'Quellkonto (Ertragskonto)',
- 'type' => 'Type',
+ 'type' => 'Typ',
'convert_Withdrawal' => 'Ändere zu Abhebung',
'convert_Deposit' => 'Ändere zu Einzahlung',
'convert_Transfer' => 'In Umbuchung umwandeln',
@@ -95,15 +95,15 @@ return [
'book_date' => 'Buchungsdatum',
'process_date' => 'Bearbeitungsdatum',
'category' => 'Kategorie',
- 'tags' => 'Tags',
+ 'tags' => 'Schlagwörter',
'deletePermanently' => 'Dauerhaft löschen',
'cancel' => 'Abbrechen',
'targetdate' => 'Zieldatum',
'startdate' => 'Startdatum',
- 'tag' => 'Tag',
+ 'tag' => 'Schlagwort',
'under' => 'Unter',
'symbol' => 'Zeichen',
- 'code' => 'Code',
+ 'code' => 'Schlüssel',
'iban' => 'IBAN',
'accountNumber' => 'Kontonummer',
'creditCardNumber' => 'Kreditkartennummer',
@@ -122,7 +122,7 @@ return [
'filename' => 'Dateiname',
'mime' => 'MIME-Typ',
'size' => 'Größe',
- 'trigger' => 'Trigger',
+ 'trigger' => 'Auslöser',
'stop_processing' => 'Verarbeitung beenden',
'start_date' => 'Anfang des Bereichs',
'end_date' => 'Ende des Bereichs',
@@ -132,44 +132,44 @@ return [
'include_attachments' => 'Hochgeladene Anhänge hinzufügen',
'include_old_uploads' => 'Importierte Daten hinzufügen',
'accounts' => 'Exportiere die Überweisungen von diesem Konto',
- 'delete_account' => 'Lösche Konto ":name"',
- 'delete_bill' => 'Lösche Rechnung ":name"',
- 'delete_budget' => 'Lösche Budget ":name"',
- 'delete_category' => 'Lösche Kategorie ":name"',
- 'delete_currency' => 'Lösche Währung ":name"',
+ 'delete_account' => 'Konto „:name” löschen',
+ 'delete_bill' => 'Rechnung „:name” löschen',
+ 'delete_budget' => 'Kostenrahmen „:name” löschen',
+ 'delete_category' => 'Kategorie „:name” löschen',
+ 'delete_currency' => 'Währung „:name” löschen',
'delete_journal' => 'Lösche Überweisung mit Beschreibung ":description"',
- 'delete_attachment' => 'Lösche Anhang ":name"',
+ 'delete_attachment' => 'Anhang „:name” löschen',
'delete_rule' => 'Lösche Regel ":title"',
'delete_rule_group' => 'Lösche Regelgruppe ":title"',
- 'delete_link_type' => 'Delete link type ":name"',
+ 'delete_link_type' => 'Verknüpfungstyp „:name” löschen',
'delete_user' => 'Benutzer ":email" löschen',
'user_areYouSure' => 'Wenn Sie den Benutzer ":email" löschen, ist alles weg. Es gibt keine Sicherung, Wiederherstellung oder ähnliches. Wenn Sie sich selbst löschen, verlieren Sie den Zugriff auf diese Instanz von Firefly III.',
- 'attachment_areYouSure' => 'Sind Sie sicher, dass Sie den Anhang ":name" löschen möchten?',
- 'account_areYouSure' => 'Sind Sie sicher, dass Sie das Konto ":name" löschen möchten?',
- 'bill_areYouSure' => 'Sind Sie sicher, dass Sie die Rechnung ":name" löschen möchten?',
+ 'attachment_areYouSure' => 'Möchten Sie den Anhang „:name” wirklich löschen?',
+ 'account_areYouSure' => 'Möchten Sie das Konto „:name” wirklich löschen?',
+ 'bill_areYouSure' => 'Möchten Sie die Rechnung „:name” wirklich löschen?',
'rule_areYouSure' => 'Sind Sie sicher, dass Sie die Regel mit dem Titel ":title" löschen möchten?',
'ruleGroup_areYouSure' => 'Sind Sie sicher, dass sie die Regelgruppe ":title" löschen möchten?',
- 'budget_areYouSure' => 'Sind Sie sicher, dass Sie das Budget ":name" löschen möchten?',
- 'category_areYouSure' => 'Sind Sie sicher, dass Sie die Kategorie ":name" löschen möchten?',
- 'currency_areYouSure' => 'Sind Sie sicher, dass Sie die Währung ":name" löschen möchten?',
- 'piggyBank_areYouSure' => 'Sind Sie sicher, dass Sie das Sparschwein ":name" löschen möchten?',
+ 'budget_areYouSure' => 'Möchten Sie den Kostenrahmen „:name” wirklich löschen?',
+ 'category_areYouSure' => 'Möchten Sie die Kategorie „:name” wirklich löschen?',
+ 'currency_areYouSure' => 'Möchten Sie die Währung „:name” wirklich löschen?',
+ 'piggyBank_areYouSure' => 'Möchten Sie das Sparschwein „:name” wirklich löschen?',
'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?',
+ 'tag_areYouSure' => 'Möchten Sie das Schlagwort „:name” wirklich löschen?',
'journal_link_areYouSure' => 'Sind Sie sicher, dass Sie die Verknüpfung zwischen :source und :destination löschen möchten?',
- 'linkType_areYouSure' => 'Are you sure you want to delete the link type ":name" (":inward" / ":outward")?',
+ 'linkType_areYouSure' => 'Möchten Sie den Verknüpfungstyp „:name” („:inward”/„:outward”) wirklich löschen?',
'permDeleteWarning' => 'Das Löschen von Dingen in Firefly III ist dauerhaft und kann nicht rückgängig gemacht werden.',
'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_connections' => 'Die einzige Transaktion, die mit diesem Verknüpfungstyp verknüpft ist, verliert diese Verbindung. • Alle :count Buchungen, die mit diesem Verknüpfungstyp verknüpft sind, verlieren ihre Verbindung.',
'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.',
- 'budget_keep_transactions' => 'Die eine Überweisung, die mit diesem Budget verknüpft ist, wird nicht gelöscht. | Keines der :count Budgets, die mit dieser Rechnung verknüpft sind, werden gelöscht.',
+ 'budget_keep_transactions' => 'Die einzige Buchung, die mit dieser Rechnung verknüpft ist, wird nicht gelöscht. | Keine der :count Buchungen, die mit dieser Rechnung verknüpft sind, werden gelöscht.',
'category_keep_transactions' => 'Die eine Überweisungen, die mit dieser Kategorie verknüpft ist, wird nicht gelöscht. | Keine der :count Kategorien, die mit dieser Rechnung verknüpft sind, werden gelöscht.',
- 'tag_keep_transactions' => 'Die einzige Überweisung, die mit diesem Tag verknüpft ist, wird nicht gelöscht. | Keiner der :count Tags, die mit dieser Rechnung verknüpft sind, werden gelöscht.',
+ 'tag_keep_transactions' => 'Die einzige Buchung, die mit diesem Schlagwort verbunden ist, wird nicht gelöscht. • Alle :count Vorgänge, die mit diesem Schlagwort verbunden sind, werden nicht gelöscht.',
'check_for_updates' => 'Nach Updates suchen',
'email' => 'E-Mail Adresse',
@@ -204,7 +204,7 @@ return [
'payment_date' => 'Zahlungsdatum',
'invoice_date' => 'Rechnungsdatum',
'internal_reference' => 'Interner Verweis',
- 'inward' => 'Inward description',
- 'outward' => 'Outward description',
+ 'inward' => 'Beschreibung der Eingänge',
+ 'outward' => 'Beschreibung der Ausgänge',
'rule_group_id' => 'Regelgruppe',
];
diff --git a/resources/lang/de_DE/import.php b/resources/lang/de_DE/import.php
index e9c578b0bd..73f51d52fd 100644
--- a/resources/lang/de_DE/import.php
+++ b/resources/lang/de_DE/import.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
// status of import:
'status_wait_title' => 'Bitte warten...',
- 'status_wait_text' => 'Diese Box wird gleich verschwinden.',
+ 'status_wait_text' => 'Diese Box wird gleich ausgeblendet.',
'status_fatal_title' => 'Ein schwerwiegender Fehler ist aufgetreten',
'status_fatal_text' => 'Es ist ein schwerwiegender Fehler aufgetreten und die Importroutine kann nicht fortgeführt werden. Bitte sehen Sie sich die Erklärung in rot unten an.',
'status_fatal_more' => 'Wenn der Fehler eine Zeitüberschreitung ist, wird der Import mittendrin gestoppt. Bei einigen Serverkonfigurationen wird lediglich der Server gestoppt, während der Import im Hintergrund ausgeführt wird. Um dies zu überprüfen, überprüfen Sie die Protokolldateien. Wenn das Problem weiterhin besteht, sollten Sie stattdessen den Import über die Befehlszeile in Erwägung ziehen.',
'status_ready_title' => 'Der Import ist startbereit',
'status_ready_text' => 'Der Import ist bereit zu starten. Alle Einstellungen wurden von Ihnen erledigt. Bitte laden Sie die Konfigurationsdatei herunter. Diese wird Ihnen beim Import helfen, sollte dieser nicht wie gewünscht verlaufen. Um den Import tatsächlich zu starten führen Sie den folgenden Befehl in der Konsole aus oder nutzen Sie den Web-basierten Import. Abhängig von ihrer Konfiguration wird Ihnen der Konsolenimport mehr Rückmeldungen geben.',
'status_ready_noconfig_text' => 'Der Import ist bereit zu starten. Alle Einstellungen wurden von Ihnen erledigt. Um den Import tatsächlich zu starten führen Sie den folgenden Befehl in der Konsole aus oder nutzen Sie den Web-basierten Import. Abhängig von ihrer Konfiguration wird Ihnen der Konsolenimport mehr Rückmeldungen geben.',
- 'status_ready_config' => 'Download der Konfiguration',
- 'status_ready_start' => 'Starte den Import',
+ 'status_ready_config' => 'Konfiguration herunterladen',
+ 'status_ready_start' => 'Importieren starten',
'status_ready_share' => 'Bitte denken Sie darüber nach ihre Konfiguration herunterzuladen und in der Übersicht der Import-Einstellungen zu teilen. Dieses erlaubt es anderen Nutzern von Firefly III ihre Daten unkomplizierter zu importieren.',
'status_job_new' => 'Die Aufgabe ist neu.',
'status_job_configuring' => 'Der Import wird konfiguriert.',
'status_job_configured' => 'Der Import ist konfiguriert.',
- 'status_job_running' => 'Der Import läuft.. Bitte warten..',
+ 'status_job_running' => 'Import wird ausgeführt … Bitte warten …',
'status_job_error' => 'Ein Fehler ist aufgetreten.',
- 'status_job_finished' => 'Der Import ist abgeschlossen!',
- 'status_running_title' => 'Der Import läuft',
- 'status_running_placeholder' => 'Bitte warten Sie auf eine Aktualisierung...',
+ 'status_job_finished' => 'Import abgeschlossen!',
+ 'status_running_title' => 'Import wird ausgeführt',
+ 'status_running_placeholder' => 'Bitte auf die Aktualisierung warten …',
'status_finished_title' => 'Importassistent abgeschlossen',
'status_finished_text' => 'Der Importassistent hat Ihre Daten importiert.',
- 'status_errors_title' => 'Fehler beim Import',
+ 'status_errors_title' => 'Fehler beim Importieren',
'status_errors_single' => 'Beim Import ist ein Fehler aufgetreten. Dieser scheint aber nicht schwerwiegend zu sein.',
- 'status_errors_multi' => 'Beim Import sind einige Fehler aufgetreten. Diese scheinen aber nicht schwerwiegend zu sein.',
+ 'status_errors_multi' => 'Beim Importieren sind einige Fehler aufgetreten. Diese scheinen aber nicht schwerwiegend zu sein.',
'status_bread_crumb' => 'Importstatus',
'status_sub_title' => 'Importstatus',
'config_sub_title' => 'Import einrichten',
- 'status_finished_job' => 'Die :count importierten Transaktionen finden Sie im Tag :tag.',
+ 'status_finished_job' => 'Die importierten :count Überweisungen finden Sie im Schlagwort :tag.',
'status_finished_no_tag' => 'Firefly III hat keine Daten aus Ihrer Import-Datei gesammelt.',
- 'import_with_key' => 'Import mit Schlüssel \':key\'',
+ 'import_with_key' => 'Mit Schlüssel „:key” importieren',
// file, upload something
- 'file_upload_title' => 'Import-Setup (1/4) - Laden Sie Ihre Datei hoch',
+ 'file_upload_title' => 'Import einrichten (1/4) • Ihre Datei hochladen',
'file_upload_text' => 'Dieser Assistent hilft Ihnen, Dateien von Ihrer Bank in Firefly III zu importieren. Bitte sehen Sie sich die Hilfeseiten in der oberen rechten Ecke an.',
'file_upload_fields' => 'Felder',
'file_upload_help' => 'Datei auswählen',
@@ -66,14 +67,14 @@ return [
'import_file_type_csv' => 'CSV (Kommagetrennte Werte)',
// file, initial config for CSV
- 'csv_initial_title' => 'Import Einrichten (2/4) - Grundlegende Einstellungen',
+ 'csv_initial_title' => 'Import einrichten (2/4) • Grundlegende Einrichtung des CSV-Imports',
'csv_initial_text' => 'Um Ihre Datei korrekt importieren zu können, überprüfen Sie bitte die folgenden Optionen.',
'csv_initial_box' => 'Standard CSV Importeinstellungen',
'csv_initial_box_title' => 'Standard CSV Importeinstellungen',
- 'csv_initial_header_help' => 'Hier auswählen, wenn die ersten Zeilen der CSV-Datei die Spaltenüberschriften sind.',
+ 'csv_initial_header_help' => 'Hier auswählen, wenn die erste Zeilen der CSV-Datei die Spaltenüberschriften enthält.',
'csv_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.',
'csv_initial_delimiter_help' => 'Wählen Sie das Trennzeichen, welches in ihrer Datei genutzt wird. Wenn Sie nicht sicher sind ist Komma die sicherste Option.',
- 'csv_initial_import_account_help' => 'Wenn ihre CSV-Datei KEINE Informationen über ihre Girokonten enthält, nutzen Sie bitte diese Dropdown-Liste um anzugeben, zu welchem Girokonto die Transaktionen in der CSV-Datei gehören.',
+ 'csv_initial_import_account_help' => 'Wenn ihre CSV-Datei KEINE Informationen über ihre Bestandskont(o/n) enthält, nutzen Sie bitte diese Auswahlmenü um anzugeben, zu welchem Bestandskonto die Buchungen in der CSV-Datei gehören.',
'csv_initial_submit' => 'Fortfahren mit Schritt 3/4',
// file, new options:
@@ -83,7 +84,7 @@ return [
'file_match_bills_description' => 'Ordnen Sie Ihre Rechnungen den neu erstellten Ausgaben zu. Beachten Sie, dass dadurch der Import erheblich verlangsamt wird.',
// file, roles config
- 'csv_roles_title' => 'Import Einrichten (3/4) - Jeder Spalte eine Rolle zuordnen',
+ 'csv_roles_title' => 'Import einrichten (3/4) • Funktion jeder Spalte festlegen',
'csv_roles_text' => 'Jede Spalte in Ihrer CSV-Datei enthält bestimmte Daten. Bitte geben Sie an, welche Art von Daten enthalten sind. Die Option "Daten zuordnen" bedeutet, dass jeder Eintrag in der Spalte mit einem Wert aus Ihrer der Datenbank ersetzt wird. Eine oft zugeordnete Spalte ist die Spalte, welche die IBAN des fremden Kontos enthält. Diese können leicht mit bereits angelegten IBANs in Ihrer Datenbank verglichen werden.',
'csv_roles_table' => 'Tabelle',
'csv_roles_column_name' => 'Name der Spalte',
@@ -97,19 +98,20 @@ return [
// not csv, but normal warning
'roles_warning' => 'Markieren Sie mindestens die Spalte, die den jeweiligen Betrag enthält. Darüber hinaus sollten eine Spalte für die Beschreibung, das Datum und das Gegenkonto ausgewählt werden.',
'foreign_amount_warning' => 'Wenn Sie eine Spalte als Fremdwährung markieren, müssen Sie auch die Spalte festlegen, welche angibt, welche Währung es ist.',
+
// file, map data
- 'file_map_title' => 'Import Einrichten (4/4) - Import mit bereits vorhandenen Daten verknüpfen',
+ 'file_map_title' => 'Import einrichten (4/4) - Importdaten mit Firefly III-Daten verknüpfen',
'file_map_text' => 'In den folgenden Tabellen zeigt der linke Wert Informationen, die sich in Ihrer hochgeladenen Datei befinden. Es ist Ihre Aufgabe, diesen Wert, wenn möglich, einem bereits in der Datenbank vorhandenen zuzuordnen. Firefly wird sich an diese Zuordnung halten. Wenn kein Wert für die Zuordnung vorhanden ist oder Sie den bestimmten Wert nicht abbilden möchten, wählen Sie nichts aus.',
'file_map_field_value' => 'Feldwert',
'file_map_field_mapped_to' => 'Zugeordnet zu',
'map_do_not_map' => '(keine Zuordnung)',
- 'file_map_submit' => 'Starte den Import',
+ 'file_map_submit' => 'Import starten',
'file_nothing_to_map' => 'Ihree Datei enthält keine Daten, die bestehenden Werten zugeordnet werden können. Klicken Sie "Import starten" um fortzufahren.',
// map things.
'column__ignore' => '(diese Spalte ignorieren)',
'column_account-iban' => 'Bestandskonto (IBAN)',
- 'column_account-id' => 'Eigenes Konto',
+ 'column_account-id' => 'Kennung des Bestandkontos (passend zu FF3)',
'column_account-name' => 'Bestandskonto (Name)',
'column_amount' => 'Betrag',
'column_amount_foreign' => 'Betrag (in Fremdwährung)',
@@ -117,9 +119,9 @@ return [
'column_amount_credit' => 'Betrag (Guthaben-Spalte)',
'column_amount-comma-separated' => 'Betrag (Komma als Dezimaltrennzeichen)',
'column_bill-id' => 'Rechnung (ID übereinstimmend mit FF3)',
- 'column_bill-name' => 'Name der Rechnung',
- 'column_budget-id' => 'Budget (ID übereinstimmend mit FF3)',
- 'column_budget-name' => 'Budgetname',
+ 'column_bill-name' => 'Rechnungsname',
+ 'column_budget-id' => 'Kostenrahmen-ID (übereinstimmend mit FF3)',
+ 'column_budget-name' => 'Kostenrahmenname',
'column_category-id' => 'Kategorie (ID übereinstimmend mit FF3)',
'column_category-name' => 'Name der Kategorie',
'column_currency-code' => 'Währungsstandard (ISO 4217)',
@@ -131,28 +133,40 @@ return [
'column_date-book' => 'Buchungsdatum der Überweisung',
'column_date-process' => 'Verarbeitungsdatum der Überweisung',
'column_date-transaction' => 'Datum',
+ 'column_date-due' => 'Buchungsfälligkeit',
+ 'column_date-payment' => 'Buchungsdatum',
+ 'column_date-invoice' => 'Buchungsdatum der Rechnung',
'column_description' => 'Beschreibung',
'column_opposing-iban' => 'Zielkonto (IBAN)',
+ 'column_opposing-bic' => 'Zielkonto (BIC)',
'column_opposing-id' => 'Zielkonto (vgl. ID in FF3)',
'column_external-id' => 'Externe ID',
'column_opposing-name' => 'Zielkonto (Name)',
- 'column_rabo-debit-credit' => 'Rabobank specific debit/credit indicator',
- 'column_ing-debit-credit' => 'ING specific debit/credit indicator',
- 'column_sepa-ct-id' => 'SEPA Transaktions-ID',
- 'column_sepa-ct-op' => 'SEPA Transaktionspartner',
- 'column_sepa-db' => 'SEPA-Lastschrift',
- 'column_tags-comma' => 'Tags (durch Komma getrennt)',
- 'column_tags-space' => 'Tags (durch Leerzeichen getrennt)',
+ 'column_rabo-debit-credit' => 'Rabobank-spezifisches Belastungs- und Kreditkennzeichen',
+ 'column_ing-debit-credit' => 'ING-spezifisches Belastungs- und Kreditkennzeichen',
+ 'column_sepa-ct-id' => 'SEPA • Ende-zu-Ende-Identifikationsnummer',
+ 'column_sepa-ct-op' => 'SEPA • Zielkonto-Identifikationsnummer',
+ 'column_sepa-db' => 'SEPA - Mandatskennung',
+ 'column_sepa-cc' => 'SEPA • Verrechnungsschlüssel',
+ 'column_sepa-ci' => 'SEPA • Identifikationsnummer des Zahlungsempfängers',
+ 'column_sepa-ep' => 'SEPA • Externer Verwendungszweck',
+ 'column_sepa-country' => 'SEPA • Landesschlüssel',
+ 'column_tags-comma' => 'Schlagwörter (durch Kommata getrennt)',
+ 'column_tags-space' => 'Schlagwörter (durch Leerzeichen getrennt)',
'column_account-number' => 'Bestandskonto (Kontonr.)',
'column_opposing-number' => 'Zielkonto (Kontonr.)',
'column_note' => 'Notiz(en)',
+ 'column_internal-reference' => 'Interne Referenz',
// prerequisites
'prerequisites' => 'Voraussetzungen',
// bunq
'bunq_prerequisites_title' => 'Voraussetzungen für einen Import von bunq',
- 'bunq_prerequisites_text' => 'Um aus bunq importieren zu können, benötigen Sie einen API-Schlüssel. Sie können diesen in der App bekommen.',
+ 'bunq_prerequisites_text' => 'Um aus „bunq” importieren zu können, benötigen Sie einen API-Schlüssel. Sie können diesen über die App bekommen. Bitte beachten Sie, dass sich die Importfunktion von „bunq” noch im BETA-Stadium befindet. Es wurde nur gegen die Sandbox-API getestet.',
+ 'bunq_do_import' => 'Ja, von diesem Konto importieren',
+ 'bunq_accounts_title' => 'Bunq-Konten',
+ 'bunq_accounts_text' => 'Dies sind jene Konten, die mit Ihrem „bunq”-Konto verknüpft sind. Bitte wählen Sie die Konten aus, von denen Sie importieren möchten, und in welches Konto die Buchungen importiert werden sollen.',
// Spectre
'spectre_title' => 'Importieren mit Spectre',
@@ -160,7 +174,7 @@ return [
'spectre_prerequisites_text' => 'Um Daten mithilfe der Spectre-API importieren zu können, müssen einige Daten angegeben werden. Diese finden Sie auf der Secrets-Seite bei Saltedge.',
'spectre_enter_pub_key' => 'Der Import funktioniert nur, wenn Sie diesen öffentlichen Schlüssel auf Ihrer Sicherheitsseite eingeben.',
'spectre_accounts_title' => 'Import-Konten auswählen',
- 'spectre_accounts_text' => 'Die Konten auf der linken Seite wurde von Spectre gefunden und können für den Import verwendet werden. Ordnen Sie jeweils ein eigenes Konto zu, in das die Transktionen importiert werden sollen. Konten ohne Häkchen werden beim Import ignoriert.',
+ 'spectre_accounts_text' => 'Die Konten auf der linken Seite wurde von Spectre gefunden und können für den Import verwendet werden. Ordnen Sie jeweils ein eigenes Konto zu, in das die Buchungen importiert werden sollen. Nicht ausgwählte Konten werden beim Import ignoriert.',
'spectre_do_import' => 'Ja, von diesem Konto importieren',
// keys from "extra" array:
@@ -173,7 +187,7 @@ return [
'spectre_extra_key_account_number' => 'Kontonummer',
'spectre_extra_key_blocked_amount' => 'Gesperrter Betrag',
'spectre_extra_key_available_amount' => 'Verfügbarer Betrag',
- 'spectre_extra_key_credit_limit' => 'Kreditlimit',
+ 'spectre_extra_key_credit_limit' => 'Kreditrahmen',
'spectre_extra_key_interest_rate' => 'Zinssatz',
'spectre_extra_key_expiry_date' => 'Ablaufdatum',
'spectre_extra_key_open_date' => 'Anfangsdatum',
@@ -185,6 +199,5 @@ return [
'spectre_extra_key_transactions_count' => 'Anzahl Transaktionen',
// various other strings:
- 'imported_from_account' => 'Von ":account" importiert',
+ 'imported_from_account' => 'Von „:account” importiert',
];
-
diff --git a/resources/lang/de_DE/intro.php b/resources/lang/de_DE/intro.php
index da53e9f9b9..b4330dd585 100644
--- a/resources/lang/de_DE/intro.php
+++ b/resources/lang/de_DE/intro.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// index
'index_intro' => 'Wilkommen auf der Startseite von Firefly III. Bitte nehmen Sie sich die Zeit, um ein Gefühl dafür zu bekommen, wie Firefly III funktioniert.',
- 'index_accounts-chart' => 'Dieses Diagramm zeigt den aktuellen Saldo Ihrer Anlagenkonten. Sie können die anzuzeigenden Konten in Ihren Einstellungen auswählen.',
+ 'index_accounts-chart' => 'Dieses Diagramm zeigt den aktuellen Saldo Ihrer Bestandskonten. Sie können die anzuzeigenden Konten in Ihren Einstellungen auswählen.',
'index_box_out_holder' => 'Diese kleine und deren benachbarten Boxen geben Ihnen einen schnellen Überblick über Ihre finanzielle Situation.',
'index_help' => 'Wenn Sie jemals Hilfe bei einer Seite oder einem Formular benötigen, drücken Sie diese Taste.',
'index_outro' => 'Die meisten Seiten von Firefly III werden mit einer kleinen Tour wie dieser beginnen. Bitte kontaktieren Sie mich, wenn Sie Fragen oder Kommentare haben. Viel Spaß!',
@@ -31,23 +31,23 @@ return [
// create account:
'accounts_create_iban' => 'Geben Sie Ihren Konten eine gültige IBAN. Dies könnte einen Datenimport in Zukunft sehr einfach machen.',
- 'accounts_create_asset_opening_balance' => 'Anlagekonten können eine "Eröffnungsbilanz" haben, welche den Beginn der Historie dieses Kontos in Firefly III angibt.',
- 'accounts_create_asset_currency' => 'Firefly III unterstützt mehrere Währungen. Anlagenkonten haben eine Hauptwährung, die Sie hier einstellen müssen.',
+ 'accounts_create_asset_opening_balance' => 'Bestandskonten können eine "Eröffnungsbilanz" haben, welche den Beginn des Verlaufs dieses Kontos in Firefly III angibt.',
+ 'accounts_create_asset_currency' => 'Firefly III unterstützt mehrere Währungen. Bestandskonten ist eine Hauptwährung zugeordnet, die Sie hier festlegen müssen.',
'accounts_create_asset_virtual' => 'Es kann manchmal helfen, Ihrem Konto ein virtuelles Gleichgewicht zu geben: eine zusätzliche Menge, die dem tatsächlichen Kontostand immer hinzugefügt oder daraus entfernt wird.',
// budgets index
- 'budgets_index_intro' => 'Mit Budgets verwalten Sie Ihre Finanzen und bilden damit eine der Kernfunktionen von Firefly III.',
- 'budgets_index_set_budget' => 'Stellen Sie Ihr Gesamtbudget für jeden Zeitraum ein, damit Firefly III Ihnen mitteilen kann, ob Sie das verfügbare Geld budgetiert haben.',
+ 'budgets_index_intro' => 'Kostenrahmen werden zur Verwaltung Ihrer Finanzen verwendet und bilden eine der Kernfunktionen von Firefly III.',
+ 'budgets_index_set_budget' => 'Stellen Sie Ihr Gesamthaushaltsplan für jeden Zeitraum so ein, dass Firefly III Ihnen mitteilen kann, ob Sie alle verfügbaren Gelder vorgesehen haben.',
'budgets_index_see_expenses_bar' => 'Dieser Balken wird sich langsam füllen, wenn Sie Geld ausgeben.',
- 'budgets_index_navigate_periods' => 'Navigieren Sie durch Zeiträume, um die Budgets im Voraus zu setzen.',
- 'budgets_index_new_budget' => 'Erstellen Sie neue Budgets, wie Sie es für richtig halten.',
- 'budgets_index_list_of_budgets' => 'Verwenden Sie diese Tabelle, um die Beträge für jedes Budget festzulegen und einen Überblick zu erhalten.',
- 'budgets_index_outro' => 'Um mehr über die Budgetierung zu erfahren, klicken Sie auf das Hilfesymbol in der oberen rechten Ecke.',
+ 'budgets_index_navigate_periods' => 'Navigieren Sie durch Zeitabschnitte, um Kostenrahmen im Voraus festzulegen.',
+ 'budgets_index_new_budget' => 'Erstellen Sie neue Kostenrahmen, wie Sie es für richtig halten.',
+ 'budgets_index_list_of_budgets' => 'Verwenden Sie diese Tabelle, um die Beträge für jeden Kostenrahmen festzulegen und einen Überblick zu erhalten.',
+ 'budgets_index_outro' => 'Um mehr über die Finanzplanung zu erfahren, klicken Sie auf das Hilfesymbol in der oberen rechten Ecke.',
// reports (index)
'reports_index_intro' => 'Verwenden Sie diese Reports, um detaillierte Einblicke in Ihre Finanzen zu erhalten.',
'reports_index_inputReportType' => 'Wählen Sie einen Berichtstyp aus. Sehen Sie sich die Hilfeseiten an, um zu sehen, was jeder Bericht Ihnen zeigt.',
- 'reports_index_inputAccountsSelect' => 'Sie können Anlagekonten ausschließen oder einbeziehen, wie Sie es für richtig halten.',
+ 'reports_index_inputAccountsSelect' => 'Sie können Bestandskonten ausschließen oder einbeziehen, wie Sie es für richtig halten.',
'reports_index_inputDateRange' => 'Der gewählte Datumsbereich liegt ganz bei Ihnen: von einem Tag bis 10 Jahre.',
'reports_index_extra-options-box' => 'Abhängig von dem ausgewählten Bericht können Sie hier zusätzliche Filter und Optionen auswählen. Sehen Sie sich dieses Feld an, wenn Sie Berichtstypen ändern.',
@@ -60,18 +60,18 @@ return [
'reports_report_category_pieCharts' => 'Diese Diagramme geben Ihnen Einblick in Ausgaben und Einnahmen pro Kategorie oder pro Konto.',
'reports_report_category_incomeAndExpensesChart' => 'Diese Tabelle zeigt Ihre Ausgaben und Einnahmen pro Kategorie.',
- 'reports_report_tag_intro' => 'Dieser Bericht gibt Ihnen Einblick in eine oder mehrere Tags.',
- 'reports_report_tag_pieCharts' => 'Diese Diagramme geben Ihnen Einblick in Ausgaben und Einnahmen pro Tag, Konto, Kategorie oder budget.',
- 'reports_report_tag_incomeAndExpensesChart' => 'Diese Tabelle zeigt Ihre Ausgaben und Einnahmen pro Tag.',
+ 'reports_report_tag_intro' => 'Dieser Bericht gibt Ihnen Einblick in eine oder mehrere Schlagwörter.',
+ 'reports_report_tag_pieCharts' => 'Diese Diagramme geben Ihnen Einblick in Ausgaben und Einnahmen ja Schlagwort, Konto, Kategorie oder Kostenrahmen.',
+ 'reports_report_tag_incomeAndExpensesChart' => 'Diese Tabelle zeigt Ihre Ausgaben und Einnahmen ja Schlagwort.',
- 'reports_report_budget_intro' => 'Dieser Bericht gibt Ihnen Einblick in eine oder mehrere Budgets.',
- 'reports_report_budget_pieCharts' => 'Diese Diagramme geben Ihnen Einblick in Ausgaben und Einnahmen pro Budget oder pro Konto.',
- 'reports_report_budget_incomeAndExpensesChart' => 'Diese Tabelle zeigt Ihre Ausgaben und Einnahmen pro Budget.',
+ 'reports_report_budget_intro' => 'Dieser Bericht gibt Ihnen Einblick in eine oder mehrere Kostenrahmen.',
+ 'reports_report_budget_pieCharts' => 'Diese Diagramme geben Ihnen Einblick in Ausgaben und Einnahmen je Kostenrahmen oder Konto.',
+ 'reports_report_budget_incomeAndExpensesChart' => 'Diese Tabelle zeigt Ihre Ausgaben und Einnahmen je Kostenrahmen.',
// create transaction
'transactions_create_switch_box' => 'Verwenden Sie diese Schaltflächen, um schnell den Typ der Transaktion zu ändern, die Sie speichern möchten.',
'transactions_create_ffInput_category' => 'Dies ist ein Freitextfeld. Zuvor erstellte Kategorien werden vorgeschlagen.',
- 'transactions_create_withdrawal_ffInput_budget' => 'Verbinden Sie Ihre Abhebung mit einem Budget für eine bessere Kontrolle Ihrer Finanzen.',
+ 'transactions_create_withdrawal_ffInput_budget' => 'Verknüpfen Sie Ihre Ausgaben mit einem Kostenplan für eine bessere Finanzkontrolle.',
'transactions_create_withdrawal_currency_dropdown_amount' => 'Verwenden Sie dieses Dropdown, wenn ihre Abbuchung in einer anderen Währung ist.',
'transactions_create_deposit_currency_dropdown_amount' => 'Verwenden Sie dieses Dropdown, wenn ihre Einzahlung in einer anderen Währung ist.',
'transactions_create_transfer_ffInput_piggy_bank_id' => 'Wählen Sie ein Sparschwein aus und verknüpfen Sie diese Umbuchung mit Ihren Ersparnissen.',
@@ -79,7 +79,7 @@ return [
// piggy banks index:
'piggy-banks_index_saved' => 'Dieses Feld zeigt Ihnen, wie viel Sie in jedem Sparschwein gespart haben.',
'piggy-banks_index_button' => 'Neben diesem Fortschrittsbalken befinden sich zwei Buttons (+ und -), um Geld von jedem Sparschwein hinzuzufügen oder zu entfernen.',
- 'piggy-banks_index_accountStatus' => 'In dieser Tabelle wird der Status der Anlagenkonten aufgeführt, die mit mindestens einem Sparschwein verbunden sind.',
+ 'piggy-banks_index_accountStatus' => 'In dieser Tabelle wird der Status der Bestandskonten aufgeführt, die mit mindestens einem Sparschwein verbunden sind.',
// create piggy
'piggy-banks_create_name' => 'Worauf sparen Sie? Eine neue Couch, eine Kamera, Geld für Notfälle?',
@@ -101,10 +101,10 @@ return [
// create bill
'bills_create_name' => 'Verwenden Sie einen aussagekräftigen Namen wie "Miete" oder "Krankenversicherung".',
- 'bills_create_match' => 'To match transactions, use terms from those transactions or the expense account involved. All words must match.',
+ 'bills_create_match' => 'Um Transaktionen abzugleichen, verwenden Sie Begriffe aus diesen Transaktionen oder dem betreffenden Aufwandskonto. Alle Wörter müssen übereinstimmen.',
'bills_create_amount_min_holder' => 'Wählen Sie einen Mindest- und Höchstbetrag für diese Rechnung aus.',
'bills_create_repeat_freq_holder' => 'Die meisten Rechnungen wiederholen sich monatlich, aber Sie können hier eine andere Frequenz einstellen.',
- '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_skip_holder' => 'Wenn eine Rechnung z.B. alle 2 Wochen wiederholt wird, sollte das Feld „überspringen” auf „1” gesetzt werden, um alle 2 Wochen zu überspringen.',
// rules index
'rules_index_intro' => 'Mit Firefly III können Sie Regeln verwalten, die automatisch auf alle Transaktionen angewendet werden, die Sie erstellen oder bearbeiten.',
@@ -113,11 +113,11 @@ return [
'rules_index_prio_buttons' => 'Sortieren Sie sie, wie Sie es für richtig halten.',
'rules_index_test_buttons' => 'Sie können Ihre Regeln testen oder sie auf vorhandene Transaktionen anwenden.',
'rules_index_rule-triggers' => 'Regeln haben "Auslöser" und "Aktionen", die Sie per Drag-and-Drop sortieren können.',
- 'rules_index_outro' => 'Be sure to check out the help pages using the (?) icon in the top right!',
+ 'rules_index_outro' => 'Bitte beachten Sie die Hilfeseiten, indem Sie das Symbol (?) oben rechts verwenden!',
// create rule:
'rules_create_mandatory' => 'Wählen Sie einen aussagekräftigen Titel und legen Sie fest, wann die Regel ausgelöst werden soll.',
- 'rules_create_ruletriggerholder' => 'Add as many triggers as you like, but remember that ALL triggers must match before any actions are fired.',
+ 'rules_create_ruletriggerholder' => 'Fügen Sie so viele Auslöser hinzu, wie Sie möchten, aber denken Sie daran, dass ALLE Auslöser übereinstimmen müssen, bevor Aktionen ausgelöst werden.',
'rules_create_test_rule_triggers' => 'Verwenden Sie diese Schaltfläche, um zu sehen, welche Transaktionen zu Ihrer Regel passen würden.',
'rules_create_actions' => 'Legen Sie so viele Aktionen fest, wie Sie möchten.',
diff --git a/resources/lang/de_DE/list.php b/resources/lang/de_DE/list.php
index dab95996b0..a6059655b4 100644
--- a/resources/lang/de_DE/list.php
+++ b/resources/lang/de_DE/list.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
'buttons' => 'Schaltflächen',
- 'icon' => 'Icon',
+ 'icon' => 'Symbol',
'id' => 'Id',
'create_date' => 'Erstellt am',
'update_date' => 'Aktualisiert am',
@@ -34,7 +35,7 @@ return [
'currentBalance' => 'Aktueller Kontostand',
'active' => 'Aktiv?',
'lastActivity' => 'Letzte Aktivität',
- 'balanceDiff' => 'Balance difference',
+ 'balanceDiff' => 'Saldendifferenz',
'matchesOn' => 'Zusammengeführt am',
'account_type' => 'Kontotyp',
'created_at' => 'Erstellt am',
@@ -61,7 +62,7 @@ return [
'from' => 'Von',
'piggy_bank' => 'Sparschwein',
'to' => 'An',
- 'budget' => 'Budget',
+ 'budget' => 'Kostenrahmen',
'category' => 'Kategorie',
'bill' => 'Rechnung',
'withdrawal' => 'Ausgabe',
@@ -86,12 +87,12 @@ return [
'categories_count' => 'Anzahl Kategorien',
'export_jobs_count' => 'Anzahl exportierter Jobs',
'import_jobs_count' => 'Anzahl importierter Jobs',
- 'budget_count' => 'Anzahl Budgets',
+ 'budget_count' => 'Anzahl Kostenpläne',
'rule_and_groups_count' => 'Anzahl Regeln und Regelgruppen',
- 'tags_count' => 'Anzahl Tags',
- 'tags' => 'Tags',
- 'inward' => 'Inward description',
- 'outward' => 'Outward description',
+ 'tags_count' => 'Anzahl Schlagwörter',
+ 'tags' => 'Schlagwörter',
+ 'inward' => 'Beschreibung der Eingänge',
+ 'outward' => 'Beschreibung der Ausgänge',
'number_of_transactions' => 'Anzahl der Zahlungsvorgänge',
'total_amount' => 'Gesamtbetrag',
'sum' => 'Summe',
@@ -102,4 +103,12 @@ return [
'reconcile' => 'Abgleichen',
'account_on_spectre' => 'Konto (Spectre)',
'do_import' => 'Von diesem Konto importieren',
+ 'sepa-ct-id' => 'SEPA • Ende-zu-Ende-Identifikationsnummer',
+ 'sepa-ct-op' => 'SEPA • Zielkonto-Identifikationsnummer',
+ 'sepa-db' => 'SEPA - Mandatskennung',
+ 'sepa-country' => 'SEPA • Land',
+ 'sepa-cc' => 'SEPA • Verrechnungsschlüssel',
+ 'sepa-ep' => 'SEPA • Externer Verwendungszweck',
+ 'sepa-ci' => 'SEPA • Identifikationsnummer des Zahlungsempfängers',
+ 'account_at_bunq' => 'Konto bei „bunq”',
];
diff --git a/resources/lang/de_DE/pagination.php b/resources/lang/de_DE/pagination.php
index c04bcf86ff..c93a398567 100644
--- a/resources/lang/de_DE/pagination.php
+++ b/resources/lang/de_DE/pagination.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'previous' => '« Vorherige',
diff --git a/resources/lang/de_DE/passwords.php b/resources/lang/de_DE/passwords.php
index dc0170529f..0a4cb3a769 100644
--- a/resources/lang/de_DE/passwords.php
+++ b/resources/lang/de_DE/passwords.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'password' => 'Passwörter müssen mindestens 6 Zeichen lang sein und übereinstimmen.',
'user' => 'Wir können keinen Benutzer mit dieser E-Mail Adresse finden.',
- 'token' => 'Das Token zum Zurücksetzen des Passwortes ist ungültig.',
+ 'token' => 'Der Authentifizierungsschlüssel zum Zurücksetzen des Passwortes ist ungültig.',
'sent' => 'Wir haben Ihnen einen Link zum Zurücksetzen des Passworts zugesendet!',
'reset' => 'Ihr Passwort wurde zurückgesetzt!',
'blocked' => 'Netter Versuch.',
diff --git a/resources/lang/de_DE/validation.php b/resources/lang/de_DE/validation.php
index 18d65b7309..0b6527c4b1 100644
--- a/resources/lang/de_DE/validation.php
+++ b/resources/lang/de_DE/validation.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'iban' => 'Dies ist keine gültige IBAN.',
+ 'source_equals_destination' => 'Das Quellkonto entspricht dem Zielkonto',
'unique_account_number_for_user' => 'Diese Kontonummer scheint bereits verwendet zu sein.',
'unique_iban_for_user' => 'Dieser IBAN scheint bereits verwendet zu werden.',
'deleted_user' => 'Aufgrund von Sicherheitsbeschränkungen ist eine Registrierung mit dieser E-Mail-Adresse nicht zugelassen.',
'rule_trigger_value' => 'Dieser Wert ist für den ausgewählten Auslöser ungültig.',
'rule_action_value' => 'Dieser Wert ist für die gewählte Aktion ungültig.',
- 'file_already_attached' => 'Die hochgeladene Datei ":name" ist diesem Objekt bereits angehängt.',
- 'file_attached' => 'Datei ":name" erfolgreich hochgeladen.',
+ 'file_already_attached' => 'Die hochgeladene Datei „:name” ist diesem Objekt bereits angehängt.',
+ 'file_attached' => 'Datei „:name” erfolgreich hochgeladen.',
'must_exist' => 'Die ID in Feld :attribute existiert nicht in der Datenbank.',
'all_accounts_equal' => 'Alle Konten in diesem Feld müssen identisch sein.',
'invalid_selection' => 'Die Auswahl ist ungültig',
@@ -36,8 +37,8 @@ return [
'at_least_one_transaction' => 'Sie brauchen mindestens eine Transaktion.',
'require_currency_info' => 'Der Inhalt dieses Feldes ist ohne Währungsinformationen ungültig.',
'equal_description' => 'Die Transaktionsbeschreibung darf nicht der globalen Beschreibung entsprechen.',
- 'file_invalid_mime' => 'Die Datei ":name" ist vom Typ ":mime", welcher nicht zum Upload zugelassen ist.',
- 'file_too_large' => 'Die Datei ":name" ist zu groß.',
+ 'file_invalid_mime' => 'Die Datei „:name” ist vom Typ „:mime”, welcher nicht zum Hochladen zugelassen ist.',
+ 'file_too_large' => 'Die Datei „:name” ist zu groß.',
'belongs_to_user' => 'Der Wert von :attribute ist nicht bekannt',
'accepted' => ':attribute muss akzeptiert werden.',
'bic' => 'Dies ist kein gültiger BIC.',
@@ -121,23 +122,23 @@ return [
'amount_min' => 'Mindestbetrag',
'amount_max' => 'Höchstbetrag',
'title' => 'Bezeichnung',
- 'tag' => 'Tag',
+ 'tag' => 'Schlagwort',
'transaction_description' => 'Transaktionsbeschreibung',
- 'rule-action-value.1' => 'rule action value #1',
- 'rule-action-value.2' => 'rule action value #2',
- 'rule-action-value.3' => 'rule action value #3',
- 'rule-action-value.4' => 'rule action value #4',
- 'rule-action-value.5' => 'rule action value #5',
- 'rule-action.1' => 'rule action #1',
- 'rule-action.2' => 'rule action #2',
- 'rule-action.3' => 'rule action #3',
- 'rule-action.4' => 'rule action #4',
- 'rule-action.5' => 'rule action #5',
- 'rule-trigger-value.1' => 'rule trigger value #1',
- 'rule-trigger-value.2' => 'rule trigger value #2',
- 'rule-trigger-value.3' => 'rule trigger value #3',
- 'rule-trigger-value.4' => 'rule trigger value #4',
- 'rule-trigger-value.5' => 'rule trigger value #5',
+ 'rule-action-value.1' => 'Regelaktionswert #1',
+ 'rule-action-value.2' => 'Regelaktionswert #2',
+ 'rule-action-value.3' => 'Regelaktionswert #3',
+ 'rule-action-value.4' => 'Regelaktionswert #4',
+ 'rule-action-value.5' => 'Regelaktionswert #5',
+ 'rule-action.1' => 'Aktionsregel #1',
+ 'rule-action.2' => 'Aktionsregel #2',
+ 'rule-action.3' => 'Aktionsregel #3',
+ 'rule-action.4' => 'Aktionsregel #4',
+ 'rule-action.5' => 'Aktionsregel #5',
+ 'rule-trigger-value.1' => 'Regelauslösewert #1',
+ 'rule-trigger-value.2' => 'Regelauslösewert #2',
+ 'rule-trigger-value.3' => 'Regelauslösewert #3',
+ 'rule-trigger-value.4' => 'Regelauslösewert #4',
+ 'rule-trigger-value.5' => 'Regelauslösewert #5',
'rule-trigger.1' => 'Regel #1 auslösen',
'rule-trigger.2' => 'Regel #2 auslösen',
'rule-trigger.3' => 'Regel #3 auslösen',
diff --git a/resources/lang/en_US/auth.php b/resources/lang/en_US/auth.php
index a9ccd1af92..1f12718e35 100644
--- a/resources/lang/en_US/auth.php
+++ b/resources/lang/en_US/auth.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
/*
diff --git a/resources/lang/en_US/bank.php b/resources/lang/en_US/bank.php
index ef0d636f91..b6a86faa4b 100644
--- a/resources/lang/en_US/bank.php
+++ b/resources/lang/en_US/bank.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
];
diff --git a/resources/lang/en_US/breadcrumbs.php b/resources/lang/en_US/breadcrumbs.php
index 0777e36191..0360acf584 100644
--- a/resources/lang/en_US/breadcrumbs.php
+++ b/resources/lang/en_US/breadcrumbs.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'home' => 'Home',
diff --git a/resources/lang/en_US/components.php b/resources/lang/en_US/components.php
index 125c74b2f0..1e9fce7f61 100644
--- a/resources/lang/en_US/components.php
+++ b/resources/lang/en_US/components.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// profile
diff --git a/resources/lang/en_US/config.php b/resources/lang/en_US/config.php
index 71d15b1baa..bb9db534fe 100644
--- a/resources/lang/en_US/config.php
+++ b/resources/lang/en_US/config.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'html_language' => 'en',
diff --git a/resources/lang/en_US/csv.php b/resources/lang/en_US/csv.php
index d61316b632..892c8beac4 100644
--- a/resources/lang/en_US/csv.php
+++ b/resources/lang/en_US/csv.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
];
diff --git a/resources/lang/en_US/demo.php b/resources/lang/en_US/demo.php
index a86d6d9a2d..3e58cb61cc 100644
--- a/resources/lang/en_US/demo.php
+++ b/resources/lang/en_US/demo.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'no_demo_text' => 'Sorry, there is no extra demo-explanation text for this page.',
diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php
index e9c24d484a..5080e9f348 100644
--- a/resources/lang/en_US/firefly.php
+++ b/resources/lang/en_US/firefly.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
// general stuff:
@@ -170,7 +171,9 @@ return [
'want_to_login' => 'I want to login',
'button_register' => 'Register',
'authorization' => 'Authorization',
-
+ 'active_bills_only' => 'active bills only',
+ 'average_per_bill' => 'average per bill',
+ 'expected_total' => 'expected total',
// API access
'authorization_request' => 'Firefly III v:version Authorization Request',
'authorization_request_intro' => ':client is requesting permission to access your financial administration. Would you like to authorize :client to access these records?',
@@ -403,590 +406,589 @@ return [
'rule_action_set_notes_choice' => 'Set notes to..',
'rule_action_set_notes' => 'Set notes to ":action_value"',
- 'rules_have_read_warning' => 'Have you read the warning?',
- 'apply_rule_warning' => 'Warning: running a rule(group) on a large selection of transactions could take ages, and it could time-out. If it does, the rule(group) will only be applied to an unknown subset of your transactions. This might leave your financial administration in tatters. Please be careful.',
+ 'rules_have_read_warning' => 'Have you read the warning?',
+ 'apply_rule_warning' => 'Warning: running a rule(group) on a large selection of transactions could take ages, and it could time-out. If it does, the rule(group) will only be applied to an unknown subset of your transactions. This might leave your financial administration in tatters. Please be careful.',
// tags
- 'store_new_tag' => 'Store new tag',
- 'update_tag' => 'Update tag',
- 'no_location_set' => 'No location set.',
- 'meta_data' => 'Meta data',
- 'location' => 'Location',
- 'without_date' => 'Without date',
- 'result' => 'Result',
- 'sums_apply_to_range' => 'All sums apply to the selected range',
- 'mapbox_api_key' => 'To use map, get an API key from Mapbox. Open your .env file en enter this code after MAPBOX_API_KEY=.',
- 'press_tag_location' => 'Right click or long press to set the tag\'s location.',
- 'clear_location' => 'Clear location',
+ 'store_new_tag' => 'Store new tag',
+ 'update_tag' => 'Update tag',
+ 'no_location_set' => 'No location set.',
+ 'meta_data' => 'Meta data',
+ 'location' => 'Location',
+ 'without_date' => 'Without date',
+ 'result' => 'Result',
+ 'sums_apply_to_range' => 'All sums apply to the selected range',
+ 'mapbox_api_key' => 'To use map, get an API key from Mapbox. Open your .env file en enter this code after MAPBOX_API_KEY=.',
+ 'press_tag_location' => 'Right click or long press to set the tag\'s location.',
+ 'clear_location' => 'Clear location',
// preferences
- 'pref_home_screen_accounts' => 'Home screen accounts',
- 'pref_home_screen_accounts_help' => 'Which accounts should be displayed on the home page?',
- 'pref_view_range' => 'View range',
- 'pref_view_range_help' => 'Some charts are automatically grouped in periods. What period would you prefer?',
- 'pref_1D' => 'One day',
- 'pref_1W' => 'One week',
- 'pref_1M' => 'One month',
- 'pref_3M' => 'Three months (quarter)',
- 'pref_6M' => 'Six months',
- 'pref_1Y' => 'One year',
- 'pref_languages' => 'Languages',
- 'pref_languages_help' => 'Firefly III supports several languages. Which one do you prefer?',
- 'pref_custom_fiscal_year' => 'Fiscal year settings',
- 'pref_custom_fiscal_year_label' => 'Enabled',
- 'pref_custom_fiscal_year_help' => 'In countries that use a financial year other than January 1 to December 31, you can switch this on and specify start / end days of the fiscal year',
- 'pref_fiscal_year_start_label' => 'Fiscal year start date',
- 'pref_two_factor_auth' => '2-step verification',
- '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_enable_two_factor_auth' => 'Enable 2-step verification',
- 'pref_two_factor_auth_disabled' => '2-step verification code removed and disabled',
- 'pref_two_factor_auth_remove_it' => 'Don\'t forget to remove the account from your authentication app!',
- 'pref_two_factor_auth_code' => 'Verify code',
- '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_reset_code' => 'Reset verification code',
- '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!',
- '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',
- 'list_page_size_title' => 'Page size',
- 'list_page_size_help' => 'Any list of things (accounts, transactions, etc) shows at most this many per page.',
- 'list_page_size_label' => 'Page size',
- 'between_dates' => '(:start and :end)',
- 'pref_optional_fields_transaction' => 'Optional fields for transactions',
- 'pref_optional_fields_transaction_help' => 'By default not all fields are enabled when creating a new transaction (because of the clutter). Below, you can enable these fields if you think they could be useful for you. Of course, any field that is disabled, but already filled in, will be visible regardless of the setting.',
- 'optional_tj_date_fields' => 'Date fields',
- 'optional_tj_business_fields' => 'Business fields',
- 'optional_tj_attachment_fields' => 'Attachment fields',
- 'pref_optional_tj_interest_date' => 'Interest date',
- 'pref_optional_tj_book_date' => 'Book date',
- 'pref_optional_tj_process_date' => 'Processing date',
- 'pref_optional_tj_due_date' => 'Due date',
- 'pref_optional_tj_payment_date' => 'Payment date',
- 'pref_optional_tj_invoice_date' => 'Invoice date',
- 'pref_optional_tj_internal_reference' => 'Internal reference',
- 'pref_optional_tj_notes' => 'Notes',
- 'pref_optional_tj_attachments' => 'Attachments',
- 'optional_field_meta_dates' => 'Dates',
- 'optional_field_meta_business' => 'Business',
- 'optional_field_attachments' => 'Attachments',
- 'optional_field_meta_data' => 'Optional meta data',
+ 'pref_home_screen_accounts' => 'Home screen accounts',
+ 'pref_home_screen_accounts_help' => 'Which accounts should be displayed on the home page?',
+ 'pref_view_range' => 'View range',
+ 'pref_view_range_help' => 'Some charts are automatically grouped in periods. What period would you prefer?',
+ 'pref_1D' => 'One day',
+ 'pref_1W' => 'One week',
+ 'pref_1M' => 'One month',
+ 'pref_3M' => 'Three months (quarter)',
+ 'pref_6M' => 'Six months',
+ 'pref_1Y' => 'One year',
+ 'pref_languages' => 'Languages',
+ 'pref_languages_help' => 'Firefly III supports several languages. Which one do you prefer?',
+ 'pref_custom_fiscal_year' => 'Fiscal year settings',
+ 'pref_custom_fiscal_year_label' => 'Enabled',
+ 'pref_custom_fiscal_year_help' => 'In countries that use a financial year other than January 1 to December 31, you can switch this on and specify start / end days of the fiscal year',
+ 'pref_fiscal_year_start_label' => 'Fiscal year start date',
+ 'pref_two_factor_auth' => '2-step verification',
+ '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_enable_two_factor_auth' => 'Enable 2-step verification',
+ 'pref_two_factor_auth_disabled' => '2-step verification code removed and disabled',
+ 'pref_two_factor_auth_remove_it' => 'Don\'t forget to remove the account from your authentication app!',
+ 'pref_two_factor_auth_code' => 'Verify code',
+ '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_reset_code' => 'Reset verification code',
+ 'pref_two_factor_auth_disable_2fa' => 'Disable 2FA',
+ 'pref_save_settings' => 'Save settings',
+ 'saved_preferences' => 'Preferences saved!',
+ 'preferences_general' => 'General',
+ 'preferences_frontpage' => 'Home screen',
+ 'preferences_security' => 'Security',
+ 'preferences_layout' => 'Layout',
+ 'pref_home_show_deposits' => 'Show deposits on the home screen',
+ 'pref_home_show_deposits_info' => 'The home screen already shows your expense accounts. Should it also show your revenue accounts?',
+ 'pref_home_do_show_deposits' => 'Yes, show them',
+ 'successful_count' => 'of which :count successful',
+ 'list_page_size_title' => 'Page size',
+ 'list_page_size_help' => 'Any list of things (accounts, transactions, etc) shows at most this many per page.',
+ 'list_page_size_label' => 'Page size',
+ 'between_dates' => '(:start and :end)',
+ 'pref_optional_fields_transaction' => 'Optional fields for transactions',
+ 'pref_optional_fields_transaction_help' => 'By default not all fields are enabled when creating a new transaction (because of the clutter). Below, you can enable these fields if you think they could be useful for you. Of course, any field that is disabled, but already filled in, will be visible regardless of the setting.',
+ 'optional_tj_date_fields' => 'Date fields',
+ 'optional_tj_business_fields' => 'Business fields',
+ 'optional_tj_attachment_fields' => 'Attachment fields',
+ 'pref_optional_tj_interest_date' => 'Interest date',
+ 'pref_optional_tj_book_date' => 'Book date',
+ 'pref_optional_tj_process_date' => 'Processing date',
+ 'pref_optional_tj_due_date' => 'Due date',
+ 'pref_optional_tj_payment_date' => 'Payment date',
+ 'pref_optional_tj_invoice_date' => 'Invoice date',
+ 'pref_optional_tj_internal_reference' => 'Internal reference',
+ 'pref_optional_tj_notes' => 'Notes',
+ 'pref_optional_tj_attachments' => 'Attachments',
+ 'optional_field_meta_dates' => 'Dates',
+ 'optional_field_meta_business' => 'Business',
+ 'optional_field_attachments' => 'Attachments',
+ 'optional_field_meta_data' => 'Optional meta data',
// profile:
- 'change_your_password' => 'Change your password',
- 'delete_account' => 'Delete account',
- 'current_password' => 'Current password',
- 'new_password' => 'New password',
- 'new_password_again' => 'New password (again)',
- 'delete_your_account' => 'Delete your account',
- 'delete_your_account_help' => 'Deleting your account will also delete any accounts, transactions, anything you might have saved into Firefly III. It\'ll be GONE.',
- 'delete_your_account_password' => 'Enter your password to continue.',
- 'password' => 'Password',
- 'are_you_sure' => 'Are you sure? You cannot undo this.',
- 'delete_account_button' => 'DELETE your account',
- 'invalid_current_password' => 'Invalid current password!',
- 'password_changed' => 'Password changed!',
- 'should_change' => 'The idea is to change your password.',
- 'invalid_password' => 'Invalid password!',
- 'what_is_pw_security' => 'What is "verify password security"?',
- 'secure_pw_title' => 'How to choose a secure password',
- 'secure_pw_history' => 'In August 2017 well known security researcher Troy Hunt released a list of 306 million stolen passwords. These passwords were stolen during breakins at companies like LinkedIn, Adobe and NeoPets (and many more).',
- 'secure_pw_check_box' => 'By checking the box, Firefly III will send the SHA1 hash of your password to the website of Troy Hunt to see if it is on the list. This will stop you from using unsafe passwords as is recommended in the latest NIST Special Publication on this subject.',
- 'secure_pw_sha1' => 'But I thought SHA1 was broken?',
- 'secure_pw_hash_speed' => 'Yes, but not in this context. As you can read on the website detailing how they broke SHA1, it is now slightly easier to find a "collision": another string that results in the same SHA1-hash. It now only takes 10,000 years using a single-GPU machine.',
- 'secure_pw_hash_security' => 'This collision would not be equal to your password, nor would it be useful on (a site like) Firefly III. This application does not use SHA1 for password verification. So it is safe to check this box. Your password is hashed and sent over HTTPS.',
- 'secure_pw_should' => 'Should I check the box?',
- 'secure_pw_long_password' => 'If you just generated a long, single-use password for Firefly III using some kind of password generator: no.',
- 'secure_pw_short' => 'If you just entered the password you always use: Please yes.',
- 'command_line_token' => 'Command line token',
- 'explain_command_line_token' => 'You need this token to perform command line options, such as importing or exporting data. Without it, such sensitive commands will not work. Do not share your command line token. Nobody will ask you for this token, not even me. If you fear you lost this, or when you\'re paranoid, regenerate this token using the button.',
- 'regenerate_command_line_token' => 'Regenerate command line token',
- 'token_regenerated' => 'A new command line token was generated',
- 'change_your_email' => 'Change your email address',
- 'email_verification' => 'An email message will be sent to your old AND new email address. For security purposes, you will not be able to login until you verify your new email address. If you are unsure if your Firefly III installation is capable of sending email, please do not use this feature. If you are an administrator, you can test this in the Administration.',
- 'email_changed_logout' => 'Until you verify your email address, you cannot login.',
- 'login_with_new_email' => 'You can now login with your new email address.',
- 'login_with_old_email' => 'You can now login with your old email address again.',
+ 'change_your_password' => 'Change your password',
+ 'delete_account' => 'Delete account',
+ 'current_password' => 'Current password',
+ 'new_password' => 'New password',
+ 'new_password_again' => 'New password (again)',
+ 'delete_your_account' => 'Delete your account',
+ 'delete_your_account_help' => 'Deleting your account will also delete any accounts, transactions, anything you might have saved into Firefly III. It\'ll be GONE.',
+ 'delete_your_account_password' => 'Enter your password to continue.',
+ 'password' => 'Password',
+ 'are_you_sure' => 'Are you sure? You cannot undo this.',
+ 'delete_account_button' => 'DELETE your account',
+ 'invalid_current_password' => 'Invalid current password!',
+ 'password_changed' => 'Password changed!',
+ 'should_change' => 'The idea is to change your password.',
+ 'invalid_password' => 'Invalid password!',
+ 'what_is_pw_security' => 'What is "verify password security"?',
+ 'secure_pw_title' => 'How to choose a secure password',
+ 'secure_pw_history' => 'In August 2017 well known security researcher Troy Hunt released a list of 306 million stolen passwords. These passwords were stolen during breakins at companies like LinkedIn, Adobe and NeoPets (and many more).',
+ 'secure_pw_check_box' => 'By checking the box, Firefly III will send the first five characters of 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 only the first five characters of this hash are 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.',
+ 'command_line_token' => 'Command line token',
+ 'explain_command_line_token' => 'You need this token to perform command line options, such as importing or exporting data. Without it, such sensitive commands will not work. Do not share your command line token. Nobody will ask you for this token, not even me. If you fear you lost this, or when you\'re paranoid, regenerate this token using the button.',
+ 'regenerate_command_line_token' => 'Regenerate command line token',
+ 'token_regenerated' => 'A new command line token was generated',
+ 'change_your_email' => 'Change your email address',
+ 'email_verification' => 'An email message will be sent to your old AND new email address. For security purposes, you will not be able to login until you verify your new email address. If you are unsure if your Firefly III installation is capable of sending email, please do not use this feature. If you are an administrator, you can test this in the Administration.',
+ 'email_changed_logout' => 'Until you verify your email address, you cannot login.',
+ 'login_with_new_email' => 'You can now login with your new email address.',
+ 'login_with_old_email' => 'You can now login with your old email address again.',
// attachments
- 'nr_of_attachments' => 'One attachment|:count attachments',
- 'attachments' => 'Attachments',
- 'edit_attachment' => 'Edit attachment ":name"',
- 'update_attachment' => 'Update attachment',
- 'delete_attachment' => 'Delete attachment ":name"',
- 'attachment_deleted' => 'Deleted attachment ":name"',
- 'attachment_updated' => 'Updated attachment ":name"',
- 'upload_max_file_size' => 'Maximum file size: :size',
+ 'nr_of_attachments' => 'One attachment|:count attachments',
+ 'attachments' => 'Attachments',
+ 'edit_attachment' => 'Edit attachment ":name"',
+ 'update_attachment' => 'Update attachment',
+ 'delete_attachment' => 'Delete attachment ":name"',
+ 'attachment_deleted' => 'Deleted attachment ":name"',
+ 'attachment_updated' => 'Updated attachment ":name"',
+ 'upload_max_file_size' => 'Maximum file size: :size',
// transaction index
- 'title_expenses' => 'Expenses',
- 'title_withdrawal' => 'Expenses',
- 'title_revenue' => 'Revenue / income',
- 'title_deposit' => 'Revenue / income',
- 'title_transfer' => 'Transfers',
- 'title_transfers' => 'Transfers',
+ 'title_expenses' => 'Expenses',
+ 'title_withdrawal' => 'Expenses',
+ 'title_revenue' => 'Revenue / income',
+ 'title_deposit' => 'Revenue / income',
+ 'title_transfer' => 'Transfers',
+ 'title_transfers' => 'Transfers',
// convert stuff:
- 'convert_is_already_type_Withdrawal' => 'This transaction is already a withdrawal',
- 'convert_is_already_type_Deposit' => 'This transaction is already a deposit',
- 'convert_is_already_type_Transfer' => 'This transaction is already a transfer',
- 'convert_to_Withdrawal' => 'Convert ":description" to a withdrawal',
- 'convert_to_Deposit' => 'Convert ":description" to a deposit',
- 'convert_to_Transfer' => 'Convert ":description" to a transfer',
- 'convert_options_WithdrawalDeposit' => 'Convert a withdrawal into a deposit',
- 'convert_options_WithdrawalTransfer' => 'Convert a withdrawal into a transfer',
- 'convert_options_DepositTransfer' => 'Convert a deposit into a transfer',
- 'convert_options_DepositWithdrawal' => 'Convert a deposit into a withdrawal',
- 'convert_options_TransferWithdrawal' => 'Convert a transfer into a withdrawal',
- 'convert_options_TransferDeposit' => 'Convert a transfer into a deposit',
- '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',
- 'invalid_convert_selection' => 'The account you have selected is already used in this transaction or does not exist.',
+ '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',
+ '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',
+ 'invalid_convert_selection' => 'The account you have selected is already used in this transaction or does not exist.',
// create new stuff:
- 'create_new_withdrawal' => 'Create new withdrawal',
- 'create_new_deposit' => 'Create new deposit',
- 'create_new_transfer' => 'Create new transfer',
- 'create_new_asset' => 'Create new asset account',
- 'create_new_expense' => 'Create new expense account',
- 'create_new_revenue' => 'Create new revenue account',
- 'create_new_piggy_bank' => 'Create new piggy bank',
- 'create_new_bill' => 'Create new bill',
+ 'create_new_withdrawal' => 'Create new withdrawal',
+ 'create_new_deposit' => 'Create new deposit',
+ 'create_new_transfer' => 'Create new transfer',
+ 'create_new_asset' => 'Create new asset account',
+ 'create_new_expense' => 'Create new expense account',
+ 'create_new_revenue' => 'Create new revenue account',
+ 'create_new_piggy_bank' => 'Create new piggy bank',
+ 'create_new_bill' => 'Create new bill',
// currencies:
- 'create_currency' => 'Create a new currency',
- 'store_currency' => 'Store new currency',
- 'update_currency' => 'Update currency',
- 'new_default_currency' => ':name is now the default currency.',
- 'cannot_delete_currency' => 'Cannot delete :name because it is still in use.',
- 'deleted_currency' => 'Currency :name deleted',
- 'created_currency' => 'Currency :name created',
- 'updated_currency' => 'Currency :name updated',
- 'ask_site_owner' => 'Please ask :owner to add, remove or edit currencies.',
- 'currencies_intro' => 'Firefly III supports various currencies which you can set and enable here.',
- 'make_default_currency' => 'make default',
- 'default_currency' => 'default',
+ 'create_currency' => 'Create a new currency',
+ 'store_currency' => 'Store new currency',
+ 'update_currency' => 'Update currency',
+ 'new_default_currency' => ':name is now the default currency.',
+ 'cannot_delete_currency' => 'Cannot delete :name because it is still in use.',
+ 'deleted_currency' => 'Currency :name deleted',
+ 'created_currency' => 'Currency :name created',
+ 'updated_currency' => 'Currency :name updated',
+ 'ask_site_owner' => 'Please ask :owner to add, remove or edit currencies.',
+ 'currencies_intro' => 'Firefly III supports various currencies which you can set and enable here.',
+ 'make_default_currency' => 'make default',
+ 'default_currency' => 'default',
// forms:
- 'mandatoryFields' => 'Mandatory fields',
- 'optionalFields' => 'Optional fields',
- 'options' => 'Options',
+ 'mandatoryFields' => 'Mandatory fields',
+ 'optionalFields' => 'Optional fields',
+ 'options' => 'Options',
// budgets:
- 'create_new_budget' => 'Create a new budget',
- 'store_new_budget' => 'Store new budget',
- 'stored_new_budget' => 'Stored new budget ":name"',
- 'available_between' => 'Available between :start and :end',
- 'transactionsWithoutBudget' => 'Expenses without budget',
- 'transactions_no_budget' => 'Expenses without budget between :start and :end',
- 'spent_between' => 'Spent between :start and :end',
- 'createBudget' => 'New budget',
- 'inactiveBudgets' => 'Inactive budgets',
- 'without_budget_between' => 'Transactions without a budget between :start and :end',
- 'delete_budget' => 'Delete budget ":name"',
- 'deleted_budget' => 'Deleted budget ":name"',
- 'edit_budget' => 'Edit budget ":name"',
- 'updated_budget' => 'Updated budget ":name"',
- 'update_amount' => 'Update amount',
- 'update_budget' => 'Update budget',
- 'update_budget_amount_range' => 'Update (expected) available amount between :start and :end',
- 'budget_period_navigator' => 'Period navigator',
- 'info_on_available_amount' => 'What do I have available?',
- 'available_amount_indication' => 'Use these amounts to get an indication of what your total budget could be.',
- 'suggested' => 'Suggested',
- 'average_between' => 'Average between :start and :end',
+ 'create_new_budget' => 'Create a new budget',
+ 'store_new_budget' => 'Store new budget',
+ 'stored_new_budget' => 'Stored new budget ":name"',
+ 'available_between' => 'Available between :start and :end',
+ 'transactionsWithoutBudget' => 'Expenses without budget',
+ 'transactions_no_budget' => 'Expenses without budget between :start and :end',
+ 'spent_between' => 'Spent between :start and :end',
+ 'createBudget' => 'New budget',
+ 'inactiveBudgets' => 'Inactive budgets',
+ 'without_budget_between' => 'Transactions without a budget between :start and :end',
+ 'delete_budget' => 'Delete budget ":name"',
+ 'deleted_budget' => 'Deleted budget ":name"',
+ 'edit_budget' => 'Edit budget ":name"',
+ 'updated_budget' => 'Updated budget ":name"',
+ 'update_amount' => 'Update amount',
+ 'update_budget' => 'Update budget',
+ 'update_budget_amount_range' => 'Update (expected) available amount between :start and :end',
+ 'budget_period_navigator' => 'Period navigator',
+ 'info_on_available_amount' => 'What do I have available?',
+ 'available_amount_indication' => 'Use these amounts to get an indication of what your total budget could be.',
+ 'suggested' => 'Suggested',
+ 'average_between' => 'Average between :start and :end',
+ 'over_budget_warn' => ' Normally you budget about :amount per day. This is :over_amount per day.',
// bills:
- 'matching_on' => 'Matching on',
- 'between_amounts' => 'between :low and :high.',
- 'repeats' => 'Repeats',
- 'connected_journals' => 'Connected transactions',
- 'auto_match_on' => 'Automatically matched by Firefly III',
- 'auto_match_off' => 'Not automatically matched by Firefly III',
- 'next_expected_match' => 'Next expected match',
- 'delete_bill' => 'Delete bill ":name"',
- 'deleted_bill' => 'Deleted bill ":name"',
- 'edit_bill' => 'Edit bill ":name"',
- 'more' => 'More',
- 'rescan_old' => 'Rescan old transactions',
- 'update_bill' => 'Update bill',
- '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.',
- 'rescanned_bill' => 'Rescanned everything.',
- 'average_bill_amount_year' => 'Average bill amount (:year)',
- 'average_bill_amount_overall' => 'Average bill amount (overall)',
- 'bill_is_active' => 'Bill is active',
- 'bill_expected_between' => 'Expected between :start and :end',
- 'bill_will_automatch' => 'Bill will automatically linked to matching transactions',
- 'skips_over' => 'skips over',
-
+ 'matching_on' => 'Matching on',
+ 'between_amounts' => 'between :low and :high.',
+ 'repeats' => 'Repeats',
+ 'connected_journals' => 'Connected transactions',
+ 'auto_match_on' => 'Automatically matched by Firefly III',
+ 'auto_match_off' => 'Not automatically matched by Firefly III',
+ 'next_expected_match' => 'Next expected match',
+ 'delete_bill' => 'Delete bill ":name"',
+ 'deleted_bill' => 'Deleted bill ":name"',
+ 'edit_bill' => 'Edit bill ":name"',
+ 'more' => 'More',
+ 'rescan_old' => 'Rescan old transactions',
+ 'update_bill' => 'Update bill',
+ '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.',
+ 'rescanned_bill' => 'Rescanned everything.',
+ 'average_bill_amount_year' => 'Average bill amount (:year)',
+ 'average_bill_amount_overall' => 'Average bill amount (overall)',
+ 'bill_is_active' => 'Bill is active',
+ 'bill_expected_between' => 'Expected between :start and :end',
+ 'bill_will_automatch' => 'Bill will automatically linked to matching transactions',
+ 'skips_over' => 'skips over',
// accounts:
- 'details_for_asset' => 'Details for asset account ":name"',
- 'details_for_expense' => 'Details for expense account ":name"',
- 'details_for_revenue' => 'Details for revenue account ":name"',
- 'details_for_cash' => 'Details for cash account ":name"',
- 'store_new_asset_account' => 'Store new asset account',
- 'store_new_expense_account' => 'Store new expense account',
- 'store_new_revenue_account' => 'Store new revenue account',
- 'edit_asset_account' => 'Edit asset account ":name"',
- 'edit_expense_account' => 'Edit expense account ":name"',
- 'edit_revenue_account' => 'Edit revenue account ":name"',
- 'delete_asset_account' => 'Delete asset account ":name"',
- 'delete_expense_account' => 'Delete expense account ":name"',
- 'delete_revenue_account' => 'Delete revenue account ":name"',
- 'asset_deleted' => 'Successfully deleted asset account ":name"',
- 'expense_deleted' => 'Successfully deleted expense account ":name"',
- 'revenue_deleted' => 'Successfully deleted revenue account ":name"',
- 'update_asset_account' => 'Update asset account',
- 'update_expense_account' => 'Update expense account',
- 'update_revenue_account' => 'Update revenue account',
- 'make_new_asset_account' => 'Create a new asset account',
- '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',
- 'Cash account' => 'Cash account',
- 'reconcile_account' => 'Reconcile account ":account"',
- 'delete_reconciliation' => 'Delete reconciliation',
- 'update_reconciliation' => 'Update reconciliation',
- 'amount_cannot_be_zero' => 'The amount cannot be zero',
- 'end_of_reconcile_period' => 'End of reconcile period: :period',
- 'start_of_reconcile_period' => 'Start of reconcile period: :period',
- 'start_balance' => 'Start balance',
- 'end_balance' => 'End balance',
- 'update_balance_dates_instruction' => 'Match the amounts and dates above to your bank statement, and press "Start reconciling"',
- 'select_transactions_instruction' => 'Select the transactions that appear on your bank statement.',
- 'select_range_and_balance' => 'First verify the date-range and balances. Then press "Start reconciling"',
- 'date_change_instruction' => 'If you change the date range now, any progress will be lost.',
- 'update_selection' => 'Update selection',
- 'store_reconcile' => 'Store reconciliation',
- 'reconciliation_transaction' => 'Reconciliation transaction',
- 'Reconciliation' => 'Reconciliation',
- 'reconciliation' => 'Reconciliation',
- 'reconcile_options' => 'Reconciliation options',
- 'reconcile_range' => 'Reconciliation range',
- 'start_reconcile' => 'Start reconciling',
- 'cash' => 'cash',
- 'account_type' => 'Account type',
- 'save_transactions_by_moving' => 'Save these transaction(s) by moving them to another account:',
- 'stored_new_account' => 'New account ":name" stored!',
- 'updated_account' => 'Updated account ":name"',
- 'credit_card_options' => 'Credit card options',
- 'no_transactions_account' => 'There are no transactions (in this period) for asset account ":name".',
- 'no_data_for_chart' => 'There is not enough information (yet) to generate this chart.',
- 'select_more_than_one_account' => 'Please select more than one account',
- 'select_more_than_one_category' => 'Please select more than one category',
- 'select_more_than_one_budget' => 'Please select more than one budget',
- 'select_more_than_one_tag' => 'Please select more than one tag',
- 'account_default_currency' => 'If you select another currency, new transactions from this account will have this currency pre-selected.',
- 'reconcile_has_more' => 'Your Firefly III ledger has more money in it than your bank claims you should have. There are several options. Please choose what to do. Then, press "Confirm reconciliation".',
- 'reconcile_has_less' => 'Your Firefly III ledger has less money in it than your bank claims you should have. There are several options. Please choose what to do. Then, press "Confirm reconciliation".',
- 'reconcile_is_equal' => 'Your Firefly III ledger and your bank statements match. There is nothing to do. Please press "Confirm reconciliation" to confirm your input.',
- 'create_pos_reconcile_transaction' => 'Clear the selected transactions, and create a correction adding :amount to this asset account.',
- 'create_neg_reconcile_transaction' => 'Clear the selected transactions, and create a correction removing :amount from this asset account.',
- 'reconcile_do_nothing' => 'Clear the selected transactions, but do not correct.',
- 'reconcile_go_back' => 'You can always edit or delete a correction later.',
- 'must_be_asset_account' => 'You can only reconcile asset accounts',
- 'reconciliation_stored' => 'Reconciliation stored',
- 'reconcilliation_transaction_title' => 'Reconciliation (:from to :to)',
- 'reconcile_this_account' => 'Reconcile this account',
- 'confirm_reconciliation' => 'Confirm reconciliation',
- 'submitted_start_balance' => 'Submitted start balance',
- 'selected_transactions' => 'Selected transactions (:count)',
- 'already_cleared_transactions' => 'Already cleared transactions (:count)',
- 'submitted_end_balance' => 'Submitted end balance',
- 'initial_balance_description' => 'Initial balance for ":account"',
+ 'details_for_asset' => 'Details for asset account ":name"',
+ 'details_for_expense' => 'Details for expense account ":name"',
+ 'details_for_revenue' => 'Details for revenue account ":name"',
+ 'details_for_cash' => 'Details for cash account ":name"',
+ 'store_new_asset_account' => 'Store new asset account',
+ 'store_new_expense_account' => 'Store new expense account',
+ 'store_new_revenue_account' => 'Store new revenue account',
+ 'edit_asset_account' => 'Edit asset account ":name"',
+ 'edit_expense_account' => 'Edit expense account ":name"',
+ 'edit_revenue_account' => 'Edit revenue account ":name"',
+ 'delete_asset_account' => 'Delete asset account ":name"',
+ 'delete_expense_account' => 'Delete expense account ":name"',
+ 'delete_revenue_account' => 'Delete revenue account ":name"',
+ 'asset_deleted' => 'Successfully deleted asset account ":name"',
+ 'expense_deleted' => 'Successfully deleted expense account ":name"',
+ 'revenue_deleted' => 'Successfully deleted revenue account ":name"',
+ 'update_asset_account' => 'Update asset account',
+ 'update_expense_account' => 'Update expense account',
+ 'update_revenue_account' => 'Update revenue account',
+ 'make_new_asset_account' => 'Create a new asset account',
+ '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',
+ 'Cash account' => 'Cash account',
+ 'reconcile_account' => 'Reconcile account ":account"',
+ 'delete_reconciliation' => 'Delete reconciliation',
+ 'update_reconciliation' => 'Update reconciliation',
+ 'amount_cannot_be_zero' => 'The amount cannot be zero',
+ 'end_of_reconcile_period' => 'End of reconcile period: :period',
+ 'start_of_reconcile_period' => 'Start of reconcile period: :period',
+ 'start_balance' => 'Start balance',
+ 'end_balance' => 'End balance',
+ 'update_balance_dates_instruction' => 'Match the amounts and dates above to your bank statement, and press "Start reconciling"',
+ 'select_transactions_instruction' => 'Select the transactions that appear on your bank statement.',
+ 'select_range_and_balance' => 'First verify the date-range and balances. Then press "Start reconciling"',
+ 'date_change_instruction' => 'If you change the date range now, any progress will be lost.',
+ 'update_selection' => 'Update selection',
+ 'store_reconcile' => 'Store reconciliation',
+ 'reconciliation_transaction' => 'Reconciliation transaction',
+ 'Reconciliation' => 'Reconciliation',
+ 'reconciliation' => 'Reconciliation',
+ 'reconcile_options' => 'Reconciliation options',
+ 'reconcile_range' => 'Reconciliation range',
+ 'start_reconcile' => 'Start reconciling',
+ 'cash' => 'cash',
+ 'account_type' => 'Account type',
+ 'save_transactions_by_moving' => 'Save these transaction(s) by moving them to another account:',
+ 'stored_new_account' => 'New account ":name" stored!',
+ 'updated_account' => 'Updated account ":name"',
+ 'credit_card_options' => 'Credit card options',
+ 'no_transactions_account' => 'There are no transactions (in this period) for asset account ":name".',
+ 'no_data_for_chart' => 'There is not enough information (yet) to generate this chart.',
+ 'select_more_than_one_account' => 'Please select more than one account',
+ 'select_more_than_one_category' => 'Please select more than one category',
+ 'select_more_than_one_budget' => 'Please select more than one budget',
+ 'select_more_than_one_tag' => 'Please select more than one tag',
+ 'account_default_currency' => 'If you select another currency, new transactions from this account will have this currency pre-selected.',
+ 'reconcile_has_more' => 'Your Firefly III ledger has more money in it than your bank claims you should have. There are several options. Please choose what to do. Then, press "Confirm reconciliation".',
+ 'reconcile_has_less' => 'Your Firefly III ledger has less money in it than your bank claims you should have. There are several options. Please choose what to do. Then, press "Confirm reconciliation".',
+ 'reconcile_is_equal' => 'Your Firefly III ledger and your bank statements match. There is nothing to do. Please press "Confirm reconciliation" to confirm your input.',
+ 'create_pos_reconcile_transaction' => 'Clear the selected transactions, and create a correction adding :amount to this asset account.',
+ 'create_neg_reconcile_transaction' => 'Clear the selected transactions, and create a correction removing :amount from this asset account.',
+ 'reconcile_do_nothing' => 'Clear the selected transactions, but do not correct.',
+ 'reconcile_go_back' => 'You can always edit or delete a correction later.',
+ 'must_be_asset_account' => 'You can only reconcile asset accounts',
+ 'reconciliation_stored' => 'Reconciliation stored',
+ 'reconcilliation_transaction_title' => 'Reconciliation (:from to :to)',
+ 'reconcile_this_account' => 'Reconcile this account',
+ 'confirm_reconciliation' => 'Confirm reconciliation',
+ 'submitted_start_balance' => 'Submitted start balance',
+ 'selected_transactions' => 'Selected transactions (:count)',
+ 'already_cleared_transactions' => 'Already cleared transactions (:count)',
+ 'submitted_end_balance' => 'Submitted end balance',
+ 'initial_balance_description' => 'Initial balance for ":account"',
// categories:
- 'new_category' => 'New category',
- 'create_new_category' => 'Create a new category',
- 'without_category' => 'Without a category',
- 'update_category' => 'Update category',
- 'updated_category' => 'Updated category ":name"',
- 'categories' => 'Categories',
- 'edit_category' => 'Edit category ":name"',
- 'no_category' => '(no category)',
- 'category' => 'Category',
- 'delete_category' => 'Delete category ":name"',
- 'deleted_category' => 'Deleted category ":name"',
- 'store_category' => 'Store new category',
- 'stored_category' => 'Stored new category ":name"',
- 'without_category_between' => 'Without category between :start and :end',
+ 'new_category' => 'New category',
+ 'create_new_category' => 'Create a new category',
+ 'without_category' => 'Without a category',
+ 'update_category' => 'Update category',
+ 'updated_category' => 'Updated category ":name"',
+ 'categories' => 'Categories',
+ 'edit_category' => 'Edit category ":name"',
+ 'no_category' => '(no category)',
+ 'category' => 'Category',
+ 'delete_category' => 'Delete category ":name"',
+ 'deleted_category' => 'Deleted category ":name"',
+ 'store_category' => 'Store new category',
+ 'stored_category' => 'Stored new category ":name"',
+ 'without_category_between' => 'Without category between :start and :end',
// transactions:
- 'update_withdrawal' => 'Update withdrawal',
- 'update_deposit' => 'Update deposit',
- 'update_transfer' => 'Update transfer',
- 'updated_withdrawal' => 'Updated withdrawal ":description"',
- 'updated_deposit' => 'Updated deposit ":description"',
- 'updated_transfer' => 'Updated transfer ":description"',
- 'delete_withdrawal' => 'Delete withdrawal ":description"',
- 'delete_deposit' => 'Delete deposit ":description"',
- 'delete_transfer' => 'Delete transfer ":description"',
- 'deleted_withdrawal' => 'Successfully deleted withdrawal ":description"',
- 'deleted_deposit' => 'Successfully deleted deposit ":description"',
- 'deleted_transfer' => 'Successfully deleted transfer ":description"',
- 'stored_journal' => 'Successfully created new transaction ":description"',
- 'select_transactions' => 'Select transactions',
- 'rule_group_select_transactions' => 'Apply ":title" to transactions',
- 'rule_select_transactions' => 'Apply ":title" to transactions',
- 'stop_selection' => 'Stop selecting transactions',
- 'reconcile_selected' => 'Reconcile',
- 'mass_delete_journals' => 'Delete a number of transactions',
- 'mass_edit_journals' => 'Edit a number of transactions',
- 'mass_bulk_journals' => 'Bulk edit a number of transactions',
- 'mass_bulk_journals_explain' => 'If you do not want to change your transactions one-by-one using the mass-edit function, you can update them in one go. Simply select the preferred category, tag(s) or budget in the fields below, and all the transactions in the table will be updated.',
- 'bulk_set_new_values' => 'Use the inputs below to set new values. If you leave them empty, they will be made empty for all. Also, note that only withdrawals will be given a budget.',
- 'no_bulk_category' => 'Don\'t update category',
- 'no_bulk_budget' => 'Don\'t update budget',
- 'no_bulk_tags' => 'Don\'t update tag(s)',
- 'bulk_edit' => 'Bulk edit',
- '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.',
- 'no_budget' => 'none',
- 'no_budget_squared' => '(no budget)',
- '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',
- 'notes' => 'Notes',
+ 'update_withdrawal' => 'Update withdrawal',
+ 'update_deposit' => 'Update deposit',
+ 'update_transfer' => 'Update transfer',
+ 'updated_withdrawal' => 'Updated withdrawal ":description"',
+ 'updated_deposit' => 'Updated deposit ":description"',
+ 'updated_transfer' => 'Updated transfer ":description"',
+ 'delete_withdrawal' => 'Delete withdrawal ":description"',
+ 'delete_deposit' => 'Delete deposit ":description"',
+ 'delete_transfer' => 'Delete transfer ":description"',
+ 'deleted_withdrawal' => 'Successfully deleted withdrawal ":description"',
+ 'deleted_deposit' => 'Successfully deleted deposit ":description"',
+ 'deleted_transfer' => 'Successfully deleted transfer ":description"',
+ 'stored_journal' => 'Successfully created new transaction ":description"',
+ 'select_transactions' => 'Select transactions',
+ 'rule_group_select_transactions' => 'Apply ":title" to transactions',
+ 'rule_select_transactions' => 'Apply ":title" to transactions',
+ 'stop_selection' => 'Stop selecting transactions',
+ 'reconcile_selected' => 'Reconcile',
+ 'mass_delete_journals' => 'Delete a number of transactions',
+ 'mass_edit_journals' => 'Edit a number of transactions',
+ 'mass_bulk_journals' => 'Bulk edit a number of transactions',
+ 'mass_bulk_journals_explain' => 'If you do not want to change your transactions one-by-one using the mass-edit function, you can update them in one go. Simply select the preferred category, tag(s) or budget in the fields below, and all the transactions in the table will be updated.',
+ 'bulk_set_new_values' => 'Use the inputs below to set new values. If you leave them empty, they will be made empty for all. Also, note that only withdrawals will be given a budget.',
+ 'no_bulk_category' => 'Don\'t update category',
+ 'no_bulk_budget' => 'Don\'t update budget',
+ 'no_bulk_tags' => 'Don\'t update tag(s)',
+ 'bulk_edit' => 'Bulk edit',
+ '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.',
+ 'no_budget' => 'none',
+ 'no_budget_squared' => '(no budget)',
+ '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',
+ 'notes' => 'Notes',
// new user:
- 'welcome' => 'Welcome to Firefly III!',
- 'submit' => 'Submit',
- 'getting_started' => 'Getting started',
- 'to_get_started' => 'It is good to see you have successfully installed Firefly III. To get started with this tool please enter your bank\'s name and the balance of your main checking account. Do not worry yet if you have multiple accounts. You can add those later. It\'s just that Firefly III needs something to start with.',
- 'savings_balance_text' => 'Firefly III will automatically create a savings account for you. By default, there will be no money in your savings account, but if you tell Firefly III the balance it will be stored as such.',
- 'finish_up_new_user' => 'That\'s it! You can continue by pressing Submit. You will be taken to the index of Firefly III.',
- 'stored_new_accounts_new_user' => 'Yay! Your new accounts have been stored.',
+ 'welcome' => 'Welcome to Firefly III!',
+ 'submit' => 'Submit',
+ 'getting_started' => 'Getting started',
+ 'to_get_started' => 'It is good to see you have successfully installed Firefly III. To get started with this tool please enter your bank\'s name and the balance of your main checking account. Do not worry yet if you have multiple accounts. You can add those later. It\'s just that Firefly III needs something to start with.',
+ 'savings_balance_text' => 'Firefly III will automatically create a savings account for you. By default, there will be no money in your savings account, but if you tell Firefly III the balance it will be stored as such.',
+ 'finish_up_new_user' => 'That\'s it! You can continue by pressing Submit. You will be taken to the index of Firefly III.',
+ 'stored_new_accounts_new_user' => 'Yay! Your new accounts have been stored.',
// home page:
- 'yourAccounts' => 'Your accounts',
- 'budgetsAndSpending' => 'Budgets and spending',
- 'savings' => 'Savings',
- 'newWithdrawal' => 'New expense',
- 'newDeposit' => 'New deposit',
- 'newTransfer' => 'New transfer',
- 'bills_to_pay' => 'Bills to pay',
- 'per_day' => 'Per day',
- 'left_to_spend_per_day' => 'Left to spend per day',
- 'bills_paid' => 'Bills paid',
+ 'yourAccounts' => 'Your accounts',
+ 'budgetsAndSpending' => 'Budgets and spending',
+ 'savings' => 'Savings',
+ 'newWithdrawal' => 'New expense',
+ 'newDeposit' => 'New deposit',
+ 'newTransfer' => 'New transfer',
+ 'bills_to_pay' => 'Bills to pay',
+ 'per_day' => 'Per day',
+ 'left_to_spend_per_day' => 'Left to spend per day',
+ 'bills_paid' => 'Bills paid',
// menu and titles, should be recycled as often as possible:
- 'currency' => 'Currency',
- 'preferences' => 'Preferences',
- 'logout' => 'Logout',
- 'toggleNavigation' => 'Toggle navigation',
- 'searchPlaceholder' => 'Search...',
- 'version' => 'Version',
- 'dashboard' => 'Dashboard',
- 'currencies' => 'Currencies',
- 'accounts' => 'Accounts',
- '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',
- 'transfers' => 'Transfers',
- 'moneyManagement' => 'Money management',
- 'piggyBanks' => 'Piggy banks',
- 'bills' => 'Bills',
- 'withdrawal' => 'Withdrawal',
- 'opening_balance' => 'Opening balance',
- 'deposit' => 'Deposit',
- 'account' => 'Account',
- 'transfer' => 'Transfer',
- 'Withdrawal' => 'Withdrawal',
- 'Deposit' => 'Deposit',
- 'Transfer' => 'Transfer',
- 'bill' => 'Bill',
- 'yes' => 'Yes',
- 'no' => 'No',
- 'amount' => 'Amount',
- 'overview' => 'Overview',
- 'saveOnAccount' => 'Save on account',
- 'unknown' => 'Unknown',
- 'daily' => 'Daily',
- 'monthly' => 'Monthly',
- 'profile' => 'Profile',
- 'errors' => 'Errors',
+ 'currency' => 'Currency',
+ 'preferences' => 'Preferences',
+ 'logout' => 'Logout',
+ 'toggleNavigation' => 'Toggle navigation',
+ 'searchPlaceholder' => 'Search...',
+ 'version' => 'Version',
+ 'dashboard' => 'Dashboard',
+ 'currencies' => 'Currencies',
+ 'accounts' => 'Accounts',
+ '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',
+ 'transfers' => 'Transfers',
+ 'moneyManagement' => 'Money management',
+ 'piggyBanks' => 'Piggy banks',
+ 'bills' => 'Bills',
+ 'withdrawal' => 'Withdrawal',
+ 'opening_balance' => 'Opening balance',
+ 'deposit' => 'Deposit',
+ 'account' => 'Account',
+ 'transfer' => 'Transfer',
+ 'Withdrawal' => 'Withdrawal',
+ 'Deposit' => 'Deposit',
+ 'Transfer' => 'Transfer',
+ 'bill' => 'Bill',
+ 'yes' => 'Yes',
+ 'no' => 'No',
+ 'amount' => 'Amount',
+ 'overview' => 'Overview',
+ 'saveOnAccount' => 'Save on account',
+ 'unknown' => 'Unknown',
+ 'daily' => 'Daily',
+ 'monthly' => 'Monthly',
+ 'profile' => 'Profile',
+ 'errors' => 'Errors',
// reports:
- 'report_default' => 'Default financial report between :start and :end',
- 'report_audit' => 'Transaction history overview between :start and :end',
- 'report_category' => 'Category report between :start and :end',
- 'report_account' => 'Expense/revenue account report between :start and :end',
- 'report_budget' => 'Budget report between :start and :end',
- 'report_tag' => 'Tag report between :start and :end',
- 'quick_link_reports' => 'Quick links',
- 'quick_link_default_report' => 'Default financial report',
- 'quick_link_audit_report' => 'Transaction history overview',
- 'report_this_month_quick' => 'Current month, all accounts',
- 'report_this_year_quick' => 'Current year, all accounts',
- 'report_this_fiscal_year_quick' => 'Current fiscal year, all accounts',
- 'report_all_time_quick' => 'All-time, all accounts',
- 'reports_can_bookmark' => 'Remember that reports can be bookmarked.',
- 'incomeVsExpenses' => 'Income vs. expenses',
- 'accountBalances' => 'Account balances',
- 'balanceStart' => 'Balance at start of period',
- 'balanceEnd' => 'Balance at end of period',
- 'splitByAccount' => 'Split by account',
- 'coveredWithTags' => 'Covered with tags',
- 'leftUnbalanced' => 'Left unbalanced',
- 'leftInBudget' => 'Left in budget',
- 'sumOfSums' => 'Sum of sums',
- 'noCategory' => '(no category)',
- 'notCharged' => 'Not charged (yet)',
- 'inactive' => 'Inactive',
- 'active' => 'Active',
- 'difference' => 'Difference',
- 'money_flowing_in' => 'In',
- 'money_flowing_out' => 'Out',
- 'topX' => 'top :number',
- 'show_full_list' => 'Show entire list',
- 'show_only_top' => 'Show only top :number',
- 'report_type' => 'Report type',
- 'report_type_default' => 'Default financial report',
- 'report_type_audit' => 'Transaction history overview (audit)',
- 'report_type_category' => 'Category report',
- 'report_type_budget' => 'Budget report',
- 'report_type_tag' => 'Tag report',
- 'report_type_account' => 'Expense/revenue account report',
- 'more_info_help' => 'More information about these types of reports can be found in the help pages. Press the (?) icon in the top right corner.',
- 'report_included_accounts' => 'Included accounts',
- 'report_date_range' => 'Date range',
- 'report_preset_ranges' => 'Pre-set ranges',
- 'shared' => 'Shared',
- 'fiscal_year' => 'Fiscal year',
- 'income_entry' => 'Income from account ":name" between :start and :end',
- 'expense_entry' => 'Expenses to account ":name" between :start and :end',
- 'category_entry' => 'Expenses in category ":name" between :start and :end',
- 'budget_spent_amount' => 'Expenses in budget ":budget" between :start and :end',
- 'balance_amount' => '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',
- 'end_after_start_date' => 'End date of report must be after start date.',
- 'select_category' => 'Select category(ies)',
- 'select_budget' => 'Select budget(s).',
- 'select_tag' => 'Select tag(s).',
- 'income_per_category' => 'Income per category',
- 'expense_per_category' => 'Expense per category',
- 'expense_per_budget' => 'Expense per budget',
- 'income_per_account' => 'Income per account',
- 'expense_per_account' => 'Expense per account',
- 'expense_per_tag' => 'Expense per tag',
- 'income_per_tag' => 'Income per tag',
- 'include_expense_not_in_budget' => 'Included expenses not in the selected budget(s)',
- 'include_expense_not_in_account' => 'Included expenses not in the selected account(s)',
- 'include_expense_not_in_category' => 'Included expenses not in the selected category(ies)',
- 'include_income_not_in_category' => 'Included income not in the selected category(ies)',
- 'include_income_not_in_account' => 'Included income not in the selected account(s)',
- 'include_income_not_in_tags' => 'Included income not in the selected tag(s)',
- 'include_expense_not_in_tags' => 'Included expenses not in the selected tag(s)',
- 'everything_else' => 'Everything else',
- 'income_and_expenses' => 'Income and expenses',
- 'spent_average' => 'Spent (average)',
- 'income_average' => 'Income (average)',
- 'transaction_count' => 'Transaction count',
- 'average_spending_per_account' => 'Average spending per account',
- 'average_income_per_account' => 'Average income per account',
- 'total' => 'Total',
- 'description' => 'Description',
- 'sum_of_period' => 'Sum of period',
- 'average_in_period' => 'Average in period',
- 'account_role_defaultAsset' => 'Default asset account',
- 'account_role_sharedAsset' => 'Shared asset account',
- 'account_role_savingAsset' => 'Savings account',
- 'account_role_ccAsset' => 'Credit card',
- '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.',
- 'in_out_accounts' => 'Earned and spent per combination',
- 'in_out_per_category' => 'Earned and spent per category',
- 'out_per_budget' => 'Spent per budget',
- 'select_expense_revenue' => 'Select expense/revenue account',
+ '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_account' => 'Expense/revenue account report between :start and :end',
+ 'report_budget' => 'Budget report between :start and :end',
+ 'report_tag' => 'Tag report between :start and :end',
+ 'quick_link_reports' => 'Quick links',
+ 'quick_link_default_report' => 'Default financial report',
+ 'quick_link_audit_report' => 'Transaction history overview',
+ 'report_this_month_quick' => 'Current month, all accounts',
+ 'report_this_year_quick' => 'Current year, all accounts',
+ 'report_this_fiscal_year_quick' => 'Current fiscal year, all accounts',
+ 'report_all_time_quick' => 'All-time, all accounts',
+ 'reports_can_bookmark' => 'Remember that reports can be bookmarked.',
+ 'incomeVsExpenses' => 'Income vs. expenses',
+ 'accountBalances' => 'Account balances',
+ 'balanceStart' => 'Balance at start of period',
+ 'balanceEnd' => 'Balance at end of period',
+ 'splitByAccount' => 'Split by account',
+ 'coveredWithTags' => 'Covered with tags',
+ 'leftUnbalanced' => 'Left unbalanced',
+ 'leftInBudget' => 'Left in budget',
+ 'sumOfSums' => 'Sum of sums',
+ 'noCategory' => '(no category)',
+ 'notCharged' => 'Not charged (yet)',
+ 'inactive' => 'Inactive',
+ 'active' => 'Active',
+ 'difference' => 'Difference',
+ 'money_flowing_in' => 'In',
+ 'money_flowing_out' => 'Out',
+ 'topX' => 'top :number',
+ 'show_full_list' => 'Show entire list',
+ 'show_only_top' => 'Show only top :number',
+ 'report_type' => 'Report type',
+ 'report_type_default' => 'Default financial report',
+ 'report_type_audit' => 'Transaction history overview (audit)',
+ 'report_type_category' => 'Category report',
+ 'report_type_budget' => 'Budget report',
+ 'report_type_tag' => 'Tag report',
+ 'report_type_account' => 'Expense/revenue account report',
+ 'more_info_help' => 'More information about these types of reports can be found in the help pages. Press the (?) icon in the top right corner.',
+ 'report_included_accounts' => 'Included accounts',
+ 'report_date_range' => 'Date range',
+ 'report_preset_ranges' => 'Pre-set ranges',
+ 'shared' => 'Shared',
+ 'fiscal_year' => 'Fiscal year',
+ 'income_entry' => 'Income from account ":name" between :start and :end',
+ 'expense_entry' => 'Expenses to account ":name" between :start and :end',
+ 'category_entry' => 'Expenses in category ":name" between :start and :end',
+ 'budget_spent_amount' => 'Expenses in budget ":budget" between :start and :end',
+ 'balance_amount' => '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',
+ 'end_after_start_date' => 'End date of report must be after start date.',
+ 'select_category' => 'Select category(ies)',
+ 'select_budget' => 'Select budget(s).',
+ 'select_tag' => 'Select tag(s).',
+ 'income_per_category' => 'Income per category',
+ 'expense_per_category' => 'Expense per category',
+ 'expense_per_budget' => 'Expense per budget',
+ 'income_per_account' => 'Income per account',
+ 'expense_per_account' => 'Expense per account',
+ 'expense_per_tag' => 'Expense per tag',
+ 'income_per_tag' => 'Income per tag',
+ 'include_expense_not_in_budget' => 'Included expenses not in the selected budget(s)',
+ 'include_expense_not_in_account' => 'Included expenses not in the selected account(s)',
+ 'include_expense_not_in_category' => 'Included expenses not in the selected category(ies)',
+ 'include_income_not_in_category' => 'Included income not in the selected category(ies)',
+ 'include_income_not_in_account' => 'Included income not in the selected account(s)',
+ 'include_income_not_in_tags' => 'Included income not in the selected tag(s)',
+ 'include_expense_not_in_tags' => 'Included expenses not in the selected tag(s)',
+ 'everything_else' => 'Everything else',
+ 'income_and_expenses' => 'Income and expenses',
+ 'spent_average' => 'Spent (average)',
+ 'income_average' => 'Income (average)',
+ 'transaction_count' => 'Transaction count',
+ 'average_spending_per_account' => 'Average spending per account',
+ 'average_income_per_account' => 'Average income per account',
+ 'total' => 'Total',
+ 'description' => 'Description',
+ 'sum_of_period' => 'Sum of period',
+ 'average_in_period' => 'Average in period',
+ 'account_role_defaultAsset' => 'Default asset account',
+ 'account_role_sharedAsset' => 'Shared asset account',
+ 'account_role_savingAsset' => 'Savings account',
+ 'account_role_ccAsset' => 'Credit card',
+ '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.',
+ 'in_out_accounts' => 'Earned and spent per combination',
+ 'in_out_per_category' => 'Earned and spent per category',
+ 'out_per_budget' => 'Spent per budget',
+ 'select_expense_revenue' => 'Select expense/revenue account',
// charts:
- 'chart' => 'Chart',
- 'month' => 'Month',
- 'budget' => 'Budget',
- 'spent' => 'Spent',
- 'spent_in_budget' => 'Spent in budget',
- 'left_to_spend' => 'Left to spend',
- 'earned' => 'Earned',
- 'overspent' => 'Overspent',
- 'left' => 'Left',
- 'max-amount' => 'Maximum amount',
- 'min-amount' => 'Minumum amount',
- 'journal-amount' => 'Current bill entry',
- 'name' => 'Name',
- 'date' => 'Date',
- 'paid' => 'Paid',
- 'unpaid' => 'Unpaid',
- 'day' => 'Day',
- 'budgeted' => 'Budgeted',
- 'period' => 'Period',
- 'balance' => 'Balance',
- 'sum' => 'Sum',
- 'average' => 'Average',
- 'balanceFor' => 'Balance for :name',
+ 'chart' => 'Chart',
+ 'month' => 'Month',
+ 'budget' => 'Budget',
+ 'spent' => 'Spent',
+ 'spent_in_budget' => 'Spent in budget',
+ 'left_to_spend' => 'Left to spend',
+ 'earned' => 'Earned',
+ 'overspent' => 'Overspent',
+ 'left' => 'Left',
+ 'max-amount' => 'Maximum amount',
+ 'min-amount' => 'Minumum amount',
+ 'journal-amount' => 'Current bill entry',
+ 'name' => 'Name',
+ 'date' => 'Date',
+ 'paid' => 'Paid',
+ 'unpaid' => 'Unpaid',
+ 'day' => 'Day',
+ 'budgeted' => 'Budgeted',
+ 'period' => 'Period',
+ 'balance' => 'Balance',
+ 'sum' => 'Sum',
+ 'average' => 'Average',
+ 'balanceFor' => 'Balance for :name',
// piggy banks:
- 'add_money_to_piggy' => 'Add money to piggy bank ":name"',
- 'piggy_bank' => 'Piggy bank',
- 'new_piggy_bank' => 'New piggy bank',
- 'store_piggy_bank' => 'Store new piggy bank',
- 'stored_piggy_bank' => 'Store new piggy bank ":name"',
- 'account_status' => 'Account status',
- 'left_for_piggy_banks' => 'Left for piggy banks',
- 'sum_of_piggy_banks' => 'Sum of piggy banks',
- 'saved_so_far' => 'Saved so far',
- 'left_to_save' => 'Left to save',
- 'suggested_amount' => 'Suggested monthly amount to save',
- 'add_money_to_piggy_title' => 'Add money to piggy bank ":name"',
- 'remove_money_from_piggy_title' => 'Remove money from piggy bank ":name"',
- 'add' => 'Add',
- 'no_money_for_piggy' => 'You have no money to put in this piggy bank.',
+ 'add_money_to_piggy' => 'Add money to piggy bank ":name"',
+ 'piggy_bank' => 'Piggy bank',
+ 'new_piggy_bank' => 'New piggy bank',
+ 'store_piggy_bank' => 'Store new piggy bank',
+ 'stored_piggy_bank' => 'Store new piggy bank ":name"',
+ 'account_status' => 'Account status',
+ 'left_for_piggy_banks' => 'Left for piggy banks',
+ 'sum_of_piggy_banks' => 'Sum of piggy banks',
+ 'saved_so_far' => 'Saved so far',
+ 'left_to_save' => 'Left to save',
+ 'suggested_amount' => 'Suggested monthly amount to save',
+ 'add_money_to_piggy_title' => 'Add money to piggy bank ":name"',
+ 'remove_money_from_piggy_title' => 'Remove money from piggy bank ":name"',
+ 'add' => 'Add',
+ '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',
@@ -1084,6 +1086,7 @@ return [
'invalid_link_selection' => 'Cannot link these transactions',
'journals_linked' => 'Transactions are linked.',
'journals_error_linked' => 'These transactions are already linked.',
+ 'journals_link_to_self' => 'You cannot link a transaction to itself',
'journal_links' => 'Transaction links',
'this_withdrawal' => 'This withdrawal',
'this_deposit' => 'This deposit',
diff --git a/resources/lang/en_US/form.php b/resources/lang/en_US/form.php
index fda485df3f..4c132ced51 100644
--- a/resources/lang/en_US/form.php
+++ b/resources/lang/en_US/form.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// new user:
diff --git a/resources/lang/en_US/import.php b/resources/lang/en_US/import.php
index d0be62eb6c..3130034c8b 100644
--- a/resources/lang/en_US/import.php
+++ b/resources/lang/en_US/import.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
// status of import:
@@ -97,6 +98,7 @@ return [
// not csv, but normal warning
'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.',
'foreign_amount_warning' => 'If you mark a column as containing an amount in a foreign currency, you must also set the column that contains which currency it is.',
+
// file, map data
'file_map_title' => 'Import setup (4/4) - Connect import data to Firefly III data',
'file_map_text' => 'In the following tables, the left value shows you information found in your uploaded file. It is your task to map this value, if possible, to a value already present in your database. Firefly will stick to this mapping. If there is no value to map to, or you do not wish to map the specific value, select nothing.',
@@ -131,28 +133,40 @@ return [
'column_date-book' => 'Transaction booking date',
'column_date-process' => 'Transaction process date',
'column_date-transaction' => 'Date',
+ 'column_date-due' => 'Transaction due date',
+ 'column_date-payment' => 'Transaction payment date',
+ 'column_date-invoice' => 'Transaction invoice date',
'column_description' => 'Description',
'column_opposing-iban' => 'Opposing account (IBAN)',
+ 'column_opposing-bic' => 'Opposing account (BIC)',
'column_opposing-id' => 'Opposing account ID (matching FF3)',
'column_external-id' => 'External ID',
'column_opposing-name' => 'Opposing account (name)',
'column_rabo-debit-credit' => 'Rabobank specific debit/credit indicator',
'column_ing-debit-credit' => 'ING specific debit/credit indicator',
- 'column_sepa-ct-id' => 'SEPA Credit Transfer end-to-end ID',
- 'column_sepa-ct-op' => 'SEPA Credit Transfer opposing account',
- 'column_sepa-db' => 'SEPA Direct Debit',
+ 'column_sepa-ct-id' => 'SEPA end-to-end Identifier',
+ 'column_sepa-ct-op' => 'SEPA Opposing Account Identifier',
+ 'column_sepa-db' => 'SEPA Mandate Identifier',
+ 'column_sepa-cc' => 'SEPA Clearing Code',
+ 'column_sepa-ci' => 'SEPA Creditor Identifier',
+ 'column_sepa-ep' => 'SEPA External Purpose',
+ 'column_sepa-country' => 'SEPA Country Code',
'column_tags-comma' => 'Tags (comma separated)',
'column_tags-space' => 'Tags (space separated)',
'column_account-number' => 'Asset account (account number)',
'column_opposing-number' => 'Opposing account (account number)',
'column_note' => 'Note(s)',
+ 'column_internal-reference' => 'Internal reference',
// prerequisites
'prerequisites' => 'Prerequisites',
// bunq
'bunq_prerequisites_title' => 'Prerequisites for an import from bunq',
- 'bunq_prerequisites_text' => 'In order to import from bunq, you need to obtain an API key. You can do this through the app.',
+ 'bunq_prerequisites_text' => 'In order to import from bunq, you need to obtain an API key. You can do this through the app. Please note that the import function for bunq is in BETA. It has only been tested against the sandbox API.',
+ 'bunq_do_import' => 'Yes, import from this account',
+ 'bunq_accounts_title' => 'Bunq accounts',
+ 'bunq_accounts_text' => 'These are the accounts associated with your bunq account. Please select the accounts from which you want to import, and in which account the transactions must be imported.',
// Spectre
'spectre_title' => 'Import using Spectre',
@@ -187,4 +201,3 @@ return [
// various other strings:
'imported_from_account' => 'Imported from ":account"',
];
-
diff --git a/resources/lang/en_US/intro.php b/resources/lang/en_US/intro.php
index 12485de8fd..8dba87a7cc 100644
--- a/resources/lang/en_US/intro.php
+++ b/resources/lang/en_US/intro.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// index
diff --git a/resources/lang/en_US/list.php b/resources/lang/en_US/list.php
index 08ebf2bddd..d8da5cb39e 100644
--- a/resources/lang/en_US/list.php
+++ b/resources/lang/en_US/list.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
'buttons' => 'Buttons',
@@ -102,4 +103,12 @@ return [
'reconcile' => 'Reconcile',
'account_on_spectre' => 'Account (Spectre)',
'do_import' => 'Import from this account',
+ 'sepa-ct-id' => 'SEPA End to End Identifier',
+ 'sepa-ct-op' => 'SEPA Opposing Account Identifier',
+ 'sepa-db' => 'SEPA Mandate Identifier',
+ 'sepa-country' => 'SEPA Country',
+ 'sepa-cc' => 'SEPA Clearing Code',
+ 'sepa-ep' => 'SEPA External Purpose',
+ 'sepa-ci' => 'SEPA Creditor Identifier',
+ 'account_at_bunq' => 'Account with bunq',
];
diff --git a/resources/lang/en_US/pagination.php b/resources/lang/en_US/pagination.php
index 2c19d61e0c..08f0120dcf 100644
--- a/resources/lang/en_US/pagination.php
+++ b/resources/lang/en_US/pagination.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'previous' => '« Previous',
diff --git a/resources/lang/en_US/passwords.php b/resources/lang/en_US/passwords.php
index 022045d473..886144c6f9 100644
--- a/resources/lang/en_US/passwords.php
+++ b/resources/lang/en_US/passwords.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'password' => 'Passwords must be at least six characters and match the confirmation.',
diff --git a/resources/lang/en_US/validation.php b/resources/lang/en_US/validation.php
index db12a84f92..a5338ebd8f 100644
--- a/resources/lang/en_US/validation.php
+++ b/resources/lang/en_US/validation.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'iban' => 'This is not a valid IBAN.',
+ 'source_equals_destination' => 'The source account equals the destination account',
'unique_account_number_for_user' => 'It looks like this account number is already in use.',
'unique_iban_for_user' => 'It looks like this IBAN is already in use.',
'deleted_user' => 'Due to security constraints, you cannot register using this email address.',
diff --git a/resources/lang/es_ES/auth.php b/resources/lang/es_ES/auth.php
index 0174bb37e5..a320da2085 100644
--- a/resources/lang/es_ES/auth.php
+++ b/resources/lang/es_ES/auth.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
/*
diff --git a/resources/lang/es_ES/bank.php b/resources/lang/es_ES/bank.php
index ef0d636f91..b6a86faa4b 100644
--- a/resources/lang/es_ES/bank.php
+++ b/resources/lang/es_ES/bank.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
];
diff --git a/resources/lang/es_ES/breadcrumbs.php b/resources/lang/es_ES/breadcrumbs.php
index 61ad6a28b6..71644a5c15 100644
--- a/resources/lang/es_ES/breadcrumbs.php
+++ b/resources/lang/es_ES/breadcrumbs.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'home' => 'Inicio',
diff --git a/resources/lang/es_ES/components.php b/resources/lang/es_ES/components.php
index d537947a1c..c3a3d8d2bb 100644
--- a/resources/lang/es_ES/components.php
+++ b/resources/lang/es_ES/components.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// profile
diff --git a/resources/lang/es_ES/config.php b/resources/lang/es_ES/config.php
index 8d2ea86b8a..34f6dcfe1f 100644
--- a/resources/lang/es_ES/config.php
+++ b/resources/lang/es_ES/config.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'html_language' => 'es',
diff --git a/resources/lang/es_ES/csv.php b/resources/lang/es_ES/csv.php
index d61316b632..892c8beac4 100644
--- a/resources/lang/es_ES/csv.php
+++ b/resources/lang/es_ES/csv.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
];
diff --git a/resources/lang/es_ES/demo.php b/resources/lang/es_ES/demo.php
index 858ff8d21d..a2a7084015 100644
--- a/resources/lang/es_ES/demo.php
+++ b/resources/lang/es_ES/demo.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
- 'no_demo_text' => 'Lamentablemente no hay textos de ayuda para esta página.',
- 'see_help_icon' => 'Sin embargo, el ícono en la esquina superior-derecha puede tener más información.',
- 'index' => '¡Bienvenido a Firefly III! En esta página tendrá una vista rápida de sus finanzas. Para más información, mire sus cuentas rarr; Asset Accounts y, claro, las páginas de presupuestos y reportes. O simplemente investigue la aplicación por su cuenta.',
- 'accounts-index' => 'Las cajas de ahorro son sus cuentas de banco personales. Las cuentas de gastos contienen sus gastos habituales como compras y salidas con amigos. Las cuentas de ingresos repesentan ingresos de su trabajo u otras fuentes. En esta página puede editarlas o eliminarlas.',
- 'budgets-index' => 'Esta página le muestra una visión general de sus presupuestos. La barra superior muestra la cantidad que está disponible para ser presupuestado. Esto se puede personalizar para cualquier período haciendo clic en la cantidad a la derecha. La cantidad que has gastado hasta ahora se muestra en la barra de abajo. Debajo están los gastos por presupuesto y lo que ha presupuestado para ellos.',
- 'reports-index-start' => 'Firefly III da soporte a un buen numero de tipos de reportes. Lea sobre ellos haciendo clic en el icono en el tope de la esquina derecha.',
- 'reports-index-examples' => 'Asegúrese de revisar estos ejemplos: un resumen financiero mensual, un resumen financiero anual y una vista general del presupuesto.',
- 'currencies-index' => 'Firefly III admite múltiples monedas. A pesar de que la moneda por defecto es el Euro, se puede seleccionar el Dólar de EE.UU, y muchas otras monedas. Como se puede ver se ha incluido una pequeña selección de monedas, pero puedes agregar tu propia moneda si lo deseas. Sin embargo, cambiar la moneda predeterminada no cambiará la moneda de las transacciones existentes: Firefly III admite el uso de varias monedas al mismo tiempo.',
- 'transactions-index' => 'Estos gastos, depósitos y transferencias no son particularmente imaginativos. Se han generado automáticamente.',
- 'piggy-banks-index' => 'Como puede ver, hay tres alcancías. Utilice los botones más y menos para influir en la cantidad de dinero en cada alcancía. Haga clic en el nombre de la alcancía para ver la administración de cada una.',
- 'import-index' => 'Por supuesto, cualquier archivo CSV puede ser importado dentro de Firefly III',
+ 'no_demo_text' => 'Lamentablemente no hay textos de ayuda para esta página.',
+ 'see_help_icon' => 'Sin embargo, el ícono en la esquina superior-derecha puede tener más información.',
+ 'index' => '¡Bienvenido a Firefly III! En esta página tendrá una vista rápida de sus finanzas. Para más información, mire sus cuentas rarr; Asset Accounts y, claro, las páginas de presupuestos y reportes. O simplemente investigue la aplicación por su cuenta.',
+ 'accounts-index' => 'Las cajas de ahorro son sus cuentas de banco personales. Las cuentas de gastos contienen sus gastos habituales como compras y salidas con amigos. Las cuentas de ingresos repesentan ingresos de su trabajo u otras fuentes. En esta página puede editarlas o eliminarlas.',
+ 'budgets-index' => 'Esta página le muestra una visión general de sus presupuestos. La barra superior muestra la cantidad que está disponible para ser presupuestado. Esto se puede personalizar para cualquier período haciendo clic en la cantidad a la derecha. La cantidad que has gastado hasta ahora se muestra en la barra de abajo. Debajo están los gastos por presupuesto y lo que ha presupuestado para ellos.',
+ 'reports-index-start' => 'Firefly III da soporte a un buen numero de tipos de reportes. Lea sobre ellos haciendo clic en el icono en el tope de la esquina derecha.',
+ 'reports-index-examples' => 'Asegúrese de revisar estos ejemplos: un resumen financiero mensual, un resumen financiero anual y una vista general del presupuesto.',
+ 'currencies-index' => 'Firefly III admite múltiples monedas. A pesar de que la moneda por defecto es el Euro, se puede seleccionar el Dólar de EE.UU, y muchas otras monedas. Como se puede ver se ha incluido una pequeña selección de monedas, pero puedes agregar tu propia moneda si lo deseas. Sin embargo, cambiar la moneda predeterminada no cambiará la moneda de las transacciones existentes: Firefly III admite el uso de varias monedas al mismo tiempo.',
+ 'transactions-index' => 'Estos gastos, depósitos y transferencias no son particularmente imaginativos. Se han generado automáticamente.',
+ 'piggy-banks-index' => 'Como puede ver, hay tres alcancías. Utilice los botones más y menos para influir en la cantidad de dinero en cada alcancía. Haga clic en el nombre de la alcancía para ver la administración de cada una.',
+ 'import-index' => 'Por supuesto, cualquier archivo CSV puede ser importado dentro de Firefly III',
];
diff --git a/resources/lang/es_ES/firefly.php b/resources/lang/es_ES/firefly.php
index db1f7af44c..1e128fbd9b 100644
--- a/resources/lang/es_ES/firefly.php
+++ b/resources/lang/es_ES/firefly.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
// general stuff:
@@ -170,10 +171,12 @@ return [
'want_to_login' => 'Yo quiero entrar al sistema',
'button_register' => 'Registrar',
'authorization' => 'Authorization',
-
+ 'active_bills_only' => 'active bills only',
+ 'average_per_bill' => 'average per bill',
+ 'expected_total' => 'expected total',
// API access
- 'authorization_request' => 'Firefly III v: version Solicitud de autorización',
- 'authorization_request_intro' => ': el cliente está solicitando permiso para acceder a su administración financiera. ¿Desea autorizar : cliente para acceder a estos registros?',
+ 'authorization_request' => 'Firefly III v:version Solicitud de autorización',
+ 'authorization_request_intro' => 'El :client está solicitando permiso para acceder a su administración financiera. ¿Desea autorizar :client para acceder a estos registros?',
'scopes_will_be_able' => 'Esta aplicación podrá:',
'button_authorize' => 'Autorizar',
@@ -403,591 +406,590 @@ return [
'rule_action_set_notes_choice' => 'Establecer notas para..',
'rule_action_set_notes' => 'Establecer notas para:action_value',
- 'rules_have_read_warning' => '¿Has leído la advertencia?',
- 'apply_rule_warning' => 'Advertencia: Ejecutando una regla (grupo) en una gran selección de transacciones podría tomar años, y podría exceder el tiempo de espera. Si lo hace, la regla (grupo) solo se aplicara a un subconjunto desconocido de sus transacciones. Esto podría dejar a su administración financiera en ruinas. por favor tenga cuidado.',
+ 'rules_have_read_warning' => '¿Has leído la advertencia?',
+ 'apply_rule_warning' => 'Advertencia: Ejecutando una regla (grupo) en una gran selección de transacciones podría tomar años, y podría exceder el tiempo de espera. Si lo hace, la regla (grupo) solo se aplicara a un subconjunto desconocido de sus transacciones. Esto podría dejar a su administración financiera en ruinas. por favor tenga cuidado.',
// tags
- 'store_new_tag' => 'Almacenar nueva etiqueta',
- 'update_tag' => 'Actualizar etiqueta',
- 'no_location_set' => 'Ubicación no establecida.',
- 'meta_data' => 'Meta Datos',
- 'location' => 'Ubicación',
- 'without_date' => 'Sin fecha',
- 'result' => 'Resultado',
- 'sums_apply_to_range' => 'Todas las sumas aplican al rango seleccionado',
- 'mapbox_api_key' => 'Para usar el mapa, obtenga una clave API de MapboxAbra su.env y introduzca este código después de MAPBOX_API_KEY=.',
- 'press_tag_location' => 'Haga clic o pulse de forma prolongada para definir la ubicación de la etiqueta.',
- 'clear_location' => 'Eliminar ubicación',
+ 'store_new_tag' => 'Almacenar nueva etiqueta',
+ 'update_tag' => 'Actualizar etiqueta',
+ 'no_location_set' => 'Ubicación no establecida.',
+ 'meta_data' => 'Meta Datos',
+ 'location' => 'Ubicación',
+ 'without_date' => 'Sin fecha',
+ 'result' => 'Resultado',
+ 'sums_apply_to_range' => 'Todas las sumas aplican al rango seleccionado',
+ 'mapbox_api_key' => 'Para usar el mapa, obtenga una clave API de MapboxAbra su.env y introduzca este código después de MAPBOX_API_KEY=.',
+ 'press_tag_location' => 'Haga clic o pulse de forma prolongada para definir la ubicación de la etiqueta.',
+ 'clear_location' => 'Eliminar ubicación',
// preferences
- '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' => 'Rango de vision',
- 'pref_view_range_help' => 'Algunos gráficos se agrupan automáticamente en periodos. ¿que periodo prefiere usted?',
- 'pref_1D' => 'Un dia',
- 'pref_1W' => 'Una semana',
- 'pref_1M' => 'Un mes',
- 'pref_3M' => 'Tres meses (trimestre)',
- 'pref_6M' => 'Seis meses',
- 'pref_1Y' => 'Un año',
- 'pref_languages' => 'Idiomas',
- 'pref_languages_help' => 'Firefly III apoya varios idiomas. cual usted prefiere?',
- 'pref_custom_fiscal_year' => 'Configuraciónes del año fiscal',
- 'pref_custom_fiscal_year_label' => 'Habilitado',
- 'pref_custom_fiscal_year_help' => 'En países que utilizan año fiscal diferente del 1 al 31 de diciembre, usted puede cambiarlo y especificar los días de inicio / y termino del año fiscal',
- 'pref_fiscal_year_start_label' => 'Fecha de inicio del año fiscal',
- 'pref_two_factor_auth' => 'Verificación en 2 pasos',
- 'pref_two_factor_auth_help' => 'Cuando usted habilita la verificación en 2 pasos ( también conocida como autenticacion de dos factores) usted agrega una capa adicional de seguridad a su cuenta. usted inicia la sesión que conoce (código de verificación). los códigos de generación son generados por una aplicación de su teléfono, tales como Authy o Google Authenticador.',
- 'pref_enable_two_factor_auth' => 'Permita la verificación de 2 pasos',
- 'pref_two_factor_auth_disabled' => 'Codigo de verificacion en 2 pasos removido y inabilitado',
- 'pref_two_factor_auth_remove_it' => 'No olvide eliminar la cuenta de su aplicación de autenticacion!',
- 'pref_two_factor_auth_code' => 'Verificar código',
- 'pref_two_factor_auth_code_help' => 'Escanee el código QR con una aplicación en su teléfono como Authy o Google autenticator y ingrese el código generado.',
- 'pref_two_factor_auth_reset_code' => 'Reiniciar código de verificación',
- 'pref_two_factor_auth_remove_code' => 'Eliminar el código de verificación',
- 'pref_two_factor_auth_remove_will_disable' => '(Esto también desactivara la autenticacion de dos factores)',
- 'pref_save_settings' => 'Guardar la configuración',
- 'saved_preferences' => '¡Preferencias guardadas!',
- 'preferences_general' => 'General',
- 'preferences_frontpage' => 'Pantalla de inicio',
- 'preferences_security' => 'Seguridad',
- 'preferences_layout' => 'Diseño',
- 'pref_home_show_deposits' => 'Mostrar los depósitos en la pantalla de inicio',
- 'pref_home_show_deposits_info' => 'La pantalla de inicio ya muestra sus cuentas de gastos. ¿debería mostrar también su cuenta de ingresos?',
- 'pref_home_do_show_deposits' => 'Si, muestrales',
- 'successful_count' => 'de cual :count exitoso',
- 'list_page_size_title' => 'Tamaño de pagina',
- 'list_page_size_help' => 'Cualquier lista de cosas (cuentas, transacciones, etc) muestra como mucho esta cantidad por pagina.',
- 'list_page_size_label' => 'Tamaño de pagina',
- 'between_dates' => '(:start y :end)',
- 'pref_optional_fields_transaction' => 'Campos opcionales para transacciones',
- 'pref_optional_fields_transaction_help' => 'Por defecto no todos los campos se habilitan al crear una nueva transacción (debido al desorden). abajo usted puede habilitar estos campos si usted piensa que pueden ser útiles. por supuesto, cualquier campo que este desactivado, pero ya completado, sera visible a pesar de la configuración.',
- 'optional_tj_date_fields' => 'Campos de fecha',
- 'optional_tj_business_fields' => 'Campos comerciales',
- 'optional_tj_attachment_fields' => 'Campos de datos adjuntos',
- 'pref_optional_tj_interest_date' => 'Fecha de intereses',
- 'pref_optional_tj_book_date' => 'Fecha del libro de registro',
- 'pref_optional_tj_process_date' => 'Fecha de procesamiento',
- 'pref_optional_tj_due_date' => 'Fecha de caducidad',
- 'pref_optional_tj_payment_date' => 'Fecha de pago',
- 'pref_optional_tj_invoice_date' => 'Fecha de la factura',
- 'pref_optional_tj_internal_reference' => 'Referencia interna',
- 'pref_optional_tj_notes' => 'Notas',
- 'pref_optional_tj_attachments' => 'Adjuntos',
- 'optional_field_meta_dates' => 'Fechas',
- 'optional_field_meta_business' => 'Negocios',
- 'optional_field_attachments' => 'Adjuntos',
- 'optional_field_meta_data' => 'Opcional meta datos',
+ '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' => 'Rango de vision',
+ 'pref_view_range_help' => 'Algunos gráficos se agrupan automáticamente en periodos. ¿que periodo prefiere usted?',
+ 'pref_1D' => 'Un dia',
+ 'pref_1W' => 'Una semana',
+ 'pref_1M' => 'Un mes',
+ 'pref_3M' => 'Tres meses (trimestre)',
+ 'pref_6M' => 'Seis meses',
+ 'pref_1Y' => 'Un año',
+ 'pref_languages' => 'Idiomas',
+ 'pref_languages_help' => 'Firefly III apoya varios idiomas. cual usted prefiere?',
+ 'pref_custom_fiscal_year' => 'Configuraciónes del año fiscal',
+ 'pref_custom_fiscal_year_label' => 'Habilitado',
+ 'pref_custom_fiscal_year_help' => 'En países que utilizan año fiscal diferente del 1 al 31 de diciembre, usted puede cambiarlo y especificar los días de inicio / y termino del año fiscal',
+ 'pref_fiscal_year_start_label' => 'Fecha de inicio del año fiscal',
+ 'pref_two_factor_auth' => 'Verificación en 2 pasos',
+ 'pref_two_factor_auth_help' => 'Cuando usted habilita la verificación en 2 pasos ( también conocida como autenticacion de dos factores) usted agrega una capa adicional de seguridad a su cuenta. usted inicia la sesión que conoce (código de verificación). los códigos de generación son generados por una aplicación de su teléfono, tales como Authy o Google Authenticador.',
+ 'pref_enable_two_factor_auth' => 'Permita la verificación de 2 pasos',
+ 'pref_two_factor_auth_disabled' => 'Codigo de verificacion en 2 pasos removido y inabilitado',
+ 'pref_two_factor_auth_remove_it' => 'No olvide eliminar la cuenta de su aplicación de autenticacion!',
+ 'pref_two_factor_auth_code' => 'Verificar código',
+ 'pref_two_factor_auth_code_help' => 'Escanee el código QR con una aplicación en su teléfono como Authy o Google autenticator y ingrese el código generado.',
+ 'pref_two_factor_auth_reset_code' => 'Reiniciar código de verificación',
+ 'pref_two_factor_auth_disable_2fa' => 'Disable 2FA',
+ 'pref_save_settings' => 'Guardar la configuración',
+ 'saved_preferences' => '¡Preferencias guardadas!',
+ 'preferences_general' => 'General',
+ 'preferences_frontpage' => 'Pantalla de inicio',
+ 'preferences_security' => 'Seguridad',
+ 'preferences_layout' => 'Diseño',
+ 'pref_home_show_deposits' => 'Mostrar los depósitos en la pantalla de inicio',
+ 'pref_home_show_deposits_info' => 'La pantalla de inicio ya muestra sus cuentas de gastos. ¿debería mostrar también su cuenta de ingresos?',
+ 'pref_home_do_show_deposits' => 'Si, muestrales',
+ 'successful_count' => 'de cual :count exitoso',
+ 'list_page_size_title' => 'Tamaño de pagina',
+ 'list_page_size_help' => 'Cualquier lista de cosas (cuentas, transacciones, etc) muestra como mucho esta cantidad por pagina.',
+ 'list_page_size_label' => 'Tamaño de pagina',
+ 'between_dates' => '(:start y :end)',
+ 'pref_optional_fields_transaction' => 'Campos opcionales para transacciones',
+ 'pref_optional_fields_transaction_help' => 'Por defecto no todos los campos se habilitan al crear una nueva transacción (debido al desorden). abajo usted puede habilitar estos campos si usted piensa que pueden ser útiles. por supuesto, cualquier campo que este desactivado, pero ya completado, sera visible a pesar de la configuración.',
+ 'optional_tj_date_fields' => 'Campos de fecha',
+ 'optional_tj_business_fields' => 'Campos comerciales',
+ 'optional_tj_attachment_fields' => 'Campos de datos adjuntos',
+ 'pref_optional_tj_interest_date' => 'Fecha de intereses',
+ 'pref_optional_tj_book_date' => 'Fecha del libro de registro',
+ 'pref_optional_tj_process_date' => 'Fecha de procesamiento',
+ 'pref_optional_tj_due_date' => 'Fecha de caducidad',
+ 'pref_optional_tj_payment_date' => 'Fecha de pago',
+ 'pref_optional_tj_invoice_date' => 'Fecha de la factura',
+ 'pref_optional_tj_internal_reference' => 'Referencia interna',
+ 'pref_optional_tj_notes' => 'Notas',
+ 'pref_optional_tj_attachments' => 'Adjuntos',
+ 'optional_field_meta_dates' => 'Fechas',
+ 'optional_field_meta_business' => 'Negocios',
+ 'optional_field_attachments' => 'Adjuntos',
+ 'optional_field_meta_data' => 'Opcional meta datos',
// profile:
- 'change_your_password' => 'Cambie su contraseña',
- 'delete_account' => 'Eliminar cuenta',
- 'current_password' => 'Contraseña actual',
- 'new_password' => 'Nueva contraseña',
- 'new_password_again' => 'Nueva contraseña (de nuevo)',
- 'delete_your_account' => 'Borre su cuenta',
- 'delete_your_account_help' => 'Eliminando su cuenta también eliminara cualquier otra cuenta, transacciones,cualquierque podría haber salvado en Firefly III. se habrá IDO.',
- 'delete_your_account_password' => 'Introduzca su contraseña para continuar.',
- 'password' => 'Contraseña',
- 'are_you_sure' => '¿Esta usted seguro? usted no puede deshacer esto.',
- 'delete_account_button' => 'Borre su cuenta',
- 'invalid_current_password' => 'Contraseña actual invalida!',
- 'password_changed' => 'Contraseña cambiada!',
- 'should_change' => 'La idea es cambiar su contraseña.',
- 'invalid_password' => 'Contraseña invalida!',
- 'what_is_pw_security' => '¿Que es "verificar la seguridad de contraseña?',
- 'secure_pw_title' => 'Como escoger una contraseña segura',
- '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' => 'Chequeando la casilla, Firefly III enviara el hash SHA1 de su contraseña al el sitio web de Troy Hunt para ver si esta en la lista.Esto le impedira a usted de usar contraseñas inseguras como se recomienda en la ultima NISH Publicación especial sobre este tema.',
- 'secure_pw_sha1' => '¿Pero pensé que SHA1 estaba dañado?',
- 'secure_pw_hash_speed' => 'Si, pero no en este contexto. Como usted puede leer en el sitio web que detalla como rompieron SHA1-hash. Ahora solo toma 10,000 años usando una sola maquina GPU.',
- 'secure_pw_hash_security' => 'Esta colisión no seria igual a su contraseña, ni seria útil en (un sitio como) Firefly III. Esta aplicación no usa SHA1 para la verificación de contraseña. así que es seguro chequear esta casilla. Su contraseña es cifrada y enviada a travez de HTTPS.',
- 'secure_pw_should' => '¿Debo chequear la casilla?',
- 'secure_pw_long_password' => 'Si usted acaba de generar una contraseña larga de un solo uso para Firefly III usando algún tipo de generador de contraseñas:no.',
- 'secure_pw_short' => 'Si usted acaba de entrar la contraseña que siempre usa:Por favor si .',
- 'command_line_token' => 'Token de linea de comando',
- 'explain_command_line_token' => 'Necesita este token para realizar opciones de línea de comando, como importar o exportar datos. Sin él, dichos comandos confidenciales no funcionarán. No compartas tu token de línea de comando. Nadie te lo pedirá, ni siquiera a nosotros. Si crees que lo has perdido, o si estás paranoico, regenera tu token pulsando el botón.',
- 'regenerate_command_line_token' => 'Regenerar token de línea de comando',
- 'token_regenerated' => 'Se generó un nuevo token de línea de comandos',
- 'change_your_email' => 'Cambie su dirección de correo',
- 'email_verification' => 'Un mensaje de correo electrónico sera enviado a su nueva dirección de correo viejas y nuevas. por motivos de seguridad, usted no podrá iniciar sesión hasta que verifique su nueva dirección de correo electrónico. Si no esta seguro de si su instalación Firefly III puede enviar correos electrónicos, por favor no use esta función. Si usted es administrador, usted puede probar esto en la administracion.',
- 'email_changed_logout' => 'Hasta que usted verifique su dirección de correo electrónico, usted no puede iniciar sesión.',
- 'login_with_new_email' => 'Usted puede ahora iniciar sesión con su nueva dirección de correo electrónico.',
- 'login_with_old_email' => 'Usted puede ahora iniciar sesión con su vieja dirección de correo electrónico otra vez.',
+ 'change_your_password' => 'Cambie su contraseña',
+ 'delete_account' => 'Eliminar cuenta',
+ 'current_password' => 'Contraseña actual',
+ 'new_password' => 'Nueva contraseña',
+ 'new_password_again' => 'Nueva contraseña (de nuevo)',
+ 'delete_your_account' => 'Borre su cuenta',
+ 'delete_your_account_help' => 'Eliminando su cuenta también eliminara cualquier otra cuenta, transacciones,cualquierque podría haber salvado en Firefly III. se habrá IDO.',
+ 'delete_your_account_password' => 'Introduzca su contraseña para continuar.',
+ 'password' => 'Contraseña',
+ 'are_you_sure' => '¿Esta usted seguro? usted no puede deshacer esto.',
+ 'delete_account_button' => 'Borre su cuenta',
+ 'invalid_current_password' => 'Contraseña actual invalida!',
+ 'password_changed' => 'Contraseña cambiada!',
+ 'should_change' => 'La idea es cambiar su contraseña.',
+ 'invalid_password' => 'Contraseña invalida!',
+ 'what_is_pw_security' => '¿Que es "verificar la seguridad de contraseña?',
+ 'secure_pw_title' => 'Como escoger una contraseña segura',
+ '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 first five characters of 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' => '¿Pero pensé que SHA1 estaba dañado?',
+ 'secure_pw_hash_speed' => 'Si, pero no en este contexto. Como usted puede leer en el sitio web que detalla como rompieron SHA1-hash. Ahora solo toma 10,000 años usando una sola maquina GPU.',
+ '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 only the first five characters of this hash are sent over HTTPS.',
+ 'secure_pw_should' => '¿Debo chequear la casilla?',
+ 'secure_pw_long_password' => 'Si usted acaba de generar una contraseña larga de un solo uso para Firefly III usando algún tipo de generador de contraseñas:no.',
+ 'secure_pw_short' => 'Si usted acaba de entrar la contraseña que siempre usa:Por favor si .',
+ 'command_line_token' => 'Token de linea de comando',
+ 'explain_command_line_token' => 'Necesita este token para realizar opciones de línea de comando, como importar o exportar datos. Sin él, dichos comandos confidenciales no funcionarán. No compartas tu token de línea de comando. Nadie te lo pedirá, ni siquiera a nosotros. Si crees que lo has perdido, o si estás paranoico, regenera tu token pulsando el botón.',
+ 'regenerate_command_line_token' => 'Regenerar token de línea de comando',
+ 'token_regenerated' => 'Se generó un nuevo token de línea de comandos',
+ 'change_your_email' => 'Cambie su dirección de correo',
+ 'email_verification' => 'Un mensaje de correo electrónico sera enviado a su nueva dirección de correo viejas y nuevas. por motivos de seguridad, usted no podrá iniciar sesión hasta que verifique su nueva dirección de correo electrónico. Si no esta seguro de si su instalación Firefly III puede enviar correos electrónicos, por favor no use esta función. Si usted es administrador, usted puede probar esto en la administracion.',
+ 'email_changed_logout' => 'Hasta que usted verifique su dirección de correo electrónico, usted no puede iniciar sesión.',
+ 'login_with_new_email' => 'Usted puede ahora iniciar sesión con su nueva dirección de correo electrónico.',
+ 'login_with_old_email' => 'Usted puede ahora iniciar sesión con su vieja dirección de correo electrónico otra vez.',
// attachments
- 'nr_of_attachments' => 'Un archivo adjunto:count archivos adjuntos',
- 'attachments' => 'Archivos adjuntos',
- 'edit_attachment' => 'Editar cuenta de archivos ":name"',
- 'update_attachment' => 'Actualizar archivo adjunto',
- 'delete_attachment' => 'Eliminar archivo adjunto ":name"',
- 'attachment_deleted' => 'Eliminar archivo adjunto ":name"',
- 'attachment_updated' => 'Actualizar archivo adjunto ":name"',
- 'upload_max_file_size' => 'Tamaño máximo de archivo::size',
+ 'nr_of_attachments' => 'Un archivo adjunto:count archivos adjuntos',
+ 'attachments' => 'Archivos adjuntos',
+ 'edit_attachment' => 'Editar cuenta de archivos ":name"',
+ 'update_attachment' => 'Actualizar archivo adjunto',
+ 'delete_attachment' => 'Eliminar archivo adjunto ":name"',
+ 'attachment_deleted' => 'Eliminar archivo adjunto ":name"',
+ 'attachment_updated' => 'Actualizar archivo adjunto ":name"',
+ 'upload_max_file_size' => 'Tamaño máximo de archivo::size',
// transaction index
- 'title_expenses' => 'Gastos',
- 'title_withdrawal' => 'Gastos',
- 'title_revenue' => 'Ingresos / salarios',
- 'title_deposit' => 'Ingresos / salarios',
- 'title_transfer' => 'Transferencias',
- 'title_transfers' => 'Transferencias',
+ 'title_expenses' => 'Gastos',
+ 'title_withdrawal' => 'Gastos',
+ 'title_revenue' => 'Ingresos / salarios',
+ 'title_deposit' => 'Ingresos / salarios',
+ 'title_transfer' => 'Transferencias',
+ 'title_transfers' => 'Transferencias',
// convert stuff:
- 'convert_is_already_type_Withdrawal' => 'Esta transferencia ya es un retiro: crwdn: crwdn',
- 'convert_is_already_type_Deposit' => 'Esta transacción ya es un deposito',
- 'convert_is_already_type_Transfer' => 'Esta transacción ya es una transferencia',
- 'convert_to_Withdrawal' => 'Convierta ":description" a un retiro',
- 'convert_to_Deposit' => 'Convierta ":description" en un deposito',
- 'convert_to_Transfer' => 'Convierta ":description" en una transferencia',
- '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',
- 'convert_Withdrawal_to_deposit' => 'Convierta este retiro: crwdn en un deposito',
- 'convert_Withdrawal_to_transfer' => 'Convierta este retiro en una transferencia',
- 'convert_Deposit_to_withdrawal' => 'Convierta este deposito en un retiro: crwdn',
- 'convert_Deposit_to_transfer' => 'Convierta este deposito en una transferencia',
- 'convert_Transfer_to_deposit' => 'Convierta esta transferencia en un deposito',
- 'convert_Transfer_to_withdrawal' => 'Convierta esta transferencia en un retiro: crwdn',
- 'convert_please_set_revenue_source' => 'Por favor elija la cuenta de ingresos de donde vendrá el dinero.',
- 'convert_please_set_asset_destination' => 'Por favor elija la cuenta de activos a donde el dinero se destinara.',
- 'convert_please_set_expense_destination' => 'Por favor elija la cuenta de gastos a la que ira el dinero.',
- 'convert_please_set_asset_source' => 'Por favor elija la cuenta de activos de donde vendrá el dinero.',
- 'convert_explanation_withdrawal_deposit' => 'Si usted convierte este retiro :crwdn en un deposito,:amount sera depositado en :sourceNameen vez de tomar de el.',
- 'convert_explanation_withdrawal_transfer' => 'Si usted convierte esto ;crwdn:gr:0:gr:crwdn; en una transferencia, :amount sera transferido desde :sourceName a una nueva cuenta de ingresos, en lugar de pagarse a :destinationName.',
- 'convert_explanation_deposit_withdrawal' => 'Si usted convierte este deposito en un retiro, :amount se eliminara de :destinationName en vez de añadirse a él.',
- 'convert_explanation_deposit_transfer' => 'Si convierte este deposito en una transferencia,:amount sera transferido desde una cuenta de activos de su elección :destinationName.',
- 'convert_explanation_transfer_withdrawal' => 'Si convierte esta transferencia en un retiroc :crwdn:amount ira desde :sourceName a un nuevo destino como gastos , en vez de como una transferencia.',
- 'convert_explanation_transfer_deposit' => 'Si convierte esta transferencia en un deposito,:amount sera depositado en la cuenta ::destinationName en vez de ser transferida allí.',
- 'converted_to_Withdrawal' => 'La transacción se convirtió en un retiro: crwdn',
- 'converted_to_Deposit' => 'La transacción se ha convertido en un deposito',
- 'converted_to_Transfer' => 'La transacción se convirtió en transferencia',
- 'invalid_convert_selection' => 'L a cuenta que usted ha selecionado ya esta en uso o no existe.',
+ 'convert_is_already_type_Withdrawal' => 'Esta transferencia ya es un retiro',
+ 'convert_is_already_type_Deposit' => 'Esta transacción ya es un deposito',
+ 'convert_is_already_type_Transfer' => 'Esta transacción ya es una transferencia',
+ 'convert_to_Withdrawal' => 'Convierta ":description" a un retiro',
+ 'convert_to_Deposit' => 'Convierta ":description" en un deposito',
+ 'convert_to_Transfer' => 'Convierta ":description" en una transferencia',
+ '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',
+ 'convert_Withdrawal_to_deposit' => 'Convierta este retiro en un deposito',
+ 'convert_Withdrawal_to_transfer' => 'Convierta este retiro en una transferencia',
+ 'convert_Deposit_to_withdrawal' => 'Convierta este deposito en un retiro',
+ 'convert_Deposit_to_transfer' => 'Convierta este deposito en una transferencia',
+ 'convert_Transfer_to_deposit' => 'Convierta esta transferencia en un deposito',
+ 'convert_Transfer_to_withdrawal' => 'Convierta esta transferencia en un retiro',
+ 'convert_please_set_revenue_source' => 'Por favor elija la cuenta de ingresos de donde vendrá el dinero.',
+ 'convert_please_set_asset_destination' => 'Por favor elija la cuenta de activos a donde el dinero se destinara.',
+ 'convert_please_set_expense_destination' => 'Por favor elija la cuenta de gastos a la que ira el dinero.',
+ 'convert_please_set_asset_source' => 'Por favor elija la cuenta de activos de donde vendrá el dinero.',
+ 'convert_explanation_withdrawal_deposit' => 'Si usted convierte este retiro en un deposito, :amount sera depositado en :sourceNameen vez de tomar de el.',
+ 'convert_explanation_withdrawal_transfer' => 'Si usted convierte esto en una transferencia, :amount sera transferido desde :sourceName a una nueva cuenta de ingresos, en lugar de pagarse a :destinationName.',
+ 'convert_explanation_deposit_withdrawal' => 'Si usted convierte este deposito en un retiro, :amount se eliminara de :destinationName en vez de añadirse a él.',
+ 'convert_explanation_deposit_transfer' => 'Si convierte este deposito en una transferencia,:amount sera transferido desde una cuenta de activos de su elección :destinationName.',
+ 'convert_explanation_transfer_withdrawal' => 'Si convierte esta transferencia en un retiroc :amount ira desde :sourceName a un nuevo destino como gastos , en vez de :destinationName como una transferencia.',
+ 'convert_explanation_transfer_deposit' => 'Si convierte esta transferencia en un deposito,:amount sera depositado en la cuenta ::destinationName en vez de ser transferida allí.',
+ 'converted_to_Withdrawal' => 'La transacción se convirtió en un retiro',
+ 'converted_to_Deposit' => 'La transacción se ha convertido en un deposito',
+ 'converted_to_Transfer' => 'La transacción se convirtió en transferencia',
+ 'invalid_convert_selection' => 'L a cuenta que usted ha selecionado ya esta en uso o no existe.',
// create new stuff:
- 'create_new_withdrawal' => 'Crear nuevo retiro: crwdn',
- 'create_new_deposit' => 'Crear nuevo deposito',
- 'create_new_transfer' => 'Crear nueva transferencia',
- 'create_new_asset' => 'Crear nueva cuenta de activos',
- 'create_new_expense' => 'Crear nueva cuenta de gastos',
- 'create_new_revenue' => 'Crear nueva cuenta de ingresos',
- 'create_new_piggy_bank' => 'Crear nueva alcancia',
- 'create_new_bill' => 'Crear nueva factura',
+ 'create_new_withdrawal' => 'Crear nuevo retiro',
+ 'create_new_deposit' => 'Crear nuevo deposito',
+ 'create_new_transfer' => 'Crear nueva transferencia',
+ 'create_new_asset' => 'Crear nueva cuenta de activos',
+ 'create_new_expense' => 'Crear nueva cuenta de gastos',
+ 'create_new_revenue' => 'Crear nueva cuenta de ingresos',
+ 'create_new_piggy_bank' => 'Crear nueva alcancia',
+ 'create_new_bill' => 'Crear nueva factura',
// currencies:
- 'create_currency' => 'Crear nueva moneda',
- 'store_currency' => 'Almacenar nueva moneda',
- 'update_currency' => 'Actualizar moneda',
- 'new_default_currency' => ':name es ahora moneda por defecto.',
- 'cannot_delete_currency' => 'No puede eliminar :name porque todavía esta en uso.',
- 'deleted_currency' => 'Moneda :name eliminada',
- 'created_currency' => 'Moneda :name creada',
- 'updated_currency' => 'Moneda :name actualizada',
- 'ask_site_owner' => 'Por favor pregunte :owner por agregar,elimine o edite monedas.',
- 'currencies_intro' => 'Firefly III respalda varias monedas que usted puede establecer y habilitar aquí.',
- 'make_default_currency' => 'hacer por defecto',
- 'default_currency' => 'en mora',
+ 'create_currency' => 'Crear nueva moneda',
+ 'store_currency' => 'Almacenar nueva moneda',
+ 'update_currency' => 'Actualizar moneda',
+ 'new_default_currency' => ':name es ahora moneda por defecto.',
+ 'cannot_delete_currency' => 'No puede eliminar :name porque todavía esta en uso.',
+ 'deleted_currency' => 'Moneda :name eliminada',
+ 'created_currency' => 'Moneda :name creada',
+ 'updated_currency' => 'Moneda :name actualizada',
+ 'ask_site_owner' => 'Por favor pregunte :owner por agregar,elimine o edite monedas.',
+ 'currencies_intro' => 'Firefly III respalda varias monedas que usted puede establecer y habilitar aquí.',
+ 'make_default_currency' => 'hacer por defecto',
+ 'default_currency' => 'en mora',
// forms:
- 'mandatoryFields' => 'Campos obligatorios',
- 'optionalFields' => 'Campos opcionales',
- 'options' => 'Opciones',
+ 'mandatoryFields' => 'Campos obligatorios',
+ 'optionalFields' => 'Campos opcionales',
+ 'options' => 'Opciones',
// budgets:
- 'create_new_budget' => 'Crear un nuevo presupuesto',
- 'store_new_budget' => 'Almacene el nuevo presupuesto',
- 'stored_new_budget' => 'Almacenar el nuevo presupuesto ":name"',
- 'available_between' => 'Disponible entre :start y :end',
- 'transactionsWithoutBudget' => 'Gastos sin presupuesto',
- 'transactions_no_budget' => 'Gastos sin presupuesto entre :start y :end',
- 'spent_between' => 'Gasto entre :start y :end',
- 'createBudget' => 'Nuevo presupuesto',
- 'inactiveBudgets' => 'Presupuestos inactivos',
- 'without_budget_between' => 'Transacciones sin presupuesto entre :start y :end',
- 'delete_budget' => 'Eliminar presupuesto ":name"',
- 'deleted_budget' => 'Presupuesto eliminado ":name"',
- 'edit_budget' => 'Editar presupuesto ":name"',
- 'updated_budget' => 'Presupuesto actualizado ":name"',
- 'update_amount' => 'Actualizar monto',
- 'update_budget' => 'Actualizar presupuesto',
- 'update_budget_amount_range' => 'Cantidad disponible (esperada) actualizada entre :start y :end',
- 'budget_period_navigator' => 'Periodo navegador',
- 'info_on_available_amount' => '¿ que tengo disponible?',
- 'available_amount_indication' => 'Use estos montos para obtener una indicación de cual podría ser el presupuesto total.',
- 'suggested' => 'Sugerido',
- 'average_between' => 'Promedio entre :start y :end',
+ 'create_new_budget' => 'Crear un nuevo presupuesto',
+ 'store_new_budget' => 'Almacene el nuevo presupuesto',
+ 'stored_new_budget' => 'Almacenar el nuevo presupuesto ":name"',
+ 'available_between' => 'Disponible entre :start y :end',
+ 'transactionsWithoutBudget' => 'Gastos sin presupuesto',
+ 'transactions_no_budget' => 'Gastos sin presupuesto entre :start y :end',
+ 'spent_between' => 'Gasto entre :start y :end',
+ 'createBudget' => 'Nuevo presupuesto',
+ 'inactiveBudgets' => 'Presupuestos inactivos',
+ 'without_budget_between' => 'Transacciones sin presupuesto entre :start y :end',
+ 'delete_budget' => 'Eliminar presupuesto ":name"',
+ 'deleted_budget' => 'Presupuesto eliminado ":name"',
+ 'edit_budget' => 'Editar presupuesto ":name"',
+ 'updated_budget' => 'Presupuesto actualizado ":name"',
+ 'update_amount' => 'Actualizar monto',
+ 'update_budget' => 'Actualizar presupuesto',
+ 'update_budget_amount_range' => 'Cantidad disponible (esperada) actualizada entre :start y :end',
+ 'budget_period_navigator' => 'Periodo navegador',
+ 'info_on_available_amount' => '¿ que tengo disponible?',
+ 'available_amount_indication' => 'Use estos montos para obtener una indicación de cual podría ser el presupuesto total.',
+ 'suggested' => 'Sugerido',
+ 'average_between' => 'Promedio entre :start y :end',
+ 'over_budget_warn' => ' Normally you budget about :amount per day. This is :over_amount per day.',
// bills:
- 'matching_on' => 'Emparejar en',
- 'between_amounts' => 'entre :low y :high.',
- 'repeats' => 'Repeticiones',
- 'connected_journals' => 'Transacciones conectadas',
- 'auto_match_on' => 'Automáticamente igualado por Firefly III',
- 'auto_match_off' => 'No igualado automaticamente por Firefly III',
- 'next_expected_match' => 'Siguiente partido esperado',
- 'delete_bill' => 'Eliminar factura ":name"',
- 'deleted_bill' => 'Eliminar factura ":name"',
- 'edit_bill' => 'Editar factura ":name"',
- 'more' => 'Mas',
- 'rescan_old' => 'Volver a analizar transacciones viejas',
- 'update_bill' => 'Actualizar factura',
- 'updated_bill' => 'Actualizar factura ":name"',
- 'store_new_bill' => 'Almacenar nueva factura',
- 'stored_new_bill' => 'Almacenar nueva factura ":name"',
- 'cannot_scan_inactive_bill' => 'Las facturas inactivas no pueden ser escaneadas.',
- 'rescanned_bill' => 'Volver a escanear todo.',
- 'average_bill_amount_year' => 'Monto promedio de la factura (:year)',
- 'average_bill_amount_overall' => 'Monto promedio de la factura (sobretodo)',
- 'bill_is_active' => 'Bill esta activo',
- 'bill_expected_between' => 'Esperado entre :start y :end',
- 'bill_will_automatch' => 'Bill se vinculara automáticamente a transacciones coincidentes',
- 'skips_over' => 'salta sobre',
-
+ 'matching_on' => 'Emparejar en',
+ 'between_amounts' => 'entre :low y :high.',
+ 'repeats' => 'Repeticiones',
+ 'connected_journals' => 'Transacciones conectadas',
+ 'auto_match_on' => 'Automáticamente igualado por Firefly III',
+ 'auto_match_off' => 'No igualado automaticamente por Firefly III',
+ 'next_expected_match' => 'Siguiente partido esperado',
+ 'delete_bill' => 'Eliminar factura ":name"',
+ 'deleted_bill' => 'Eliminar factura ":name"',
+ 'edit_bill' => 'Editar factura ":name"',
+ 'more' => 'Mas',
+ 'rescan_old' => 'Volver a analizar transacciones viejas',
+ 'update_bill' => 'Actualizar factura',
+ 'updated_bill' => 'Actualizar factura ":name"',
+ 'store_new_bill' => 'Almacenar nueva factura',
+ 'stored_new_bill' => 'Almacenar nueva factura ":name"',
+ 'cannot_scan_inactive_bill' => 'Las facturas inactivas no pueden ser escaneadas.',
+ 'rescanned_bill' => 'Volver a escanear todo.',
+ 'average_bill_amount_year' => 'Monto promedio de la factura (:year)',
+ 'average_bill_amount_overall' => 'Monto promedio de la factura (sobretodo)',
+ 'bill_is_active' => 'Bill esta activo',
+ 'bill_expected_between' => 'Esperado entre :start y :end',
+ 'bill_will_automatch' => 'Bill se vinculara automáticamente a transacciones coincidentes',
+ 'skips_over' => 'salta sobre',
// accounts:
- 'details_for_asset' => 'Detalles para la cuenta de activos ":name"',
- 'details_for_expense' => 'Detalles para la cuenta de gastos ":name"',
- 'details_for_revenue' => 'Detalles para la cuenta de ingresos ": nombre"',
- 'details_for_cash' => 'Detalle para la cuenta de efectivo ":name"',
- 'store_new_asset_account' => 'Almacenar nueva cuenta de activos',
- 'store_new_expense_account' => 'Almacenar cuenta nueva de gastos',
- 'store_new_revenue_account' => 'Almacenar cuenta nueva de ingresos',
- 'edit_asset_account' => 'Editar cuenta de activos ":name"',
- 'edit_expense_account' => 'Editar cuenta de gastos ":name"',
- 'edit_revenue_account' => 'Editar cuenta de ganancias ":name"',
- 'delete_asset_account' => 'Eliminar cuenta de activo ":name"',
- 'delete_expense_account' => 'Eliminar cuenta de gastos ":name"',
- 'delete_revenue_account' => 'Eliminar cuenta de ganancias ":name"',
- 'asset_deleted' => 'Se ha eliminado exitosamente la cuenta de activos ":name"',
- 'expense_deleted' => 'Exitosamente eliminado la cuenta de gastos ":name"',
- 'revenue_deleted' => 'Exitosamente eliminado cuenta de ganacias ":name"',
- 'update_asset_account' => 'Actualizar cuenta de activos',
- 'update_expense_account' => 'Actualizar cuenta de gastos',
- 'update_revenue_account' => 'Actualizar cuenta de ingresos',
- 'make_new_asset_account' => 'Crear nueva cuenta de activo',
- 'make_new_expense_account' => 'Crear nueva cuenta de gastos',
- 'make_new_revenue_account' => 'Crear nueva cuenta de ingresos',
- 'asset_accounts' => 'Cuenta de activos',
- 'expense_accounts' => 'Cuentas de gastos',
- 'revenue_accounts' => 'Cuentas de ingresos',
- 'cash_accounts' => 'Cuentas de efectivo',
- 'Cash account' => 'Cuenta de efectivo',
- 'reconcile_account' => 'Reconciliar cuenta ":account"',
- 'delete_reconciliation' => 'Eliminar reconciliacion',
- 'update_reconciliation' => 'Actualizar reconciliacion',
- 'amount_cannot_be_zero' => 'El monto no puede ser cero',
- 'end_of_reconcile_period' => 'Fin del periodo de reconciliacion::period',
- 'start_of_reconcile_period' => 'Inicio de periodo de reconciliación::period',
- 'start_balance' => 'Balance inicial',
- 'end_balance' => 'Balance final',
- 'update_balance_dates_instruction' => 'Coinciden con las cantidades y fechas sobre su estado de cuenta, y presione "comenzar reconciliación"',
- 'select_transactions_instruction' => 'Seleccione las transacciones que aparecen en su estado bancario.',
- 'select_range_and_balance' => 'Primero verifique el rango de las fechas y los saldos. luego presione "comenzar reconciliación"',
- 'date_change_instruction' => 'Si usted cambia el rango de las fechas ahora, se perderá cualquier progreso.',
- 'update_selection' => 'Selección de actualización',
- 'store_reconcile' => 'Guardar reconciliación',
- 'reconciliation_transaction' => 'Transacción de reconciliación',
- 'Reconciliation' => 'Reconciliacion',
- 'reconciliation' => 'Reconciliacion',
- 'reconcile_options' => 'Opciones de reconciliacion',
- 'reconcile_range' => 'Rango de reconciliacion',
- 'start_reconcile' => 'Comienzo de reconciliación',
- 'cash' => 'efectivo',
- 'account_type' => 'Tipo de cuenta',
- 'save_transactions_by_moving' => 'Guarde estas transacción (es) moviendolas a otra cuenta:',
- 'stored_new_account' => 'Nueva cuenta ":name" almacenada!',
- 'updated_account' => 'Cuenta actualizada ":name"',
- 'credit_card_options' => 'Opciones de tarjeta de crédito',
- 'no_transactions_account' => 'No hay transacciones ( en este periodo) para cuenta de activos ":name".',
- 'no_data_for_chart' => 'No hay suficiente información (todavía) para generar este gráfico.',
- 'select_more_than_one_account' => 'Por favor seleccione mas de una cuenta',
- 'select_more_than_one_category' => 'Por favor seleccione mas de una categoría',
- 'select_more_than_one_budget' => 'Por favor seleccione mas de un presupuesto',
- 'select_more_than_one_tag' => 'Por favor seleccione mas de una etiqueta',
- 'account_default_currency' => 'Si usted selecciona otra moneda, las nuevas transacciones de esta cuenta tendrán esta moneda preseleccionada.',
- 'reconcile_has_more' => 'Su libro principal de Firefly III tiene mas dinero de lo que su banco afirma debería tener, Hay varias opciones. por favor elija que hacer. luego, presione "confirmar reconciliación".',
- 'reconcile_has_less' => 'Su libro principal de Firefly III tiene menos dinero de el que su banco dice que usted debería tener. hay varias opciones. Por favor elija que hacer, luego presione " Confirmar reconciliación".',
- 'reconcile_is_equal' => 'Su libro principal de Firefly III y sus estados de cuenta coinciden. No hay nada que hacer. por favor presione "Confirmar reconciliación" para confirmar su entrada.',
- 'create_pos_reconcile_transaction' => 'Borre las transacciones seleccionadas, y cree una corrección agregando :amount a esta cuenta de activo.',
- 'create_neg_reconcile_transaction' => 'Borre las transacciones seleccionadas, y cree una corrección eliminando :amount de esta cuenta de activo.',
- 'reconcile_do_nothing' => 'Borre la transacciones seleccionadas, pero no las corrija.',
- 'reconcile_go_back' => 'Usted puede siempre editar o eliminar una corrección mas tarde.',
- 'must_be_asset_account' => 'Usted solo puede reconciliar cuentas de activos',
- 'reconciliation_stored' => 'Reconciliación almacenada',
- 'reconcilliation_transaction_title' => 'Reconciliación (:from a :to)',
- 'reconcile_this_account' => 'Reconciliar esta cuenta',
- 'confirm_reconciliation' => 'Confirmar la reconciliacion',
- 'submitted_start_balance' => 'Balance final enviado',
- 'selected_transactions' => 'Transacciones seleccionadas (:count)',
- 'already_cleared_transactions' => 'Transacciones ya despejadas (:count)',
- 'submitted_end_balance' => 'Balance final enviado',
- 'initial_balance_description' => 'Balance inicial para ":account"',
+ 'details_for_asset' => 'Detalles para la cuenta de activos ":name"',
+ 'details_for_expense' => 'Detalles para la cuenta de gastos ":name"',
+ 'details_for_revenue' => 'Detalles para la cuenta de ingresos ":name"',
+ 'details_for_cash' => 'Detalle para la cuenta de efectivo ":name"',
+ 'store_new_asset_account' => 'Almacenar nueva cuenta de activos',
+ 'store_new_expense_account' => 'Almacenar cuenta nueva de gastos',
+ 'store_new_revenue_account' => 'Almacenar cuenta nueva de ingresos',
+ 'edit_asset_account' => 'Editar cuenta de activos ":name"',
+ 'edit_expense_account' => 'Editar cuenta de gastos ":name"',
+ 'edit_revenue_account' => 'Editar cuenta de ganancias ":name"',
+ 'delete_asset_account' => 'Eliminar cuenta de activo ":name"',
+ 'delete_expense_account' => 'Eliminar cuenta de gastos ":name"',
+ 'delete_revenue_account' => 'Eliminar cuenta de ganancias ":name"',
+ 'asset_deleted' => 'Se ha eliminado exitosamente la cuenta de activos ":name"',
+ 'expense_deleted' => 'Exitosamente eliminado la cuenta de gastos ":name"',
+ 'revenue_deleted' => 'Exitosamente eliminado cuenta de ganacias ":name"',
+ 'update_asset_account' => 'Actualizar cuenta de activos',
+ 'update_expense_account' => 'Actualizar cuenta de gastos',
+ 'update_revenue_account' => 'Actualizar cuenta de ingresos',
+ 'make_new_asset_account' => 'Crear nueva cuenta de activo',
+ 'make_new_expense_account' => 'Crear nueva cuenta de gastos',
+ 'make_new_revenue_account' => 'Crear nueva cuenta de ingresos',
+ 'asset_accounts' => 'Cuenta de activos',
+ 'expense_accounts' => 'Cuentas de gastos',
+ 'revenue_accounts' => 'Cuentas de ingresos',
+ 'cash_accounts' => 'Cuentas de efectivo',
+ 'Cash account' => 'Cuenta de efectivo',
+ 'reconcile_account' => 'Reconciliar cuenta ":account"',
+ 'delete_reconciliation' => 'Eliminar reconciliacion',
+ 'update_reconciliation' => 'Actualizar reconciliacion',
+ 'amount_cannot_be_zero' => 'El monto no puede ser cero',
+ 'end_of_reconcile_period' => 'Fin del periodo de reconciliacion::period',
+ 'start_of_reconcile_period' => 'Inicio de periodo de reconciliación::period',
+ 'start_balance' => 'Balance inicial',
+ 'end_balance' => 'Balance final',
+ 'update_balance_dates_instruction' => 'Coinciden con las cantidades y fechas sobre su estado de cuenta, y presione "comenzar reconciliación"',
+ 'select_transactions_instruction' => 'Seleccione las transacciones que aparecen en su estado bancario.',
+ 'select_range_and_balance' => 'Primero verifique el rango de las fechas y los saldos. luego presione "comenzar reconciliación"',
+ 'date_change_instruction' => 'Si usted cambia el rango de las fechas ahora, se perderá cualquier progreso.',
+ 'update_selection' => 'Selección de actualización',
+ 'store_reconcile' => 'Guardar reconciliación',
+ 'reconciliation_transaction' => 'Transacción de reconciliación',
+ 'Reconciliation' => 'Reconciliacion',
+ 'reconciliation' => 'Reconciliacion',
+ 'reconcile_options' => 'Opciones de reconciliacion',
+ 'reconcile_range' => 'Rango de reconciliacion',
+ 'start_reconcile' => 'Comienzo de reconciliación',
+ 'cash' => 'efectivo',
+ 'account_type' => 'Tipo de cuenta',
+ 'save_transactions_by_moving' => 'Guarde estas transacción (es) moviendolas a otra cuenta:',
+ 'stored_new_account' => 'Nueva cuenta ":name" almacenada!',
+ 'updated_account' => 'Cuenta actualizada ":name"',
+ 'credit_card_options' => 'Opciones de tarjeta de crédito',
+ 'no_transactions_account' => 'No hay transacciones ( en este periodo) para cuenta de activos ":name".',
+ 'no_data_for_chart' => 'No hay suficiente información (todavía) para generar este gráfico.',
+ 'select_more_than_one_account' => 'Por favor seleccione mas de una cuenta',
+ 'select_more_than_one_category' => 'Por favor seleccione mas de una categoría',
+ 'select_more_than_one_budget' => 'Por favor seleccione mas de un presupuesto',
+ 'select_more_than_one_tag' => 'Por favor seleccione mas de una etiqueta',
+ 'account_default_currency' => 'Si usted selecciona otra moneda, las nuevas transacciones de esta cuenta tendrán esta moneda preseleccionada.',
+ 'reconcile_has_more' => 'Su libro principal de Firefly III tiene mas dinero de lo que su banco afirma debería tener, Hay varias opciones. por favor elija que hacer. luego, presione "confirmar reconciliación".',
+ 'reconcile_has_less' => 'Su libro principal de Firefly III tiene menos dinero de el que su banco dice que usted debería tener. hay varias opciones. Por favor elija que hacer, luego presione " Confirmar reconciliación".',
+ 'reconcile_is_equal' => 'Su libro principal de Firefly III y sus estados de cuenta coinciden. No hay nada que hacer. por favor presione "Confirmar reconciliación" para confirmar su entrada.',
+ 'create_pos_reconcile_transaction' => 'Borre las transacciones seleccionadas, y cree una corrección agregando :amount a esta cuenta de activo.',
+ 'create_neg_reconcile_transaction' => 'Borre las transacciones seleccionadas, y cree una corrección eliminando :amount de esta cuenta de activo.',
+ 'reconcile_do_nothing' => 'Borre la transacciones seleccionadas, pero no las corrija.',
+ 'reconcile_go_back' => 'Usted puede siempre editar o eliminar una corrección mas tarde.',
+ 'must_be_asset_account' => 'Usted solo puede reconciliar cuentas de activos',
+ 'reconciliation_stored' => 'Reconciliación almacenada',
+ 'reconcilliation_transaction_title' => 'Reconciliación (:from a :to)',
+ 'reconcile_this_account' => 'Reconciliar esta cuenta',
+ 'confirm_reconciliation' => 'Confirmar la reconciliacion',
+ 'submitted_start_balance' => 'Balance final enviado',
+ 'selected_transactions' => 'Transacciones seleccionadas (:count)',
+ 'already_cleared_transactions' => 'Transacciones ya despejadas (:count)',
+ 'submitted_end_balance' => 'Balance final enviado',
+ 'initial_balance_description' => 'Balance inicial para ":account"',
// categories:
- 'new_category' => 'Nueva categoría',
- 'create_new_category' => 'Crear una nueva categoria',
- 'without_category' => 'Sin categoría',
- 'update_category' => 'Actualizar categoría',
- 'updated_category' => 'Actualizar categoría ":name"',
- 'categories' => 'Categorías',
- 'edit_category' => 'Editar categoría ":name"',
- 'no_category' => '(sin categoría)',
- 'category' => 'Categoria',
- 'delete_category' => 'Eliminar categoría ":name"',
- 'deleted_category' => 'Categoría eliminada ":name"',
- 'store_category' => 'Guardar nueva categoria',
- 'stored_category' => 'Nueva categoría guardada ":name"',
- 'without_category_between' => 'Sin categoría entre :start y:end',
+ 'new_category' => 'Nueva categoría',
+ 'create_new_category' => 'Crear una nueva categoria',
+ 'without_category' => 'Sin categoría',
+ 'update_category' => 'Actualizar categoría',
+ 'updated_category' => 'Actualizar categoría ":name"',
+ 'categories' => 'Categorías',
+ 'edit_category' => 'Editar categoría ":name"',
+ 'no_category' => '(sin categoría)',
+ 'category' => 'Categoria',
+ 'delete_category' => 'Eliminar categoría ":name"',
+ 'deleted_category' => 'Categoría eliminada ":name"',
+ 'store_category' => 'Guardar nueva categoria',
+ 'stored_category' => 'Nueva categoría guardada ":name"',
+ 'without_category_between' => 'Sin categoría entre :start y:end',
// transactions:
- 'update_withdrawal' => 'Actualización de retiro',
- 'update_deposit' => 'Actualización de deposito',
- 'update_transfer' => 'Actualización de transferencia',
- 'updated_withdrawal' => 'Retiro actualizado',
- 'updated_deposit' => 'Actualización de deposito ":description"',
- 'updated_transfer' => 'Transferencia actualizada ":description"',
- 'delete_withdrawal' => 'Eliminar;crwdn:gr:0:gr:crwdn; ":description"',
- 'delete_deposit' => 'Eliminar deposito ":description"',
- 'delete_transfer' => 'Eliminar transferencia ":description"',
- 'deleted_withdrawal' => 'Eliminado exitosamente',
- 'deleted_deposit' => 'Deposito eliminado exitosamente ":description"',
- 'deleted_transfer' => 'Transferencia eliminada exitosamente ":description"',
- 'stored_journal' => 'Nueva transacción creada exitosamente ":description"',
- 'select_transactions' => 'Seleccionar transacciones',
- 'rule_group_select_transactions' => 'Aplicar ":title" a las transacciones',
- 'rule_select_transactions' => 'Aplicar ":title" a las transacciones',
- 'stop_selection' => 'Pare de seleccionas transacciones',
- 'reconcile_selected' => 'Reconciliar',
- 'mass_delete_journals' => 'Eliminar un numero de transacciones',
- 'mass_edit_journals' => 'Editar un numero de transacciones',
- 'mass_bulk_journals' => 'Bulk editar un numero de transacciones',
- 'mass_bulk_journals_explain' => 'Si usted no desea cambiar sus transacciones a una mediante la función de edición masiva, usted puede actualizarlas de una sola vez. simplemente seleccione la categoría, las etiquetas o el presupuesto preferidos en los campos de abajo, y todas las transacciones de la tabla se actualizaran.',
- 'bulk_set_new_values' => 'Use las entradas abajo para establecer nuevos valores. Si usted los deja vacíos, serán vacíos para todos. también, tenga en cuenta que solo los retiros tendrán un presupuesto.',
- 'no_bulk_category' => 'No actualizar la categoria',
- 'no_bulk_budget' => 'No actualizar el presupuesto',
- 'no_bulk_tags' => 'No actualizar etiqueta(s)',
- 'bulk_edit' => 'Edición masiva',
- 'cannot_edit_other_fields' => 'Usted no puede editar en masa otros campos ademas de los que están aquí, porque no hay espacio para mostrarlos. siga el enlace y editelo uno a uno, si usted necesita editar estos campos.',
- 'no_budget' => '(no budget)',
- 'no_budget_squared' => '(sin presupuesto)',
- 'perm-delete-many' => 'Eliminar muchos elementos de una sola vez puede ser perturbador. Por favor sea cuidadoso.',
- 'mass_deleted_transactions_success' => 'Eliminar :amount transacción (es).',
- 'mass_edited_transactions_success' => 'Actualizado :amount transacción (es)',
- 'opt_group_no_account_type' => '(Sin tipo de cuenta)',
- 'opt_group_defaultAsset' => 'Cuenta de ingresos por mora',
- 'opt_group_savingAsset' => 'Cuenta de ahorros',
- 'opt_group_sharedAsset' => 'Cuenta de activos compartidas',
- 'opt_group_ccAsset' => 'Tarjetas de credito',
- 'notes' => 'Notas',
+ 'update_withdrawal' => 'Actualización de retiro',
+ 'update_deposit' => 'Actualización de deposito',
+ 'update_transfer' => 'Actualización de transferencia',
+ 'updated_withdrawal' => 'Retiro actualizado',
+ 'updated_deposit' => 'Actualización de deposito ":description"',
+ 'updated_transfer' => 'Transferencia actualizada ":description"',
+ 'delete_withdrawal' => 'Eliminar ":description"',
+ 'delete_deposit' => 'Eliminar deposito ":description"',
+ 'delete_transfer' => 'Eliminar transferencia ":description"',
+ 'deleted_withdrawal' => 'Eliminado exitosamente',
+ 'deleted_deposit' => 'Deposito eliminado exitosamente ":description"',
+ 'deleted_transfer' => 'Transferencia eliminada exitosamente ":description"',
+ 'stored_journal' => 'Nueva transacción creada exitosamente ":description"',
+ 'select_transactions' => 'Seleccionar transacciones',
+ 'rule_group_select_transactions' => 'Aplicar ":title" a las transacciones',
+ 'rule_select_transactions' => 'Aplicar ":title" a las transacciones',
+ 'stop_selection' => 'Pare de seleccionas transacciones',
+ 'reconcile_selected' => 'Reconciliar',
+ 'mass_delete_journals' => 'Eliminar un numero de transacciones',
+ 'mass_edit_journals' => 'Editar un numero de transacciones',
+ 'mass_bulk_journals' => 'Bulk editar un numero de transacciones',
+ 'mass_bulk_journals_explain' => 'Si usted no desea cambiar sus transacciones a una mediante la función de edición masiva, usted puede actualizarlas de una sola vez. simplemente seleccione la categoría, las etiquetas o el presupuesto preferidos en los campos de abajo, y todas las transacciones de la tabla se actualizaran.',
+ 'bulk_set_new_values' => 'Use las entradas abajo para establecer nuevos valores. Si usted los deja vacíos, serán vacíos para todos. también, tenga en cuenta que solo los retiros tendrán un presupuesto.',
+ 'no_bulk_category' => 'No actualizar la categoria',
+ 'no_bulk_budget' => 'No actualizar el presupuesto',
+ 'no_bulk_tags' => 'No actualizar etiqueta(s)',
+ 'bulk_edit' => 'Edición masiva',
+ 'cannot_edit_other_fields' => 'Usted no puede editar en masa otros campos ademas de los que están aquí, porque no hay espacio para mostrarlos. siga el enlace y editelo uno a uno, si usted necesita editar estos campos.',
+ 'no_budget' => '(no budget)',
+ 'no_budget_squared' => '(sin presupuesto)',
+ 'perm-delete-many' => 'Eliminar muchos elementos de una sola vez puede ser perturbador. Por favor sea cuidadoso.',
+ 'mass_deleted_transactions_success' => 'Eliminar :amount transacción (es).',
+ 'mass_edited_transactions_success' => 'Actualizado :amount transacción (es)',
+ 'opt_group_no_account_type' => '(Sin tipo de cuenta)',
+ 'opt_group_defaultAsset' => 'Cuenta de ingresos por mora',
+ 'opt_group_savingAsset' => 'Cuenta de ahorros',
+ 'opt_group_sharedAsset' => 'Cuenta de activos compartidas',
+ 'opt_group_ccAsset' => 'Tarjetas de credito',
+ 'notes' => 'Notas',
// new user:
- 'welcome' => 'Bienvenido a Firefly III!',
- 'submit' => 'Enviar',
- 'getting_started' => 'Comenzando',
- 'to_get_started' => 'Es bueno ver que usted ha instalado con éxito Firefly III. Para comenzar con esta regla, por favor ingrese el nombre de su banco y el saldo de su cuenta de cheques principal. No se preocupe todavía si tiene varias cuentas. usted puede agregarlas luego. Es solo que Firefly III necesita algo para empezar.',
- 'savings_balance_text' => 'Firefly II creara automáticamente una cuenta de ahorros para usted. Por
+ 'welcome' => 'Bienvenido a Firefly III!',
+ 'submit' => 'Enviar',
+ 'getting_started' => 'Comenzando',
+ 'to_get_started' => 'Es bueno ver que usted ha instalado con éxito Firefly III. Para comenzar con esta regla, por favor ingrese el nombre de su banco y el saldo de su cuenta de cheques principal. No se preocupe todavía si tiene varias cuentas. usted puede agregarlas luego. Es solo que Firefly III necesita algo para empezar.',
+ 'savings_balance_text' => 'Firefly II creara automáticamente una cuenta de ahorros para usted. Por
defecto. No abra dinero en su cuenta de ahorros. pero si le dice a Firefly III el saldo se almacenara como tal.',
- 'finish_up_new_user' => 'Eso es! Usted puede continuar presionando. Usted sera llevado al indice de Firefly III.',
- 'stored_new_accounts_new_user' => 'Hurra! Sus nuevas cuentas han sido almacenadas.',
+ 'finish_up_new_user' => 'Eso es! Usted puede continuar presionando. Usted sera llevado al indice de Firefly III.',
+ 'stored_new_accounts_new_user' => 'Hurra! Sus nuevas cuentas han sido almacenadas.',
// home page:
- 'yourAccounts' => 'Tus cuentas',
- 'budgetsAndSpending' => 'Presupuestos y gastos',
- 'savings' => 'Ahorros',
- 'newWithdrawal' => 'Nuevo gasto',
- 'newDeposit' => 'Nuevo deposito',
- 'newTransfer' => 'Nueva transferencia',
- 'bills_to_pay' => 'Facturas por pagar',
- 'per_day' => 'Por dia',
- 'left_to_spend_per_day' => 'Dejar para gastar por dia',
- 'bills_paid' => 'Facturas pagadas',
+ 'yourAccounts' => 'Tus cuentas',
+ 'budgetsAndSpending' => 'Presupuestos y gastos',
+ 'savings' => 'Ahorros',
+ 'newWithdrawal' => 'Nuevo gasto',
+ 'newDeposit' => 'Nuevo deposito',
+ 'newTransfer' => 'Nueva transferencia',
+ 'bills_to_pay' => 'Facturas por pagar',
+ 'per_day' => 'Por dia',
+ 'left_to_spend_per_day' => 'Dejar para gastar por dia',
+ 'bills_paid' => 'Facturas pagadas',
// menu and titles, should be recycled as often as possible:
- 'currency' => 'Moneda',
- 'preferences' => 'Preferencias',
- 'logout' => 'Cerrar sesión',
- 'toggleNavigation' => 'Activar navegación',
- 'searchPlaceholder' => 'Buscar...',
- 'version' => 'Versión',
- 'dashboard' => 'Panel de control',
- 'currencies' => 'Divisas',
- 'accounts' => 'Cuentas',
- 'Asset account' => 'Cuenta de activos',
- 'Default account' => 'Cuenta de activos',
- 'Expense account' => 'Cuenta de gastos',
- 'Revenue account' => 'Cuenta de ganancia',
- 'Initial balance account' => 'Cuenta de balance inicial',
- 'budgets' => 'Presupuestos',
- 'tags' => 'Etiquetas',
- 'reports' => 'Informes',
- 'transactions' => 'Transacciones',
- 'expenses' => 'Gastos',
- 'income' => 'Ingresos / salarios',
- 'transfers' => 'Transferencias',
- 'moneyManagement' => 'Gestión del dinero',
- 'piggyBanks' => 'Huchas',
- 'bills' => 'Facturas',
- 'withdrawal' => 'Retiro',
- 'opening_balance' => 'Saldo inicial',
- 'deposit' => 'Depósito',
- 'account' => 'Cuenta',
- 'transfer' => 'Transferencia',
- 'Withdrawal' => 'Retiro',
- 'Deposit' => 'Depósito',
- 'Transfer' => 'Transferencia',
- 'bill' => 'Factura',
- 'yes' => 'Si',
- 'no' => 'No',
- 'amount' => 'Cantidad',
- 'overview' => 'Resumen',
- 'saveOnAccount' => 'Guardar en cuenta',
- 'unknown' => 'Desconocido',
- 'daily' => 'Diario',
- 'monthly' => 'Mensual',
- 'profile' => 'Perfil',
- 'errors' => 'Errores',
+ 'currency' => 'Moneda',
+ 'preferences' => 'Preferencias',
+ 'logout' => 'Cerrar sesión',
+ 'toggleNavigation' => 'Activar navegación',
+ 'searchPlaceholder' => 'Buscar...',
+ 'version' => 'Versión',
+ 'dashboard' => 'Panel de control',
+ 'currencies' => 'Divisas',
+ 'accounts' => 'Cuentas',
+ 'Asset account' => 'Cuenta de activos',
+ 'Default account' => 'Cuenta de activos',
+ 'Expense account' => 'Cuenta de gastos',
+ 'Revenue account' => 'Cuenta de ganancia',
+ 'Initial balance account' => 'Cuenta de balance inicial',
+ 'budgets' => 'Presupuestos',
+ 'tags' => 'Etiquetas',
+ 'reports' => 'Informes',
+ 'transactions' => 'Transacciones',
+ 'expenses' => 'Gastos',
+ 'income' => 'Ingresos / salarios',
+ 'transfers' => 'Transferencias',
+ 'moneyManagement' => 'Gestión del dinero',
+ 'piggyBanks' => 'Huchas',
+ 'bills' => 'Facturas',
+ 'withdrawal' => 'Retiro',
+ 'opening_balance' => 'Saldo inicial',
+ 'deposit' => 'Depósito',
+ 'account' => 'Cuenta',
+ 'transfer' => 'Transferencia',
+ 'Withdrawal' => 'Retiro',
+ 'Deposit' => 'Depósito',
+ 'Transfer' => 'Transferencia',
+ 'bill' => 'Factura',
+ 'yes' => 'Si',
+ 'no' => 'No',
+ 'amount' => 'Cantidad',
+ 'overview' => 'Resumen',
+ 'saveOnAccount' => 'Guardar en cuenta',
+ 'unknown' => 'Desconocido',
+ 'daily' => 'Diario',
+ 'monthly' => 'Mensual',
+ 'profile' => 'Perfil',
+ 'errors' => 'Errores',
// reports:
- 'report_default' => 'Reporte financiero por defecto entre :start y :end',
- 'report_audit' => 'Transacción general del historial entre :start y :end',
- 'report_category' => 'Reporte de categoría entre :start y :end',
- 'report_account' => 'Cuentas de Gastos/ingresos reporta entre :start y :end',
- 'report_budget' => 'Reporte de presupuesto entre :start y :end',
- 'report_tag' => 'Reporte de etiqueta entre :start y :end',
- 'quick_link_reports' => 'Enlaces rápidos',
- 'quick_link_default_report' => 'Reporte financiero por defecto',
- 'quick_link_audit_report' => 'Resumen del historial de transacciones',
- 'report_this_month_quick' => 'Mes en curso, todas las cuentas',
- 'report_this_year_quick' => 'Año en curso, todas las cuentas',
- 'report_this_fiscal_year_quick' => 'Año fiscal en curso, todas las cuentas',
- 'report_all_time_quick' => 'Todo el tiempo, todas las cuentas',
- 'reports_can_bookmark' => 'Recuerda que los informes pueden ser marcados como favoritos.',
- 'incomeVsExpenses' => 'Ingresos vs. gastos',
- 'accountBalances' => 'Balances de cuentas',
- 'balanceStart' => 'Balance al inicio de un periodo',
- 'balanceEnd' => 'Balance al final de un periodo',
- 'splitByAccount' => 'Separada por cuenta',
- 'coveredWithTags' => 'Cubierta con etiquetas',
- 'leftUnbalanced' => 'Izquierda desbalanceada',
- 'leftInBudget' => 'Dejado en el presupuesto',
- 'sumOfSums' => 'Suma de sumas',
- 'noCategory' => '(sin categoría)',
- 'notCharged' => 'No cargado (todavía)',
- 'inactive' => 'Inactivo',
- 'active' => 'Activo',
- 'difference' => 'Diferente',
- 'money_flowing_in' => 'Dentro',
- 'money_flowing_out' => 'Fuera',
- 'topX' => 'tope :number',
- 'show_full_list' => 'Mostrar lista entera',
- 'show_only_top' => 'Mostrar solo tope :number',
- 'report_type' => 'Tipo de reporte',
- 'report_type_default' => 'Reporte financiero por mora',
- 'report_type_audit' => 'Resumen del historial de transacciones (auditar)',
- 'report_type_category' => 'Reporte de categoría',
- 'report_type_budget' => 'Reporte de presupuesto',
- 'report_type_tag' => 'Reporte de etiqueta',
- 'report_type_account' => 'Reporte de cuenta de gastos/ingresos',
- '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' => 'Rango de fechas',
- 'report_preset_ranges' => 'Rangos preestablecidos',
- 'shared' => 'Compartido',
- 'fiscal_year' => 'Año fiscal',
- 'income_entry' => 'Ingresos de la cuenta ":name" entre :start y :end',
- 'expense_entry' => 'Gastos a cuenta ":name" entre :start y :end',
- 'category_entry' => 'Gastos en categoría ":name" entre :start y :end',
- 'budget_spent_amount' => 'Gastos en presupuesto ":budget" entre :start y :end',
- 'balance_amount' => 'Gastos en presupuesto ":budget" pago desde la cuenta ":account" entre :start y :end',
- 'no_audit_activity' => 'Ninguna actividad fue registrada en la cuenta :account_name entre :start y :end.',
- 'audit_end_balance' => 'Saldo de cuenta de :account_name en el final de :end fue :balance',
- 'reports_extra_options' => 'Opciones adicionales',
- 'report_has_no_extra_options' => 'Este informe no tiene opciones adicionales',
- 'reports_submit' => 'Ver informe',
- 'end_after_start_date' => 'Fecha final de reporte debe ser después de la fecha de inicio.',
- 'select_category' => 'Seleccionar categoría (as)',
- 'select_budget' => 'Seleccionar presupuesto (s).',
- 'select_tag' => 'Seleccionar etiqueta (s).',
- 'income_per_category' => 'Ingresos por categoria',
- 'expense_per_category' => 'Gastos por categoria',
- 'expense_per_budget' => 'Gastos por presupuestos',
- 'income_per_account' => 'Ingresos por cuenta',
- 'expense_per_account' => 'Gastos por cuenta',
- 'expense_per_tag' => 'Gastos por etiqueta',
- 'income_per_tag' => 'Ingreso por etiqueta',
- 'include_expense_not_in_budget' => 'Gastos incluidos que no están en el presupuesto (s) seleccionado',
- 'include_expense_not_in_account' => 'Gastos incluidos que no están en la cuenta (s) seleccionada',
- 'include_expense_not_in_category' => 'Gastos incluidos que no están en la categoría (s) seleccionada',
- 'include_income_not_in_category' => 'Ingresos incluidos que no estan en la categoria (s) seleccionada',
- 'include_income_not_in_account' => 'Ingresos incluidos que no están en la cuenta (s) seleccionada',
- 'include_income_not_in_tags' => 'Ingresos incluidos no en la etiqueta (s) seleccionadas',
- 'include_expense_not_in_tags' => 'Gastos incluidos no seleccionados con etiqueta',
- 'everything_else' => 'Todo lo demas',
- 'income_and_expenses' => 'Ingresos y gastos',
- 'spent_average' => 'Gastado (promedio)',
- 'income_average' => 'Ingresos (promedio)',
- 'transaction_count' => 'Cuenta de transacciones',
- 'average_spending_per_account' => 'Promedio de gasto por cuenta',
- 'average_income_per_account' => 'Promedio de ingreso por cuenta',
- 'total' => 'Total',
- 'description' => 'Descripción',
- 'sum_of_period' => 'Suma de período',
- 'average_in_period' => 'Promedio en el período',
- 'account_role_defaultAsset' => 'Cuentas de ingresos por defecto',
- 'account_role_sharedAsset' => 'Compartir cuenta de ingresos',
- 'account_role_savingAsset' => 'Cuentas de ahorros',
- 'account_role_ccAsset' => 'Tarjeta de Crédito',
- 'budget_chart_click' => 'Por favor de click el nombre del presupuesto en la tabla de arriba para ver el cuadro.',
- 'category_chart_click' => 'Por favor de click en el nombre de categoría en la tabla de arriba para ver el cuadro.',
- 'in_out_accounts' => 'Ganado y gastado por combinación',
- 'in_out_per_category' => 'Ganado y gastado por categoría',
- 'out_per_budget' => 'Gasto por presupuesto',
- 'select_expense_revenue' => 'Seleccione cuenta de gastos/ingresos',
+ 'report_default' => 'Reporte financiero por defecto entre :start y :end',
+ 'report_audit' => 'Transacción general del historial entre :start y :end',
+ 'report_category' => 'Reporte de categoría entre :start y :end',
+ 'report_account' => 'Cuentas de Gastos/ingresos reporta entre :start y :end',
+ 'report_budget' => 'Reporte de presupuesto entre :start y :end',
+ 'report_tag' => 'Reporte de etiqueta entre :start y :end',
+ 'quick_link_reports' => 'Enlaces rápidos',
+ 'quick_link_default_report' => 'Reporte financiero por defecto',
+ 'quick_link_audit_report' => 'Resumen del historial de transacciones',
+ 'report_this_month_quick' => 'Mes en curso, todas las cuentas',
+ 'report_this_year_quick' => 'Año en curso, todas las cuentas',
+ 'report_this_fiscal_year_quick' => 'Año fiscal en curso, todas las cuentas',
+ 'report_all_time_quick' => 'Todo el tiempo, todas las cuentas',
+ 'reports_can_bookmark' => 'Recuerda que los informes pueden ser marcados como favoritos.',
+ 'incomeVsExpenses' => 'Ingresos vs. gastos',
+ 'accountBalances' => 'Balances de cuentas',
+ 'balanceStart' => 'Balance al inicio de un periodo',
+ 'balanceEnd' => 'Balance al final de un periodo',
+ 'splitByAccount' => 'Separada por cuenta',
+ 'coveredWithTags' => 'Cubierta con etiquetas',
+ 'leftUnbalanced' => 'Izquierda desbalanceada',
+ 'leftInBudget' => 'Dejado en el presupuesto',
+ 'sumOfSums' => 'Suma de sumas',
+ 'noCategory' => '(sin categoría)',
+ 'notCharged' => 'No cargado (todavía)',
+ 'inactive' => 'Inactivo',
+ 'active' => 'Activo',
+ 'difference' => 'Diferente',
+ 'money_flowing_in' => 'Dentro',
+ 'money_flowing_out' => 'Fuera',
+ 'topX' => 'tope :number',
+ 'show_full_list' => 'Mostrar lista entera',
+ 'show_only_top' => 'Mostrar solo tope :number',
+ 'report_type' => 'Tipo de reporte',
+ 'report_type_default' => 'Reporte financiero por mora',
+ 'report_type_audit' => 'Resumen del historial de transacciones (auditar)',
+ 'report_type_category' => 'Reporte de categoría',
+ 'report_type_budget' => 'Reporte de presupuesto',
+ 'report_type_tag' => 'Reporte de etiqueta',
+ 'report_type_account' => 'Reporte de cuenta de gastos/ingresos',
+ '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' => 'Rango de fechas',
+ 'report_preset_ranges' => 'Rangos preestablecidos',
+ 'shared' => 'Compartido',
+ 'fiscal_year' => 'Año fiscal',
+ 'income_entry' => 'Ingresos de la cuenta ":name" entre :start y :end',
+ 'expense_entry' => 'Gastos a cuenta ":name" entre :start y :end',
+ 'category_entry' => 'Gastos en categoría ":name" entre :start y :end',
+ 'budget_spent_amount' => 'Gastos en presupuesto ":budget" entre :start y :end',
+ 'balance_amount' => 'Gastos en presupuesto ":budget" pago desde la cuenta ":account" entre :start y :end',
+ 'no_audit_activity' => 'Ninguna actividad fue registrada en la cuenta :account_name entre :start y :end.',
+ 'audit_end_balance' => 'Saldo de cuenta de :account_name en el final de :end fue :balance',
+ 'reports_extra_options' => 'Opciones adicionales',
+ 'report_has_no_extra_options' => 'Este informe no tiene opciones adicionales',
+ 'reports_submit' => 'Ver informe',
+ 'end_after_start_date' => 'Fecha final de reporte debe ser después de la fecha de inicio.',
+ 'select_category' => 'Seleccionar categoría (as)',
+ 'select_budget' => 'Seleccionar presupuesto (s).',
+ 'select_tag' => 'Seleccionar etiqueta (s).',
+ 'income_per_category' => 'Ingresos por categoria',
+ 'expense_per_category' => 'Gastos por categoria',
+ 'expense_per_budget' => 'Gastos por presupuestos',
+ 'income_per_account' => 'Ingresos por cuenta',
+ 'expense_per_account' => 'Gastos por cuenta',
+ 'expense_per_tag' => 'Gastos por etiqueta',
+ 'income_per_tag' => 'Ingreso por etiqueta',
+ 'include_expense_not_in_budget' => 'Gastos incluidos que no están en el presupuesto (s) seleccionado',
+ 'include_expense_not_in_account' => 'Gastos incluidos que no están en la cuenta (s) seleccionada',
+ 'include_expense_not_in_category' => 'Gastos incluidos que no están en la categoría (s) seleccionada',
+ 'include_income_not_in_category' => 'Ingresos incluidos que no estan en la categoria (s) seleccionada',
+ 'include_income_not_in_account' => 'Ingresos incluidos que no están en la cuenta (s) seleccionada',
+ 'include_income_not_in_tags' => 'Ingresos incluidos no en la etiqueta (s) seleccionadas',
+ 'include_expense_not_in_tags' => 'Gastos incluidos no seleccionados con etiqueta',
+ 'everything_else' => 'Todo lo demas',
+ 'income_and_expenses' => 'Ingresos y gastos',
+ 'spent_average' => 'Gastado (promedio)',
+ 'income_average' => 'Ingresos (promedio)',
+ 'transaction_count' => 'Cuenta de transacciones',
+ 'average_spending_per_account' => 'Promedio de gasto por cuenta',
+ 'average_income_per_account' => 'Promedio de ingreso por cuenta',
+ 'total' => 'Total',
+ 'description' => 'Descripción',
+ 'sum_of_period' => 'Suma de período',
+ 'average_in_period' => 'Promedio en el período',
+ 'account_role_defaultAsset' => 'Cuentas de ingresos por defecto',
+ 'account_role_sharedAsset' => 'Compartir cuenta de ingresos',
+ 'account_role_savingAsset' => 'Cuentas de ahorros',
+ 'account_role_ccAsset' => 'Tarjeta de Crédito',
+ 'budget_chart_click' => 'Por favor de click el nombre del presupuesto en la tabla de arriba para ver el cuadro.',
+ 'category_chart_click' => 'Por favor de click en el nombre de categoría en la tabla de arriba para ver el cuadro.',
+ 'in_out_accounts' => 'Ganado y gastado por combinación',
+ 'in_out_per_category' => 'Ganado y gastado por categoría',
+ 'out_per_budget' => 'Gasto por presupuesto',
+ 'select_expense_revenue' => 'Seleccione cuenta de gastos/ingresos',
// charts:
- 'chart' => 'Grafico',
- 'month' => 'Mes',
- 'budget' => 'Presupuesto',
- 'spent' => 'Gastado',
- 'spent_in_budget' => 'Gastado en presupuesto',
- 'left_to_spend' => 'Dejar para gastar',
- 'earned' => 'Ganado',
- 'overspent' => 'Sobrepasadas',
- 'left' => 'Izquierda',
- 'max-amount' => 'Monto máximo',
- 'min-amount' => 'Monto minimo',
- 'journal-amount' => 'Entrada actual de factura',
- 'name' => 'Nombre',
- 'date' => 'Fecha',
- 'paid' => 'Pagado',
- 'unpaid' => 'No pagado',
- 'day' => 'Día',
- 'budgeted' => 'Presupuestado',
- 'period' => 'Período',
- 'balance' => 'Balance',
- 'sum' => 'Suma',
- 'average' => 'Promedio',
- 'balanceFor' => 'Saldo por :name',
+ 'chart' => 'Grafico',
+ 'month' => 'Mes',
+ 'budget' => 'Presupuesto',
+ 'spent' => 'Gastado',
+ 'spent_in_budget' => 'Gastado en presupuesto',
+ 'left_to_spend' => 'Dejar para gastar',
+ 'earned' => 'Ganado',
+ 'overspent' => 'Sobrepasadas',
+ 'left' => 'Izquierda',
+ 'max-amount' => 'Monto máximo',
+ 'min-amount' => 'Monto minimo',
+ 'journal-amount' => 'Entrada actual de factura',
+ 'name' => 'Nombre',
+ 'date' => 'Fecha',
+ 'paid' => 'Pagado',
+ 'unpaid' => 'No pagado',
+ 'day' => 'Día',
+ 'budgeted' => 'Presupuestado',
+ 'period' => 'Período',
+ 'balance' => 'Balance',
+ 'sum' => 'Suma',
+ 'average' => 'Promedio',
+ 'balanceFor' => 'Saldo por :name',
// piggy banks:
- 'add_money_to_piggy' => 'Añadir dinero a la alcancía ":name"',
- 'piggy_bank' => 'Alcancía',
- 'new_piggy_bank' => 'Nueva alcancía',
- 'store_piggy_bank' => 'Archivar nueva alcancía',
- 'stored_piggy_bank' => 'Archivar nueva alcancía ":name"',
- 'account_status' => 'Estado de cuenta',
- 'left_for_piggy_banks' => 'Apartado para las huchas',
- 'sum_of_piggy_banks' => 'Total de huchas',
- 'saved_so_far' => 'Guardado hasta el momento',
- 'left_to_save' => 'Izquierda para guardar',
- 'suggested_amount' => 'Sugerir monto mensual para guardar',
- 'add_money_to_piggy_title' => 'Añadir dinero a la alcancía ":name"',
- 'remove_money_from_piggy_title' => 'Quitar dinero de la alcancía ":name"',
- 'add' => 'Añadir',
- 'no_money_for_piggy' => 'Usted no tiene dinero para colocar en esta alcancía.',
+ 'add_money_to_piggy' => 'Añadir dinero a la alcancía ":name"',
+ 'piggy_bank' => 'Alcancía',
+ 'new_piggy_bank' => 'Nueva alcancía',
+ 'store_piggy_bank' => 'Archivar nueva alcancía',
+ 'stored_piggy_bank' => 'Archivar nueva alcancía ":name"',
+ 'account_status' => 'Estado de cuenta',
+ 'left_for_piggy_banks' => 'Apartado para las huchas',
+ 'sum_of_piggy_banks' => 'Total de huchas',
+ 'saved_so_far' => 'Guardado hasta el momento',
+ 'left_to_save' => 'Izquierda para guardar',
+ 'suggested_amount' => 'Sugerir monto mensual para guardar',
+ 'add_money_to_piggy_title' => 'Añadir dinero a la alcancía ":name"',
+ 'remove_money_from_piggy_title' => 'Quitar dinero de la alcancía ":name"',
+ 'add' => 'Añadir',
+ 'no_money_for_piggy' => 'Usted no tiene dinero para colocar en esta alcancía.',
'remove' => 'Eliminar',
'max_amount_add' => 'La cantidad máxima que usted puede agregar es',
@@ -1085,6 +1087,7 @@ return [
'invalid_link_selection' => 'No se puede vincular esta transacción',
'journals_linked' => 'Las transacciones están vinculadas.',
'journals_error_linked' => 'Estas transacciones ya están vinculadas.',
+ 'journals_link_to_self' => 'You cannot link a transaction to itself',
'journal_links' => 'Enlaces de transacciones',
'this_withdrawal' => 'Este retiro',
'this_deposit' => 'Este deposito',
diff --git a/resources/lang/es_ES/form.php b/resources/lang/es_ES/form.php
index 14197cc0a8..2f2cf6d6aa 100644
--- a/resources/lang/es_ES/form.php
+++ b/resources/lang/es_ES/form.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// new user:
diff --git a/resources/lang/es_ES/import.php b/resources/lang/es_ES/import.php
index aa0652a4b9..0df9bf02b0 100644
--- a/resources/lang/es_ES/import.php
+++ b/resources/lang/es_ES/import.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
// status of import:
@@ -97,6 +98,7 @@ return [
// not csv, but normal warning
'roles_warning' => 'Por lo menos, marque una columna como la columna de importe. también es aconsejable seleccionar una columna para la descripción. la fecha y la cuenta contraria.',
'foreign_amount_warning' => 'Si usted marca una columna que contiene un importe en una moneda extranjera, usted también debe establecer la columna que contiene que moneda es.',
+
// file, map data
'file_map_title' => 'Configuración de importación (4/4) - Conecta datos de importación a los datos de Firefly III',
'file_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 Iii respetara este mapeo. Si no hay un valor hacia el cual mapear o no se desea mapear un valor especifico, no seleccione ninguno.',
@@ -131,28 +133,40 @@ return [
'column_date-book' => 'Fecha de registro de la transacción',
'column_date-process' => 'Fecha del proceso de transacción',
'column_date-transaction' => 'Fecha',
+ 'column_date-due' => 'Transaction due date',
+ 'column_date-payment' => 'Transaction payment date',
+ 'column_date-invoice' => 'Transaction invoice date',
'column_description' => 'Descripción',
'column_opposing-iban' => 'Cuenta opuesta (IBAN)',
+ 'column_opposing-bic' => 'Opposing account (BIC)',
'column_opposing-id' => 'ID de cuenta opuesta (coincide FF3)',
'column_external-id' => 'Identificación externa',
'column_opposing-name' => 'Cuenta opuesta (nombre)',
'column_rabo-debit-credit' => 'Indicador especifico débito/crédito de Rabobank',
'column_ing-debit-credit' => 'Indicador especifico débito/crédito de ING',
- 'column_sepa-ct-id' => 'ID transferencia de crédito extremo a extremo',
- 'column_sepa-ct-op' => 'Transferencia de crédito a cuenta opuesta SEPA',
- 'column_sepa-db' => 'SEPA débito directo',
+ 'column_sepa-ct-id' => 'SEPA end-to-end Identifier',
+ 'column_sepa-ct-op' => 'SEPA Opposing Account Identifier',
+ 'column_sepa-db' => 'SEPA Mandate Identifier',
+ 'column_sepa-cc' => 'SEPA Clearing Code',
+ 'column_sepa-ci' => 'SEPA Creditor Identifier',
+ 'column_sepa-ep' => 'SEPA External Purpose',
+ 'column_sepa-country' => 'SEPA Country Code',
'column_tags-comma' => 'Etiquetas ( separadas por comas)',
'column_tags-space' => 'Etiquetas ( separadas por espacio)',
'column_account-number' => 'Cuenta de archivos ( numero de cuenta)',
'column_opposing-number' => 'Cuenta opuesta (numero de cuenta)',
'column_note' => 'Nota (s)',
+ 'column_internal-reference' => 'Internal reference',
// prerequisites
'prerequisites' => 'Prerequisitos',
// bunq
'bunq_prerequisites_title' => 'Pre requisitos para una importación de bunq',
- 'bunq_prerequisites_text' => 'Para importar de bunq, usted necesita obtener una clave API. usted puede hacerlo a través de la aplicación.',
+ 'bunq_prerequisites_text' => 'In order to import from bunq, you need to obtain an API key. You can do this through the app. Please note that the import function for bunq is in BETA. It has only been tested against the sandbox API.',
+ 'bunq_do_import' => 'Yes, import from this account',
+ 'bunq_accounts_title' => 'Bunq accounts',
+ 'bunq_accounts_text' => 'These are the accounts associated with your bunq account. Please select the accounts from which you want to import, and in which account the transactions must be imported.',
// Spectre
'spectre_title' => 'Importar usando Spectre',
@@ -187,4 +201,3 @@ return [
// various other strings:
'imported_from_account' => 'Importado de ":account"',
];
-
diff --git a/resources/lang/es_ES/intro.php b/resources/lang/es_ES/intro.php
index 384efe1e89..a606cf11f5 100644
--- a/resources/lang/es_ES/intro.php
+++ b/resources/lang/es_ES/intro.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// index
diff --git a/resources/lang/es_ES/list.php b/resources/lang/es_ES/list.php
index 8b3527ab45..280df678e8 100644
--- a/resources/lang/es_ES/list.php
+++ b/resources/lang/es_ES/list.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
'buttons' => 'Botones',
@@ -102,4 +103,12 @@ return [
'reconcile' => 'Reconciliar',
'account_on_spectre' => 'Cuenta (espectro)',
'do_import' => 'Importar desde esta cuenta',
+ 'sepa-ct-id' => 'SEPA End to End Identifier',
+ 'sepa-ct-op' => 'SEPA Opposing Account Identifier',
+ 'sepa-db' => 'SEPA Mandate Identifier',
+ 'sepa-country' => 'SEPA Country',
+ 'sepa-cc' => 'SEPA Clearing Code',
+ 'sepa-ep' => 'SEPA External Purpose',
+ 'sepa-ci' => 'SEPA Creditor Identifier',
+ 'account_at_bunq' => 'Account with bunq',
];
diff --git a/resources/lang/es_ES/pagination.php b/resources/lang/es_ES/pagination.php
index da73ae7b5b..53cef1c2fd 100644
--- a/resources/lang/es_ES/pagination.php
+++ b/resources/lang/es_ES/pagination.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'previous' => '« Anterior',
diff --git a/resources/lang/es_ES/passwords.php b/resources/lang/es_ES/passwords.php
index 593d7a97cd..72bb4ceebb 100644
--- a/resources/lang/es_ES/passwords.php
+++ b/resources/lang/es_ES/passwords.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'password' => 'Las contraseñas deben tener al menos seis caracteres y coincidir entre sí.',
diff --git a/resources/lang/es_ES/validation.php b/resources/lang/es_ES/validation.php
index 1a579ff6a1..f6f733923c 100644
--- a/resources/lang/es_ES/validation.php
+++ b/resources/lang/es_ES/validation.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'iban' => 'Este no es un IBAN válido.',
+ 'source_equals_destination' => 'The source account equals the destination account',
'unique_account_number_for_user' => 'Parece que este número de cuenta ya está en uso.',
'unique_iban_for_user' => 'It looks like this IBAN is already in use.',
'deleted_user' => 'Debido a restricciones de seguridad, no se puede registrar utilizando esta dirección de correo electrónico.',
diff --git a/resources/lang/fr_FR/auth.php b/resources/lang/fr_FR/auth.php
index f6cd19d030..e8f628a756 100644
--- a/resources/lang/fr_FR/auth.php
+++ b/resources/lang/fr_FR/auth.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
/*
diff --git a/resources/lang/fr_FR/bank.php b/resources/lang/fr_FR/bank.php
index ef0d636f91..b6a86faa4b 100644
--- a/resources/lang/fr_FR/bank.php
+++ b/resources/lang/fr_FR/bank.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
];
diff --git a/resources/lang/fr_FR/breadcrumbs.php b/resources/lang/fr_FR/breadcrumbs.php
index 9ddec46d34..52ae690c0e 100644
--- a/resources/lang/fr_FR/breadcrumbs.php
+++ b/resources/lang/fr_FR/breadcrumbs.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'home' => 'Accueil',
diff --git a/resources/lang/fr_FR/components.php b/resources/lang/fr_FR/components.php
index 125c74b2f0..d73b89a4d1 100644
--- a/resources/lang/fr_FR/components.php
+++ b/resources/lang/fr_FR/components.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// profile
- 'personal_access_tokens' => 'Personal access tokens',
+ 'personal_access_tokens' => 'Jeton d\'accès personnel',
// bills:
- 'not_expected_period' => 'Not expected this period',
- 'not_or_not_yet' => 'Not (yet)',
+ 'not_expected_period' => 'Cette période n\'est pas prévue',
+ 'not_or_not_yet' => 'Non (pas encore)',
];
diff --git a/resources/lang/fr_FR/config.php b/resources/lang/fr_FR/config.php
index 5c774ae250..0f6f6362c0 100644
--- a/resources/lang/fr_FR/config.php
+++ b/resources/lang/fr_FR/config.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'html_language' => 'fr',
diff --git a/resources/lang/fr_FR/csv.php b/resources/lang/fr_FR/csv.php
index d61316b632..892c8beac4 100644
--- a/resources/lang/fr_FR/csv.php
+++ b/resources/lang/fr_FR/csv.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
];
diff --git a/resources/lang/fr_FR/demo.php b/resources/lang/fr_FR/demo.php
index a0ae5fcc06..e74d44b518 100644
--- a/resources/lang/fr_FR/demo.php
+++ b/resources/lang/fr_FR/demo.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
- 'no_demo_text' => 'Désolé, il n’y a aucun texte supplémentaire de démonstration ou d\'explication pour cette page.',
- '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' => '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 un certain nombre de types de rapports. Lisez-les en cliquant sur l\'icône dans le coin supérieur droit.',
- 'reports-index-examples' => 'N’oubliez pas de consultez ces exemples : un aperçu financier mensuel, une vue d’ensemble financière annuelle ainsi qu’une présentation du budget.',
- 'currencies-index' => 'Firefly III prend en charge plusieurs devises. Bien que l\'Euro soit la devise par défaut, cette dernière peut être changée pour le Dollar américain et de nombreuses autres devises. Comme vous pouvez le remarquer une petite sélection des monnaies a été incluse, mais vous pouvez ajouter vos propres devises si vous le souhaitez. Gardez à l\'esprit que la modification de la devise par défaut ne modifie pas la monnaie des transactions existantes : Firefly III prend en charge l’utilisation de plusieurs devises en même temps.',
- 'transactions-index' => 'Ces dépenses, dépôts et transferts ne sont pas particulièrement imaginatifs. Ils ont été générés automatiquement.',
- 'piggy-banks-index' => 'Comme vous pouvez le voir, il y a trois tirelires. Utilisez les boutons plus et moins pour influer sur le montant d’argent dans chaque tirelire. Cliquez sur le nom de la tirelire pour voir l’administration pour chaque tirelire.',
- 'import-index' => 'Bien sûr, n’importe quel fichier CSV peut être importé dans Firefly III',
+ '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' => '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 un certain nombre de types de rapports. Lisez-les en cliquant sur l\'icône dans le coin supérieur droit.',
+ 'reports-index-examples' => 'N’oubliez pas de consultez ces exemples : un aperçu financier mensuel, une vue d’ensemble financière annuelle ainsi qu’une présentation du budget.',
+ 'currencies-index' => 'Firefly III prend en charge plusieurs devises. Bien que l\'Euro soit la devise par défaut, cette dernière peut être changée pour le Dollar américain et de nombreuses autres devises. Comme vous pouvez le remarquer une petite sélection des monnaies a été incluse, mais vous pouvez ajouter vos propres devises si vous le souhaitez. Gardez à l\'esprit que la modification de la devise par défaut ne modifie pas la monnaie des transactions existantes : Firefly III prend en charge l’utilisation de plusieurs devises en même temps.',
+ 'transactions-index' => 'Ces dépenses, dépôts et transferts ne sont pas particulièrement imaginatifs. Ils ont été générés automatiquement.',
+ 'piggy-banks-index' => 'Comme vous pouvez le voir, il y a trois tirelires. Utilisez les boutons plus et moins pour influer sur le montant d’argent dans chaque tirelire. Cliquez sur le nom de la tirelire pour voir l’administration pour chaque tirelire.',
+ 'import-index' => 'Bien sûr, n’importe quel fichier CSV peut être importé dans Firefly III',
];
diff --git a/resources/lang/fr_FR/firefly.php b/resources/lang/fr_FR/firefly.php
index 3a53b6837c..09f94ed303 100644
--- a/resources/lang/fr_FR/firefly.php
+++ b/resources/lang/fr_FR/firefly.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
// general stuff:
@@ -43,7 +44,7 @@ return [
'asset_account_role_help' => 'Toutes options supplémentaires résultant de votre choix peuvent être réglées plus tard.',
'Opening balance' => 'Solde initial',
'create_new_stuff' => 'Créer de nouvelles choses',
- 'new_withdrawal' => 'Nouveau retrait',
+ 'new_withdrawal' => 'Nouvelle dépense',
'create_new_transaction' => 'Crée une nouvelle transaction',
'go_to_asset_accounts' => 'Afficher vos comptes d\'actifs',
'go_to_budgets' => 'Gérer vos budgets',
@@ -54,7 +55,7 @@ return [
'go_to_piggies' => 'Gérer vos tirelires',
'new_deposit' => 'Nouveau dépôt',
'new_transfer' => 'Nouveau transfert',
- 'new_transfers' => 'New transfer',
+ 'new_transfers' => 'Nouveau transfert',
'new_asset_account' => 'Nouveau compte d’actif',
'new_expense_account' => 'Nouveau compte de dépenses',
'new_revenue_account' => 'Nouveau compte de recettes',
@@ -169,13 +170,15 @@ return [
'reset_button' => 'Réinitialiser',
'want_to_login' => 'Je veux me connecter',
'button_register' => 'S\'inscrire',
- 'authorization' => 'Authorization',
-
+ 'authorization' => 'Autorisation',
+ 'active_bills_only' => 'factures actives seulement',
+ 'average_per_bill' => 'moyenne par facture',
+ 'expected_total' => 'total prévu',
// API access
- 'authorization_request' => 'Firefly III v:version Authorization Request',
- 'authorization_request_intro' => ':client is requesting permission to access your financial administration. Would you like to authorize :client to access these records?',
- 'scopes_will_be_able' => 'This application will be able to:',
- 'button_authorize' => 'Authorize',
+ 'authorization_request' => 'Firefly III v:version demande d\'autorisation',
+ 'authorization_request_intro' => ':client demande l\'autorisation d\'accéder à votre administration financière. Souhaitez-vous autoriser :client à accéder à ces enregistrements?',
+ 'scopes_will_be_able' => 'Cette application pourra :',
+ 'button_authorize' => 'Autoriser',
// check for updates:
'update_check_title' => 'Vérifier les mises à jour',
@@ -188,7 +191,7 @@ return [
'admin_update_check_now_title' => 'Vérifier les mises à jour maintenant',
'admin_update_check_now_explain' => 'Si vous appuyez sur le bouton, Firefly III verra si votre version actuelle est la dernière.',
'check_for_updates_button' => 'Vérifier maintenant !',
- 'update_new_version_alert' => 'A new version of Firefly III is available. You are running v:your_version, the latest version is v:new_version which was released on :date.',
+ 'update_new_version_alert' => 'Une nouvelle version de Firefly III est disponible. Vous utilisez v:your_version, la dernière version est v:new_version qui a été publiée le :date.',
'update_current_version_alert' => 'Vous utilisez v:version, qui est la dernière version disponible.',
'update_newer_version_alert' => 'Vous utilisez v:your_version, qui est plus récente que la dernière version, v:new_version.',
'update_check_error' => 'Une erreur s\'est produite lors de la recherche des mises à jour. S\'il vous plaît allez voir les fichiers journaux.',
@@ -218,8 +221,8 @@ return [
// export data:
'import_and_export' => 'Importer et Exporter',
'export_data' => 'Exporter les données',
- 'export_and_backup_data' => 'Export data',
- 'export_data_intro' => 'Use the exported data to move to a new financial application. Please note that these files are not meant as a backup. They do not contain enough meta-data to fully restore a new Firefly III installation. If you want to make a backup of your data, please backup the database directly.',
+ 'export_and_backup_data' => 'Exporter les données',
+ 'export_data_intro' => 'Utilisez les données exportées pour passer à une nouvelle application financière. Veuillez noter que ces fichiers ne sont pas destinés à être sauvegardés. Ils ne contiennent pas assez de métadonnées pour restaurer complètement une nouvelle installation de Firefly III. Si vous souhaitez effectuer une sauvegarde de vos données, veuillez sauvegarder la base de données directement.',
'export_format' => 'Format d\'export',
'export_format_csv' => 'Valeurs séparées par des virgules (fichier CSV)',
'export_format_mt940' => 'Format compatible MT940',
@@ -403,590 +406,589 @@ return [
'rule_action_set_notes_choice' => 'Remplacer les notes par..',
'rule_action_set_notes' => 'Remplacer les notes par ":action_value"',
- 'rules_have_read_warning' => 'Avez-vous lu les avertissements ?',
- 'apply_rule_warning' => 'Avertissement : exécuter une règle ou un groupe de règles sur un grand nombre de transactions peut prendre beaucoup de temps, et pourrait entraîner un time-out. Si c\'est le cas, alors la règle ou le groupe de règles ne serait appliqué que sur une partie indéterminée de vos transactions. Cela peut engendrer des erreurs sur votre gestion financière. S\'il vous plaît, faites attention.',
+ 'rules_have_read_warning' => 'Avez-vous lu les avertissements ?',
+ 'apply_rule_warning' => 'Avertissement : exécuter une règle ou un groupe de règles sur un grand nombre de transactions peut prendre beaucoup de temps, et pourrait entraîner un time-out. Si c\'est le cas, alors la règle ou le groupe de règles ne serait appliqué que sur une partie indéterminée de vos transactions. Cela peut engendrer des erreurs sur votre gestion financière. S\'il vous plaît, faites attention.',
// tags
- 'store_new_tag' => 'Créer un nouveau tag',
- 'update_tag' => 'Mettre à jour le tag',
- 'no_location_set' => 'Aucun emplacement défini.',
- 'meta_data' => 'Meta-données',
- 'location' => 'Emplacement',
- 'without_date' => 'Sans date',
- 'result' => 'Résultat',
- 'sums_apply_to_range' => 'Toutes les sommes s\'appliquent à l\'ensemble sélectionné',
- 'mapbox_api_key' => 'Pour utiliser la carte, obtenez une clé API à partir de Mapbox. Ouvrez votre fichier .env et entrez ce code après MAPBOX_API_KEY = .',
- 'press_tag_location' => 'Faites un clic droit ou appuyez longuement sur pour définir l\'emplacement du tag.',
- 'clear_location' => 'Effacer la localisation',
+ 'store_new_tag' => 'Créer un nouveau tag',
+ 'update_tag' => 'Mettre à jour le tag',
+ 'no_location_set' => 'Aucun emplacement défini.',
+ 'meta_data' => 'Meta-données',
+ 'location' => 'Emplacement',
+ 'without_date' => 'Sans date',
+ 'result' => 'Résultat',
+ 'sums_apply_to_range' => 'Toutes les sommes s\'appliquent à l\'ensemble sélectionné',
+ 'mapbox_api_key' => 'Pour utiliser la carte, obtenez une clé API à partir de Mapbox. Ouvrez votre fichier .env et entrez ce code après MAPBOX_API_KEY = .',
+ 'press_tag_location' => 'Faites un clic droit ou appuyez longuement sur pour définir l\'emplacement du tag.',
+ 'clear_location' => 'Effacer la localisation',
// preferences
- 'pref_home_screen_accounts' => 'Comptes de l’écran d’accueil',
- 'pref_home_screen_accounts_help' => 'Quel compte doit être affiché sur l\'écran d’accueil?',
- 'pref_view_range' => 'Voir l\'étendue',
- 'pref_view_range_help' => 'Certains graphiques sont automatiquement groupés par périodes. Quelle période préférez-vous ?',
- 'pref_1D' => 'Un jour',
- 'pref_1W' => 'Une semaine',
- 'pref_1M' => 'Un mois',
- 'pref_3M' => 'Trois mois (trimestre)',
- 'pref_6M' => 'Six mois',
- 'pref_1Y' => 'Un an',
- 'pref_languages' => 'Langues',
- 'pref_languages_help' => 'Firefly III prend en charge plusieurs langues. Laquelle préférez-vous ?',
- 'pref_custom_fiscal_year' => 'Paramètres fiscaux de l\'année',
- 'pref_custom_fiscal_year_label' => 'Activé',
- 'pref_custom_fiscal_year_help' => 'Dans les pays qui utilisent une année financière autre que du 1er janvier au 31 décembre, vous pouvez la changer en spécifiant le jour de début et de fin de l\'année fiscale',
- 'pref_fiscal_year_start_label' => 'Date du début de l\'année fiscale',
- 'pref_two_factor_auth' => 'Validation en 2 étapes',
- 'pref_two_factor_auth_help' => 'Lorsque vous activez la validation en 2 étapes (également connu sous le nom de deux facteurs d’authentification), vous ajoutez une couche de sécurité supplémentaire à votre compte. Vous vous connectez avec quelque chose que vous connaissez (votre mot de passe) et quelque chose que vous avez (un code de vérification). Les codes de vérification sont générés par une application sur votre téléphone, comme par exemple Authy ou Google Authenticator.',
- 'pref_enable_two_factor_auth' => 'Activez la validation en 2 étapes',
- 'pref_two_factor_auth_disabled' => 'Le code de vérification en deux étapes a été enlevé et désactivé',
- 'pref_two_factor_auth_remove_it' => 'N’oubliez pas de supprimer ce compte de votre application d’authentification !',
- 'pref_two_factor_auth_code' => 'Vérifier le code',
- 'pref_two_factor_auth_code_help' => 'Scanner le code QR avec une application sur votre téléphone comme Authy ou Google Authenticator et entrez le code généré.',
- 'pref_two_factor_auth_reset_code' => 'Réinitialiser le code de vérification',
- 'pref_two_factor_auth_remove_code' => 'Supprimez le code de vérification',
- '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' => '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',
- 'list_page_size_title' => 'Taille de la page',
- 'list_page_size_help' => 'Toute liste de choses (comptes, transactions, etc) montre au plus tant par page.',
- 'list_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' => 'Par défaut, tous les champs ne sont pas activés lors de la création d\'une nouvelle transaction (en raison de possibles problèmes d',
- 'optional_tj_date_fields' => 'Champ date',
- 'optional_tj_business_fields' => 'Champs professionnels',
- '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',
- 'pref_optional_tj_due_date' => 'Échéance',
- 'pref_optional_tj_payment_date' => 'Date de paiement',
- 'pref_optional_tj_invoice_date' => 'Date de facturation',
- 'pref_optional_tj_internal_reference' => 'Référence interne',
- 'pref_optional_tj_notes' => 'Notes',
- 'pref_optional_tj_attachments' => 'Pièces jointes',
- 'optional_field_meta_dates' => 'Dates',
- 'optional_field_meta_business' => 'Commerce',
- 'optional_field_attachments' => 'Pièces jointes',
- 'optional_field_meta_data' => 'Métadonnées facultatives',
+ 'pref_home_screen_accounts' => 'Comptes de l’écran d’accueil',
+ 'pref_home_screen_accounts_help' => 'Quel compte doit être affiché sur l\'écran d’accueil?',
+ 'pref_view_range' => 'Voir l\'étendue',
+ 'pref_view_range_help' => 'Certains graphiques sont automatiquement groupés par périodes. Quelle période préférez-vous ?',
+ 'pref_1D' => 'Un jour',
+ 'pref_1W' => 'Une semaine',
+ 'pref_1M' => 'Un mois',
+ 'pref_3M' => 'Trois mois (trimestre)',
+ 'pref_6M' => 'Six mois',
+ 'pref_1Y' => 'Un an',
+ 'pref_languages' => 'Langues',
+ 'pref_languages_help' => 'Firefly III prend en charge plusieurs langues. Laquelle préférez-vous ?',
+ 'pref_custom_fiscal_year' => 'Paramètres fiscaux de l\'année',
+ 'pref_custom_fiscal_year_label' => 'Activé',
+ 'pref_custom_fiscal_year_help' => 'Dans les pays qui utilisent une année financière autre que du 1er janvier au 31 décembre, vous pouvez la changer en spécifiant le jour de début et de fin de l\'année fiscale',
+ 'pref_fiscal_year_start_label' => 'Date du début de l\'année fiscale',
+ 'pref_two_factor_auth' => 'Validation en 2 étapes',
+ 'pref_two_factor_auth_help' => 'Lorsque vous activez la validation en 2 étapes (également connu sous le nom de deux facteurs d’authentification), vous ajoutez une couche de sécurité supplémentaire à votre compte. Vous vous connectez avec quelque chose que vous connaissez (votre mot de passe) et quelque chose que vous avez (un code de vérification). Les codes de vérification sont générés par une application sur votre téléphone, comme par exemple Authy ou Google Authenticator.',
+ 'pref_enable_two_factor_auth' => 'Activez la validation en 2 étapes',
+ 'pref_two_factor_auth_disabled' => 'Le code de vérification en deux étapes a été enlevé et désactivé',
+ 'pref_two_factor_auth_remove_it' => 'N’oubliez pas de supprimer ce compte de votre application d’authentification !',
+ 'pref_two_factor_auth_code' => 'Vérifier le code',
+ 'pref_two_factor_auth_code_help' => 'Scanner le code QR avec une application sur votre téléphone comme Authy ou Google Authenticator et entrez le code généré.',
+ 'pref_two_factor_auth_reset_code' => 'Réinitialiser le code de vérification',
+ 'pref_two_factor_auth_disable_2fa' => 'Désactiver l\'authentification en deux étapes',
+ 'pref_save_settings' => 'Enregistrer les paramètres',
+ 'saved_preferences' => 'Préférences enregistrées!',
+ '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',
+ 'list_page_size_title' => 'Taille de la page',
+ 'list_page_size_help' => 'Toute liste de choses (comptes, transactions, etc) montre au plus tant par page.',
+ 'list_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' => 'Par défaut, tous les champs ne sont pas activés lors de la création d\'une nouvelle transaction (en raison de possibles problèmes d',
+ 'optional_tj_date_fields' => 'Champ date',
+ 'optional_tj_business_fields' => 'Champs professionnels',
+ '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',
+ 'pref_optional_tj_due_date' => 'Échéance',
+ 'pref_optional_tj_payment_date' => 'Date de paiement',
+ 'pref_optional_tj_invoice_date' => 'Date de facturation',
+ 'pref_optional_tj_internal_reference' => 'Référence interne',
+ 'pref_optional_tj_notes' => 'Notes',
+ 'pref_optional_tj_attachments' => 'Pièces jointes',
+ 'optional_field_meta_dates' => 'Dates',
+ 'optional_field_meta_business' => 'Commerce',
+ 'optional_field_attachments' => 'Pièces jointes',
+ 'optional_field_meta_data' => 'Métadonnées facultatives',
// profile:
- 'change_your_password' => 'Modifier votre mot de passe',
- 'delete_account' => 'Supprimer le compte',
- 'current_password' => 'Mot de passe actuel',
- 'new_password' => 'Nouveau mot de passe ',
- 'new_password_again' => 'Nouveau mot de passe (confirmation)',
- 'delete_your_account' => 'Supprimer votre compte',
- 'delete_your_account_help' => 'La suppression de votre compte supprimera également les comptes, les opérations, tout ce que vous pourriez avoir enregistré dans Firefly III. Tout sera SUPPRIME.',
- 'delete_your_account_password' => 'Entrez votre mot de passe pour continuer.',
- 'password' => 'Mot de passe',
- 'are_you_sure' => 'Etes-vous sûr ? Vous ne pourrez pas annuler cette action.',
- 'delete_account_button' => 'SUPPRIMER votre compte',
- 'invalid_current_password' => 'Mot de passe actuel non valide!',
- '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' => '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 d\'entreprises comme LinkedIn, Adobe ou NeoPets (et bien d’autres).',
- 'secure_pw_check_box' => 'En cochant la case, Firefly III enverra l\'empreinte SHA1 de votre mot de passe au site Web de Troy Hunt pour voir si c’est sur la liste. Cela vous empêchera d\'utiliser des mots de passe dangereux comme cela est recommandé dans les dernières NIST Special Publication à ce sujet.',
- 'secure_pw_sha1' => 'Mais je pensais que SHA1 était cassé ?',
- 'secure_pw_hash_speed' => 'Oui, mais pas dans ce contexte. Comme vous pouvez le lire sur le site web détaillant comment ils ont cassé SHA1, c’est maintenant légèrement plus facile de trouver une « collision » : une autre chaîne qui aboutit à la même empreinte SHA1. Maintenant, cela prend seulement 10 000 ans, à l’aide d’une machine mono-GPU.',
- 'secure_pw_hash_security' => 'Cette collision ne serait pas égale à votre mot de passe, et ne serait pas utile sur (un site comme) Firefly III. Cette application n\'utilise pas SHA1 pour la vérification du mot de passe. Il est donc sûr de cocher cette case. Votre mot de passe est haché et envoyé par HTTPS.',
- 'secure_pw_should' => 'Dois-je cocher la case ?',
- 'secure_pw_long_password' => 'Si vous venez de générer un long mot de passe unique pour Firefly III à l\'aide d\'un type de générateur de mot de passe : non.',
- 'secure_pw_short' => 'Si vous venez d\'entrer le mot de passe que vous utilisez toujours : oui.',
- 'command_line_token' => 'Command line token',
- 'explain_command_line_token' => 'You need this token to perform command line options, such as importing or exporting data. Without it, such sensitive commands will not work. Do not share your command line token. Nobody will ask you for this token, not even me. If you fear you lost this, or when you\'re paranoid, regenerate this token using the button.',
- 'regenerate_command_line_token' => 'Regenerate command line token',
- 'token_regenerated' => 'A new command line token was generated',
- 'change_your_email' => 'Changer votre adresse e-mail',
- 'email_verification' => 'Un e-mail sera envoyé à votre ancienne ET votre nouvelle adresse. Pour des raisons de sécurité, vous ne pourrez pas vous connecter jusqu\'à ce que vous ayez vérifié votre nouvelle adresse. Si vous n\'êtes pas certain que votre installation de Firefly III soit capable d\'envoyer un e-mail, n\'utilisez pas cette fonctionnalité. Si vous êtes un administrateur, vous pouvez tester l\'envoi des e-mails en allant dans le menu Administration.',
- 'email_changed_logout' => 'Vous ne pouvez pas vous connecter tant que vous n\'aurez pas vérifié votre adresse e-mail.',
- 'login_with_new_email' => 'Vous pouvez désormais vous connecter avec votre nouvelle adresse e-mail.',
- 'login_with_old_email' => 'Vous pouvez à nouveau vous connecter à l\'aide de votre ancienne adresse e-mail.',
+ 'change_your_password' => 'Modifier votre mot de passe',
+ 'delete_account' => 'Supprimer le compte',
+ 'current_password' => 'Mot de passe actuel',
+ 'new_password' => 'Nouveau mot de passe ',
+ 'new_password_again' => 'Nouveau mot de passe (confirmation)',
+ 'delete_your_account' => 'Supprimer votre compte',
+ 'delete_your_account_help' => 'La suppression de votre compte supprimera également les comptes, les opérations, tout ce que vous pourriez avoir enregistré dans Firefly III. Tout sera SUPPRIME.',
+ 'delete_your_account_password' => 'Entrez votre mot de passe pour continuer.',
+ 'password' => 'Mot de passe',
+ 'are_you_sure' => 'Etes-vous sûr ? Vous ne pourrez pas annuler cette action.',
+ 'delete_account_button' => 'SUPPRIMER votre compte',
+ 'invalid_current_password' => 'Mot de passe actuel non valide!',
+ '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' => '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 d\'entreprises comme LinkedIn, Adobe ou NeoPets (et bien d’autres).',
+ 'secure_pw_check_box' => 'En cochant la case, Firefly III enverra l\'empreinte SHA1 de votre mot de passe au site Web de Troy Hunt pour voir si c’est sur la liste. Cela vous empêchera d\'utiliser des mots de passe non sûr comme cela est recommandé dans les dernières Publication Special NIST à 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 : non.',
+ 'secure_pw_short' => 'Si vous venez d\'entrer le mot de passe que vous utilisez toujours : oui.',
+ 'command_line_token' => 'Jeton de ligne de commande',
+ 'explain_command_line_token' => 'Vous avez besoin de ce jeton pour exécuter des opérations optionnelles en ligne de commandes telles qu\'importer et exporter des données. Sans celui-ci, de telles commandes sensibles ne fonctionneront pas. Personne ne vous le demandera, pas même moi. Si vous craignez de le perdre, ou si vous êtes parano, régénérez ce jeton à l\'aide du bouton.',
+ 'regenerate_command_line_token' => 'Régénérer le jeton de ligne de commande',
+ 'token_regenerated' => 'Un nouveau jeton en ligne de commande a été généré',
+ 'change_your_email' => 'Changer votre adresse e-mail',
+ 'email_verification' => 'Un e-mail sera envoyé à votre ancienne ET votre nouvelle adresse. Pour des raisons de sécurité, vous ne pourrez pas vous connecter jusqu\'à ce que vous ayez vérifié votre nouvelle adresse. Si vous n\'êtes pas certain que votre installation de Firefly III soit capable d\'envoyer un e-mail, n\'utilisez pas cette fonctionnalité. Si vous êtes un administrateur, vous pouvez tester l\'envoi des e-mails en allant dans le menu Administration.',
+ 'email_changed_logout' => 'Vous ne pouvez pas vous connecter tant que vous n\'aurez pas vérifié votre adresse e-mail.',
+ 'login_with_new_email' => 'Vous pouvez désormais vous connecter avec votre nouvelle adresse e-mail.',
+ 'login_with_old_email' => 'Vous pouvez à nouveau vous connecter à l\'aide de votre ancienne adresse e-mail.',
// attachments
- 'nr_of_attachments' => 'Une pièce jointe|:count pièces jointes',
- 'attachments' => 'Pièces jointes',
- 'edit_attachment' => 'Modifier la pièce jointe ":name"',
- 'update_attachment' => 'Mettre à jour la pièce jointe',
- 'delete_attachment' => 'Supprimer la pièce jointe ":name"',
- 'attachment_deleted' => 'Pièce jointe ":name" supprimée',
- 'attachment_updated' => 'Pièce jointe ":name" mise à jour',
- 'upload_max_file_size' => 'Taille maximum du fichier : :size',
+ 'nr_of_attachments' => 'Une pièce jointe|:count pièces jointes',
+ 'attachments' => 'Pièces jointes',
+ 'edit_attachment' => 'Modifier la pièce jointe ":name"',
+ 'update_attachment' => 'Mettre à jour la pièce jointe',
+ 'delete_attachment' => 'Supprimer la pièce jointe ":name"',
+ 'attachment_deleted' => 'Pièce jointe ":name" supprimée',
+ 'attachment_updated' => 'Pièce jointe ":name" mise à jour',
+ 'upload_max_file_size' => 'Taille maximum du fichier : :size',
// transaction index
- 'title_expenses' => 'Dépenses',
- 'title_withdrawal' => 'Dépenses',
- 'title_revenue' => 'Recette / revenu',
- 'title_deposit' => 'Recette / revenu',
- 'title_transfer' => 'Transferts',
- 'title_transfers' => 'Transferts',
+ 'title_expenses' => 'Dépenses',
+ 'title_withdrawal' => 'Dépenses',
+ 'title_revenue' => 'Recette / revenu',
+ 'title_deposit' => 'Recette / revenu',
+ 'title_transfer' => 'Transferts',
+ 'title_transfers' => 'Transferts',
// convert stuff:
- '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',
- '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 sur lequel l\'argent sera versé.',
- 'convert_please_set_expense_destination' => 'Veuillez choisir le compte de dépenses sur lequel l\'argent sera versé.',
- 'convert_please_set_asset_source' => 'Veuillez choisir le compte d’actifs d\'où proviendra l’argent.',
- 'convert_explanation_withdrawal_deposit' => 'Si vous convertissez ce retrait en dépôt, :amount sera déposé dans :sourceName au lieu de le retirer.',
- 'convert_explanation_withdrawal_transfer' => 'Si vous convertissez ce retrait en transfert, :amount sera transféré de :sourceName vers un nouveau compte d\'actif, au lieu d\'être payé à :destinationName.',
- 'convert_explanation_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',
- 'invalid_convert_selection' => 'Le compte que vous avez sélectionné est déjà utilisé dans cette transaction ou n\'existe pas.',
+ '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',
+ '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 sur lequel l\'argent sera versé.',
+ 'convert_please_set_expense_destination' => 'Veuillez choisir le compte de dépenses sur lequel l\'argent sera versé.',
+ 'convert_please_set_asset_source' => 'Veuillez choisir le compte d’actifs d\'où proviendra l’argent.',
+ 'convert_explanation_withdrawal_deposit' => 'Si vous convertissez ce retrait en dépôt, :amount sera déposé dans :sourceName au lieu de le retirer.',
+ 'convert_explanation_withdrawal_transfer' => 'Si vous convertissez cette dépense 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',
+ 'invalid_convert_selection' => 'Le compte que vous avez sélectionné est déjà utilisé dans cette transaction ou n\'existe pas.',
// create new stuff:
- 'create_new_withdrawal' => 'Creer un nouveau retrait',
- 'create_new_deposit' => 'Créer un nouveau dépôt',
- 'create_new_transfer' => 'Creer un nouveau transfert',
- 'create_new_asset' => 'Créer un nouveau compte d’actif',
- 'create_new_expense' => 'Créer nouveau compte de dépenses',
- 'create_new_revenue' => 'Créer nouveau compte de recettes',
- 'create_new_piggy_bank' => 'Créer une nouvelle tirelire',
- 'create_new_bill' => 'Créer une nouvelle facture',
+ 'create_new_withdrawal' => 'Créer une nouvelle dépense',
+ 'create_new_deposit' => 'Créer un nouveau dépôt',
+ 'create_new_transfer' => 'Creer un nouveau transfert',
+ 'create_new_asset' => 'Créer un nouveau compte d’actif',
+ 'create_new_expense' => 'Créer nouveau compte de dépenses',
+ 'create_new_revenue' => 'Créer nouveau compte de recettes',
+ 'create_new_piggy_bank' => 'Créer une nouvelle tirelire',
+ 'create_new_bill' => 'Créer une nouvelle facture',
// currencies:
- 'create_currency' => 'Créer une nouvelle devise',
- 'store_currency' => 'Créer une nouvelle devise',
- 'update_currency' => 'Mise à jour de la balance',
- 'new_default_currency' => ':name est maintenant la devise par défaut.',
- 'cannot_delete_currency' => 'Impossible de supprimer :name car il est encore utilisé.',
- 'deleted_currency' => 'Devise ":name" supprimée',
- 'created_currency' => 'Devise ":name" créée',
- 'updated_currency' => 'Devise ":name" mise à jour',
- 'ask_site_owner' => 'Merci de demander à :owner pour ajouter, modifier ou supprimer des devises.',
- 'currencies_intro' => 'Firefly III prend en charge diverses devises que vous pouvez configurer et activer ici.',
- 'make_default_currency' => 'définir par défaut',
- 'default_currency' => 'par défaut',
+ 'create_currency' => 'Créer une nouvelle devise',
+ 'store_currency' => 'Créer une nouvelle devise',
+ 'update_currency' => 'Mise à jour de la balance',
+ 'new_default_currency' => ':name est maintenant la devise par défaut.',
+ 'cannot_delete_currency' => 'Impossible de supprimer :name car il est encore utilisé.',
+ 'deleted_currency' => 'Devise ":name" supprimée',
+ 'created_currency' => 'Devise ":name" créée',
+ 'updated_currency' => 'Devise ":name" mise à jour',
+ 'ask_site_owner' => 'Merci de demander à :owner pour ajouter, modifier ou supprimer des devises.',
+ 'currencies_intro' => 'Firefly III prend en charge diverses devises que vous pouvez configurer et activer ici.',
+ 'make_default_currency' => 'définir par défaut',
+ 'default_currency' => 'par défaut',
// forms:
- 'mandatoryFields' => 'Champs obligatoires',
- 'optionalFields' => 'Champs optionnels',
- 'options' => 'Options',
+ 'mandatoryFields' => 'Champs obligatoires',
+ 'optionalFields' => 'Champs optionnels',
+ 'options' => 'Options',
// budgets:
- 'create_new_budget' => 'Créer un nouveau budget',
- 'store_new_budget' => 'Créer un nouveau budget',
- 'stored_new_budget' => 'Nouveau budget ":name" créé',
- 'available_between' => 'Disponible entre le :start et le :end',
- 'transactionsWithoutBudget' => 'Dépenses non budgétisées',
- 'transactions_no_budget' => 'Dépenses non budgetisées entre le :start et le :end',
- 'spent_between' => 'Dépensé entre le :start et le :end',
- 'createBudget' => 'Nouveau budget',
- 'inactiveBudgets' => 'Budgets inactifs',
- 'without_budget_between' => 'Opérations non budgetisées entre le :start et le :end',
- 'delete_budget' => 'Supprimer le budget ":name"',
- 'deleted_budget' => 'Budget ":name" supprimé',
- 'edit_budget' => 'Modifier le budget ":name"',
- 'updated_budget' => 'Mettre à jour le budget ":name"',
- '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' => 'Navigateur d\'époque',
- 'info_on_available_amount' => 'Qu\'est-ce que j\'ai de disponible ?',
- 'available_amount_indication' => 'Utilisez ces montants pour avoir une indication de ce que pourrait être votre budget total.',
- 'suggested' => 'Suggéré',
- 'average_between' => 'Moyenne entre :start et :end',
+ 'create_new_budget' => 'Créer un nouveau budget',
+ 'store_new_budget' => 'Créer un nouveau budget',
+ 'stored_new_budget' => 'Nouveau budget ":name" créé',
+ 'available_between' => 'Disponible entre le :start et le :end',
+ 'transactionsWithoutBudget' => 'Dépenses non budgétisées',
+ 'transactions_no_budget' => 'Dépenses non budgetisées entre le :start et le :end',
+ 'spent_between' => 'Dépensé entre le :start et le :end',
+ 'createBudget' => 'Nouveau budget',
+ 'inactiveBudgets' => 'Budgets inactifs',
+ 'without_budget_between' => 'Opérations non budgetisées entre le :start et le :end',
+ 'delete_budget' => 'Supprimer le budget ":name"',
+ 'deleted_budget' => 'Budget ":name" supprimé',
+ 'edit_budget' => 'Modifier le budget ":name"',
+ 'updated_budget' => 'Mettre à jour le budget ":name"',
+ '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' => 'Navigateur d\'époque',
+ 'info_on_available_amount' => 'Qu\'est-ce que j\'ai de disponible ?',
+ 'available_amount_indication' => 'Utilisez ces montants pour avoir une indication de ce que pourrait être votre budget total.',
+ 'suggested' => 'Suggéré',
+ 'average_between' => 'Moyenne entre :start et :end',
+ 'over_budget_warn' => ' Normally you budget about :amount per day. This is :over_amount per day.',
// bills:
- 'matching_on' => 'Correspond à',
- 'between_amounts' => 'entre :low et :high.',
- 'repeats' => 'Répétitions',
- 'connected_journals' => 'Opérations liées',
- 'auto_match_on' => 'Automatiquement mis en correspondance par Firefly III',
- 'auto_match_off' => 'Pas mis automatiquement en correspondance par Firefly III',
- 'next_expected_match' => 'Prochain montant attendu',
- 'delete_bill' => 'Supprimer la facture ":name"',
- 'deleted_bill' => 'Facture ":name" supprimée',
- 'edit_bill' => 'Modifier la facture : ":name"',
- 'more' => 'Plus',
- 'rescan_old' => 'Réanalyser les anciennes opérations',
- 'update_bill' => 'Mettre à jour la facture',
- 'updated_bill' => 'Facture ":name" mise à jour',
- 'store_new_bill' => 'Créer une nouvelle facture',
- 'stored_new_bill' => 'Nouvelle facture ":name" créée',
- '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' => 'Montant moyen de la facture (global)',
- 'bill_is_active' => 'Facture en cours',
- 'bill_expected_between' => 'Attendu entre le :start et le :end',
- 'bill_will_automatch' => 'La facture sera automatiquement liée aux transactions correspondantes',
- 'skips_over' => 'saute',
-
+ 'matching_on' => 'Correspond à',
+ 'between_amounts' => 'entre :low et :high.',
+ 'repeats' => 'Répétitions',
+ 'connected_journals' => 'Opérations liées',
+ 'auto_match_on' => 'Automatiquement mis en correspondance par Firefly III',
+ 'auto_match_off' => 'Pas mis automatiquement en correspondance par Firefly III',
+ 'next_expected_match' => 'Prochain montant attendu',
+ 'delete_bill' => 'Supprimer la facture ":name"',
+ 'deleted_bill' => 'Facture ":name" supprimée',
+ 'edit_bill' => 'Modifier la facture : ":name"',
+ 'more' => 'Plus',
+ 'rescan_old' => 'Réanalyser les anciennes opérations',
+ 'update_bill' => 'Mettre à jour la facture',
+ 'updated_bill' => 'Facture ":name" mise à jour',
+ 'store_new_bill' => 'Créer une nouvelle facture',
+ 'stored_new_bill' => 'Nouvelle facture ":name" créée',
+ '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' => 'Montant moyen de la facture (global)',
+ 'bill_is_active' => 'Facture en cours',
+ 'bill_expected_between' => 'Attendu entre le :start et le :end',
+ 'bill_will_automatch' => 'La facture sera automatiquement liée aux transactions correspondantes',
+ 'skips_over' => 'saute',
// accounts:
- 'details_for_asset' => 'Détails pour le compte d’actif ":name"',
- 'details_for_expense' => 'Détails du compte de dépenses ":name"',
- 'details_for_revenue' => 'Détails du comptes de recettes ":name"',
- 'details_for_cash' => 'Détails pour le compte de trésorerie ":name"',
- 'store_new_asset_account' => 'Créer un nouveau compte d’actif',
- 'store_new_expense_account' => 'Créer un nouveau compte de dépenses',
- 'store_new_revenue_account' => 'Créer un compte de recettes',
- 'edit_asset_account' => 'Modifier le compte d’actif ":name"',
- 'edit_expense_account' => 'Modifier le compte de dépenses ";name"',
- 'edit_revenue_account' => 'Modifier le compte de recettes ":name"',
- 'delete_asset_account' => 'Supprimer le compte d’actif ":name"',
- 'delete_expense_account' => 'Supprimer le compte de dépenses ":name"',
- 'delete_revenue_account' => 'Supprimer le compte de recettes ":name"',
- 'asset_deleted' => 'Compte d’actif ":name" correctement supprimé',
- 'expense_deleted' => 'Compte de dépenses ":name" correctement supprimé',
- 'revenue_deleted' => 'Compte de recettes ":name" correctement supprimé',
- 'update_asset_account' => 'Mettre à jour le compte d’actif',
- 'update_expense_account' => 'Mettre à jour le compte de dépenses',
- 'update_revenue_account' => 'Mettre à jour le compte de recettes',
- 'make_new_asset_account' => 'Créer un nouveau compte d’actif',
- 'make_new_expense_account' => 'Créer un nouveau compte de dépenses',
- 'make_new_revenue_account' => 'Créer un nouveau compte de recettes',
- 'asset_accounts' => 'Comptes d’actif',
- 'expense_accounts' => 'Comptes de dépenses',
- 'revenue_accounts' => 'Comptes de recettes',
- 'cash_accounts' => 'Comptes de trésorerie',
- 'Cash account' => 'Compte de trésorerie',
- 'reconcile_account' => 'Rapprocher le compte ":account"',
- 'delete_reconciliation' => 'Supprimer le rapprochement',
- 'update_reconciliation' => 'Mettre à jour le rapprochement',
- 'amount_cannot_be_zero' => 'Le montant ne peut pas être zéro',
- 'end_of_reconcile_period' => 'Fin de la période de rapptrochement : :period',
- 'start_of_reconcile_period' => 'Début de la période de rapprochement : :period',
- 'start_balance' => 'Solde initial',
- 'end_balance' => 'Solde de clotûre',
- 'update_balance_dates_instruction' => 'Faites correspondre les montants et les dates ci-dessus à votre relevé bancaire et appuyez sur "Commencer le rapprochement"',
- 'select_transactions_instruction' => 'Sélectionnez les transactions qui apparaissent sur votre relevé bancaire.',
- 'select_range_and_balance' => 'Vérifiez d\'abord la plage des dates et les soldes. Puis appuyez sur "Commencer le rapprochement"',
- 'date_change_instruction' => 'Si vous modifiez la plage des dates maintenant, toute progression sera perdue.',
- 'update_selection' => 'Mettre à jour la sélection',
- 'store_reconcile' => 'Stocker le rapprochement',
- 'reconciliation_transaction' => 'Transaction de rapprochement',
- 'Reconciliation' => 'Rapprochement',
- 'reconciliation' => 'Rapprochement',
- 'reconcile_options' => 'Options de rapprochement',
- 'reconcile_range' => 'Plage de rapprochement',
- 'start_reconcile' => 'Commencer le rapprochement',
- 'cash' => 'espèces',
- 'account_type' => 'Type de compte',
- 'save_transactions_by_moving' => 'Enregistrer ces opération(s) en les déplaçant vers un autre compte :',
- 'stored_new_account' => 'Nouveau compte ":name" créé !',
- 'updated_account' => 'Nom du compte ":name"',
- 'credit_card_options' => 'Cartes de crédit',
- 'no_transactions_account' => 'Il n\'y a pas de transaction (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 devise, les nouvelles transactions de ce compte auront cette devise pré-sélectionnée.',
- 'reconcile_has_more' => 'Votre registre Firefly III a plus d\'argent que ce que votre banque prétend que vous devriez avoir. Il y a plusieurs options. S\'il vous plaît choisir quoi faire. Ensuite, appuyez sur "Confirmer le rapprochement".',
- 'reconcile_has_less' => 'Votre registre Firefly III a moins d\'argent que ce que votre banque prétend que vous devriez avoir. Il y a plusieurs options. S\'il vous plaît choisir quoi faire. Ensuite, appuyez sur "Confirmer le rapprochement".',
- 'reconcile_is_equal' => 'Votre registre Firefly III et vos relevés bancaires correspondent. Il n\'y a rien à faire. Appuyez sur "Confirmer le rapprochement" pour confirmer votre entrée.',
- 'create_pos_reconcile_transaction' => 'Effacez les transactions sélectionnées et créez une correction en ajoutant :amount à ce compte d\'actif.',
- 'create_neg_reconcile_transaction' => 'Effacez les transactions sélectionnées et créez une correction en enlevant :amount à ce compte d\'actif.',
- 'reconcile_do_nothing' => 'Effacez les transactions sélectionnées, mais ne les corrigez pas.',
- 'reconcile_go_back' => 'Vous pouvez toujours modifier ou supprimer une correction ultérieurement.',
- 'must_be_asset_account' => 'Vous pouvez uniquement rapprocher les comptes d\'actifs',
- 'reconciliation_stored' => 'Rapprochement stocké',
- 'reconcilliation_transaction_title' => 'Rapprochement (:from vers :to)',
- 'reconcile_this_account' => 'Rapprocher ce compte',
- 'confirm_reconciliation' => 'Confirmer le rapprochement',
- 'submitted_start_balance' => 'Solde initial soumis',
- 'selected_transactions' => 'Transactions sélectionnées ( :count)',
- 'already_cleared_transactions' => 'Transactions déjà effacées ( :count)',
- 'submitted_end_balance' => 'Solde final soumis',
- 'initial_balance_description' => 'Balance initiale pour ":account"',
+ 'details_for_asset' => 'Détails pour le compte d’actif ":name"',
+ 'details_for_expense' => 'Détails du compte de dépenses ":name"',
+ 'details_for_revenue' => 'Détails du comptes de recettes ":name"',
+ 'details_for_cash' => 'Détails pour le compte de trésorerie ":name"',
+ 'store_new_asset_account' => 'Créer un nouveau compte d’actif',
+ 'store_new_expense_account' => 'Créer un nouveau compte de dépenses',
+ 'store_new_revenue_account' => 'Créer un compte de recettes',
+ 'edit_asset_account' => 'Modifier le compte d’actif ":name"',
+ 'edit_expense_account' => 'Modifier le compte de dépenses ";name"',
+ 'edit_revenue_account' => 'Modifier le compte de recettes ":name"',
+ 'delete_asset_account' => 'Supprimer le compte d’actif ":name"',
+ 'delete_expense_account' => 'Supprimer le compte de dépenses ":name"',
+ 'delete_revenue_account' => 'Supprimer le compte de recettes ":name"',
+ 'asset_deleted' => 'Compte d’actif ":name" correctement supprimé',
+ 'expense_deleted' => 'Compte de dépenses ":name" correctement supprimé',
+ 'revenue_deleted' => 'Compte de recettes ":name" correctement supprimé',
+ 'update_asset_account' => 'Mettre à jour le compte d’actif',
+ 'update_expense_account' => 'Mettre à jour le compte de dépenses',
+ 'update_revenue_account' => 'Mettre à jour le compte de recettes',
+ 'make_new_asset_account' => 'Créer un nouveau compte d’actif',
+ 'make_new_expense_account' => 'Créer un nouveau compte de dépenses',
+ 'make_new_revenue_account' => 'Créer un nouveau compte de recettes',
+ 'asset_accounts' => 'Comptes d’actif',
+ 'expense_accounts' => 'Comptes de dépenses',
+ 'revenue_accounts' => 'Comptes de recettes',
+ 'cash_accounts' => 'Comptes de trésorerie',
+ 'Cash account' => 'Compte de trésorerie',
+ 'reconcile_account' => 'Rapprocher le compte ":account"',
+ 'delete_reconciliation' => 'Supprimer le rapprochement',
+ 'update_reconciliation' => 'Mettre à jour le rapprochement',
+ 'amount_cannot_be_zero' => 'Le montant ne peut pas être zéro',
+ 'end_of_reconcile_period' => 'Fin de la période de rapptrochement : :period',
+ 'start_of_reconcile_period' => 'Début de la période de rapprochement : :period',
+ 'start_balance' => 'Solde initial',
+ 'end_balance' => 'Solde de clotûre',
+ 'update_balance_dates_instruction' => 'Faites correspondre les montants et les dates ci-dessus à votre relevé bancaire et appuyez sur "Commencer le rapprochement"',
+ 'select_transactions_instruction' => 'Sélectionnez les transactions qui apparaissent sur votre relevé bancaire.',
+ 'select_range_and_balance' => 'Vérifiez d\'abord la plage des dates et les soldes. Puis appuyez sur "Commencer le rapprochement"',
+ 'date_change_instruction' => 'Si vous modifiez la plage des dates maintenant, toute progression sera perdue.',
+ 'update_selection' => 'Mettre à jour la sélection',
+ 'store_reconcile' => 'Stocker le rapprochement',
+ 'reconciliation_transaction' => 'Transaction de rapprochement',
+ 'Reconciliation' => 'Rapprochement',
+ 'reconciliation' => 'Rapprochement',
+ 'reconcile_options' => 'Options de rapprochement',
+ 'reconcile_range' => 'Plage de rapprochement',
+ 'start_reconcile' => 'Commencer le rapprochement',
+ 'cash' => 'espèces',
+ 'account_type' => 'Type de compte',
+ 'save_transactions_by_moving' => 'Enregistrer ces opération(s) en les déplaçant vers un autre compte :',
+ 'stored_new_account' => 'Nouveau compte ":name" créé !',
+ 'updated_account' => 'Nom du compte ":name"',
+ 'credit_card_options' => 'Cartes de crédit',
+ 'no_transactions_account' => 'Il n\'y a pas de transaction (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 devise, les nouvelles transactions de ce compte auront cette devise pré-sélectionnée.',
+ 'reconcile_has_more' => 'Votre registre Firefly III a plus d\'argent que ce que votre banque prétend que vous devriez avoir. Il y a plusieurs options. S\'il vous plaît choisir quoi faire. Ensuite, appuyez sur "Confirmer le rapprochement".',
+ 'reconcile_has_less' => 'Votre registre Firefly III a moins d\'argent que ce que votre banque prétend que vous devriez avoir. Il y a plusieurs options. S\'il vous plaît choisir quoi faire. Ensuite, appuyez sur "Confirmer le rapprochement".',
+ 'reconcile_is_equal' => 'Votre registre Firefly III et vos relevés bancaires correspondent. Il n\'y a rien à faire. Appuyez sur "Confirmer le rapprochement" pour confirmer votre entrée.',
+ 'create_pos_reconcile_transaction' => 'Effacez les transactions sélectionnées et créez une correction en ajoutant :amount à ce compte d\'actif.',
+ 'create_neg_reconcile_transaction' => 'Effacez les transactions sélectionnées et créez une correction en enlevant :amount à ce compte d\'actif.',
+ 'reconcile_do_nothing' => 'Effacez les transactions sélectionnées, mais ne les corrigez pas.',
+ 'reconcile_go_back' => 'Vous pouvez toujours modifier ou supprimer une correction ultérieurement.',
+ 'must_be_asset_account' => 'Vous pouvez uniquement rapprocher les comptes d\'actifs',
+ 'reconciliation_stored' => 'Rapprochement stocké',
+ 'reconcilliation_transaction_title' => 'Rapprochement (:from vers :to)',
+ 'reconcile_this_account' => 'Rapprocher ce compte',
+ 'confirm_reconciliation' => 'Confirmer le rapprochement',
+ 'submitted_start_balance' => 'Solde initial soumis',
+ 'selected_transactions' => 'Transactions sélectionnées ( :count)',
+ 'already_cleared_transactions' => 'Transactions déjà effacées ( :count)',
+ 'submitted_end_balance' => 'Solde final soumis',
+ 'initial_balance_description' => 'Balance initiale pour ":account"',
// categories:
- 'new_category' => 'Nouvelle catégorie',
- 'create_new_category' => 'Créer une nouvelle catégorie',
- 'without_category' => 'Sans catégorie',
- 'update_category' => 'Modifier la catégorie',
- 'updated_category' => 'Catégorie ":name" mise à jour',
- 'categories' => 'Catégories',
- 'edit_category' => 'Modifier la catégorie ":name"',
- 'no_category' => '(aucune catégorie)',
- 'category' => 'Catégorie',
- 'delete_category' => 'Supprimer la catégorie ":name"',
- 'deleted_category' => 'Catégorie ":name" supprimée',
- 'store_category' => 'Créer une nouvelle catgorie',
- 'stored_category' => 'Nouvelle catégorie stockée ":name"',
- 'without_category_between' => 'Sans catégorie entre :start et :end',
+ 'new_category' => 'Nouvelle catégorie',
+ 'create_new_category' => 'Créer une nouvelle catégorie',
+ 'without_category' => 'Sans catégorie',
+ 'update_category' => 'Modifier la catégorie',
+ 'updated_category' => 'Catégorie ":name" mise à jour',
+ 'categories' => 'Catégories',
+ 'edit_category' => 'Modifier la catégorie ":name"',
+ 'no_category' => '(aucune catégorie)',
+ 'category' => 'Catégorie',
+ 'delete_category' => 'Supprimer la catégorie ":name"',
+ 'deleted_category' => 'Catégorie ":name" supprimée',
+ 'store_category' => 'Créer une nouvelle catgorie',
+ 'stored_category' => 'Nouvelle catégorie stockée ":name"',
+ 'without_category_between' => 'Sans catégorie entre :start et :end',
// transactions:
- 'update_withdrawal' => 'Mettre à jour un retrait',
- 'update_deposit' => 'Mettre à jour un dépôt',
- 'update_transfer' => 'Mettre à jour un transfert',
- 'updated_withdrawal' => 'Retrait ":description" mis à jour',
- 'updated_deposit' => 'Dépôt ":description" mis à jour',
- 'updated_transfer' => 'Transfert ":description" mis à jour',
- 'delete_withdrawal' => 'Supprimer le retrait ":description"',
- 'delete_deposit' => 'Supprimer le dépôt ":description"',
- 'delete_transfer' => 'Supprimer le transfert ":description"',
- 'deleted_withdrawal' => 'Retrait ":name" correctement supprimé',
- 'deleted_deposit' => 'Dépot ":name" correctement supprimé',
- 'deleted_transfer' => 'Opération ":name" correctement supprimée',
- 'stored_journal' => 'Opération ":description" créée avec succès',
- 'select_transactions' => 'Sélectionner des opérations',
- 'rule_group_select_transactions' => 'Appliquer le groupe de règles ":title" sur les transactions',
- 'rule_select_transactions' => 'Appliquer la règle ":title" sur les transactions',
- 'stop_selection' => 'Arrêter de sélectionner les transactions',
- 'reconcile_selected' => 'Rapproché',
- 'mass_delete_journals' => 'Supprimer un certain nombre de transactions',
- 'mass_edit_journals' => 'Modifier un certain nombre d’opérations',
- 'mass_bulk_journals' => 'Modifier un certain nombre d’opérations en masse',
- 'mass_bulk_journals_explain' => 'Si vous ne souhaitez pas modifier vos transactions une à une en utilisant la fonction d\'édition en masse, vous pouvez les mettre à jour en une seule fois. Sélectionnez simplement la catégorie, le·s tag·s ou le budget préféré dans les champs ci-dessous, et toutes les transactions dans le tableau seront mises à jour.',
- 'bulk_set_new_values' => 'Utilisez les entrées ci-dessous pour définir de nouvelles valeurs. Si vous les laissez vides, ils seront vides pour tous. Notez également que seuls les retraits recevront un budget.',
- 'no_bulk_category' => 'Ne pas mettre à jour la catégorie',
- 'no_bulk_budget' => 'Ne pas mettre à jour le budget',
- 'no_bulk_tags' => 'Ne pas mettre à jour le·s tag·s',
- 'bulk_edit' => 'Modification en masse',
- 'cannot_edit_other_fields' => 'Vous ne pouvez pas modifier en masse d\'autres champs que ceux-ci, 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.',
- 'no_budget' => '(pas de budget)',
- 'no_budget_squared' => '(pas de budget)',
- 'perm-delete-many' => 'Supprimer de nombreux éléments en une seule fois peut engendrer des erreurs. 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' => 'Comptes d\'actifs par défaut',
- 'opt_group_savingAsset' => 'Comptes d\'épargne',
- 'opt_group_sharedAsset' => 'Comptes d\'actifs partagés',
- 'opt_group_ccAsset' => 'Cartes de crédit',
- 'notes' => 'Notes',
+ 'update_withdrawal' => 'Mettre à jour un retrait',
+ 'update_deposit' => 'Mettre à jour un dépôt',
+ 'update_transfer' => 'Mettre à jour un transfert',
+ 'updated_withdrawal' => 'Retrait ":description" mis à jour',
+ 'updated_deposit' => 'Dépôt ":description" mis à jour',
+ 'updated_transfer' => 'Transfert ":description" mis à jour',
+ 'delete_withdrawal' => 'Supprimer le retrait ":description"',
+ 'delete_deposit' => 'Supprimer le dépôt ":description"',
+ 'delete_transfer' => 'Supprimer le transfert ":description"',
+ 'deleted_withdrawal' => 'Retrait ":name" correctement supprimé',
+ 'deleted_deposit' => 'Dépot ":name" correctement supprimé',
+ 'deleted_transfer' => 'Opération ":name" correctement supprimée',
+ 'stored_journal' => 'Opération ":description" créée avec succès',
+ 'select_transactions' => 'Sélectionner des opérations',
+ 'rule_group_select_transactions' => 'Appliquer le groupe de règles ":title" sur les transactions',
+ 'rule_select_transactions' => 'Appliquer la règle ":title" sur les transactions',
+ 'stop_selection' => 'Arrêter de sélectionner les transactions',
+ 'reconcile_selected' => 'Rapproché',
+ 'mass_delete_journals' => 'Supprimer un certain nombre de transactions',
+ 'mass_edit_journals' => 'Modifier un certain nombre d’opérations',
+ 'mass_bulk_journals' => 'Modifier un certain nombre d’opérations en masse',
+ 'mass_bulk_journals_explain' => 'Si vous ne souhaitez pas modifier vos transactions une à une en utilisant la fonction d\'édition en masse, vous pouvez les mettre à jour en une seule fois. Sélectionnez simplement la catégorie, le·s tag·s ou le budget préféré dans les champs ci-dessous, et toutes les transactions dans le tableau seront mises à jour.',
+ 'bulk_set_new_values' => 'Utilisez les entrées ci-dessous pour définir de nouvelles valeurs. Si vous les laissez vides, ils seront vides pour tous. Notez également que seuls les retraits recevront un budget.',
+ 'no_bulk_category' => 'Ne pas mettre à jour la catégorie',
+ 'no_bulk_budget' => 'Ne pas mettre à jour le budget',
+ 'no_bulk_tags' => 'Ne pas mettre à jour le·s tag·s',
+ 'bulk_edit' => 'Modification en masse',
+ 'cannot_edit_other_fields' => 'Vous ne pouvez pas modifier en masse d\'autres champs que ceux-ci, 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.',
+ 'no_budget' => '(pas de budget)',
+ 'no_budget_squared' => '(pas de budget)',
+ 'perm-delete-many' => 'Supprimer de nombreux éléments en une seule fois peut engendrer des erreurs. 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' => 'Comptes d\'actifs par défaut',
+ 'opt_group_savingAsset' => 'Comptes d\'épargne',
+ 'opt_group_sharedAsset' => 'Comptes d\'actifs partagés',
+ 'opt_group_ccAsset' => 'Cartes de crédit',
+ 'notes' => 'Notes',
// new user:
- 'welcome' => 'Bienvenue sur Firefly III!',
- 'submit' => 'Soumettre',
- 'getting_started' => 'Mise en route',
- 'to_get_started' => 'Vous venez d\'installer 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 si vous avez plusieurs comptes. Vous pourrez les ajouter plus tard. Firefly III a simplement 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 le 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éés.',
+ 'welcome' => 'Bienvenue sur Firefly III!',
+ 'submit' => 'Soumettre',
+ 'getting_started' => 'Mise en route',
+ 'to_get_started' => 'Vous venez d\'installer 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 si vous avez plusieurs comptes. Vous pourrez les ajouter plus tard. Firefly III a simplement 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 le 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éés.',
// home page:
- 'yourAccounts' => 'Vos comptes',
- 'budgetsAndSpending' => 'Budgets et dépenses',
- 'savings' => 'Épargne',
- 'newWithdrawal' => 'Nouvelle dépense',
- 'newDeposit' => 'Nouveau dépôt',
- 'newTransfer' => 'Nouveau transfert',
- 'bills_to_pay' => 'Facture à payer',
- 'per_day' => 'Par jour',
- 'left_to_spend_per_day' => 'Reste à dépenser par jour',
- 'bills_paid' => 'Factures payées',
+ 'yourAccounts' => 'Vos comptes',
+ 'budgetsAndSpending' => 'Budgets et dépenses',
+ 'savings' => 'Épargne',
+ 'newWithdrawal' => 'Nouvelle dépense',
+ 'newDeposit' => 'Nouveau dépôt',
+ 'newTransfer' => 'Nouveau transfert',
+ 'bills_to_pay' => 'Facture à payer',
+ 'per_day' => 'Par jour',
+ 'left_to_spend_per_day' => 'Reste à dépenser par jour',
+ 'bills_paid' => 'Factures payées',
// menu and titles, should be recycled as often as possible:
- 'currency' => 'Devise',
- 'preferences' => 'Préférences',
- 'logout' => 'Se déconnecter',
- 'toggleNavigation' => 'Activer navigation',
- 'searchPlaceholder' => 'Rechercher...',
- 'version' => 'Version',
- 'dashboard' => 'Tableau de Bord',
- 'currencies' => 'Devises',
- 'accounts' => 'Comptes',
- 'Asset account' => 'Compte d’actif',
- 'Default account' => 'Compte d’actif',
- 'Expense account' => 'Compte de dépenses',
- 'Revenue account' => 'Compte de recettes',
- 'Initial balance account' => 'Balance initiale',
- 'budgets' => 'Budgets',
- 'tags' => 'Tags',
- 'reports' => 'Rapports',
- 'transactions' => 'Opérations',
- 'expenses' => 'Dépenses',
- 'income' => 'Recette / revenu',
- 'transfers' => 'Transferts',
- 'moneyManagement' => 'Gérer les comptes',
- 'piggyBanks' => 'Tirelires',
- 'bills' => 'Factures',
- 'withdrawal' => 'Retrait',
- 'opening_balance' => 'Solde d\'ouverture',
- 'deposit' => 'Dépôt',
- 'account' => 'Compte',
- 'transfer' => 'Transfert',
- 'Withdrawal' => 'Retrait',
- 'Deposit' => 'Dépôt',
- 'Transfer' => 'Transfert',
- 'bill' => 'Facture',
- 'yes' => 'Oui',
- 'no' => 'Non',
- 'amount' => 'Montant',
- 'overview' => 'Vue globale',
- 'saveOnAccount' => 'Mis de côté sur le compte',
- 'unknown' => 'Inconnu',
- 'daily' => 'Journalier',
- 'monthly' => 'Mensuel',
- 'profile' => 'Profil',
- 'errors' => 'Erreurs',
+ 'currency' => 'Devise',
+ 'preferences' => 'Préférences',
+ 'logout' => 'Se déconnecter',
+ 'toggleNavigation' => 'Activer navigation',
+ 'searchPlaceholder' => 'Rechercher...',
+ 'version' => 'Version',
+ 'dashboard' => 'Tableau de Bord',
+ 'currencies' => 'Devises',
+ 'accounts' => 'Comptes',
+ 'Asset account' => 'Compte d’actif',
+ 'Default account' => 'Compte d’actif',
+ 'Expense account' => 'Compte de dépenses',
+ 'Revenue account' => 'Compte de recettes',
+ 'Initial balance account' => 'Balance initiale',
+ 'budgets' => 'Budgets',
+ 'tags' => 'Tags',
+ 'reports' => 'Rapports',
+ 'transactions' => 'Opérations',
+ 'expenses' => 'Dépenses',
+ 'income' => 'Recette / revenu',
+ 'transfers' => 'Transferts',
+ 'moneyManagement' => 'Gérer les comptes',
+ 'piggyBanks' => 'Tirelires',
+ 'bills' => 'Factures',
+ 'withdrawal' => 'Retrait',
+ 'opening_balance' => 'Solde d\'ouverture',
+ 'deposit' => 'Dépôt',
+ 'account' => 'Compte',
+ 'transfer' => 'Transfert',
+ 'Withdrawal' => 'Retrait',
+ 'Deposit' => 'Dépôt',
+ 'Transfer' => 'Transfert',
+ 'bill' => 'Facture',
+ 'yes' => 'Oui',
+ 'no' => 'Non',
+ 'amount' => 'Montant',
+ 'overview' => 'Vue globale',
+ 'saveOnAccount' => 'Mis de côté sur le compte',
+ 'unknown' => 'Inconnu',
+ 'daily' => 'Journalier',
+ 'monthly' => 'Mensuel',
+ 'profile' => 'Profil',
+ 'errors' => 'Erreurs',
// reports:
- 'report_default' => 'Rapport financier par défaut entre le :start et le :end',
- 'report_audit' => 'Aperçu de l\'historique des transactions entre le :start et le :end',
- 'report_category' => 'Rapport de catégorie entre :start et :end',
- 'report_account' => 'Rapport de compte de dépenses / recettes entre le :start et le :end',
- 'report_budget' => 'Rapport du budget entre le :start et le :end',
- 'report_tag' => 'Marquer le rapport entre le :start et le :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' => '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',
- 'balanceStart' => 'Solde au début de la période',
- 'balanceEnd' => 'Solde à la fin de la période',
- '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' => 'Pas encore chargé',
- 'inactive' => 'Désactivé',
- 'active' => 'Actif',
- 'difference' => 'Différence',
- 'money_flowing_in' => 'Rentrée',
- 'money_flowing_out' => 'Sortie',
- 'topX' => ':number premiers',
- 'show_full_list' => 'Afficher la liste complète',
- 'show_only_top' => 'Afficher uniquement :number premiers',
- 'report_type' => 'Type de rapport',
- 'report_type_default' => 'Rapport financier par défaut',
- 'report_type_audit' => 'Historique des transactions',
- 'report_type_category' => 'Rapport par catégories',
- 'report_type_budget' => 'Rapport du budget',
- 'report_type_tag' => 'Rapport de tag',
- 'report_type_account' => 'Rapport de compte de dépenses/recettes',
- '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' => 'Revenus du compte ":name" entre le :start et le :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' => 'Aucune activité n\'a été enregistrée sur le compte :account_name entre le :start et le :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' => 'Revenus par catégorie',
- 'expense_per_category' => 'Dépenses par catégorie',
- 'expense_per_budget' => 'Dépenses par budget',
- 'income_per_account' => 'Revenus par compte',
- 'expense_per_account' => 'Dépenses par compte',
- 'expense_per_tag' => 'Dépenses par tag',
- 'income_per_tag' => 'Revenus 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épenses (moyenne)',
- 'income_average' => 'Revenus (moyenne)',
- 'transaction_count' => 'Nombre de transactions',
- 'average_spending_per_account' => 'Dépenses moyennes par compte',
- 'average_income_per_account' => 'Revenus moyens par compte',
- 'total' => 'Total',
- 'description' => 'Description',
- '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.',
- 'in_out_accounts' => 'Gagné et dépensé par compte',
- 'in_out_per_category' => 'Gagné et dépensé par catégorie',
- 'out_per_budget' => 'Dépensé par budget',
- 'select_expense_revenue' => 'Sélectionner le compte de dépenses / recettes',
+ 'report_default' => 'Rapport financier par défaut entre le :start et le :end',
+ 'report_audit' => 'Aperçu de l\'historique des transactions entre le :start et le :end',
+ 'report_category' => 'Rapport de catégorie entre :start et :end',
+ 'report_account' => 'Rapport de compte de dépenses / recettes entre le :start et le :end',
+ 'report_budget' => 'Rapport du budget entre le :start et le :end',
+ 'report_tag' => 'Marquer le rapport entre le :start et le :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' => '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',
+ 'balanceStart' => 'Solde au début de la période',
+ 'balanceEnd' => 'Solde à la fin de la période',
+ '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' => 'Pas encore chargé',
+ 'inactive' => 'Désactivé',
+ 'active' => 'Actif',
+ 'difference' => 'Différence',
+ 'money_flowing_in' => 'Rentrée',
+ 'money_flowing_out' => 'Sortie',
+ 'topX' => ':number premiers',
+ 'show_full_list' => 'Afficher la liste complète',
+ 'show_only_top' => 'Afficher uniquement :number premiers',
+ 'report_type' => 'Type de rapport',
+ 'report_type_default' => 'Rapport financier par défaut',
+ 'report_type_audit' => 'Historique des transactions',
+ 'report_type_category' => 'Rapport par catégories',
+ 'report_type_budget' => 'Rapport du budget',
+ 'report_type_tag' => 'Rapport de tag',
+ 'report_type_account' => 'Rapport de compte de dépenses/recettes',
+ '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' => 'Revenus du compte ":name" entre le :start et le :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' => 'Aucune activité n\'a été enregistrée sur le compte :account_name entre le :start et le :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' => 'Revenus par catégorie',
+ 'expense_per_category' => 'Dépenses par catégorie',
+ 'expense_per_budget' => 'Dépenses par budget',
+ 'income_per_account' => 'Revenus par compte',
+ 'expense_per_account' => 'Dépenses par compte',
+ 'expense_per_tag' => 'Dépenses par tag',
+ 'income_per_tag' => 'Revenus 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épenses (moyenne)',
+ 'income_average' => 'Revenus (moyenne)',
+ 'transaction_count' => 'Nombre de transactions',
+ 'average_spending_per_account' => 'Dépenses moyennes par compte',
+ 'average_income_per_account' => 'Revenus moyens par compte',
+ 'total' => 'Total',
+ 'description' => 'Description',
+ '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.',
+ 'in_out_accounts' => 'Gagné et dépensé par compte',
+ 'in_out_per_category' => 'Gagné et dépensé par catégorie',
+ 'out_per_budget' => 'Dépensé par budget',
+ 'select_expense_revenue' => 'Sélectionner le compte de dépenses / recettes',
// charts:
- 'chart' => 'Diagramme',
- 'month' => 'Mois',
- 'budget' => 'Budget',
- 'spent' => 'Dépensé',
- 'spent_in_budget' => 'Dépensé dans le budget',
- 'left_to_spend' => 'Restant à dépenser',
- 'earned' => 'Gagné',
- 'overspent' => 'Trop dépensé',
- 'left' => 'Reste',
- 'max-amount' => 'Montant maximum',
- 'min-amount' => 'Montant minimum',
- 'journal-amount' => 'Entrée de facture courante',
- 'name' => 'Nom',
- 'date' => 'Date',
- 'paid' => 'Payé',
- 'unpaid' => 'Impayé',
- 'day' => 'Jour',
- 'budgeted' => 'Budgétisé',
- 'period' => 'Période',
- 'balance' => 'Solde',
- 'sum' => 'Somme',
- 'average' => 'Moyenne',
- 'balanceFor' => 'Balance pour :name',
+ 'chart' => 'Diagramme',
+ 'month' => 'Mois',
+ 'budget' => 'Budget',
+ 'spent' => 'Dépensé',
+ 'spent_in_budget' => 'Dépensé dans le budget',
+ 'left_to_spend' => 'Restant à dépenser',
+ 'earned' => 'Gagné',
+ 'overspent' => 'Trop dépensé',
+ 'left' => 'Reste',
+ 'max-amount' => 'Montant maximum',
+ 'min-amount' => 'Montant minimum',
+ 'journal-amount' => 'Entrée de facture courante',
+ 'name' => 'Nom',
+ 'date' => 'Date',
+ 'paid' => 'Payé',
+ 'unpaid' => 'Impayé',
+ 'day' => 'Jour',
+ 'budgeted' => 'Budgétisé',
+ 'period' => 'Période',
+ 'balance' => 'Solde',
+ 'sum' => 'Somme',
+ 'average' => 'Moyenne',
+ 'balanceFor' => 'Balance pour :name',
// piggy banks:
- 'add_money_to_piggy' => 'Ajouter de l’argent à la tirelire ":name"',
- 'piggy_bank' => 'Tirelire',
- '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' => 'Reste pour les tirelires',
- 'sum_of_piggy_banks' => 'Somme des tirelires',
- 'saved_so_far' => 'Mis de côté jusqu\'à présent',
- 'left_to_save' => 'Reste à mettre de côté',
- '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' => 'Vous n\'avez pas d\'argent à placer dans cette tirelire.',
+ 'add_money_to_piggy' => 'Ajouter de l’argent à la tirelire ":name"',
+ 'piggy_bank' => 'Tirelire',
+ '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' => 'Reste pour les tirelires',
+ 'sum_of_piggy_banks' => 'Somme des tirelires',
+ 'saved_so_far' => 'Mis de côté jusqu\'à présent',
+ 'left_to_save' => 'Reste à mettre de côté',
+ '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' => 'Vous n\'avez pas d\'argent à placer dans cette tirelire.',
'remove' => 'Enlever',
'max_amount_add' => 'Le montant maximum que vous pouvez ajouter est',
@@ -1084,6 +1086,7 @@ return [
'invalid_link_selection' => 'Impossible de lier ces transactions',
'journals_linked' => 'Ces transactions sont liées.',
'journals_error_linked' => 'Ces transactions sont déjà liées.',
+ 'journals_link_to_self' => 'You cannot link a transaction to itself',
'journal_links' => 'Liens de transaction',
'this_withdrawal' => 'Ce retrait',
'this_deposit' => 'Ce dépôt',
@@ -1132,7 +1135,7 @@ return [
// import index page:
'import_index_title' => 'Importer des données dans Firefly III',
'import_index_sub_title' => 'Index',
- 'import_general_index_intro' => 'Welcome to Firefly III\'s import routine. There are a few ways of importing data into Firefly III, displayed here as buttons.',
+ 'import_general_index_intro' => 'Bienvenue dans la routine d\'importation de Firefly III. Il existe différentes façons d\'importer des données dans Firefly III, affichées ici sous forme de boutons.',
// sandstorm.io errors and messages:
'sandstorm_not_available' => 'Cette fonction n\'est pas disponible lorsque vous utilisez Firefly III dans un environnement Sandstorm.io.',
diff --git a/resources/lang/fr_FR/form.php b/resources/lang/fr_FR/form.php
index 5aacce4723..6d0e50ff53 100644
--- a/resources/lang/fr_FR/form.php
+++ b/resources/lang/fr_FR/form.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// new user:
@@ -78,7 +78,7 @@ return [
'new_email_address' => 'Nouvelle adresse email',
'verification' => 'Vérification',
'api_key' => 'Clé API',
- 'remember_me' => 'Remember me',
+ 'remember_me' => 'Se souvenir de moi',
'source_account_asset' => 'Compte source (compte d\'actif)',
'destination_account_expense' => 'Compte de destination (compte de dépenses)',
@@ -158,7 +158,7 @@ return [
'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' => 'Deleting stuff from Firefly III is permanent and cannot be undone.',
+ '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',
@@ -170,7 +170,7 @@ return [
'budget_keep_transactions' => 'La seule opération liée à ce budget ne sera pas supprimée.|Les :count opérations liées à ce budget ne seront pas supprimées.',
'category_keep_transactions' => 'La seule opération liée à cette catégorie ne sera pas supprimée.|Les :count opérations liées à cette catégorie ne seront pas supprimées.',
'tag_keep_transactions' => 'La seule opération liée à ce tag ne sera pas supprimée.|Les :count opérations liées à ce tag ne seront pas supprimées.',
- 'check_for_updates' => 'Check for updates',
+ 'check_for_updates' => 'Vérifier les mises à jour',
'email' => 'Adresse Email',
'password' => 'Mot de passe',
@@ -194,8 +194,8 @@ return [
'csv_import_account' => 'Compte d’importation par défaut',
'csv_config' => 'Configuration d\'importation CSV',
'client_id' => 'Identifiant',
- 'service_secret' => 'Service secret',
- 'app_secret' => 'App secret',
+ 'service_secret' => 'Secret de service',
+ 'app_secret' => 'Secret d\'application',
'public_key' => 'Clé publique',
'country_code' => 'Code pays',
'provider_code' => 'Banque ou fournisseur de données',
diff --git a/resources/lang/fr_FR/import.php b/resources/lang/fr_FR/import.php
index d8b5eaaaf1..1216706002 100644
--- a/resources/lang/fr_FR/import.php
+++ b/resources/lang/fr_FR/import.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
// status of import:
@@ -97,6 +98,7 @@ return [
// not csv, but normal warning
'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.',
'foreign_amount_warning' => 'If you mark a column as containing an amount in a foreign currency, you must also set the column that contains which currency it is.',
+
// file, map data
'file_map_title' => 'Import setup (4/4) - Connect import data to Firefly III data',
'file_map_text' => 'In the following tables, the left value shows you information found in your uploaded file. It is your task to map this value, if possible, to a value already present in your database. Firefly will stick to this mapping. If there is no value to map to, or you do not wish to map the specific value, select nothing.',
@@ -131,28 +133,40 @@ return [
'column_date-book' => 'Transaction booking date',
'column_date-process' => 'Transaction process date',
'column_date-transaction' => 'Date',
+ 'column_date-due' => 'Transaction due date',
+ 'column_date-payment' => 'Transaction payment date',
+ 'column_date-invoice' => 'Transaction invoice date',
'column_description' => 'Description',
'column_opposing-iban' => 'Opposing account (IBAN)',
+ 'column_opposing-bic' => 'Opposing account (BIC)',
'column_opposing-id' => 'Opposing account ID (matching FF3)',
'column_external-id' => 'ID externe',
'column_opposing-name' => 'Opposing account (name)',
'column_rabo-debit-credit' => 'Rabobank specific debit/credit indicator',
'column_ing-debit-credit' => 'ING specific debit/credit indicator',
- 'column_sepa-ct-id' => 'SEPA Credit Transfer end-to-end ID',
- 'column_sepa-ct-op' => 'SEPA Credit Transfer opposing account',
- 'column_sepa-db' => 'SEPA Direct Debit',
+ 'column_sepa-ct-id' => 'SEPA end-to-end Identifier',
+ 'column_sepa-ct-op' => 'SEPA Opposing Account Identifier',
+ 'column_sepa-db' => 'SEPA Mandate Identifier',
+ 'column_sepa-cc' => 'SEPA Clearing Code',
+ 'column_sepa-ci' => 'SEPA Creditor Identifier',
+ 'column_sepa-ep' => 'SEPA External Purpose',
+ 'column_sepa-country' => 'SEPA Country Code',
'column_tags-comma' => 'Tags (comma separated)',
'column_tags-space' => 'Tags (space separated)',
'column_account-number' => 'Asset account (account number)',
'column_opposing-number' => 'Opposing account (account number)',
'column_note' => 'Note(s)',
+ 'column_internal-reference' => 'Internal reference',
// prerequisites
'prerequisites' => 'Prerequisites',
// bunq
'bunq_prerequisites_title' => 'Prerequisites for an import from bunq',
- 'bunq_prerequisites_text' => 'In order to import from bunq, you need to obtain an API key. You can do this through the app.',
+ 'bunq_prerequisites_text' => 'In order to import from bunq, you need to obtain an API key. You can do this through the app. Please note that the import function for bunq is in BETA. It has only been tested against the sandbox API.',
+ 'bunq_do_import' => 'Yes, import from this account',
+ 'bunq_accounts_title' => 'Bunq accounts',
+ 'bunq_accounts_text' => 'These are the accounts associated with your bunq account. Please select the accounts from which you want to import, and in which account the transactions must be imported.',
// Spectre
'spectre_title' => 'Import using Spectre',
@@ -187,4 +201,3 @@ return [
// various other strings:
'imported_from_account' => 'Imported from ":account"',
];
-
diff --git a/resources/lang/fr_FR/intro.php b/resources/lang/fr_FR/intro.php
index 243855109e..1499a1a9f2 100644
--- a/resources/lang/fr_FR/intro.php
+++ b/resources/lang/fr_FR/intro.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// index
@@ -31,13 +31,13 @@ return [
// create account:
'accounts_create_iban' => 'Donnez à vos comptes un IBAN valide. Cela pourrait rendre une importation de données très facile à l\'avenir.',
- 'accounts_create_asset_opening_balance' => 'Assets accounts may have an "opening balance", indicating the start of this account\'s history in Firefly III.',
+ 'accounts_create_asset_opening_balance' => 'Les comptes d\'actifs peuvent avoir un «solde d\'ouverture», indiquant le début de l\'historique de ce compte dans Firefly III.',
'accounts_create_asset_currency' => 'Firefly III prend en charge plusieurs devises. Les comptes d\'actifs ont une devise principale, que vous devez définir ici.',
'accounts_create_asset_virtual' => 'Il peut parfois être utile de donner à votre compte un solde virtuel : un montant supplémentaire toujours ajouté ou soustrait du solde réel.',
// budgets index
'budgets_index_intro' => 'Les budgets sont utilisés pour gérer vos finances et forment l\'une des principales fonctions de Firefly III.',
- 'budgets_index_set_budget' => 'Set your total budget for every period so Firefly III can tell you if you have budgeted all available money.',
+ 'budgets_index_set_budget' => 'Définissez votre budget total pour chaque période afin que Firefly III puisse vous dire si vous avez budgétisé tout l\'argent disponible.',
'budgets_index_see_expenses_bar' => 'Dépenser de l\'argent va lentement remplir cette barre.',
'budgets_index_navigate_periods' => 'Parcourez des périodes pour régler facilement les budgets à l\'avance.',
'budgets_index_new_budget' => 'Créez de nouveaux budgets comme bon vous semble.',
diff --git a/resources/lang/fr_FR/list.php b/resources/lang/fr_FR/list.php
index 67222b2721..25d3a1eed6 100644
--- a/resources/lang/fr_FR/list.php
+++ b/resources/lang/fr_FR/list.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
'buttons' => 'Boutons',
@@ -100,6 +101,14 @@ return [
'sum_deposits' => 'Somme des dépôts',
'sum_transfers' => 'Somme des transferts',
'reconcile' => 'Rapprocher',
- 'account_on_spectre' => 'Account (Spectre)',
- 'do_import' => 'Import from this account',
+ 'account_on_spectre' => 'Compte (Spectre)',
+ 'do_import' => 'Importer depuis ce compte',
+ 'sepa-ct-id' => 'Identificateur de bout en bout SEPA',
+ 'sepa-ct-op' => 'Identifiant de compte SEPA opposable',
+ 'sepa-db' => 'Identifiant de mandat SEPA',
+ 'sepa-country' => 'Pays SEPA',
+ 'sepa-cc' => 'Code de compensation SEPA',
+ 'sepa-ep' => 'Objectif externe SEPA',
+ 'sepa-ci' => 'Identifiant SEPA Creditor',
+ 'account_at_bunq' => 'Account with bunq',
];
diff --git a/resources/lang/fr_FR/pagination.php b/resources/lang/fr_FR/pagination.php
index 252bd87674..7e8a6cd31a 100644
--- a/resources/lang/fr_FR/pagination.php
+++ b/resources/lang/fr_FR/pagination.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'previous' => '« Précédent',
diff --git a/resources/lang/fr_FR/passwords.php b/resources/lang/fr_FR/passwords.php
index 6c3698071d..633fedbc4d 100644
--- a/resources/lang/fr_FR/passwords.php
+++ b/resources/lang/fr_FR/passwords.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'password' => 'Les mots de passe doivent contenir au moins six caractères et correspondre à la confirmation.',
diff --git a/resources/lang/fr_FR/validation.php b/resources/lang/fr_FR/validation.php
index d025e5bb46..28b3b5e95d 100644
--- a/resources/lang/fr_FR/validation.php
+++ b/resources/lang/fr_FR/validation.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'iban' => 'Il ne s\'agit pas d\'un IBAN valide.',
+ 'source_equals_destination' => 'Le compte source est égal au compte de destination',
'unique_account_number_for_user' => 'Il semble que ce numéro de compte est déjà utilisé.',
- 'unique_iban_for_user' => 'It looks like this IBAN is already in use.',
+ 'unique_iban_for_user' => 'Il semble que cet IBAN soit déjà utilisé.',
'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.',
'file_already_attached' => 'Le fichier téléchargé ":name" est déjà attaché à cet objet.',
'file_attached' => 'Envoi du fichier ":name" avec succès.',
- 'must_exist' => 'The ID in field :attribute does not exist in the database.',
- 'all_accounts_equal' => 'All accounts in this field must be equal.',
- 'invalid_selection' => 'Your selection is invalid',
- 'belongs_user' => 'This value is invalid for this field.',
- 'at_least_one_transaction' => 'Need at least one transaction.',
- 'require_currency_info' => 'The content of this field is invalid without currency information.',
- 'equal_description' => 'Transaction description should not equal global description.',
+ 'must_exist' => 'L\'ID dans le champ :attribute n\'existe pas dans la base de données.',
+ 'all_accounts_equal' => 'Tous les comptes dans ce champ doivent être égaux.',
+ 'invalid_selection' => 'Votre sélection est invalide',
+ 'belongs_user' => 'Cette valeur n\'est pas valide pour ce champ.',
+ 'at_least_one_transaction' => 'Besoin d\'au moins une transaction.',
+ 'require_currency_info' => 'Le contenu de ce champ n\'est pas valide sans informations sur la devise.',
+ 'equal_description' => 'La description de la transaction ne doit pas être égale à la description globale.',
'file_invalid_mime' => 'Le fichier ":name" est du type ":mime" ce qui n\'est pas accepté pour un nouvel envoi.',
'file_too_large' => 'Le fichier ":name" est trop grand.',
'belongs_to_user' => 'La valeur de :attribute est inconnue',
@@ -92,7 +93,7 @@ return [
'required_without_all' => 'Le champ :attribute est requis quand aucun de :values n\'est présent.',
'same' => 'Les champs :attribute et :other doivent être identiques.',
'size.numeric' => 'La valeur de :attribute doit être :size.',
- 'amount_min_over_max' => 'The minimum amount cannot be larger than the maximum amount.',
+ 'amount_min_over_max' => 'Le montant minimum ne peut pas être supérieur au montant maximum.',
'size.file' => 'La taille du fichier de :attribute doit être de :size kilo-octets.',
'size.string' => 'Le texte de :attribute doit contenir :size caractères.',
'size.array' => 'Le tableau :attribute doit contenir :size éléments.',
@@ -113,7 +114,7 @@ return [
'description' => 'description',
'amount' => 'montant',
'name' => 'nom',
- 'piggy_bank_id' => 'piggy bank ID',
+ 'piggy_bank_id' => 'ID de tirelire',
'targetamount' => 'montant cible',
'openingBalanceDate' => 'date du solde initial',
'openingBalance' => 'solde initial',
@@ -122,7 +123,7 @@ return [
'amount_max' => 'montant maximum',
'title' => 'titre',
'tag' => 'tag',
- 'transaction_description' => 'transaction description',
+ 'transaction_description' => 'description de la transaction',
'rule-action-value.1' => 'valeur d\'action de la règle #1',
'rule-action-value.2' => 'valeur d\'action de la règle #2',
'rule-action-value.3' => 'valeur d\'action de la règle #3',
diff --git a/resources/lang/id_ID/auth.php b/resources/lang/id_ID/auth.php
index 0e216e497f..e7abc9c330 100644
--- a/resources/lang/id_ID/auth.php
+++ b/resources/lang/id_ID/auth.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
/*
diff --git a/resources/lang/id_ID/bank.php b/resources/lang/id_ID/bank.php
index ef0d636f91..b6a86faa4b 100644
--- a/resources/lang/id_ID/bank.php
+++ b/resources/lang/id_ID/bank.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
];
diff --git a/resources/lang/id_ID/breadcrumbs.php b/resources/lang/id_ID/breadcrumbs.php
index 1170d129ed..8c537eff60 100644
--- a/resources/lang/id_ID/breadcrumbs.php
+++ b/resources/lang/id_ID/breadcrumbs.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'home' => 'Beranda',
diff --git a/resources/lang/id_ID/components.php b/resources/lang/id_ID/components.php
index 125c74b2f0..1e9fce7f61 100644
--- a/resources/lang/id_ID/components.php
+++ b/resources/lang/id_ID/components.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// profile
diff --git a/resources/lang/id_ID/config.php b/resources/lang/id_ID/config.php
index 3aacdec3fa..8bb059277f 100644
--- a/resources/lang/id_ID/config.php
+++ b/resources/lang/id_ID/config.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'html_language' => 'id',
diff --git a/resources/lang/id_ID/csv.php b/resources/lang/id_ID/csv.php
index d61316b632..892c8beac4 100644
--- a/resources/lang/id_ID/csv.php
+++ b/resources/lang/id_ID/csv.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
];
diff --git a/resources/lang/id_ID/demo.php b/resources/lang/id_ID/demo.php
index 0cf92a4c18..42d403bf8b 100644
--- a/resources/lang/id_ID/demo.php
+++ b/resources/lang/id_ID/demo.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
- 'no_demo_text' => 'Maaf, tidak ada teks penjelasan-penjelasan tambahan laman halaman ini.',
- 'see_help_icon' => 'Namun, ikon di pojok kanan atas mungkin memberi tahu Anda lebih banyak.',
- 'index' => 'Selamat Datang di Firefly III! Di halaman ini Anda mendapatkan gambaran singkat tentang keuangan Anda. Untuk informasi lebih lanjut, lihat Akun → Setelan Akun dan tentu saja halaman Budgets123_4_6_32_23_32_19_7_321Reports. Atau hanya melihat-lihat dan melihat di mana Anda berakhir.',
- 'accounts-index' => 'Akun aset adalah rekening bank pribadi Anda. Akun pengeluaran adalah akun yang Anda belanjakan, seperti toko dan teman. Akun pendapatan adalah rekening yang Anda terima dari, seperti pekerjaan Anda, pemerintah atau sumber pendapatan lainnya. Pada halaman ini Anda dapat mengedit atau menghapusnya.',
- 'budgets-index' => 'Halaman ini menunjukkan ikhtisar anggaran Anda. Bagian atas menunjukkan jumlah yang tersedia untuk dianggarkan. Ini dapat disesuaikan untuk segala periode dengan mengklik jumlah di sebelah kanan. Jumlah yang sebenarnya Anda habiskan ditunjukkan di bilah di bawah ini. Di bawah ini adalah biaya per anggaran dan apa yang telah Anda anggarkan untuk mereka.',
- 'reports-index-start' => 'Firefly III mendukung sejumlah jenis laporan. Baca tentang mereka dengan mengklik -icon di pojok kanan atas.',
- 'reports-index-examples' => 'Pastikan untuk memeriksa contoh-contoh ini: gambaran keuangan bulanan, ikhtisar keuangan tahunan dan gambaran umum anggaran.',
- 'currencies-index' => 'Firefly III mendukung banyak mata uang. Meski default ke Euro itu bisa diatur ke US Dollar dan banyak mata uang lainnya. Seperti yang bisa Anda lihat, sejumlah kecil mata uang telah disertakan namun Anda dapat menambahkannya sendiri jika menginginkannya. Mengubah mata uang default tidak akan mengubah mata uang dari transaksi yang ada namun: Firefly III mendukung penggunaan beberapa mata uang pada saat bersamaan.',
- 'transactions-index' => 'Biaya ini, deposito dan transfer tidak terlalu imajinatif. Mereka telah dihasilkan secara otomatis.',
- 'piggy-banks-index' => 'Seperti yang bisa Anda lihat, ada tiga celengan. Gunakan tombol plus dan minus untuk mempengaruhi jumlah uang di setiap celengan. Klik nama celengan untuk melihat administrasi masing-masing celengan.',
- 'import-index' => 'Tentu saja, file CSV manapun bisa diimpor ke Firefly III',
+ 'no_demo_text' => 'Maaf, tidak ada teks penjelasan-penjelasan tambahan laman halaman ini.',
+ 'see_help_icon' => 'Namun, ikon di pojok kanan atas mungkin memberi tahu Anda lebih banyak.',
+ 'index' => 'Selamat Datang di Firefly III! Di halaman ini Anda mendapatkan gambaran singkat tentang keuangan Anda. Untuk informasi lebih lanjut, lihat Akun → Setelan Akun dan tentu saja halaman Budgets123_4_6_32_23_32_19_7_321Reports. Atau hanya melihat-lihat dan melihat di mana Anda berakhir.',
+ 'accounts-index' => 'Akun aset adalah rekening bank pribadi Anda. Akun pengeluaran adalah akun yang Anda belanjakan, seperti toko dan teman. Akun pendapatan adalah rekening yang Anda terima dari, seperti pekerjaan Anda, pemerintah atau sumber pendapatan lainnya. Pada halaman ini Anda dapat mengedit atau menghapusnya.',
+ 'budgets-index' => 'Halaman ini menunjukkan ikhtisar anggaran Anda. Bagian atas menunjukkan jumlah yang tersedia untuk dianggarkan. Ini dapat disesuaikan untuk segala periode dengan mengklik jumlah di sebelah kanan. Jumlah yang sebenarnya Anda habiskan ditunjukkan di bilah di bawah ini. Di bawah ini adalah biaya per anggaran dan apa yang telah Anda anggarkan untuk mereka.',
+ 'reports-index-start' => 'Firefly III mendukung sejumlah jenis laporan. Baca tentang mereka dengan mengklik -icon di pojok kanan atas.',
+ 'reports-index-examples' => 'Pastikan untuk memeriksa contoh-contoh ini: gambaran keuangan bulanan, ikhtisar keuangan tahunan dan gambaran umum anggaran.',
+ 'currencies-index' => 'Firefly III mendukung banyak mata uang. Meski default ke Euro itu bisa diatur ke US Dollar dan banyak mata uang lainnya. Seperti yang bisa Anda lihat, sejumlah kecil mata uang telah disertakan namun Anda dapat menambahkannya sendiri jika menginginkannya. Mengubah mata uang default tidak akan mengubah mata uang dari transaksi yang ada namun: Firefly III mendukung penggunaan beberapa mata uang pada saat bersamaan.',
+ 'transactions-index' => 'Biaya ini, deposito dan transfer tidak terlalu imajinatif. Mereka telah dihasilkan secara otomatis.',
+ 'piggy-banks-index' => 'Seperti yang bisa Anda lihat, ada tiga celengan. Gunakan tombol plus dan minus untuk mempengaruhi jumlah uang di setiap celengan. Klik nama celengan untuk melihat administrasi masing-masing celengan.',
+ 'import-index' => 'Tentu saja, file CSV manapun bisa diimpor ke Firefly III',
];
diff --git a/resources/lang/id_ID/firefly.php b/resources/lang/id_ID/firefly.php
index a8697dd99a..361e491eaf 100644
--- a/resources/lang/id_ID/firefly.php
+++ b/resources/lang/id_ID/firefly.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
// general stuff:
@@ -170,7 +171,9 @@ return [
'want_to_login' => 'I want to login',
'button_register' => 'Register',
'authorization' => 'Authorization',
-
+ 'active_bills_only' => 'active bills only',
+ 'average_per_bill' => 'average per bill',
+ 'expected_total' => 'expected total',
// API access
'authorization_request' => 'Firefly III v:version Authorization Request',
'authorization_request_intro' => ':client is requesting permission to access your financial administration. Would you like to authorize :client to access these records?',
@@ -403,590 +406,589 @@ return [
'rule_action_set_notes_choice' => 'Tetapkan catatan ke..',
'rule_action_set_notes' => 'Tetapkan catatan ke ":action_value"',
- 'rules_have_read_warning' => 'Sudahkah anda membaca peringatannya?',
- 'apply_rule_warning' => 'Peringatan: menjalankan aturan (grup) pada banyak pilihan transaksi bisa memakan waktu lama, dan bisa time-out. Jika ya, aturan (grup) hanya akan diterapkan ke subkumpulan transaksi yang tidak diketahui. Ini mungkin akan membuat administrasi keuangan Anda berantakan. Tolong hati-hati.',
+ 'rules_have_read_warning' => 'Sudahkah anda membaca peringatannya?',
+ 'apply_rule_warning' => 'Peringatan: menjalankan aturan (grup) pada banyak pilihan transaksi bisa memakan waktu lama, dan bisa time-out. Jika ya, aturan (grup) hanya akan diterapkan ke subkumpulan transaksi yang tidak diketahui. Ini mungkin akan membuat administrasi keuangan Anda berantakan. Tolong hati-hati.',
// tags
- 'store_new_tag' => 'Simpan tag baru',
- 'update_tag' => 'Perbarui tag',
- 'no_location_set' => 'Tidak ada lokasi yang ditetapkan',
- 'meta_data' => 'Data meta',
- 'location' => 'Lokasi',
- 'without_date' => 'Tanpa tanggal',
- 'result' => 'Hasil',
- 'sums_apply_to_range' => 'Semua jumlah berlaku untuk rentang yang dipilih',
- 'mapbox_api_key' => 'Untuk menggunakan peta, dapatkan kunci API dari Mapbox. Buka file .env en masukkan kode ini setelah MAPBOX_API_KEY = .',
- 'press_tag_location' => 'Klik kanan atau tekan agak lama untuk mengatur lokasi tag.',
- 'clear_location' => 'Lokasi yang jelas',
+ 'store_new_tag' => 'Simpan tag baru',
+ 'update_tag' => 'Perbarui tag',
+ 'no_location_set' => 'Tidak ada lokasi yang ditetapkan',
+ 'meta_data' => 'Data meta',
+ 'location' => 'Lokasi',
+ 'without_date' => 'Tanpa tanggal',
+ 'result' => 'Hasil',
+ 'sums_apply_to_range' => 'Semua jumlah berlaku untuk rentang yang dipilih',
+ 'mapbox_api_key' => 'Untuk menggunakan peta, dapatkan kunci API dari Mapbox. Buka file .env en masukkan kode ini setelah MAPBOX_API_KEY = .',
+ 'press_tag_location' => 'Klik kanan atau tekan agak lama untuk mengatur lokasi tag.',
+ 'clear_location' => 'Lokasi yang jelas',
// preferences
- 'pref_home_screen_accounts' => 'Akun layar utama',
- 'pref_home_screen_accounts_help' => 'Akun mana yang harus ditampilkan di beranda?',
- 'pref_view_range' => 'Rentang tampilan',
- 'pref_view_range_help' => 'Beberapa grafik secara otomatis dikelompokkan dalam beberapa periode. Periode apa yang anda inginkan?',
- 'pref_1D' => 'Suatu hari',
- 'pref_1W' => 'Satu minggu',
- 'pref_1M' => 'Satu bulan',
- 'pref_3M' => 'Tiga bulan (seperempat)',
- 'pref_6M' => 'Enam bulan',
- 'pref_1Y' => 'Satu tahun',
- 'pref_languages' => 'Bahasa',
- 'pref_languages_help' => 'Firefly III mendukung beberapa bahasa. Mana yang kamu suka?',
- 'pref_custom_fiscal_year' => 'Pengaturan tahun fiskal',
- 'pref_custom_fiscal_year_label' => 'Diaktifkan',
- 'pref_custom_fiscal_year_help' => 'Di negara-negara yang menggunakan tahun keuangan selain 1 Januari sampai 31 Desember, Anda dapat mengaktifkannya dan menentukan hari-hari awal / akhir dari tahun fiskal',
- 'pref_fiscal_year_start_label' => 'Tahun anggaran mulai tanggal',
- 'pref_two_factor_auth' => 'Verifikasi 2 langkah',
- 'pref_two_factor_auth_help' => 'Bila Anda mengaktifkan verifikasi 2 langkah (juga dikenal sebagai autentikasi dua faktor), Anda menambahkan lapisan keamanan ekstra ke akun Anda. Anda masuk dengan sesuatu yang Anda tahu (kata sandi Anda) dan sesuatu yang Anda miliki (kode verifikasi). Kode verifikasi dihasilkan oleh aplikasi di ponsel Anda, seperti Authy atau Google Authenticator.',
- 'pref_enable_two_factor_auth' => 'Aktifkan verifikasi 2 langkah',
- 'pref_two_factor_auth_disabled' => 'Kode verifikasi 2 langkah dihapus dan dinonaktifkan',
- 'pref_two_factor_auth_remove_it' => 'Jangan lupa menghapus akun dari aplikasi autentikasi Anda!',
- 'pref_two_factor_auth_code' => 'Kode verifikasi',
- '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_reset_code' => 'Setel ulang kode verifikasi',
- 'pref_two_factor_auth_remove_code' => 'Hapus kode verifikasi',
- 'pref_two_factor_auth_remove_will_disable' => '(ini juga akan menonaktifkan autentikasi dua faktor)',
- 'pref_save_settings' => 'Simpan Pengaturan',
- 'saved_preferences' => 'Preferensi disimpan!',
- 'preferences_general' => 'Umum',
- 'preferences_frontpage' => 'Tampilan depan',
- 'preferences_security' => 'Keamanan',
- 'preferences_layout' => 'Tata ruang',
- 'pref_home_show_deposits' => 'Tampilkan deposito pada layar awal',
- 'pref_home_show_deposits_info' => 'Layar awal sudah menunjukkan rekening pengeluaran Anda. Harus itu juga menunjukkan akun pendapatan Anda?',
- 'pref_home_do_show_deposits' => 'Ya, menunjukkan kepada mereka',
- 'successful_count' => ':count menghitung sukses',
- 'list_page_size_title' => 'Ukuran halaman',
- 'list_page_size_help' => 'Setiap daftar hal-hal (rekening, transaksi, dll) menunjukkan paling ini banyak per halaman.',
- 'list_page_size_label' => 'Ukuran halaman',
- 'between_dates' => '(:start dan :end)',
- 'pref_optional_fields_transaction' => 'Bidang opsional untuk transaksi',
- 'pref_optional_fields_transaction_help' => 'Secara default tidak semua bidang diaktifkan saat membuat transaksi baru (karena kekacauan). Di bawah, Anda dapat mengaktifkan bidang ini jika Anda berpikir mereka bisa berguna bagi Anda. Tentu saja, setiap bidang yang dinonaktifkan, tapi sudah diisi, akan terlihat terlepas dari pengaturan.',
- 'optional_tj_date_fields' => 'Bidang tanggal',
- 'optional_tj_business_fields' => 'Bidang usaha',
- 'optional_tj_attachment_fields' => 'Bidang lampiran',
- 'pref_optional_tj_interest_date' => 'Tanggal bunga',
- 'pref_optional_tj_book_date' => 'Buku tanggal',
- 'pref_optional_tj_process_date' => 'Tanggal pengolahan',
- 'pref_optional_tj_due_date' => 'Batas tanggal terakhir',
- 'pref_optional_tj_payment_date' => 'Tanggal pembayaran',
- 'pref_optional_tj_invoice_date' => 'Tanggal faktur',
- 'pref_optional_tj_internal_reference' => 'Referensi internal',
- 'pref_optional_tj_notes' => 'Catatan',
- 'pref_optional_tj_attachments' => 'Lampiran',
- 'optional_field_meta_dates' => 'Tanggal',
- 'optional_field_meta_business' => 'Bisnis',
- 'optional_field_attachments' => 'Lampiran',
- 'optional_field_meta_data' => 'Data meta opsional',
+ 'pref_home_screen_accounts' => 'Akun layar utama',
+ 'pref_home_screen_accounts_help' => 'Akun mana yang harus ditampilkan di beranda?',
+ 'pref_view_range' => 'Rentang tampilan',
+ 'pref_view_range_help' => 'Beberapa grafik secara otomatis dikelompokkan dalam beberapa periode. Periode apa yang anda inginkan?',
+ 'pref_1D' => 'Suatu hari',
+ 'pref_1W' => 'Satu minggu',
+ 'pref_1M' => 'Satu bulan',
+ 'pref_3M' => 'Tiga bulan (seperempat)',
+ 'pref_6M' => 'Enam bulan',
+ 'pref_1Y' => 'Satu tahun',
+ 'pref_languages' => 'Bahasa',
+ 'pref_languages_help' => 'Firefly III mendukung beberapa bahasa. Mana yang kamu suka?',
+ 'pref_custom_fiscal_year' => 'Pengaturan tahun fiskal',
+ 'pref_custom_fiscal_year_label' => 'Diaktifkan',
+ 'pref_custom_fiscal_year_help' => 'Di negara-negara yang menggunakan tahun keuangan selain 1 Januari sampai 31 Desember, Anda dapat mengaktifkannya dan menentukan hari-hari awal / akhir dari tahun fiskal',
+ 'pref_fiscal_year_start_label' => 'Tahun anggaran mulai tanggal',
+ 'pref_two_factor_auth' => 'Verifikasi 2 langkah',
+ 'pref_two_factor_auth_help' => 'Bila Anda mengaktifkan verifikasi 2 langkah (juga dikenal sebagai autentikasi dua faktor), Anda menambahkan lapisan keamanan ekstra ke akun Anda. Anda masuk dengan sesuatu yang Anda tahu (kata sandi Anda) dan sesuatu yang Anda miliki (kode verifikasi). Kode verifikasi dihasilkan oleh aplikasi di ponsel Anda, seperti Authy atau Google Authenticator.',
+ 'pref_enable_two_factor_auth' => 'Aktifkan verifikasi 2 langkah',
+ 'pref_two_factor_auth_disabled' => 'Kode verifikasi 2 langkah dihapus dan dinonaktifkan',
+ 'pref_two_factor_auth_remove_it' => 'Jangan lupa menghapus akun dari aplikasi autentikasi Anda!',
+ 'pref_two_factor_auth_code' => 'Kode verifikasi',
+ '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_reset_code' => 'Setel ulang kode verifikasi',
+ 'pref_two_factor_auth_disable_2fa' => 'Disable 2FA',
+ 'pref_save_settings' => 'Simpan Pengaturan',
+ 'saved_preferences' => 'Preferensi disimpan!',
+ 'preferences_general' => 'Umum',
+ 'preferences_frontpage' => 'Tampilan depan',
+ 'preferences_security' => 'Keamanan',
+ 'preferences_layout' => 'Tata ruang',
+ 'pref_home_show_deposits' => 'Tampilkan deposito pada layar awal',
+ 'pref_home_show_deposits_info' => 'Layar awal sudah menunjukkan rekening pengeluaran Anda. Harus itu juga menunjukkan akun pendapatan Anda?',
+ 'pref_home_do_show_deposits' => 'Ya, menunjukkan kepada mereka',
+ 'successful_count' => ':count menghitung sukses',
+ 'list_page_size_title' => 'Ukuran halaman',
+ 'list_page_size_help' => 'Setiap daftar hal-hal (rekening, transaksi, dll) menunjukkan paling ini banyak per halaman.',
+ 'list_page_size_label' => 'Ukuran halaman',
+ 'between_dates' => '(:start dan :end)',
+ 'pref_optional_fields_transaction' => 'Bidang opsional untuk transaksi',
+ 'pref_optional_fields_transaction_help' => 'Secara default tidak semua bidang diaktifkan saat membuat transaksi baru (karena kekacauan). Di bawah, Anda dapat mengaktifkan bidang ini jika Anda berpikir mereka bisa berguna bagi Anda. Tentu saja, setiap bidang yang dinonaktifkan, tapi sudah diisi, akan terlihat terlepas dari pengaturan.',
+ 'optional_tj_date_fields' => 'Bidang tanggal',
+ 'optional_tj_business_fields' => 'Bidang usaha',
+ 'optional_tj_attachment_fields' => 'Bidang lampiran',
+ 'pref_optional_tj_interest_date' => 'Tanggal bunga',
+ 'pref_optional_tj_book_date' => 'Buku tanggal',
+ 'pref_optional_tj_process_date' => 'Tanggal pengolahan',
+ 'pref_optional_tj_due_date' => 'Batas tanggal terakhir',
+ 'pref_optional_tj_payment_date' => 'Tanggal pembayaran',
+ 'pref_optional_tj_invoice_date' => 'Tanggal faktur',
+ 'pref_optional_tj_internal_reference' => 'Referensi internal',
+ 'pref_optional_tj_notes' => 'Catatan',
+ 'pref_optional_tj_attachments' => 'Lampiran',
+ 'optional_field_meta_dates' => 'Tanggal',
+ 'optional_field_meta_business' => 'Bisnis',
+ 'optional_field_attachments' => 'Lampiran',
+ 'optional_field_meta_data' => 'Data meta opsional',
// profile:
- 'change_your_password' => 'Ubah password Anda',
- 'delete_account' => 'Hapus akun',
- 'current_password' => 'Kata sandi saat ini',
- 'new_password' => 'Kata sandi baru',
- 'new_password_again' => 'Password Baru Lagi)',
- 'delete_your_account' => 'Hapus akun anda',
- 'delete_your_account_help' => 'Menghapus akun juga akan menghapus akun, transaksi, semua Anda mungkin telah disimpan ke Firefly III. Ini akan HILANG.',
- 'delete_your_account_password' => 'Masukkan kata sandi Anda untuk melanjutkan.',
- 'password' => 'Kata sandi',
- 'are_you_sure' => 'Apakah Anda yakin? Anda tidak dapat membatalkan ini.',
- 'delete_account_button' => 'Hapus akun anda',
- 'invalid_current_password' => 'Kata sandi tidak valid saat ini!',
- 'password_changed' => 'Sandi berubah!',
- 'should_change' => 'Idenya adalah untuk mengubah password Anda.',
- 'invalid_password' => 'Kata sandi salah!',
- 'what_is_pw_security' => 'Apa itu "memverifikasi keamanan password"?',
- 'secure_pw_title' => 'Bagaimana memilih sebuah password yang aman',
- 'secure_pw_history' => 'Pada Agustus 2017 terkenal peneliti keamanan Troy berburu merilis daftar 306 juta password dicuri. password tersebut dicuri selama breakins di perusahaan seperti LinkedIn, Adobe dan Neopets (dan banyak lagi).',
- 'secure_pw_check_box' => 'Dengan mencentang kotaknya, Firefly III akan mengirimkan hash SHA1 dari kata sandi Anda ke situs web dari Troy Hunt untuk melihat apakah itu ada dalam daftar. Ini akan menghentikan Anda untuk menggunakan kata kunci yang tidak aman seperti yang disarankan di Publikasi Khusus NIST atas Subjek ini.',
- 'secure_pw_sha1' => 'Tapi saya pikir SHA1 rusak?',
- 'secure_pw_hash_speed' => 'Ya, tapi tidak dalam konteks ini. Seperti yang bisa Anda baca di situs web yang merinci bagaimana mereka melanggar SHA1, sekarang sedikit lebih mudah untuk menemukan "tabrakan": string lain yang menghasilkan sama SHA1-hash Sekarang hanya membutuhkan waktu 10.000 tahun dengan menggunakan mesin GPU tunggal.',
- 'secure_pw_hash_security' => 'Tabrakan ini tidak akan sama dengan kata sandi Anda, juga tidak akan berguna di (situs seperti) Firefly III. Aplikasi ini tidak menggunakan SHA1 untuk verifikasi kata sandi. Jadi aman untuk mencentang kotak ini. Kata sandi Anda hashed dan dikirim melalui HTTPS.',
- 'secure_pw_should' => 'Haruskah saya mencentang kotaknya?',
- 'secure_pw_long_password' => 'Jika Anda baru saja menghasilkan kata sandi penggunaan tunggal yang hebat untuk Firefly III menggunakan beberapa jenis generator kata kunci: tidak.',
- 'secure_pw_short' => 'Jika Anda baru memasukkan kata sandi yang selalu Anda gunakan: Please yes.',
- 'command_line_token' => 'Command line token',
- 'explain_command_line_token' => 'You need this token to perform command line options, such as importing or exporting data. Without it, such sensitive commands will not work. Do not share your command line token. Nobody will ask you for this token, not even me. If you fear you lost this, or when you\'re paranoid, regenerate this token using the button.',
- 'regenerate_command_line_token' => 'Regenerate command line token',
- 'token_regenerated' => 'A new command line token was generated',
- 'change_your_email' => 'Ubah alamat email anda',
- 'email_verification' => 'Pesan email akan dikirim ke alamat email lama DAN baru Anda. Untuk tujuan keamanan, Anda tidak dapat masuk sampai Anda memverifikasi alamat email baru Anda. Jika Anda tidak yakin apakah instalasi Firefly III Anda bisa mengirim email, tolong jangan gunakan fitur ini. Jika Anda seorang administrator, Anda dapat mengujinya di Administrasi.',
- 'email_changed_logout' => 'Sampai Anda memverifikasi alamat email Anda, Anda tidak dapat login.',
- 'login_with_new_email' => 'Anda sekarang bisa masuk dengan alamat email baru Anda.',
- 'login_with_old_email' => 'Anda sekarang dapat login dengan alamat email lama Anda lagi.',
+ 'change_your_password' => 'Ubah password Anda',
+ 'delete_account' => 'Hapus akun',
+ 'current_password' => 'Kata sandi saat ini',
+ 'new_password' => 'Kata sandi baru',
+ 'new_password_again' => 'Password Baru Lagi)',
+ 'delete_your_account' => 'Hapus akun anda',
+ 'delete_your_account_help' => 'Menghapus akun juga akan menghapus akun, transaksi, semua Anda mungkin telah disimpan ke Firefly III. Ini akan HILANG.',
+ 'delete_your_account_password' => 'Masukkan kata sandi Anda untuk melanjutkan.',
+ 'password' => 'Kata sandi',
+ 'are_you_sure' => 'Apakah Anda yakin? Anda tidak dapat membatalkan ini.',
+ 'delete_account_button' => 'Hapus akun anda',
+ 'invalid_current_password' => 'Kata sandi tidak valid saat ini!',
+ 'password_changed' => 'Sandi berubah!',
+ 'should_change' => 'Idenya adalah untuk mengubah password Anda.',
+ 'invalid_password' => 'Kata sandi salah!',
+ 'what_is_pw_security' => 'Apa itu "memverifikasi keamanan password"?',
+ 'secure_pw_title' => 'Bagaimana memilih sebuah password yang aman',
+ 'secure_pw_history' => 'Pada Agustus 2017 terkenal peneliti keamanan Troy berburu merilis daftar 306 juta password dicuri. password tersebut dicuri selama breakins di perusahaan seperti LinkedIn, Adobe dan Neopets (dan banyak lagi).',
+ 'secure_pw_check_box' => 'By checking the box, Firefly III will send the first five characters of 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' => 'Tapi saya pikir SHA1 rusak?',
+ 'secure_pw_hash_speed' => 'Ya, tapi tidak dalam konteks ini. Seperti yang bisa Anda baca di situs web yang merinci bagaimana mereka melanggar SHA1, sekarang sedikit lebih mudah untuk menemukan "tabrakan": string lain yang menghasilkan sama SHA1-hash Sekarang hanya membutuhkan waktu 10.000 tahun dengan menggunakan mesin GPU tunggal.',
+ 'secure_pw_hash_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 only the first five characters of this hash are sent over HTTPS.',
+ 'secure_pw_should' => 'Haruskah saya mencentang kotaknya?',
+ 'secure_pw_long_password' => 'Jika Anda baru saja menghasilkan kata sandi penggunaan tunggal yang hebat untuk Firefly III menggunakan beberapa jenis generator kata kunci: tidak.',
+ 'secure_pw_short' => 'Jika Anda baru memasukkan kata sandi yang selalu Anda gunakan: Please yes.',
+ 'command_line_token' => 'Command line token',
+ 'explain_command_line_token' => 'You need this token to perform command line options, such as importing or exporting data. Without it, such sensitive commands will not work. Do not share your command line token. Nobody will ask you for this token, not even me. If you fear you lost this, or when you\'re paranoid, regenerate this token using the button.',
+ 'regenerate_command_line_token' => 'Regenerate command line token',
+ 'token_regenerated' => 'A new command line token was generated',
+ 'change_your_email' => 'Ubah alamat email anda',
+ 'email_verification' => 'Pesan email akan dikirim ke alamat email lama DAN baru Anda. Untuk tujuan keamanan, Anda tidak dapat masuk sampai Anda memverifikasi alamat email baru Anda. Jika Anda tidak yakin apakah instalasi Firefly III Anda bisa mengirim email, tolong jangan gunakan fitur ini. Jika Anda seorang administrator, Anda dapat mengujinya di Administrasi.',
+ 'email_changed_logout' => 'Sampai Anda memverifikasi alamat email Anda, Anda tidak dapat login.',
+ 'login_with_new_email' => 'Anda sekarang bisa masuk dengan alamat email baru Anda.',
+ 'login_with_old_email' => 'Anda sekarang dapat login dengan alamat email lama Anda lagi.',
// attachments
- 'nr_of_attachments' => 'Satu lampiran |:count lampiran',
- 'attachments' => 'Lampiran',
- 'edit_attachment' => 'Edit lampiran ":name"',
- 'update_attachment' => 'Perbarui lampiran',
- 'delete_attachment' => 'Hapus lampiran ":name"',
- 'attachment_deleted' => 'Lampiran yang dihapus ":name"',
- 'attachment_updated' => 'Lampiran yang diperbarui ":name"',
- 'upload_max_file_size' => 'Ukuran file maksimum: :size',
+ 'nr_of_attachments' => 'Satu lampiran |:count lampiran',
+ 'attachments' => 'Lampiran',
+ 'edit_attachment' => 'Edit lampiran ":name"',
+ 'update_attachment' => 'Perbarui lampiran',
+ 'delete_attachment' => 'Hapus lampiran ":name"',
+ 'attachment_deleted' => 'Lampiran yang dihapus ":name"',
+ 'attachment_updated' => 'Lampiran yang diperbarui ":name"',
+ 'upload_max_file_size' => 'Ukuran file maksimum: :size',
// transaction index
- 'title_expenses' => 'Beban',
- 'title_withdrawal' => 'Beban',
- 'title_revenue' => 'Pendapatan / penghasilan',
- 'title_deposit' => 'Pendapatan / penghasilan',
- 'title_transfer' => 'Transfer',
- 'title_transfers' => 'Transfer',
+ 'title_expenses' => 'Beban',
+ 'title_withdrawal' => 'Beban',
+ 'title_revenue' => 'Pendapatan / penghasilan',
+ 'title_deposit' => 'Pendapatan / penghasilan',
+ 'title_transfer' => 'Transfer',
+ 'title_transfers' => 'Transfer',
// convert stuff:
- 'convert_is_already_type_Withdrawal' => 'Transaksi ini sudah menjadi penarikan',
- 'convert_is_already_type_Deposit' => 'Transaksi ini sudah menjadi deposit',
- 'convert_is_already_type_Transfer' => 'Transaksi ini sudah di transfer',
- 'convert_to_Withdrawal' => 'Convert ":description" ke penarikan',
- 'convert_to_Deposit' => 'Convert ":description" ke deposit',
- 'convert_to_Transfer' => 'Convert ":description" ke sebuah transfer',
- 'convert_options_WithdrawalDeposit' => 'Mengkonversi penarikan menjadi deposit',
- 'convert_options_WithdrawalTransfer' => 'Mengkonversi penarikan ke dalam transfer',
- 'convert_options_DepositTransfer' => 'Mengkonversi deposit ke transfer',
- 'convert_options_DepositWithdrawal' => 'Mengkonversi deposit menjadi penarikan',
- 'convert_options_TransferWithdrawal' => 'Mengkonversi transfer menjadi penarikan',
- 'convert_options_TransferDeposit' => 'Mengkonversi transfer menjadi deposit',
- 'convert_Withdrawal_to_deposit' => 'Mengkonversi penarikan ini ke deposit',
- 'convert_Withdrawal_to_transfer' => 'Mengkonversi penarikan ini ke transfer',
- 'convert_Deposit_to_withdrawal' => 'Convert this deposit to a withdrawal',
- 'convert_Deposit_to_transfer' => 'Konversikan deposit ini ke transfer',
- 'convert_Transfer_to_deposit' => 'Mengkonversi transfer ini ke deposit',
- 'convert_Transfer_to_withdrawal' => 'Mengkonversi transfer ini ke penarikan',
- 'convert_please_set_revenue_source' => 'Silakan pilih akun pendapatan dari mana uang itu berasal.',
- 'convert_please_set_asset_destination' => 'Silakan pilih akun aset dimana uangnya akan digunakan.',
- 'convert_please_set_expense_destination' => 'Tolong pilih rekening pengeluaran yang akan digunakan untuk uang.',
- 'convert_please_set_asset_source' => 'Silakan pilih akun aset dari mana uang itu berasal.',
- 'convert_explanation_withdrawal_deposit' => 'Jika Anda mengubah penarikan ini menjadi deposit, :amount akan disetorkan ke :sourceName alih-alih diambil darinya.',
- 'convert_explanation_withdrawal_transfer' => 'Jika Anda mengubah penarikan ini menjadi transfer, :amount akan ditransfer dari :sourceName ke akun aset baru, alih-alih dibayar ke :destinationName.',
- 'convert_explanation_deposit_withdrawal' => 'Jika Anda mengonversi setoran ini menjadi penarikan, :amount akan dihapus dari :destinationName alih-alih ditambahkan ke penarikan tersebut.',
- 'convert_explanation_deposit_transfer' => 'Jika Anda mengonversi setoran ini menjadi transfer, :amount akan ditransfer dari akun aset pilihan Anda ke :destinationName .',
- 'convert_explanation_transfer_withdrawal' => 'Jika Anda mengubah transfer ini menjadi penarikan, :amount akan beralih dari :sourceName ke tujuan baru sebagai biaya, alih-alih :destinationName sebagai transfer.',
- 'convert_explanation_transfer_deposit' => 'Jika Anda mengubah transfer ini menjadi deposit, :amount akan disetorkan ke akun :destinationName alih-alih ditransfer ke sana.',
- 'converted_to_Withdrawal' => 'Transaksi telah dikonversi menjadi penarikan',
- 'converted_to_Deposit' => 'Transaksi telah dikonversi menjadi deposit',
- 'converted_to_Transfer' => 'Transaksi telah dikonversi menjadi transfer',
- 'invalid_convert_selection' => 'Akun yang telah Anda pilih sudah digunakan dalam transaksi ini atau tidak ada.',
+ 'convert_is_already_type_Withdrawal' => 'Transaksi ini sudah menjadi penarikan',
+ 'convert_is_already_type_Deposit' => 'Transaksi ini sudah menjadi deposit',
+ 'convert_is_already_type_Transfer' => 'Transaksi ini sudah di transfer',
+ 'convert_to_Withdrawal' => 'Convert ":description" ke penarikan',
+ 'convert_to_Deposit' => 'Convert ":description" ke deposit',
+ 'convert_to_Transfer' => 'Convert ":description" ke sebuah transfer',
+ 'convert_options_WithdrawalDeposit' => 'Mengkonversi penarikan menjadi deposit',
+ 'convert_options_WithdrawalTransfer' => 'Mengkonversi penarikan ke dalam transfer',
+ 'convert_options_DepositTransfer' => 'Mengkonversi deposit ke transfer',
+ 'convert_options_DepositWithdrawal' => 'Mengkonversi deposit menjadi penarikan',
+ 'convert_options_TransferWithdrawal' => 'Mengkonversi transfer menjadi penarikan',
+ 'convert_options_TransferDeposit' => 'Mengkonversi transfer menjadi deposit',
+ 'convert_Withdrawal_to_deposit' => 'Mengkonversi penarikan ini ke deposit',
+ 'convert_Withdrawal_to_transfer' => 'Mengkonversi penarikan ini ke transfer',
+ 'convert_Deposit_to_withdrawal' => 'Convert this deposit to a withdrawal',
+ 'convert_Deposit_to_transfer' => 'Konversikan deposit ini ke transfer',
+ 'convert_Transfer_to_deposit' => 'Mengkonversi transfer ini ke deposit',
+ 'convert_Transfer_to_withdrawal' => 'Mengkonversi transfer ini ke penarikan',
+ 'convert_please_set_revenue_source' => 'Silakan pilih akun pendapatan dari mana uang itu berasal.',
+ 'convert_please_set_asset_destination' => 'Silakan pilih akun aset dimana uangnya akan digunakan.',
+ 'convert_please_set_expense_destination' => 'Tolong pilih rekening pengeluaran yang akan digunakan untuk uang.',
+ 'convert_please_set_asset_source' => 'Silakan pilih akun aset dari mana uang itu berasal.',
+ 'convert_explanation_withdrawal_deposit' => 'Jika Anda mengubah penarikan ini menjadi deposit, :amount akan disetorkan ke :sourceName alih-alih diambil darinya.',
+ 'convert_explanation_withdrawal_transfer' => 'Jika Anda mengubah penarikan ini menjadi transfer, :amount akan ditransfer dari :sourceName ke akun aset baru, alih-alih dibayar ke :destinationName.',
+ 'convert_explanation_deposit_withdrawal' => 'Jika Anda mengonversi setoran ini menjadi penarikan, :amount akan dihapus dari :destinationName alih-alih ditambahkan ke penarikan tersebut.',
+ 'convert_explanation_deposit_transfer' => 'Jika Anda mengonversi setoran ini menjadi transfer, :amount akan ditransfer dari akun aset pilihan Anda ke :destinationName .',
+ 'convert_explanation_transfer_withdrawal' => 'Jika Anda mengubah transfer ini menjadi penarikan, :amount akan beralih dari :sourceName ke tujuan baru sebagai biaya, alih-alih :destinationName sebagai transfer.',
+ 'convert_explanation_transfer_deposit' => 'Jika Anda mengubah transfer ini menjadi deposit, :amount akan disetorkan ke akun :destinationName alih-alih ditransfer ke sana.',
+ 'converted_to_Withdrawal' => 'Transaksi telah dikonversi menjadi penarikan',
+ 'converted_to_Deposit' => 'Transaksi telah dikonversi menjadi deposit',
+ 'converted_to_Transfer' => 'Transaksi telah dikonversi menjadi transfer',
+ 'invalid_convert_selection' => 'Akun yang telah Anda pilih sudah digunakan dalam transaksi ini atau tidak ada.',
// create new stuff:
- 'create_new_withdrawal' => 'Buat penarikan baru',
- 'create_new_deposit' => 'Buat deposit baru',
- 'create_new_transfer' => 'Buat transfer baru',
- 'create_new_asset' => 'Buat akun aset baru',
- 'create_new_expense' => 'Buat akun biaya baru',
- 'create_new_revenue' => 'Buat akun pendapatan baru',
- 'create_new_piggy_bank' => 'Buat celengan baru',
- 'create_new_bill' => 'Buat tagihan baru',
+ 'create_new_withdrawal' => 'Buat penarikan baru',
+ 'create_new_deposit' => 'Buat deposit baru',
+ 'create_new_transfer' => 'Buat transfer baru',
+ 'create_new_asset' => 'Buat akun aset baru',
+ 'create_new_expense' => 'Buat akun biaya baru',
+ 'create_new_revenue' => 'Buat akun pendapatan baru',
+ 'create_new_piggy_bank' => 'Buat celengan baru',
+ 'create_new_bill' => 'Buat tagihan baru',
// currencies:
- 'create_currency' => 'Buat mata uang baru',
- 'store_currency' => 'Simpan mata uang baru',
- 'update_currency' => 'Perbarui mata uang',
- 'new_default_currency' => ' :name sekarang adalah mata uang default.',
- 'cannot_delete_currency' => 'Tidak dapat menghapus :name karena masih digunakan.',
- 'deleted_currency' => 'Mata uang :name dihapus',
- 'created_currency' => 'Mata uang :name dibuat',
- 'updated_currency' => 'Mata uang :name diperbarui',
- 'ask_site_owner' => 'Harap bertanya :owner untuk menambahkan, menghapus atau mengedit mata uang.',
- 'currencies_intro' => 'Firefly III mendukung berbagai mata uang yang dapat Anda atur dan aktifkan di sini.',
- 'make_default_currency' => 'membuat default',
- 'default_currency' => 'default',
+ 'create_currency' => 'Buat mata uang baru',
+ 'store_currency' => 'Simpan mata uang baru',
+ 'update_currency' => 'Perbarui mata uang',
+ 'new_default_currency' => ' :name sekarang adalah mata uang default.',
+ 'cannot_delete_currency' => 'Tidak dapat menghapus :name karena masih digunakan.',
+ 'deleted_currency' => 'Mata uang :name dihapus',
+ 'created_currency' => 'Mata uang :name dibuat',
+ 'updated_currency' => 'Mata uang :name diperbarui',
+ 'ask_site_owner' => 'Harap bertanya :owner untuk menambahkan, menghapus atau mengedit mata uang.',
+ 'currencies_intro' => 'Firefly III mendukung berbagai mata uang yang dapat Anda atur dan aktifkan di sini.',
+ 'make_default_currency' => 'membuat default',
+ 'default_currency' => 'default',
// forms:
- 'mandatoryFields' => 'Bidang wajib',
- 'optionalFields' => 'Bidang pilihan',
- 'options' => 'Pilihan',
+ 'mandatoryFields' => 'Bidang wajib',
+ 'optionalFields' => 'Bidang pilihan',
+ 'options' => 'Pilihan',
// budgets:
- 'create_new_budget' => 'Buat anggaran baru',
- 'store_new_budget' => 'Simpan anggaran baru',
- 'stored_new_budget' => 'Anggaran baru tersimpan ":name"',
- 'available_between' => 'Tersedia antara :start dan :end',
- 'transactionsWithoutBudget' => 'Biaya tanpa anggaran',
- 'transactions_no_budget' => 'Biaya tanpa anggaran antara :start dan :end',
- 'spent_between' => 'Menghabiskan antara :start dan :end',
- 'createBudget' => 'Anggaran baru',
- 'inactiveBudgets' => 'Anggaran tidak aktif',
- 'without_budget_between' => 'Transaksi tanpa anggaran antara :start dan :end',
- 'delete_budget' => 'Hapus anggaran ":name"',
- 'deleted_budget' => 'Anggaran yang telah dihapus ":name"',
- 'edit_budget' => 'Edit anggaran ":name"',
- 'updated_budget' => 'Anggaran yang diperbarui ":name"',
- 'update_amount' => 'Perbarui jumlah',
- 'update_budget' => 'Perbarui anggaran',
- 'update_budget_amount_range' => 'Update (expected) jumlah yang tersedia antara :start and :end',
- 'budget_period_navigator' => 'Navigator periode',
- 'info_on_available_amount' => 'Apa yang telah tersedia?',
- 'available_amount_indication' => 'Gunakan jumlah ini untuk mendapatkan indikasi berapa total anggaran Anda.',
- 'suggested' => 'Disarankan',
- 'average_between' => 'Rata-rata antara :start dan :end',
+ 'create_new_budget' => 'Buat anggaran baru',
+ 'store_new_budget' => 'Simpan anggaran baru',
+ 'stored_new_budget' => 'Anggaran baru tersimpan ":name"',
+ 'available_between' => 'Tersedia antara :start dan :end',
+ 'transactionsWithoutBudget' => 'Biaya tanpa anggaran',
+ 'transactions_no_budget' => 'Biaya tanpa anggaran antara :start dan :end',
+ 'spent_between' => 'Menghabiskan antara :start dan :end',
+ 'createBudget' => 'Anggaran baru',
+ 'inactiveBudgets' => 'Anggaran tidak aktif',
+ 'without_budget_between' => 'Transaksi tanpa anggaran antara :start dan :end',
+ 'delete_budget' => 'Hapus anggaran ":name"',
+ 'deleted_budget' => 'Anggaran yang telah dihapus ":name"',
+ 'edit_budget' => 'Edit anggaran ":name"',
+ 'updated_budget' => 'Anggaran yang diperbarui ":name"',
+ 'update_amount' => 'Perbarui jumlah',
+ 'update_budget' => 'Perbarui anggaran',
+ 'update_budget_amount_range' => 'Update (expected) jumlah yang tersedia antara :start and :end',
+ 'budget_period_navigator' => 'Navigator periode',
+ 'info_on_available_amount' => 'Apa yang telah tersedia?',
+ 'available_amount_indication' => 'Gunakan jumlah ini untuk mendapatkan indikasi berapa total anggaran Anda.',
+ 'suggested' => 'Disarankan',
+ 'average_between' => 'Rata-rata antara :start dan :end',
+ 'over_budget_warn' => ' Normally you budget about :amount per day. This is :over_amount per day.',
// bills:
- 'matching_on' => 'Cocok di',
- 'between_amounts' => 'antara :low dan :high.',
- 'repeats' => 'Berulang',
- 'connected_journals' => 'Transaksi yang terhubung',
- 'auto_match_on' => 'Automatically matched by Firefly III',
- 'auto_match_off' => 'Not automatically matched by Firefly III',
- 'next_expected_match' => 'Pertandingan yang diharapkan berikutnya',
- 'delete_bill' => 'Hapus tagihan ":name"',
- 'deleted_bill' => 'Tagihan yang dihapus ":name"',
- 'edit_bill' => 'Edit tagihan ":name"',
- 'more' => 'Lebih',
- 'rescan_old' => 'Rescan transaksi lama',
- 'update_bill' => 'Perbarui tagihan',
- 'updated_bill' => 'Diperbarui tagihan ":name"',
- 'store_new_bill' => 'Simpan tagihan baru',
- 'stored_new_bill' => 'Stored tagihan baru ":name"',
- 'cannot_scan_inactive_bill' => 'Tagihan tidak aktif tidak dapat dipindai.',
- 'rescanned_bill' => 'Rescanned semuanya.',
- 'average_bill_amount_year' => 'Jumlah tagihan rata-rata (:year)',
- 'average_bill_amount_overall' => 'Jumlah tagihan rata-rata (keseluruhan)',
- 'bill_is_active' => 'Tagihan aktif',
- 'bill_expected_between' => 'Diharapkan antara :start dan :end',
- 'bill_will_automatch' => 'Tagihan akan secara otomatis terhubung ke transaksi yang sesuai',
- 'skips_over' => 'melompati',
-
+ 'matching_on' => 'Cocok di',
+ 'between_amounts' => 'antara :low dan :high.',
+ 'repeats' => 'Berulang',
+ 'connected_journals' => 'Transaksi yang terhubung',
+ 'auto_match_on' => 'Automatically matched by Firefly III',
+ 'auto_match_off' => 'Not automatically matched by Firefly III',
+ 'next_expected_match' => 'Pertandingan yang diharapkan berikutnya',
+ 'delete_bill' => 'Hapus tagihan ":name"',
+ 'deleted_bill' => 'Tagihan yang dihapus ":name"',
+ 'edit_bill' => 'Edit tagihan ":name"',
+ 'more' => 'Lebih',
+ 'rescan_old' => 'Rescan transaksi lama',
+ 'update_bill' => 'Perbarui tagihan',
+ 'updated_bill' => 'Diperbarui tagihan ":name"',
+ 'store_new_bill' => 'Simpan tagihan baru',
+ 'stored_new_bill' => 'Stored tagihan baru ":name"',
+ 'cannot_scan_inactive_bill' => 'Tagihan tidak aktif tidak dapat dipindai.',
+ 'rescanned_bill' => 'Rescanned semuanya.',
+ 'average_bill_amount_year' => 'Jumlah tagihan rata-rata (:year)',
+ 'average_bill_amount_overall' => 'Jumlah tagihan rata-rata (keseluruhan)',
+ 'bill_is_active' => 'Tagihan aktif',
+ 'bill_expected_between' => 'Diharapkan antara :start dan :end',
+ 'bill_will_automatch' => 'Tagihan akan secara otomatis terhubung ke transaksi yang sesuai',
+ 'skips_over' => 'melompati',
// accounts:
- 'details_for_asset' => 'Rincian akun aset ":name"',
- 'details_for_expense' => 'Rincian untuk akun biaya ":name"',
- 'details_for_revenue' => 'Rincian untuk akun pendapatan ":name"',
- 'details_for_cash' => 'Rincian untuk rekening kas ":name"',
- 'store_new_asset_account' => 'Simpan akun aset baru',
- 'store_new_expense_account' => 'Simpan akun pengeluaran baru',
- 'store_new_revenue_account' => 'Simpan akun pendapatan baru',
- 'edit_asset_account' => 'Edit akun aset ":name"',
- 'edit_expense_account' => 'Edit akun biaya ":name"',
- 'edit_revenue_account' => 'Edit akun pendapatan ":name"',
- 'delete_asset_account' => 'Hapus akun aset ":name"',
- 'delete_expense_account' => 'Hapus akun pengeluaran ":name"',
- 'delete_revenue_account' => 'Hapus akun pendapatan ":name"',
- 'asset_deleted' => 'Berhasil menghapus akun aset ":name"',
- 'expense_deleted' => 'Akun pengeluaran yang berhasil dihapus ":name"',
- 'revenue_deleted' => 'Berhasil menghapus akun pendapatan ":name"',
- 'update_asset_account' => 'Perbarui akun aset',
- 'update_expense_account' => 'Rekening pengeluaran pembaruan',
- 'update_revenue_account' => 'Perbarui akun pendapatan',
- 'make_new_asset_account' => 'Buat akun aset baru',
- 'make_new_expense_account' => 'Buat akun pengeluaran baru',
- 'make_new_revenue_account' => 'Buat akun pendapatan baru',
- 'asset_accounts' => 'Akun aset',
- 'expense_accounts' => 'Rekening pengeluaran',
- 'revenue_accounts' => 'Akun pendapatan',
- 'cash_accounts' => 'Akun kas',
- 'Cash account' => 'Akun kas',
- 'reconcile_account' => 'Rekonsiliasi akun ":account"',
- 'delete_reconciliation' => 'Hapus rekonsiliasi',
- 'update_reconciliation' => 'Rekonsiliasi pembaruan',
- 'amount_cannot_be_zero' => 'Jumlah tersebut tidak dapat menjadi nol',
- 'end_of_reconcile_period' => 'Akhir periode rekonsiliasi: :period',
- 'start_of_reconcile_period' => 'Mulai dari periode rekonsiliasi: :period',
- 'start_balance' => 'Saldo awal',
- 'end_balance' => 'Saldo akhir',
- 'update_balance_dates_instruction' => 'Sesuai jumlah dan tanggal di atas pernyataan bank Anda, dan tekan "Mulai rekonsiliasi"',
- 'select_transactions_instruction' => 'Pilih transaksi yang muncul di laporan bank Anda.',
- 'select_range_and_balance' => 'Pertama memverifikasi rentang tanggal dan saldo. Kemudian tekan "Mulai rekonsiliasi"',
- 'date_change_instruction' => 'Jika Anda mengubah rentang tanggal sekarang, kemajuan akan hilang.',
- 'update_selection' => 'Memperbarui pilihan',
- 'store_reconcile' => 'Rekonsiliasi toko',
- 'reconciliation_transaction' => 'Transaksi rekonsiliasi',
- 'Reconciliation' => 'Rekonsiliasi',
- 'reconciliation' => 'Rekonsiliasi',
- 'reconcile_options' => 'Pilihan rekonsiliasi',
- 'reconcile_range' => 'Jangkauan rekonsiliasi',
- 'start_reconcile' => 'Mulai rekonsiliasi',
- 'cash' => 'tunai',
- 'account_type' => 'Jenis akun',
- 'save_transactions_by_moving' => 'Menyimpan transaksi tersebut(s) dengan memindahkan mereka ke akun lain:',
- 'stored_new_account' => 'Akun baru ":name" disimpan!',
- 'updated_account' => 'Memperbarui akun ":name"',
- 'credit_card_options' => 'Pilihan kartu kredit',
- 'no_transactions_account' => 'Tidak ada transaksi (dalam periode ini) untuk akun aset ":name".',
- 'no_data_for_chart' => 'Tidak ada informasi yang cukup (belum) untuk menghasilkan grafik ini.',
- 'select_more_than_one_account' => 'Silakan pilih lebih dari satu akun',
- 'select_more_than_one_category' => 'Silakan pilih lebih dari satu kategori',
- 'select_more_than_one_budget' => 'Silakan pilih lebih dari satu anggaran',
- 'select_more_than_one_tag' => 'Silakan pilih lebih dari satu tag',
- 'account_default_currency' => 'Jika Anda memilih mata uang lain, transaksi baru dari akun ini akan memiliki mata uang ini pra-dipilih.',
- 'reconcile_has_more' => 'Buku Firefly III Anda memiliki lebih banyak uang di dalamnya dari bank Anda klaim Anda harus. Ada beberapa pilihan. Silahkan memilih apa yang harus dilakukan. Kemudian, tekan "Konfirmasi rekonsiliasi".',
- 'reconcile_has_less' => 'Buku Firefly III Anda memiliki sedikit uang di dalamnya daripada bank Anda klaim Anda harus. Ada beberapa pilihan. Silahkan memilih apa yang harus dilakukan. Kemudian, tekan "Konfirmasi rekonsiliasi".',
- 'reconcile_is_equal' => 'Buku Firefly III Anda dan pernyataan bank Anda cocok. Tidak ada hubungannya. Silahkan tekan "Konfirmasi rekonsiliasi" untuk mengkonfirmasi masukan Anda.',
- 'create_pos_reconcile_transaction' => 'Menghapus transaksi yang dipilih, dan membuat koreksi menambahkan :amount ke akun aset ini.',
- 'create_neg_reconcile_transaction' => 'Menghapus transaksi yang dipilih, dan membuat koreksi menghapus:amount dari akun aset ini.',
- 'reconcile_do_nothing' => 'Menghapus transaksi yang dipilih, tetapi tidak benar.',
- 'reconcile_go_back' => 'Anda selalu dapat mengedit atau menghapus koreksi kemudian.',
- 'must_be_asset_account' => 'Anda hanya bisa mendamaikan akun aset',
- 'reconciliation_stored' => 'Rekonsiliasi disimpan',
- 'reconcilliation_transaction_title' => 'Rekonsiliasi (:from ke :to)',
- 'reconcile_this_account' => 'Rekonsiliasi akun ini',
- 'confirm_reconciliation' => 'Konfirmasikan rekonsiliasi',
- 'submitted_start_balance' => 'Saldo awal yang dikirim',
- 'selected_transactions' => 'Transaksi yang dipilih (:count)',
- 'already_cleared_transactions' => 'Sudah dibersihkan transaksi (:count)',
- 'submitted_end_balance' => 'Saldo akhir yang dikirim',
- 'initial_balance_description' => 'Initial balance for ":account"',
+ 'details_for_asset' => 'Rincian akun aset ":name"',
+ 'details_for_expense' => 'Rincian untuk akun biaya ":name"',
+ 'details_for_revenue' => 'Rincian untuk akun pendapatan ":name"',
+ 'details_for_cash' => 'Rincian untuk rekening kas ":name"',
+ 'store_new_asset_account' => 'Simpan akun aset baru',
+ 'store_new_expense_account' => 'Simpan akun pengeluaran baru',
+ 'store_new_revenue_account' => 'Simpan akun pendapatan baru',
+ 'edit_asset_account' => 'Edit akun aset ":name"',
+ 'edit_expense_account' => 'Edit akun biaya ":name"',
+ 'edit_revenue_account' => 'Edit akun pendapatan ":name"',
+ 'delete_asset_account' => 'Hapus akun aset ":name"',
+ 'delete_expense_account' => 'Hapus akun pengeluaran ":name"',
+ 'delete_revenue_account' => 'Hapus akun pendapatan ":name"',
+ 'asset_deleted' => 'Berhasil menghapus akun aset ":name"',
+ 'expense_deleted' => 'Akun pengeluaran yang berhasil dihapus ":name"',
+ 'revenue_deleted' => 'Berhasil menghapus akun pendapatan ":name"',
+ 'update_asset_account' => 'Perbarui akun aset',
+ 'update_expense_account' => 'Rekening pengeluaran pembaruan',
+ 'update_revenue_account' => 'Perbarui akun pendapatan',
+ 'make_new_asset_account' => 'Buat akun aset baru',
+ 'make_new_expense_account' => 'Buat akun pengeluaran baru',
+ 'make_new_revenue_account' => 'Buat akun pendapatan baru',
+ 'asset_accounts' => 'Akun aset',
+ 'expense_accounts' => 'Rekening pengeluaran',
+ 'revenue_accounts' => 'Akun pendapatan',
+ 'cash_accounts' => 'Akun kas',
+ 'Cash account' => 'Akun kas',
+ 'reconcile_account' => 'Rekonsiliasi akun ":account"',
+ 'delete_reconciliation' => 'Hapus rekonsiliasi',
+ 'update_reconciliation' => 'Rekonsiliasi pembaruan',
+ 'amount_cannot_be_zero' => 'Jumlah tersebut tidak dapat menjadi nol',
+ 'end_of_reconcile_period' => 'Akhir periode rekonsiliasi: :period',
+ 'start_of_reconcile_period' => 'Mulai dari periode rekonsiliasi: :period',
+ 'start_balance' => 'Saldo awal',
+ 'end_balance' => 'Saldo akhir',
+ 'update_balance_dates_instruction' => 'Sesuai jumlah dan tanggal di atas pernyataan bank Anda, dan tekan "Mulai rekonsiliasi"',
+ 'select_transactions_instruction' => 'Pilih transaksi yang muncul di laporan bank Anda.',
+ 'select_range_and_balance' => 'Pertama memverifikasi rentang tanggal dan saldo. Kemudian tekan "Mulai rekonsiliasi"',
+ 'date_change_instruction' => 'Jika Anda mengubah rentang tanggal sekarang, kemajuan akan hilang.',
+ 'update_selection' => 'Memperbarui pilihan',
+ 'store_reconcile' => 'Rekonsiliasi toko',
+ 'reconciliation_transaction' => 'Transaksi rekonsiliasi',
+ 'Reconciliation' => 'Rekonsiliasi',
+ 'reconciliation' => 'Rekonsiliasi',
+ 'reconcile_options' => 'Pilihan rekonsiliasi',
+ 'reconcile_range' => 'Jangkauan rekonsiliasi',
+ 'start_reconcile' => 'Mulai rekonsiliasi',
+ 'cash' => 'tunai',
+ 'account_type' => 'Jenis akun',
+ 'save_transactions_by_moving' => 'Menyimpan transaksi tersebut(s) dengan memindahkan mereka ke akun lain:',
+ 'stored_new_account' => 'Akun baru ":name" disimpan!',
+ 'updated_account' => 'Memperbarui akun ":name"',
+ 'credit_card_options' => 'Pilihan kartu kredit',
+ 'no_transactions_account' => 'Tidak ada transaksi (dalam periode ini) untuk akun aset ":name".',
+ 'no_data_for_chart' => 'Tidak ada informasi yang cukup (belum) untuk menghasilkan grafik ini.',
+ 'select_more_than_one_account' => 'Silakan pilih lebih dari satu akun',
+ 'select_more_than_one_category' => 'Silakan pilih lebih dari satu kategori',
+ 'select_more_than_one_budget' => 'Silakan pilih lebih dari satu anggaran',
+ 'select_more_than_one_tag' => 'Silakan pilih lebih dari satu tag',
+ 'account_default_currency' => 'Jika Anda memilih mata uang lain, transaksi baru dari akun ini akan memiliki mata uang ini pra-dipilih.',
+ 'reconcile_has_more' => 'Buku Firefly III Anda memiliki lebih banyak uang di dalamnya dari bank Anda klaim Anda harus. Ada beberapa pilihan. Silahkan memilih apa yang harus dilakukan. Kemudian, tekan "Konfirmasi rekonsiliasi".',
+ 'reconcile_has_less' => 'Buku Firefly III Anda memiliki sedikit uang di dalamnya daripada bank Anda klaim Anda harus. Ada beberapa pilihan. Silahkan memilih apa yang harus dilakukan. Kemudian, tekan "Konfirmasi rekonsiliasi".',
+ 'reconcile_is_equal' => 'Buku Firefly III Anda dan pernyataan bank Anda cocok. Tidak ada hubungannya. Silahkan tekan "Konfirmasi rekonsiliasi" untuk mengkonfirmasi masukan Anda.',
+ 'create_pos_reconcile_transaction' => 'Menghapus transaksi yang dipilih, dan membuat koreksi menambahkan :amount ke akun aset ini.',
+ 'create_neg_reconcile_transaction' => 'Menghapus transaksi yang dipilih, dan membuat koreksi menghapus:amount dari akun aset ini.',
+ 'reconcile_do_nothing' => 'Menghapus transaksi yang dipilih, tetapi tidak benar.',
+ 'reconcile_go_back' => 'Anda selalu dapat mengedit atau menghapus koreksi kemudian.',
+ 'must_be_asset_account' => 'Anda hanya bisa mendamaikan akun aset',
+ 'reconciliation_stored' => 'Rekonsiliasi disimpan',
+ 'reconcilliation_transaction_title' => 'Rekonsiliasi (:from ke :to)',
+ 'reconcile_this_account' => 'Rekonsiliasi akun ini',
+ 'confirm_reconciliation' => 'Konfirmasikan rekonsiliasi',
+ 'submitted_start_balance' => 'Saldo awal yang dikirim',
+ 'selected_transactions' => 'Transaksi yang dipilih (:count)',
+ 'already_cleared_transactions' => 'Sudah dibersihkan transaksi (:count)',
+ 'submitted_end_balance' => 'Saldo akhir yang dikirim',
+ 'initial_balance_description' => 'Initial balance for ":account"',
// categories:
- 'new_category' => 'Kategori baru',
- 'create_new_category' => 'Buat kategori baru',
- 'without_category' => 'Tanpa kategori',
- 'update_category' => 'Perbarui kategori',
- 'updated_category' => 'Kategori yang Diperbarui ":name"',
- 'categories' => 'Kategori',
- 'edit_category' => 'Edit kategori ":name"',
- 'no_category' => '(tidak ada kategori)',
- 'category' => 'Kategori',
- 'delete_category' => 'Hapus kategori ":name"',
- 'deleted_category' => 'Kategori yang dihapus ":name"',
- 'store_category' => 'Simpan kategori baru',
- 'stored_category' => 'Stored new category ":name"',
- 'without_category_between' => 'Tanpa kategori antara :start dan :end',
+ 'new_category' => 'Kategori baru',
+ 'create_new_category' => 'Buat kategori baru',
+ 'without_category' => 'Tanpa kategori',
+ 'update_category' => 'Perbarui kategori',
+ 'updated_category' => 'Kategori yang Diperbarui ":name"',
+ 'categories' => 'Kategori',
+ 'edit_category' => 'Edit kategori ":name"',
+ 'no_category' => '(tidak ada kategori)',
+ 'category' => 'Kategori',
+ 'delete_category' => 'Hapus kategori ":name"',
+ 'deleted_category' => 'Kategori yang dihapus ":name"',
+ 'store_category' => 'Simpan kategori baru',
+ 'stored_category' => 'Stored new category ":name"',
+ 'without_category_between' => 'Tanpa kategori antara :start dan :end',
// transactions:
- 'update_withdrawal' => 'Perbarui penarikan',
- 'update_deposit' => 'Perbarui setoran',
- 'update_transfer' => 'Perbarui transfer',
- 'updated_withdrawal' => 'Penarikan yang telah diupdate ":description"',
- 'updated_deposit' => 'Deposit Diperbarui ":description"',
- 'updated_transfer' => 'Transfer yang diperbarui ":description"',
- 'delete_withdrawal' => 'Hapus penarikan ":description"',
- 'delete_deposit' => 'Hapus deposit ":description"',
- 'delete_transfer' => 'Hapus transfer ":description"',
- 'deleted_withdrawal' => 'Penarikan yang berhasil dihapus ":description"',
- 'deleted_deposit' => 'Berhasil menghapus deposit ":description"',
- 'deleted_transfer' => 'Berhasil menghapus transfer ":description"',
- 'stored_journal' => 'Berhasil membuat transaksi baru ":description"',
- 'select_transactions' => 'Pilih transaksi',
- 'rule_group_select_transactions' => 'Terapkan ":title" untuk transaksi',
- 'rule_select_transactions' => 'Terapkan ":title" untuk transaksi',
- 'stop_selection' => 'Berhentilah memilih transaksi',
- 'reconcile_selected' => 'Mendamaikan',
- 'mass_delete_journals' => 'Hapus sejumlah transaksi',
- 'mass_edit_journals' => 'Edit sejumlah transaksi',
- 'mass_bulk_journals' => 'Bulk edit a number of transactions',
- 'mass_bulk_journals_explain' => 'If you do not want to change your transactions one-by-one using the mass-edit function, you can update them in one go. Simply select the preferred category, tag(s) or budget in the fields below, and all the transactions in the table will be updated.',
- 'bulk_set_new_values' => 'Use the inputs below to set new values. If you leave them empty, they will be made empty for all. Also, note that only withdrawals will be given a budget.',
- 'no_bulk_category' => 'Don\'t update category',
- 'no_bulk_budget' => 'Don\'t update budget',
- 'no_bulk_tags' => 'Don\'t update tag(s)',
- 'bulk_edit' => 'Bulk edit',
- 'cannot_edit_other_fields' => 'Anda tidak bisa menyunting bidang lain dari yang lain di sini, karena tidak ada ruang untuk ditunjukkan kepada mereka. Ikuti tautan dan edit dengan satu per satu, jika Anda perlu mengedit bidang ini.',
- 'no_budget' => '(no budget)',
- 'no_budget_squared' => '(tidak ada anggaran)',
- 'perm-delete-many' => 'Menghapus banyak barang dalam satu go bisa sangat mengganggu. Harap berhati-hati.',
- 'mass_deleted_transactions_success' => 'Dihapus:amount transaksi.',
- 'mass_edited_transactions_success' => 'Diperbarui:amount transaksi',
- 'opt_group_no_account_type' => '(tidak ada jenis akun)',
- 'opt_group_defaultAsset' => 'Akun aset standar',
- 'opt_group_savingAsset' => 'Menyimpan akun',
- 'opt_group_sharedAsset' => 'Akun aset bersama',
- 'opt_group_ccAsset' => 'Kartu kredit',
- 'notes' => 'Notes',
+ 'update_withdrawal' => 'Perbarui penarikan',
+ 'update_deposit' => 'Perbarui setoran',
+ 'update_transfer' => 'Perbarui transfer',
+ 'updated_withdrawal' => 'Penarikan yang telah diupdate ":description"',
+ 'updated_deposit' => 'Deposit Diperbarui ":description"',
+ 'updated_transfer' => 'Transfer yang diperbarui ":description"',
+ 'delete_withdrawal' => 'Hapus penarikan ":description"',
+ 'delete_deposit' => 'Hapus deposit ":description"',
+ 'delete_transfer' => 'Hapus transfer ":description"',
+ 'deleted_withdrawal' => 'Penarikan yang berhasil dihapus ":description"',
+ 'deleted_deposit' => 'Berhasil menghapus deposit ":description"',
+ 'deleted_transfer' => 'Berhasil menghapus transfer ":description"',
+ 'stored_journal' => 'Berhasil membuat transaksi baru ":description"',
+ 'select_transactions' => 'Pilih transaksi',
+ 'rule_group_select_transactions' => 'Terapkan ":title" untuk transaksi',
+ 'rule_select_transactions' => 'Terapkan ":title" untuk transaksi',
+ 'stop_selection' => 'Berhentilah memilih transaksi',
+ 'reconcile_selected' => 'Mendamaikan',
+ 'mass_delete_journals' => 'Hapus sejumlah transaksi',
+ 'mass_edit_journals' => 'Edit sejumlah transaksi',
+ 'mass_bulk_journals' => 'Bulk edit a number of transactions',
+ 'mass_bulk_journals_explain' => 'If you do not want to change your transactions one-by-one using the mass-edit function, you can update them in one go. Simply select the preferred category, tag(s) or budget in the fields below, and all the transactions in the table will be updated.',
+ 'bulk_set_new_values' => 'Use the inputs below to set new values. If you leave them empty, they will be made empty for all. Also, note that only withdrawals will be given a budget.',
+ 'no_bulk_category' => 'Don\'t update category',
+ 'no_bulk_budget' => 'Don\'t update budget',
+ 'no_bulk_tags' => 'Don\'t update tag(s)',
+ 'bulk_edit' => 'Bulk edit',
+ 'cannot_edit_other_fields' => 'Anda tidak bisa menyunting bidang lain dari yang lain di sini, karena tidak ada ruang untuk ditunjukkan kepada mereka. Ikuti tautan dan edit dengan satu per satu, jika Anda perlu mengedit bidang ini.',
+ 'no_budget' => '(no budget)',
+ 'no_budget_squared' => '(tidak ada anggaran)',
+ 'perm-delete-many' => 'Menghapus banyak barang dalam satu go bisa sangat mengganggu. Harap berhati-hati.',
+ 'mass_deleted_transactions_success' => 'Dihapus:amount transaksi.',
+ 'mass_edited_transactions_success' => 'Diperbarui:amount transaksi',
+ 'opt_group_no_account_type' => '(tidak ada jenis akun)',
+ 'opt_group_defaultAsset' => 'Akun aset standar',
+ 'opt_group_savingAsset' => 'Menyimpan akun',
+ 'opt_group_sharedAsset' => 'Akun aset bersama',
+ 'opt_group_ccAsset' => 'Kartu kredit',
+ 'notes' => 'Notes',
// new user:
- 'welcome' => 'Welcome to Firefly III!',
- 'submit' => 'Menyerahkan',
- 'getting_started' => 'Mulai',
- 'to_get_started' => 'Senang melihat Anda berhasil memasang Firefly III. Untuk memulai dengan alat ini, harap masukkan nama bank dan saldo rekening giro utama Anda. Jangan khawatir jika Anda memiliki banyak akun. Anda bisa menambahkannya nanti. Hanya saja Firefly III butuh sesuatu untuk memulai.',
- 'savings_balance_text' => 'Firefly III secara otomatis akan membuat rekening tabungan untuk Anda. Secara default, tidak akan ada uang di rekening tabungan Anda, tapi jika Anda memberi tahu Firefly III, saldo itu akan disimpan seperti itu.',
- 'finish_up_new_user' => 'Itu dia! Anda dapat melanjutkan dengan menekan Kirim. Anda akan dibawa ke indeks Firefly III.',
- 'stored_new_accounts_new_user' => 'Yay! Akun baru Anda telah disimpan.',
+ 'welcome' => 'Welcome to Firefly III!',
+ 'submit' => 'Menyerahkan',
+ 'getting_started' => 'Mulai',
+ 'to_get_started' => 'Senang melihat Anda berhasil memasang Firefly III. Untuk memulai dengan alat ini, harap masukkan nama bank dan saldo rekening giro utama Anda. Jangan khawatir jika Anda memiliki banyak akun. Anda bisa menambahkannya nanti. Hanya saja Firefly III butuh sesuatu untuk memulai.',
+ 'savings_balance_text' => 'Firefly III secara otomatis akan membuat rekening tabungan untuk Anda. Secara default, tidak akan ada uang di rekening tabungan Anda, tapi jika Anda memberi tahu Firefly III, saldo itu akan disimpan seperti itu.',
+ 'finish_up_new_user' => 'Itu dia! Anda dapat melanjutkan dengan menekan Kirim. Anda akan dibawa ke indeks Firefly III.',
+ 'stored_new_accounts_new_user' => 'Yay! Akun baru Anda telah disimpan.',
// home page:
- 'yourAccounts' => 'Akun anda',
- 'budgetsAndSpending' => 'Anggaran dan belanja',
- 'savings' => 'Tabungan',
- 'newWithdrawal' => 'Biaya baru',
- 'newDeposit' => 'Deposit baru',
- 'newTransfer' => 'Transfer baru',
- 'bills_to_pay' => 'Bills untuk membayar',
- 'per_day' => 'Per hari',
- 'left_to_spend_per_day' => 'Kiri untuk dibelanjakan per hari',
- 'bills_paid' => 'Tagihan dibayar',
+ 'yourAccounts' => 'Akun anda',
+ 'budgetsAndSpending' => 'Anggaran dan belanja',
+ 'savings' => 'Tabungan',
+ 'newWithdrawal' => 'Biaya baru',
+ 'newDeposit' => 'Deposit baru',
+ 'newTransfer' => 'Transfer baru',
+ 'bills_to_pay' => 'Bills untuk membayar',
+ 'per_day' => 'Per hari',
+ 'left_to_spend_per_day' => 'Kiri untuk dibelanjakan per hari',
+ 'bills_paid' => 'Tagihan dibayar',
// menu and titles, should be recycled as often as possible:
- 'currency' => 'Mata uang',
- 'preferences' => 'Preferensi',
- 'logout' => 'Keluar',
- 'toggleNavigation' => 'Toggle navigation',
- 'searchPlaceholder' => 'Pencarian...',
- 'version' => 'Versi',
- 'dashboard' => 'Dasbor',
- 'currencies' => 'Mata uang',
- 'accounts' => 'Akun',
- 'Asset account' => 'Akun aset',
- 'Default account' => 'Akun aset',
- 'Expense account' => 'Rekening pengeluaran',
- 'Revenue account' => 'Akun pendapatan',
- 'Initial balance account' => 'Akun saldo awal',
- 'budgets' => 'Anggaran',
- 'tags' => 'Tag',
- 'reports' => 'Laporan',
- 'transactions' => 'Transaksi',
- 'expenses' => 'Beban',
- 'income' => 'Pendapatan / penghasilan',
- 'transfers' => 'Transfer',
- 'moneyManagement' => 'Manajemen keuangan',
- 'piggyBanks' => 'Celengan babi',
- 'bills' => 'Tagihan',
- 'withdrawal' => 'Penarikan',
- 'opening_balance' => 'Saldo awal',
- 'deposit' => 'Deposito',
- 'account' => 'Rekening',
- 'transfer' => 'Transfer',
- 'Withdrawal' => 'Penarikan',
- 'Deposit' => 'Deposit',
- 'Transfer' => 'Transfer',
- 'bill' => 'Tagihan',
- 'yes' => 'Iya',
- 'no' => 'Tidak',
- 'amount' => 'Jumlah',
- 'overview' => 'Ikhtisar',
- 'saveOnAccount' => 'Simpan di rekening',
- 'unknown' => 'Tidak diketahui',
- 'daily' => 'Harian',
- 'monthly' => 'Bulanan',
- 'profile' => 'Profil',
- 'errors' => 'Kesalahan',
+ 'currency' => 'Mata uang',
+ 'preferences' => 'Preferensi',
+ 'logout' => 'Keluar',
+ 'toggleNavigation' => 'Toggle navigation',
+ 'searchPlaceholder' => 'Pencarian...',
+ 'version' => 'Versi',
+ 'dashboard' => 'Dasbor',
+ 'currencies' => 'Mata uang',
+ 'accounts' => 'Akun',
+ 'Asset account' => 'Akun aset',
+ 'Default account' => 'Akun aset',
+ 'Expense account' => 'Rekening pengeluaran',
+ 'Revenue account' => 'Akun pendapatan',
+ 'Initial balance account' => 'Akun saldo awal',
+ 'budgets' => 'Anggaran',
+ 'tags' => 'Tag',
+ 'reports' => 'Laporan',
+ 'transactions' => 'Transaksi',
+ 'expenses' => 'Beban',
+ 'income' => 'Pendapatan / penghasilan',
+ 'transfers' => 'Transfer',
+ 'moneyManagement' => 'Manajemen keuangan',
+ 'piggyBanks' => 'Celengan babi',
+ 'bills' => 'Tagihan',
+ 'withdrawal' => 'Penarikan',
+ 'opening_balance' => 'Saldo awal',
+ 'deposit' => 'Deposito',
+ 'account' => 'Rekening',
+ 'transfer' => 'Transfer',
+ 'Withdrawal' => 'Penarikan',
+ 'Deposit' => 'Deposit',
+ 'Transfer' => 'Transfer',
+ 'bill' => 'Tagihan',
+ 'yes' => 'Iya',
+ 'no' => 'Tidak',
+ 'amount' => 'Jumlah',
+ 'overview' => 'Ikhtisar',
+ 'saveOnAccount' => 'Simpan di rekening',
+ 'unknown' => 'Tidak diketahui',
+ 'daily' => 'Harian',
+ 'monthly' => 'Bulanan',
+ 'profile' => 'Profil',
+ 'errors' => 'Kesalahan',
// reports:
- 'report_default' => 'Laporan keuangan standar antara :start dan :end',
- 'report_audit' => 'Ikhtisar riwayat transaksi antara :start dan :end',
- 'report_category' => 'Kategori laporan antara :start dan :end',
- 'report_account' => 'Laporan biaya / pendapatan antara :start dan :end',
- 'report_budget' => 'Laporan anggaran antara :start dan :end',
- 'report_tag' => 'Tag laporan antara :start dan :end',
- 'quick_link_reports' => 'Tautan langsung',
- 'quick_link_default_report' => 'Laporan keuangan standar',
- 'quick_link_audit_report' => 'Ikhtisar sejarah transaksi',
- 'report_this_month_quick' => 'Bulan ini, semua akun',
- 'report_this_year_quick' => 'Tahun berjalan, semua akun',
- 'report_this_fiscal_year_quick' => 'Tahun fiskal berjalan, semua akun',
- 'report_all_time_quick' => 'Semua waktu, semua akun',
- 'reports_can_bookmark' => 'Ingat bahwa laporan bisa di bookmark.',
- 'incomeVsExpenses' => 'Penghasilan vs beban',
- 'accountBalances' => 'Saldo akun',
- 'balanceStart' => 'Saldo awal periode',
- 'balanceEnd' => 'Saldo akhir periode',
- 'splitByAccount' => 'Dibagi oleh akun',
- 'coveredWithTags' => 'Ditutupi dengan tag',
- 'leftUnbalanced' => 'Meninggalkan tidak seimbang',
- 'leftInBudget' => 'Yang tersisa di anggaran',
- 'sumOfSums' => 'Jumlah dari jumlah',
- 'noCategory' => '(Tidak ada kategori)',
- 'notCharged' => 'Tidak dikenakan biaya (belum)',
- 'inactive' => 'Tidak-aktif',
- 'active' => 'Aktif',
- 'difference' => 'Perbedaan',
- 'money_flowing_in' => 'Dalam',
- 'money_flowing_out' => 'Keluar',
- 'topX' => 'atas :number',
- 'show_full_list' => 'Tampilkan seluruh daftar',
- 'show_only_top' => 'Tampilkan hanya atas :number',
- 'report_type' => 'Tipe laporan',
- 'report_type_default' => 'Laporan keuangan standar',
- 'report_type_audit' => 'Gambaran riwayat transaksi (audit)',
- 'report_type_category' => 'Laporan Kategori',
- 'report_type_budget' => 'Laporan anggaran',
- 'report_type_tag' => 'Tag laporan',
- 'report_type_account' => 'Laporan akun/pendapatan Beban',
- 'more_info_help' => 'Informasi lebih lanjut tentang jenis laporan dapat ditemukan di halaman bantuan. Tekan ikon (?) Di sudut kanan atas.',
- 'report_included_accounts' => 'Termasuk akun',
- 'report_date_range' => 'Rentang tanggal',
- 'report_preset_ranges' => 'Rentang pre-set',
- 'shared' => 'Bagikan',
- 'fiscal_year' => 'Tahun fiskal',
- 'income_entry' => 'Penghasilan dari akun ":name" antara :start dan :end',
- 'expense_entry' => 'Biaya untuk akun ":name" antara :start dan :end',
- 'category_entry' => 'Biaya dalam kategori ":name" antara :start dan :end',
- 'budget_spent_amount' => 'Biaya anggaran ":budget" antara :start dan :end',
- 'balance_amount' => 'Biaya dalam anggaran ":budget" dibayar dari rekening ":account" antara :start dan :end',
- 'no_audit_activity' => 'Tidak ada aktivitas yang tercatat dalam akun :account_name antara :start and :end.',
- 'audit_end_balance' => 'Saldo akun :account_name di akhir :end adalah :balance',
- 'reports_extra_options' => 'Pilihan ekstra',
- 'report_has_no_extra_options' => 'Laporan ini tidak memiliki pilihan tambahan',
- 'reports_submit' => 'Melihat laporan',
- 'end_after_start_date' => 'Tanggal akhir laporan harus setelah tanggal mulai.',
- 'select_category' => 'Pilih kategori (ies)',
- 'select_budget' => 'Pilih anggaran.',
- 'select_tag' => 'Pilih tag.',
- 'income_per_category' => 'Pendapatan per kategori',
- 'expense_per_category' => 'Biaya per kategori',
- 'expense_per_budget' => 'Biaya per anggaran',
- 'income_per_account' => 'Pendapatan per rekening',
- 'expense_per_account' => 'Biaya per akun',
- 'expense_per_tag' => 'Biaya per tag',
- 'income_per_tag' => 'Penghasilan per tag',
- 'include_expense_not_in_budget' => 'Termasuk biaya tidak dalam anggaran yang dipilih',
- 'include_expense_not_in_account' => 'Termasuk biaya yang tidak termasuk dalam akun yang dipilih',
- 'include_expense_not_in_category' => 'Termasuk biaya yang tidak termasuk dalam kategori yang dipilih',
- 'include_income_not_in_category' => 'Termasuk pendapatan tidak dalam kategori yang dipilih (ies)',
- 'include_income_not_in_account' => 'Termasuk pendapatan tidak dalam akun yang dipilih(s)',
- 'include_income_not_in_tags' => 'Termasuk pendapatan tidak dalam tag yang dipilih',
- 'include_expense_not_in_tags' => 'Termasuk biaya yang tidak termasuk dalam tag yang dipilih',
- 'everything_else' => 'Yang lainnya',
- 'income_and_expenses' => 'Penghasilan dan beban',
- 'spent_average' => 'Menghabiskan (rata-rata)',
- 'income_average' => 'Penghasilan (rata-rata)',
- 'transaction_count' => 'Jumlah transaksi',
- 'average_spending_per_account' => 'Rata-rata pengeluaran per akun',
- 'average_income_per_account' => 'Pendapatan rata-rata per rekening',
- 'total' => 'Total',
- 'description' => 'Deskripsi',
- 'sum_of_period' => 'Jumlah periode',
- 'average_in_period' => 'Rata-rata dalam periode',
- 'account_role_defaultAsset' => 'Akun aset standar',
- 'account_role_sharedAsset' => 'Akun aset bersama',
- 'account_role_savingAsset' => 'Rekening tabungan',
- 'account_role_ccAsset' => 'Kartu kredit',
- 'budget_chart_click' => 'Silahkan klik nama anggaran pada tabel di atas untuk melihat grafik.',
- 'category_chart_click' => 'Silahkan klik pada nama kategori pada tabel di atas untuk melihat grafik.',
- 'in_out_accounts' => 'Diperoleh dan dihabiskan per kombinasi',
- 'in_out_per_category' => 'Diperoleh dan dibelanjakan per kategori',
- 'out_per_budget' => 'Menghabiskan per anggaran',
- 'select_expense_revenue' => 'Pilih akun biaya / pendapatan',
+ 'report_default' => 'Laporan keuangan standar antara :start dan :end',
+ 'report_audit' => 'Ikhtisar riwayat transaksi antara :start dan :end',
+ 'report_category' => 'Kategori laporan antara :start dan :end',
+ 'report_account' => 'Laporan biaya / pendapatan antara :start dan :end',
+ 'report_budget' => 'Laporan anggaran antara :start dan :end',
+ 'report_tag' => 'Tag laporan antara :start dan :end',
+ 'quick_link_reports' => 'Tautan langsung',
+ 'quick_link_default_report' => 'Laporan keuangan standar',
+ 'quick_link_audit_report' => 'Ikhtisar sejarah transaksi',
+ 'report_this_month_quick' => 'Bulan ini, semua akun',
+ 'report_this_year_quick' => 'Tahun berjalan, semua akun',
+ 'report_this_fiscal_year_quick' => 'Tahun fiskal berjalan, semua akun',
+ 'report_all_time_quick' => 'Semua waktu, semua akun',
+ 'reports_can_bookmark' => 'Ingat bahwa laporan bisa di bookmark.',
+ 'incomeVsExpenses' => 'Penghasilan vs beban',
+ 'accountBalances' => 'Saldo akun',
+ 'balanceStart' => 'Saldo awal periode',
+ 'balanceEnd' => 'Saldo akhir periode',
+ 'splitByAccount' => 'Dibagi oleh akun',
+ 'coveredWithTags' => 'Ditutupi dengan tag',
+ 'leftUnbalanced' => 'Meninggalkan tidak seimbang',
+ 'leftInBudget' => 'Yang tersisa di anggaran',
+ 'sumOfSums' => 'Jumlah dari jumlah',
+ 'noCategory' => '(Tidak ada kategori)',
+ 'notCharged' => 'Tidak dikenakan biaya (belum)',
+ 'inactive' => 'Tidak-aktif',
+ 'active' => 'Aktif',
+ 'difference' => 'Perbedaan',
+ 'money_flowing_in' => 'Dalam',
+ 'money_flowing_out' => 'Keluar',
+ 'topX' => 'atas :number',
+ 'show_full_list' => 'Tampilkan seluruh daftar',
+ 'show_only_top' => 'Tampilkan hanya atas :number',
+ 'report_type' => 'Tipe laporan',
+ 'report_type_default' => 'Laporan keuangan standar',
+ 'report_type_audit' => 'Gambaran riwayat transaksi (audit)',
+ 'report_type_category' => 'Laporan Kategori',
+ 'report_type_budget' => 'Laporan anggaran',
+ 'report_type_tag' => 'Tag laporan',
+ 'report_type_account' => 'Laporan akun/pendapatan Beban',
+ 'more_info_help' => 'Informasi lebih lanjut tentang jenis laporan dapat ditemukan di halaman bantuan. Tekan ikon (?) Di sudut kanan atas.',
+ 'report_included_accounts' => 'Termasuk akun',
+ 'report_date_range' => 'Rentang tanggal',
+ 'report_preset_ranges' => 'Rentang pre-set',
+ 'shared' => 'Bagikan',
+ 'fiscal_year' => 'Tahun fiskal',
+ 'income_entry' => 'Penghasilan dari akun ":name" antara :start dan :end',
+ 'expense_entry' => 'Biaya untuk akun ":name" antara :start dan :end',
+ 'category_entry' => 'Biaya dalam kategori ":name" antara :start dan :end',
+ 'budget_spent_amount' => 'Biaya anggaran ":budget" antara :start dan :end',
+ 'balance_amount' => 'Biaya dalam anggaran ":budget" dibayar dari rekening ":account" antara :start dan :end',
+ 'no_audit_activity' => 'Tidak ada aktivitas yang tercatat dalam akun :account_name antara :start and :end.',
+ 'audit_end_balance' => 'Saldo akun :account_name di akhir :end adalah :balance',
+ 'reports_extra_options' => 'Pilihan ekstra',
+ 'report_has_no_extra_options' => 'Laporan ini tidak memiliki pilihan tambahan',
+ 'reports_submit' => 'Melihat laporan',
+ 'end_after_start_date' => 'Tanggal akhir laporan harus setelah tanggal mulai.',
+ 'select_category' => 'Pilih kategori (ies)',
+ 'select_budget' => 'Pilih anggaran.',
+ 'select_tag' => 'Pilih tag.',
+ 'income_per_category' => 'Pendapatan per kategori',
+ 'expense_per_category' => 'Biaya per kategori',
+ 'expense_per_budget' => 'Biaya per anggaran',
+ 'income_per_account' => 'Pendapatan per rekening',
+ 'expense_per_account' => 'Biaya per akun',
+ 'expense_per_tag' => 'Biaya per tag',
+ 'income_per_tag' => 'Penghasilan per tag',
+ 'include_expense_not_in_budget' => 'Termasuk biaya tidak dalam anggaran yang dipilih',
+ 'include_expense_not_in_account' => 'Termasuk biaya yang tidak termasuk dalam akun yang dipilih',
+ 'include_expense_not_in_category' => 'Termasuk biaya yang tidak termasuk dalam kategori yang dipilih',
+ 'include_income_not_in_category' => 'Termasuk pendapatan tidak dalam kategori yang dipilih (ies)',
+ 'include_income_not_in_account' => 'Termasuk pendapatan tidak dalam akun yang dipilih(s)',
+ 'include_income_not_in_tags' => 'Termasuk pendapatan tidak dalam tag yang dipilih',
+ 'include_expense_not_in_tags' => 'Termasuk biaya yang tidak termasuk dalam tag yang dipilih',
+ 'everything_else' => 'Yang lainnya',
+ 'income_and_expenses' => 'Penghasilan dan beban',
+ 'spent_average' => 'Menghabiskan (rata-rata)',
+ 'income_average' => 'Penghasilan (rata-rata)',
+ 'transaction_count' => 'Jumlah transaksi',
+ 'average_spending_per_account' => 'Rata-rata pengeluaran per akun',
+ 'average_income_per_account' => 'Pendapatan rata-rata per rekening',
+ 'total' => 'Total',
+ 'description' => 'Deskripsi',
+ 'sum_of_period' => 'Jumlah periode',
+ 'average_in_period' => 'Rata-rata dalam periode',
+ 'account_role_defaultAsset' => 'Akun aset standar',
+ 'account_role_sharedAsset' => 'Akun aset bersama',
+ 'account_role_savingAsset' => 'Rekening tabungan',
+ 'account_role_ccAsset' => 'Kartu kredit',
+ 'budget_chart_click' => 'Silahkan klik nama anggaran pada tabel di atas untuk melihat grafik.',
+ 'category_chart_click' => 'Silahkan klik pada nama kategori pada tabel di atas untuk melihat grafik.',
+ 'in_out_accounts' => 'Diperoleh dan dihabiskan per kombinasi',
+ 'in_out_per_category' => 'Diperoleh dan dibelanjakan per kategori',
+ 'out_per_budget' => 'Menghabiskan per anggaran',
+ 'select_expense_revenue' => 'Pilih akun biaya / pendapatan',
// charts:
- 'chart' => 'Grafik',
- 'month' => 'Bulan',
- 'budget' => 'Anggaran',
- 'spent' => 'Menghabiskan',
- 'spent_in_budget' => 'Menghabiskan anggaran',
- 'left_to_spend' => 'Kiri untuk dibelanjakan',
- 'earned' => 'Diperoleh',
- 'overspent' => 'Overspent',
- 'left' => 'Kiri',
- 'max-amount' => 'Jumlah maksimum',
- 'min-amount' => 'Jumlah Minumum',
- 'journal-amount' => 'Entri tagihan saat ini',
- 'name' => 'Nama',
- 'date' => 'Tanggal',
- 'paid' => 'Dibayar',
- 'unpaid' => 'Tidak dibayar',
- 'day' => 'Hari',
- 'budgeted' => 'Dianggarkan',
- 'period' => 'Periode',
- 'balance' => 'Keseimbangan',
- 'sum' => 'Jumlah',
- 'average' => 'Rata-rata',
- 'balanceFor' => 'Saldo untuk :name',
+ 'chart' => 'Grafik',
+ 'month' => 'Bulan',
+ 'budget' => 'Anggaran',
+ 'spent' => 'Menghabiskan',
+ 'spent_in_budget' => 'Menghabiskan anggaran',
+ 'left_to_spend' => 'Kiri untuk dibelanjakan',
+ 'earned' => 'Diperoleh',
+ 'overspent' => 'Overspent',
+ 'left' => 'Kiri',
+ 'max-amount' => 'Jumlah maksimum',
+ 'min-amount' => 'Jumlah Minumum',
+ 'journal-amount' => 'Entri tagihan saat ini',
+ 'name' => 'Nama',
+ 'date' => 'Tanggal',
+ 'paid' => 'Dibayar',
+ 'unpaid' => 'Tidak dibayar',
+ 'day' => 'Hari',
+ 'budgeted' => 'Dianggarkan',
+ 'period' => 'Periode',
+ 'balance' => 'Keseimbangan',
+ 'sum' => 'Jumlah',
+ 'average' => 'Rata-rata',
+ 'balanceFor' => 'Saldo untuk :name',
// piggy banks:
- 'add_money_to_piggy' => 'Tambahkan uang ke celengan ":name"',
- 'piggy_bank' => 'Celengan',
- 'new_piggy_bank' => 'Celengan baru',
- 'store_piggy_bank' => 'Simpan celengan baru',
- 'stored_piggy_bank' => 'Simpan celengan baru ":name"',
- 'account_status' => 'Status akun',
- 'left_for_piggy_banks' => 'Kiri untuk celengan',
- 'sum_of_piggy_banks' => 'Jumlah celengan',
- 'saved_so_far' => 'Disimpan sejauh ini',
- 'left_to_save' => 'Kiri untuk menyimpan',
- 'suggested_amount' => 'Jumlah bulanan yang disarankan untuk disimpan',
- 'add_money_to_piggy_title' => 'Tambahkan uang ke celengan ":name"',
- 'remove_money_from_piggy_title' => 'Hapus uang dari celengan ":name"',
- 'add' => 'Menambahkan',
- 'no_money_for_piggy' => 'Anda tidak punya uang untuk dimasukkan ke dalam celengan ini.',
+ 'add_money_to_piggy' => 'Tambahkan uang ke celengan ":name"',
+ 'piggy_bank' => 'Celengan',
+ 'new_piggy_bank' => 'Celengan baru',
+ 'store_piggy_bank' => 'Simpan celengan baru',
+ 'stored_piggy_bank' => 'Simpan celengan baru ":name"',
+ 'account_status' => 'Status akun',
+ 'left_for_piggy_banks' => 'Kiri untuk celengan',
+ 'sum_of_piggy_banks' => 'Jumlah celengan',
+ 'saved_so_far' => 'Disimpan sejauh ini',
+ 'left_to_save' => 'Kiri untuk menyimpan',
+ 'suggested_amount' => 'Jumlah bulanan yang disarankan untuk disimpan',
+ 'add_money_to_piggy_title' => 'Tambahkan uang ke celengan ":name"',
+ 'remove_money_from_piggy_title' => 'Hapus uang dari celengan ":name"',
+ 'add' => 'Menambahkan',
+ 'no_money_for_piggy' => 'Anda tidak punya uang untuk dimasukkan ke dalam celengan ini.',
'remove' => 'Menghapus',
'max_amount_add' => 'Jumlah maksimum yang bisa Anda tambahkan adalah',
@@ -1084,6 +1086,7 @@ return [
'invalid_link_selection' => 'Tidak dapat menautkan transaksi ini',
'journals_linked' => 'Transaksi terkait.',
'journals_error_linked' => 'Transaksi ini sudah tertaut.',
+ 'journals_link_to_self' => 'You cannot link a transaction to itself',
'journal_links' => 'Link transaksi',
'this_withdrawal' => 'Penarikan ini',
'this_deposit' => 'Deposit ini',
diff --git a/resources/lang/id_ID/form.php b/resources/lang/id_ID/form.php
index 1842886da6..91bd88422e 100644
--- a/resources/lang/id_ID/form.php
+++ b/resources/lang/id_ID/form.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// new user:
diff --git a/resources/lang/id_ID/import.php b/resources/lang/id_ID/import.php
index 6e1c02c83c..762939879f 100644
--- a/resources/lang/id_ID/import.php
+++ b/resources/lang/id_ID/import.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
// status of import:
@@ -97,6 +98,7 @@ return [
// not csv, but normal warning
'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.',
'foreign_amount_warning' => 'If you mark a column as containing an amount in a foreign currency, you must also set the column that contains which currency it is.',
+
// file, map data
'file_map_title' => 'Pengaturan impor (4/4) - Sambungkan data impor ke data Firefly III',
'file_map_text' => 'Pada tabel berikut, nilai kiri menunjukkan informasi yang Anda temukan di file yang Anda upload. Adalah tugas Anda untuk memetakan nilai ini, jika mungkin, ke nilai yang sudah ada di database Anda. Firefly akan menempel pada pemetaan ini. Jika tidak ada nilai untuk dipetakan, atau Anda tidak ingin memetakan nilai spesifiknya, pilih yang tidak ada.',
@@ -131,28 +133,40 @@ return [
'column_date-book' => 'Tanggal pemesanan transaksi',
'column_date-process' => 'Tanggal proses transaksi',
'column_date-transaction' => 'Tanggal',
+ 'column_date-due' => 'Transaction due date',
+ 'column_date-payment' => 'Transaction payment date',
+ 'column_date-invoice' => 'Transaction invoice date',
'column_description' => 'Deskripsi',
'column_opposing-iban' => 'Akun lawan (IBAN)',
+ 'column_opposing-bic' => 'Opposing account (BIC)',
'column_opposing-id' => 'Opposing account ID (matching FF3)',
'column_external-id' => 'ID eksternal',
'column_opposing-name' => 'Akun lawan (nama)',
'column_rabo-debit-credit' => 'Indikator debit / kredit khusus Rabobank',
'column_ing-debit-credit' => 'Indikator debit / kredit ING yang spesifik',
- 'column_sepa-ct-id' => 'ID Transfer Kredit SEPA end-to-end',
- 'column_sepa-ct-op' => 'Akun lawan kredit SEPA yang berlawanan',
- 'column_sepa-db' => 'SEPA Direct Debit',
+ 'column_sepa-ct-id' => 'SEPA end-to-end Identifier',
+ 'column_sepa-ct-op' => 'SEPA Opposing Account Identifier',
+ 'column_sepa-db' => 'SEPA Mandate Identifier',
+ 'column_sepa-cc' => 'SEPA Clearing Code',
+ 'column_sepa-ci' => 'SEPA Creditor Identifier',
+ 'column_sepa-ep' => 'SEPA External Purpose',
+ 'column_sepa-country' => 'SEPA Country Code',
'column_tags-comma' => 'Tag (dipisahkan koma)',
'column_tags-space' => 'Tag (spasi terpisah)',
'column_account-number' => 'Akun aset (nomor rekening)',
'column_opposing-number' => 'Akun lawan (nomor rekening)',
'column_note' => 'Catatan (s)',
+ 'column_internal-reference' => 'Internal reference',
// prerequisites
'prerequisites' => 'Prerequisites',
// bunq
'bunq_prerequisites_title' => 'Prasyarat untuk impor dari bunq',
- 'bunq_prerequisites_text' => 'Untuk mengimpor dari bunq, Anda perlu mendapatkan kunci API. Anda bisa melakukan ini melalui aplikasi.',
+ 'bunq_prerequisites_text' => 'In order to import from bunq, you need to obtain an API key. You can do this through the app. Please note that the import function for bunq is in BETA. It has only been tested against the sandbox API.',
+ 'bunq_do_import' => 'Yes, import from this account',
+ 'bunq_accounts_title' => 'Bunq accounts',
+ 'bunq_accounts_text' => 'These are the accounts associated with your bunq account. Please select the accounts from which you want to import, and in which account the transactions must be imported.',
// Spectre
'spectre_title' => 'Impor menggunakan momok',
@@ -187,4 +201,3 @@ return [
// various other strings:
'imported_from_account' => 'Imported from ":account"',
];
-
diff --git a/resources/lang/id_ID/intro.php b/resources/lang/id_ID/intro.php
index 30a5b5cb89..34ba249aad 100644
--- a/resources/lang/id_ID/intro.php
+++ b/resources/lang/id_ID/intro.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// index
diff --git a/resources/lang/id_ID/list.php b/resources/lang/id_ID/list.php
index 34601b3139..fed38bf0ff 100644
--- a/resources/lang/id_ID/list.php
+++ b/resources/lang/id_ID/list.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
'buttons' => 'Tombol',
@@ -102,4 +103,12 @@ return [
'reconcile' => 'Menyesuaikan',
'account_on_spectre' => 'Account (Spectre)',
'do_import' => 'Import from this account',
+ 'sepa-ct-id' => 'SEPA End to End Identifier',
+ 'sepa-ct-op' => 'SEPA Opposing Account Identifier',
+ 'sepa-db' => 'SEPA Mandate Identifier',
+ 'sepa-country' => 'SEPA Country',
+ 'sepa-cc' => 'SEPA Clearing Code',
+ 'sepa-ep' => 'SEPA External Purpose',
+ 'sepa-ci' => 'SEPA Creditor Identifier',
+ 'account_at_bunq' => 'Account with bunq',
];
diff --git a/resources/lang/id_ID/pagination.php b/resources/lang/id_ID/pagination.php
index 0e720cc21c..9d5ca26de8 100644
--- a/resources/lang/id_ID/pagination.php
+++ b/resources/lang/id_ID/pagination.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'previous' => '« Sebelumnya',
diff --git a/resources/lang/id_ID/passwords.php b/resources/lang/id_ID/passwords.php
index 5cf403a495..cf4af040bf 100644
--- a/resources/lang/id_ID/passwords.php
+++ b/resources/lang/id_ID/passwords.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'password' => 'Sandi minimal harus 6 karakter dan cocok dengan konfirmasi.',
diff --git a/resources/lang/id_ID/validation.php b/resources/lang/id_ID/validation.php
index 3d1fd3f1f5..9ffb6aeb23 100644
--- a/resources/lang/id_ID/validation.php
+++ b/resources/lang/id_ID/validation.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'iban' => 'Ini bukan IBAN yang valid.',
+ 'source_equals_destination' => 'The source account equals the destination account',
'unique_account_number_for_user' => 'Sepertinya nomor rekening ini sudah digunakan.',
'unique_iban_for_user' => 'It looks like this IBAN is already in use.',
'deleted_user' => 'Kerena kendala keamanan, anda tidak bisa mendaftar menggunkan alamat email ini.',
diff --git a/resources/lang/it_IT/auth.php b/resources/lang/it_IT/auth.php
new file mode 100644
index 0000000000..a3810b746a
--- /dev/null
+++ b/resources/lang/it_IT/auth.php
@@ -0,0 +1,37 @@
+.
+ */
+
+return [
+ /*
+ |--------------------------------------------------------------------------
+ | Authentication Language Lines
+ |--------------------------------------------------------------------------
+ |
+ | The following language lines are used during authentication for various
+ | messages that we need to display to the user. You are free to modify
+ | these language lines according to your application's requirements.
+ |
+ */
+
+ 'failed' => 'Queste credenziali non corrispondono ai nostri record.',
+ 'throttle' => 'Troppi tentativi di accesso. Per favore riprova tra :seconds secondi.',
+];
diff --git a/resources/lang/it_IT/bank.php b/resources/lang/it_IT/bank.php
new file mode 100644
index 0000000000..b6a86faa4b
--- /dev/null
+++ b/resources/lang/it_IT/bank.php
@@ -0,0 +1,24 @@
+.
+ */
+
+return [
+];
diff --git a/resources/lang/it_IT/breadcrumbs.php b/resources/lang/it_IT/breadcrumbs.php
new file mode 100644
index 0000000000..ca9632bbdb
--- /dev/null
+++ b/resources/lang/it_IT/breadcrumbs.php
@@ -0,0 +1,55 @@
+.
+ */
+
+return [
+ 'home' => 'Home',
+ 'edit_currency' => 'Modifica valuta ":name"',
+ 'delete_currency' => 'Elimina valuta ":name"',
+ 'newPiggyBank' => 'Crea un nuovo salvadanaio',
+ 'edit_piggyBank' => 'Modifica salvadanaio ":name"',
+ 'preferences' => 'Preferenze',
+ 'profile' => 'Profilo',
+ 'changePassword' => 'Cambia la tua password',
+ 'change_email' => 'Cambia il tuo indirizzo email',
+ 'bills' => 'Fatture',
+ 'newBill' => 'Nuova fattura',
+ 'edit_bill' => 'Modifica fattura ":name"',
+ 'delete_bill' => 'Elimina fattura ":name"',
+ 'reports' => 'Stampe',
+ 'search_result' => 'Risultati di ricerca per ":query"',
+ 'withdrawal_list' => 'Spese',
+ 'deposit_list' => 'Entrate, entrate e depositi',
+ 'transfer_list' => 'Trasferimenti',
+ 'transfers_list' => 'Trasferimenti',
+ 'reconciliation_list' => 'Riconciliazioni',
+ 'create_withdrawal' => 'Crea nuovo prelievo',
+ 'create_deposit' => 'Crea nuovo deposito',
+ 'create_transfer' => 'Crea nuovo trasferimento',
+ 'edit_journal' => 'Modifica transazione ":description"',
+ 'edit_reconciliation' => 'Modifica ":description"',
+ 'delete_journal' => 'Elimina transazione ":description"',
+ 'tags' => 'Etichette',
+ 'createTag' => 'Crea nuova etichetta',
+ 'edit_tag' => 'Modifica etichetta ":tag"',
+ 'delete_tag' => 'Elimina etichetta ":tag"',
+ 'delete_journal_link' => 'Elimina il collegamento tra le transazioni',
+];
diff --git a/resources/lang/it_IT/components.php b/resources/lang/it_IT/components.php
new file mode 100644
index 0000000000..d918705fc0
--- /dev/null
+++ b/resources/lang/it_IT/components.php
@@ -0,0 +1,30 @@
+.
+ */
+
+return [
+ // profile
+ 'personal_access_tokens' => 'Token di accesso personale',
+
+ // bills:
+ 'not_expected_period' => 'Non previsto questo periodo',
+ 'not_or_not_yet' => 'Non ancora',
+];
diff --git a/resources/lang/it_IT/config.php b/resources/lang/it_IT/config.php
new file mode 100644
index 0000000000..c58a708ea1
--- /dev/null
+++ b/resources/lang/it_IT/config.php
@@ -0,0 +1,40 @@
+.
+ */
+
+return [
+ 'html_language' => 'it',
+ 'locale' => 'it, Italiano, it_IT, it_IT.utf8, it_IT.UTF-8',
+ 'month' => '%B %Y',
+ 'month_and_day' => '%e %B %Y',
+ 'date_time' => '%e %B %Y, @ %T',
+ 'specific_day' => '%e %B %Y',
+ 'week_in_year' => 'Week %W, %Y',
+ 'year' => '%Y',
+ 'half_year' => '%B %Y',
+ 'month_js' => 'MMMM YYYY',
+ 'month_and_day_js' => 'Do MMMM YYYY',
+ 'date_time_js' => 'Do MMMM YYYY, @ HH:mm:ss',
+ 'specific_day_js' => 'D MMMM YYYY',
+ 'week_in_year_js' => '[Week] w, YYYY',
+ 'year_js' => 'YYYY',
+ 'half_year_js' => 'Q YYYY',
+];
diff --git a/resources/lang/it_IT/csv.php b/resources/lang/it_IT/csv.php
new file mode 100644
index 0000000000..892c8beac4
--- /dev/null
+++ b/resources/lang/it_IT/csv.php
@@ -0,0 +1,24 @@
+.
+ */
+
+return [
+];
diff --git a/resources/lang/it_IT/demo.php b/resources/lang/it_IT/demo.php
new file mode 100644
index 0000000000..064ef212c7
--- /dev/null
+++ b/resources/lang/it_IT/demo.php
@@ -0,0 +1,35 @@
+.
+ */
+
+return [
+ 'no_demo_text' => 'Spiacenti, non esiste un testo dimostrativo aggiuntivo per questa pagina.',
+ 'see_help_icon' => 'Tuttavia, il -icon in alto a destra potrebbe dirti di più.',
+ 'index' => 'Benvenuto in Firefly III! In questa pagina ottieni una rapida panoramica delle tue finanze. Per ulteriori informazioni, controlla Account e → Account asset e, naturalmente, i budget e rapporti. O semplicemente dare un occhiata in giro e vedere dove finisci.',
+ 'accounts-index' => 'I conti degli asset sono i tuoi conti bancari personali. I conti spese sono gli account a cui si spendono soldi, come negozi e amici. I conti delle entrate sono conti da cui ricevi denaro, come il tuo lavoro, il governo o altre fonti di reddito. In questa pagina puoi modificarli o rimuoverli.',
+ 'budgets-index' => 'Questa pagina ti mostra una panoramica dei tuoi budget. La barra in alto mostra l\'importo disponibile per essere preventivato. Questo può essere personalizzato per qualsiasi periodo facendo clic sull\'importo a destra. La quantità che hai effettivamente speso è mostrata nella barra sottostante. Di seguito sono indicate le spese per budget e ciò che hai preventivato per loro.',
+ 'reports-index-start' => 'Firefly III supporta un certo numero di tipi di stampe. Leggi facendo clic sul -icon in alto a destra.',
+ 'reports-index-examples' => 'Assicurati di dare un occhiata a questi esempi: una panoramica finanziaria mensile , una panoramica finanziaria annuale e una panoramica del budget .',
+ 'currencies-index' => 'Firefly III supporta più valute. Sebbene sia impostato su Euro, può essere impostato sul dollaro USA e su molte altre valute. Come puoi vedere, è stata inclusa una piccola selezione di valute, ma puoi aggiungere la tua se lo desideri. Tuttavia, la modifica della valuta predefinita non cambierà la valuta delle transazioni esistenti: Firefly III supporta un uso di più valute allo stesso tempo.',
+ 'transactions-index' => 'Queste spese, depositi e trasferimenti non sono particolarmente fantasiosi. Sono stati generati automaticamente.',
+ 'piggy-banks-index' => 'Come puoi vedere, ci sono tre salvadanai. Utilizzare i pulsanti più e meno per influenzare la quantità di denaro in ogni salvadanaio. Fare clic sul nome del salvadanaio per visualizzare la gestione per ciascun salvadanaio.',
+ 'import-index' => 'Naturalmente, qualsiasi file CSV può essere importato in Firefly III',
+];
diff --git a/resources/lang/it_IT/firefly.php b/resources/lang/it_IT/firefly.php
new file mode 100644
index 0000000000..33bac95932
--- /dev/null
+++ b/resources/lang/it_IT/firefly.php
@@ -0,0 +1,1188 @@
+.
+ */
+
+return [
+ // general stuff:
+ 'close' => 'Chiudi',
+ 'actions' => 'Azioni',
+ 'edit' => 'Modifica',
+ 'delete' => 'Elimina',
+ 'welcomeBack' => 'La tua situazione finanziaria',
+ 'everything' => 'Qualunque cosa',
+ 'today' => 'oggi',
+ 'customRange' => 'Range personalizzato',
+ 'apply' => 'Applica',
+ 'select_date' => 'Seleziona data..',
+ 'cancel' => 'Cancella',
+ 'from' => 'Da',
+ 'to' => 'A',
+ 'showEverything' => 'Mostra tutto',
+ 'never' => 'Mai',
+ 'no_results_for_empty_search' => 'Chiave di ricerca vuota, quindi non è stato trovato nulla.',
+ 'removed_amount' => 'Rimosso :amount',
+ 'added_amount' => 'Aggiunto :amount',
+ 'asset_account_role_help' => 'Qualsiasi opzione aggiuntiva risultante dalla tua scelta può essere impostata in seguito.',
+ 'Opening balance' => 'Saldo di apertura',
+ 'create_new_stuff' => 'Crea nuove cose',
+ 'new_withdrawal' => 'Nuova uscita',
+ 'create_new_transaction' => 'Crea nuova transazione',
+ 'go_to_asset_accounts' => 'Visualizza i tuoi movimenti',
+ 'go_to_budgets' => 'Vai ai tuoi budget',
+ 'go_to_categories' => 'Vai alle tue categorie',
+ 'go_to_bills' => 'Vai alle tue fatture',
+ 'go_to_expense_accounts' => 'Vedi i tuoi conti spese',
+ 'go_to_revenue_accounts' => 'Vedi i tuoi conti entrate',
+ 'go_to_piggies' => 'Vai ai tuoi salvadanai',
+ 'new_deposit' => 'Nuova entrata',
+ 'new_transfer' => 'Nuovo giroconto',
+ 'new_transfers' => 'Nuovi giroconti',
+ 'new_asset_account' => 'Nuova attività conto',
+ 'new_expense_account' => 'Nuova spesa conto',
+ 'new_revenue_account' => 'Nuova entrata conto',
+ 'new_budget' => 'Nuovo bilancio',
+ 'new_bill' => 'Nuova fattura',
+ 'block_account_logout' => 'Sei stato disconnesso. Gli account bloccati non possono utilizzare questo sito. Ti sei registrato con un indirizzo email valido?',
+ 'flash_success' => 'Successo!',
+ 'flash_info' => 'Messaggio',
+ 'flash_warning' => 'Avviso!',
+ 'flash_error' => 'Errore!',
+ 'flash_info_multiple' => 'C\'è un messaggio | Ci sono :count messages',
+ 'flash_error_multiple' => 'C\'è un errore | Ci sono :count errors',
+ 'net_worth' => 'Valore netto',
+ 'route_has_no_help' => 'Non c\'è aiuto per questa rotta.',
+ 'help_for_this_page' => 'Aiuto per questa pagina',
+ 'no_help_could_be_found' => 'Non è stato trovato alcun testo di aiuto.',
+ 'no_help_title' => 'Ci scusiamo, si è verificato un errore.',
+ 'two_factor_welcome' => 'Ciao, :user!',
+ 'two_factor_enter_code' => 'Per continuare, inserisci il tuo codice di autenticazione a due fattori. La tua applicazione può generarlo per te.',
+ 'two_factor_code_here' => 'Inserisci codice qui',
+ 'two_factor_title' => 'Autenticazione a due fattori',
+ 'authenticate' => 'Autenticato',
+ 'two_factor_forgot_title' => 'Autenticazione a due fattori persa',
+ 'two_factor_forgot' => 'Ho dimenticato la mia chiave a due fattori.',
+ 'two_factor_lost_header' => 'Hai perso l\'autenticazione a due fattori?',
+ 'two_factor_lost_intro' => 'Sfortunatamente, questo non è qualcosa che puoi resettare dall\'interfaccia web. Hai due scelte.',
+ 'two_factor_lost_fix_self' => 'Se si esegue la propria istanza di Firefly III, controllare i log in storage/logs per istruzioni.',
+ 'two_factor_lost_fix_owner' => 'In caso contrario, invia un mail al proprietario del sito :site_owner e chiedi loro di ripristinare la possibilità di autenticarsi a due fattori.',
+ 'warning_much_data' => ':days di caricamento dei dati potrebbero richiedere un pò di tempo.',
+ 'registered' => 'Ti sei registrato con successo!',
+ 'Default asset account' => 'Attività conto predefinito',
+ 'no_budget_pointer' => 'Sembra che tu non abbia ancora i Bilanci Preventivi. Dovresti crearne alcuni nella pagina bilanci. I bilanci possono aiutarti a tenere traccia delle spese.',
+ 'Savings account' => 'Conti risparmio',
+ 'Credit card' => 'Carta di Credito',
+ 'source_accounts' => 'Origine conto(i)',
+ 'destination_accounts' => 'Destinazione Conto(i)',
+ 'user_id_is' => 'Il tuo ID utente è :user',
+ 'field_supports_markdown' => 'Questo campo supporta Markdown.',
+ 'need_more_help' => 'Se hai bisogno di ulteriore aiuto con Firefly III, ti preghiamo di aprire un ticket su Github.',
+ 'reenable_intro_text' => 'Puoi anche riattivare la guida introduttiva.',
+ 'intro_boxes_after_refresh' => 'Le caselle di introduzione riappariranno quando si aggiorna la pagina.',
+ 'show_all_no_filter' => 'Mostra tutte le transazioni senza raggrupparle per data.',
+ 'expenses_by_category' => 'Spese per Categorie',
+ 'expenses_by_budget' => 'Spese per bilancio',
+ 'income_by_category' => 'Reddito per categoria',
+ 'expenses_by_asset_account' => 'Spese per attività conto',
+ 'expenses_by_expense_account' => 'Spese per conto spese',
+ 'cannot_redirect_to_account' => 'Spiacente ma Firefly III non può reindirizzarti alla pagina corretta.',
+ 'sum_of_expenses' => 'Totale spese',
+ 'sum_of_income' => 'Totale reddito',
+ 'spent_in_specific_budget' => 'Speso nel bilancio ":budget"',
+ 'sum_of_expenses_in_budget' => 'Spesa totale nel bilancio ":budget"',
+ 'left_in_budget_limit' => 'Lasciato a spendere in base al budget',
+ 'current_period' => 'Periodo corrente',
+ 'show_the_current_period_and_overview' => 'Mostra il periodo e la panoramica correnti',
+ 'pref_languages_locale' => 'Affinché una lingua diversa dall\'inglese funzioni correttamente, il sistema operativo deve essere dotato delle corrette informazioni locali. Se questi non sono presenti, i dati di valuta, le date e gli importi potrebbero essere formattati in modo errato.',
+ 'budget_in_period' => 'Tutte le transazioni per il bilancio ":name" fra :start e :end',
+ 'chart_budget_in_period' => 'Grafico di tutte le transazioni per Bilancio ":name" fra :start e :end',
+ 'chart_account_in_period' => 'Grafico di tutte le transazioni per Conto ":name" fra :start E :end',
+ 'chart_category_in_period' => 'Grafico di tutte le transazioni per Categorie ":name" fra :start e :end',
+ 'chart_category_all' => 'Grafico di tutte le transazioni per Categoria ":name"',
+ 'clone_withdrawal' => 'Duplica questo uscita',
+ 'clone_deposit' => 'Duplica questa entrata',
+ 'clone_transfer' => 'Duplica questo giroconto',
+ 'multi_select_no_selection' => 'Nessuno selezionato',
+ 'multi_select_select_all' => 'Seleziona tutto',
+ 'multi_select_n_selected' => 'selezionato',
+ 'multi_select_all_selected' => 'Seleziona tutto',
+ 'multi_select_filter_placeholder' => 'Cerca..',
+ 'intro_next_label' => 'Avanti',
+ 'intro_prev_label' => 'Indietro',
+ 'intro_skip_label' => 'Salta',
+ 'intro_done_label' => 'Fatto',
+ 'between_dates_breadcrumb' => 'Fra :start e :end',
+ 'all_journals_without_budget' => 'Tutte le transazioni fuori bilancio',
+ 'journals_without_budget' => 'Transazioni senza Bilancio',
+ 'all_journals_without_category' => 'Tutte le transazioni senza una categoria',
+ 'journals_without_category' => 'Transazioni senza categoria',
+ 'all_journals_for_account' => 'Tutte le transazioni per il conto :name',
+ 'chart_all_journals_for_account' => 'Grafico di tutte le transazioni per il conto :name',
+ 'journals_in_period_for_account' => 'Tutte le transazioni per il conto :name fra :start e :end',
+ 'transferred' => 'Trasferito',
+ 'all_withdrawal' => 'Tutte le Spese',
+ 'all_transactions' => 'Tutte le Transazioni',
+ 'title_withdrawal_between' => 'Tutte le Spese tra :start e :end',
+ 'all_deposit' => 'Tutte le entrate',
+ 'title_deposit_between' => 'Tutte le entrate fra :start e :end',
+ 'all_transfers' => 'Tutti i trasferimenti',
+ 'title_transfers_between' => 'Tutti i trasferimenti fra :start e :end',
+ 'all_transfer' => 'Tutti i trasferimenti',
+ 'all_journals_for_tag' => 'Tutte le transazioni per Etichetta ":tag"',
+ 'title_transfer_between' => 'Tutti i trasferimenti fra :start e :end',
+ 'all_journals_for_category' => 'Turre le transazioni per categoria :name',
+ 'all_journals_for_budget' => 'Tutte le transazione per bilancio :name',
+ 'chart_all_journals_for_budget' => 'Grafico di tutte le transazioni per Bilancio :name',
+ 'journals_in_period_for_category' => 'Tutte le transazioni per Categoria :name fra :start e :end',
+ 'journals_in_period_for_tag' => 'Tutte le transazioni per Etichetta :tag fra :start e :end',
+ 'not_available_demo_user' => 'La funzione a cui tenti di accedere non è disponibile per gli utenti demo.',
+ 'exchange_rate_instructions' => 'Conto attività "@name" accetta solo transazioni in @native_currency. Se invece desideri utilizzare @foreign_currency, assicurati che anche l\'importo in @native_currency sia noto:',
+ 'transfer_exchange_rate_instructions' => 'Il conto attività di origine "@source_name" accetta solo transazioni in @source_currency.Il conto attività di destinazione "@dest_name" accetta solo transazioni in @dest_currency. È necessario fornire l\'importo trasferito correttamente in entrambe le valute.',
+ 'transaction_data' => 'Data Transazione',
+ 'invalid_server_configuration' => 'Configurazione Server non corretta',
+ 'invalid_locale_settings' => 'Firefly III non è in grado di formattare importi monetari perché al server mancano i pacchetti richiesti. Ci sono istruzioni su come eseguire questa operazione.',
+ 'quickswitch' => 'Interruttore veloce',
+ 'sign_in_to_start' => 'Accedi per iniziare la sessione',
+ 'sign_in' => 'Accedi',
+ 'register_new_account' => 'Registra nuovo conto',
+ 'forgot_my_password' => 'Ho dimenticato la mia password',
+ 'problems_with_input' => 'Ci sono stati alcuni problemi con il tuo inserimento.',
+ 'reset_password' => 'reimposta la tua password',
+ 'button_reset_password' => 'Resetta password',
+ 'reset_button' => 'Resetta',
+ 'want_to_login' => 'Voglio accedere',
+ 'button_register' => 'Registrare',
+ 'authorization' => 'Autorizzazione',
+ 'active_bills_only' => 'active bills only',
+ 'average_per_bill' => 'average per bill',
+ 'expected_total' => 'expected total',
+ // API access
+ 'authorization_request' => 'Firefly III v:version Richiesta Autorizzazione',
+ 'authorization_request_intro' => ':client sta richiedendo l\'autorizzazione per accedere alla tua amministrazione finanziaria. Desideri autorizzare :client ad accedere a questi record?',
+ 'scopes_will_be_able' => 'Questa applicazione sarà in grado di:',
+ 'button_authorize' => 'Autorizza',
+
+ // check for updates:
+ 'update_check_title' => 'Controlla aggiornamenti',
+ 'admin_update_check_title' => 'Controlla automaticamente aggiornamento',
+ 'admin_update_check_explain' => 'Firefly III può verificare automaticamente gli aggiornamenti. Quando attivi questa impostazione, contatterà Github per verificare se è disponibile una nuova versione di Firefly III. Quando lo sarà, riceverai una notifica. Puoi testare questa notifica usando il pulsante a destra. Indicare di seguito se si desidera che Firefly III controlli gli aggiornamenti.',
+ 'check_for_updates_permission' => 'Firefly III può controllare gli aggiornamenti, ma è necessario il tuo permesso per farlo. Vai alla amministrazione per indicare se desideri che questa funzione sia abilitata.',
+ 'updates_ask_me_later' => 'Chiedimelo più tardi',
+ 'updates_do_not_check' => 'Non controllare gli aggiornamenti',
+ 'updates_enable_check' => 'Abilita il controllo per gli aggiornamenti',
+ 'admin_update_check_now_title' => 'Controlla gli aggiornamenti ora',
+ 'admin_update_check_now_explain' => 'Se si preme il pulsante, Firefly III vedrà se la versione corrente è la più recente.',
+ 'check_for_updates_button' => 'Controlla ora!',
+ 'update_new_version_alert' => 'È disponibile una nuova versione di Firefly III. Stai eseguendo v:your_version, l\'ultima versione è v:new_version che è stata rilasciata :date.',
+ 'update_current_version_alert' => 'Stai eseguendo v:version, che è l\'ultima versione disponibile.',
+ 'update_newer_version_alert' => 'Stai eseguendo v:your_version, che è più recente rispetto all\'ultima versione, v:new_version.',
+ 'update_check_error' => 'Si è verificato un errore durante il controllo degli aggiornamenti. Si prega di visualizzare i file di registro.',
+
+ // search
+ 'search' => 'Cerca',
+ 'search_query' => 'Domanda',
+ 'search_found_transactions' => 'Numero di transizioni trovate:',
+ 'general_search_error' => 'Si è verificato un errore durante la ricerca. Si prega di controllare i file di registro per ulteriori informazioni.',
+ 'search_box' => 'Ricerca',
+ 'search_box_intro' => 'Benvenuto nella funzione di ricerca di Firefly III. Inserisci la query di ricerca nella casella. Assicurati di controllare il file della guida perché la ricerca è abbastanza avanzata.',
+ 'search_error' => 'Errore durante la ricerca',
+ 'search_searching' => 'Ricerca ...',
+ 'search_results' => 'Risultati ricerca',
+
+ // repeat frequencies:
+ 'repeat_freq_yearly' => 'annuale',
+ 'repeat_freq_half-year' => 'ogni sei mesi',
+ 'repeat_freq_quarterly' => 'trimestrale',
+ 'repeat_freq_monthly' => 'mensile',
+ 'repeat_freq_weekly' => 'settimanale',
+ 'weekly' => 'settimanale',
+ 'quarterly' => 'trimestrale',
+ 'half-year' => 'ogni sei mesi',
+ 'yearly' => 'annuale',
+
+ // export data:
+ 'import_and_export' => 'Importa e esporta',
+ 'export_data' => 'Esporta dati',
+ 'export_and_backup_data' => 'Esporta dati',
+ 'export_data_intro' => 'Utilizzare i dati esportati per passare a una nuova applicazione finanziaria. Si noti che questi file non sono intesi come backup. Non contengono abbastanza metadati per ripristinare completamente una nuova installazione di Firefly III. Se si desidera eseguire un backup dei dati, eseguire direttamente il backup del database.',
+ 'export_format' => 'Esporta formato',
+ 'export_format_csv' => 'Valori separati da virgola (file CSV)',
+ 'export_format_mt940' => 'Formato compatibile MT940',
+ 'include_old_uploads_help' => 'Firefly III non getta via i file CSV originali importati in passato. Puoi includerli nell\'esportazione.',
+ 'do_export' => 'Esporta',
+ 'export_status_never_started' => 'L\'esportazione non è ancora iniziata',
+ 'export_status_make_exporter' => 'Creare una cosa esportatore...',
+ 'export_status_collecting_journals' => 'Raccolta delle tue transazioni...',
+ 'export_status_collected_journals' => 'Raccolto le tue transazioni!',
+ 'export_status_converting_to_export_format' => 'Convertire le tue transazioni...',
+ 'export_status_converted_to_export_format' => 'Convertite le vostre transazioni!',
+ 'export_status_creating_journal_file' => 'Creare il file di esportazione...',
+ 'export_status_created_journal_file' => 'Creato il file di esportazione!',
+ 'export_status_collecting_attachments' => 'Raccogli tutti i tuoi allegati...',
+ 'export_status_collected_attachments' => 'Raccolti tutti i tuoi allegati!',
+ 'export_status_collecting_old_uploads' => 'Raccogli tutti i tuoi caricamenti precedenti...',
+ 'export_status_collected_old_uploads' => 'Raccolti tutti i tuoi caricamenti precedenti!',
+ 'export_status_creating_zip_file' => 'Creare un file zip...',
+ 'export_status_created_zip_file' => 'File zip creato!',
+ 'export_status_finished' => 'Esportazione terminata correttamente!!',
+ 'export_data_please_wait' => 'Attendere prego...',
+
+ // rules
+ 'rules' => 'Regole',
+ 'rule_name' => 'Nome regola',
+ 'rule_triggers' => 'La regola si innesca quando',
+ 'rule_actions' => 'La regola lo farà',
+ 'new_rule' => 'Nuova regola',
+ 'new_rule_group' => 'Nuovo gruppo di regole',
+ 'rule_priority_up' => 'Dare maggiore priorità alla regola',
+ 'rule_priority_down' => 'Dare alla regola meno priorità',
+ 'make_new_rule_group' => 'Crea un nuovo gruppo di regole',
+ 'store_new_rule_group' => 'Memorizza un nuovo gruppo di regole',
+ 'created_new_rule_group' => 'Nuovo gruppo di regole ":title" memorizzate!',
+ 'updated_rule_group' => 'Gruppo di regole aggiornato con successo ":title".',
+ 'edit_rule_group' => 'Modifica il gruppo di regole ":title"',
+ 'delete_rule_group' => 'Elimina il gruppo di regole ":title"',
+ 'deleted_rule_group' => 'Gruppo regole eliminato ":title"',
+ 'update_rule_group' => 'Aggiorna gruppo di regole',
+ 'no_rules_in_group' => 'Non ci sono regole in questo gruppo',
+ 'move_rule_group_up' => 'Sposta il gruppo di regole su',
+ 'move_rule_group_down' => 'Sposta il gruppo di regole in basso',
+ 'save_rules_by_moving' => 'Salva questa(e) regola(e) spostandola(e) in un altro gruppo di regole:',
+ 'make_new_rule' => 'Crea una nuova regola nel gruppo di regole ":title"',
+ 'rule_help_stop_processing' => 'Quando selezioni questa casella, le regole successive in questo gruppo non verranno eseguite.',
+ 'rule_help_active' => 'Le regole non attive non spareranno mai.',
+ 'stored_new_rule' => 'Nuova regola memorizzata con titolo ":title"',
+ 'deleted_rule' => 'Regola eliminata con titolo ":title"',
+ 'store_new_rule' => 'Salva nuova regola',
+ 'updated_rule' => 'Regola aggiornata con titolo ":title"',
+ 'default_rule_group_name' => 'Regole predefinite',
+ 'default_rule_group_description' => 'Tutte le tue regole non in un gruppo particolare.',
+ 'default_rule_name' => 'La tua prima regola predefinita',
+ 'default_rule_description' => 'Questa regola è un esempio. Puoi tranquillamente cancellarla.',
+ 'default_rule_trigger_description' => 'L\'uomo che vendette il mondo',
+ 'default_rule_trigger_from_account' => 'David Bowie',
+ 'default_rule_action_prepend' => 'Comprato il mondo da ',
+ 'default_rule_action_set_category' => 'Grandi spese',
+ 'trigger' => 'Attivare',
+ 'trigger_value' => 'Attiva il valore',
+ 'stop_processing_other_triggers' => 'Interrompe l\'elaborazione di altre attivazioni',
+ 'add_rule_trigger' => 'Aggiungi un nuovo trigger',
+ 'action' => 'Azione',
+ 'action_value' => 'Valore azione',
+ 'stop_executing_other_actions' => 'Smetti di eseguire altre azioni',
+ 'add_rule_action' => 'Aggiungi nuova azione',
+ 'edit_rule' => 'Modifica regola ":title"',
+ 'delete_rule' => 'Elimina regola ":title"',
+ 'update_rule' => 'Aggiorna regola',
+ 'test_rule_triggers' => 'Vedi le transazioni corrispondenti',
+ 'warning_transaction_subset' => 'Per motivi di prestazioni, questo elenco è limitato a :max_num_transactions e può mostrare solo un sottoinsieme di transazioni corrispondenti',
+ 'warning_no_matching_transactions' => 'Nessuna transazione corrispondente trovata. Si prega di notare che, per motivi di prestazioni, sono state verificate solo le ultime transazioni :num_transactions.',
+ 'warning_no_valid_triggers' => 'Nessun trigger valido fornito.',
+ 'apply_rule_selection' => 'Applica la regola ":title" a una selezione delle tue transazioni',
+ 'apply_rule_selection_intro' => 'Regole come ":title" sono normalmente applicate solo a transazioni nuove o aggiornate, ma puoi dire a Firefly III di eseguirle su una selezione delle tue transazioni esistenti. Questo può essere utile quando hai aggiornato una regola e hai bisogno che le modifiche vengano applicate a tutte le altre transazioni.',
+ 'include_transactions_from_accounts' => 'Includi transazioni da questi conti',
+ 'applied_rule_selection' => 'La regola ":title" è stata applicata alla tua selezione.',
+ 'execute' => 'Eseguire',
+ 'apply_rule_group_selection' => 'Applica il gruppo di regole ":title" a una selezione delle tue transazioni',
+ 'apply_rule_group_selection_intro' => 'Gruppi di regole come ":title" sono normalmente applicati solo a transazioni nuove o aggiornate, ma puoi dire a Firefly III di eseguire tutte le regole in questo gruppo su una selezione delle tue transazioni esistenti. Questo può essere utile quando hai aggiornato un gruppo di regole e hai bisogno delle modifiche da applicare a tutte le tue altre transazioni.',
+ 'applied_rule_group_selection' => 'Rule group ":title" has been applied to your selection.',
+
+ // actions and triggers
+ 'rule_trigger_user_action' => 'L\'azione dell\'utente è ":trigger_value"',
+ 'rule_trigger_from_account_starts_choice' => 'Il conto di origine inizia con..',
+ 'rule_trigger_from_account_starts' => 'Il conto di origine inizia con ":trigger_value"',
+ 'rule_trigger_from_account_ends_choice' => 'Il conto di origine termina con..',
+ 'rule_trigger_from_account_ends' => 'Il conto di origine termina con ":trigger_value"',
+ 'rule_trigger_from_account_is_choice' => 'L\'account di origine è..',
+ 'rule_trigger_from_account_is' => 'L\'account di origine è ":trigger_value"',
+ 'rule_trigger_from_account_contains_choice' => 'Il conto di origine contiene..',
+ 'rule_trigger_from_account_contains' => 'Il conto di origine contiene ":trigger_value"',
+ 'rule_trigger_to_account_starts_choice' => 'Il conto di destinazione inizia con..',
+ 'rule_trigger_to_account_starts' => 'Il conto di destinazione inizia con ":trigger_value"',
+ 'rule_trigger_to_account_ends_choice' => 'Il conto di destinazione termina con..',
+ 'rule_trigger_to_account_ends' => 'Il conto di destinazione termina con ":trigger_value"',
+ 'rule_trigger_to_account_is_choice' => 'Il conto di destinazione è..',
+ 'rule_trigger_to_account_is' => 'Il conto di destinazione è ":trigger_value"',
+ 'rule_trigger_to_account_contains_choice' => 'Il conto di destinazione contiene..',
+ 'rule_trigger_to_account_contains' => 'Il conto di destinazione contiene ":trigger_value"',
+ 'rule_trigger_transaction_type_choice' => 'La transazione è di tipo..',
+ 'rule_trigger_transaction_type' => 'La transazione è di tipo ":trigger_value"',
+ 'rule_trigger_category_is_choice' => 'La categoria è..',
+ 'rule_trigger_category_is' => 'La categoria è ":trigger_value"',
+ 'rule_trigger_amount_less_choice' => 'L\'importo è inferiore a..',
+ 'rule_trigger_amount_less' => 'L\'importo è inferiore a :trigger_value',
+ 'rule_trigger_amount_exactly_choice' => 'L\'importo è..',
+ 'rule_trigger_amount_exactly' => 'L\'importo è :trigger_value',
+ 'rule_trigger_amount_more_choice' => 'L\'importo è più di..',
+ 'rule_trigger_amount_more' => 'L\'importo è più di :trigger_value',
+ 'rule_trigger_description_starts_choice' => 'La descrizione inizia con..',
+ 'rule_trigger_description_starts' => 'La descrizione inizia con ":trigger_value"',
+ 'rule_trigger_description_ends_choice' => 'La descrizione termina con..',
+ 'rule_trigger_description_ends' => 'La descrizione termina con ":trigger_value"',
+ 'rule_trigger_description_contains_choice' => 'La descrizione contiene..',
+ 'rule_trigger_description_contains' => 'La descrizione contiene ":trigger_value"',
+ 'rule_trigger_description_is_choice' => 'La descrizione è..',
+ 'rule_trigger_description_is' => 'La descrizione è ":trigger_value"',
+ 'rule_trigger_budget_is_choice' => 'Il bilancio è..',
+ 'rule_trigger_budget_is' => 'Il bilancio è ":trigger_value"',
+ 'rule_trigger_tag_is_choice' => '(A) tag è..',
+ 'rule_trigger_tag_is' => 'Un tag è ":trigger_value"',
+ 'rule_trigger_has_attachments_choice' => 'Ha almeno questo molti allegati',
+ 'rule_trigger_has_attachments' => 'Almeno :trigger_value allegato (i)',
+ 'rule_trigger_store_journal' => 'Quando viene creata una transazione',
+ 'rule_trigger_update_journal' => 'Quando una transazione viene aggiornata',
+ 'rule_trigger_has_no_category_choice' => 'Non ha categoria',
+ 'rule_trigger_has_no_category' => 'La transazione non ha categoria',
+ 'rule_trigger_has_any_category_choice' => 'Ha una (qualsiasi) categoria',
+ 'rule_trigger_has_any_category' => 'La transazione ha una (qualsiasi) categoria',
+ 'rule_trigger_has_no_budget_choice' => 'Non ha bilancio',
+ 'rule_trigger_has_no_budget' => 'La transazione non ha bilancio',
+ 'rule_trigger_has_any_budget_choice' => 'Ha un (qualsiasi) bilancio',
+ 'rule_trigger_has_any_budget' => 'La transazione ha un (qualsiasi) bilancio',
+ 'rule_trigger_has_no_tag_choice' => 'Non ha etichetta(e)',
+ 'rule_trigger_has_no_tag' => 'La transazione non ha etichetta(e)',
+ 'rule_trigger_has_any_tag_choice' => 'Ha una o più etichette (qualsiasi)',
+ 'rule_trigger_has_any_tag' => 'La transazione ha una (qualsiasi) o più etichette',
+ 'rule_trigger_any_notes_choice' => 'Ha (qualsiasi) note',
+ 'rule_trigger_any_notes' => 'La transazione ha (qualsiasi) note',
+ 'rule_trigger_no_notes_choice' => 'Non ha note',
+ 'rule_trigger_no_notes' => 'La transazione non ha note',
+ 'rule_trigger_notes_are_choice' => 'Le note sono..',
+ 'rule_trigger_notes_are' => 'Le note sono ":trigger_value"',
+ 'rule_trigger_notes_contain_choice' => 'Le note contengono..',
+ 'rule_trigger_notes_contain' => 'Le note contengono ":trigger_value"',
+ 'rule_trigger_notes_start_choice' => 'Le note iniziano con..',
+ 'rule_trigger_notes_start' => 'Le note iniziano con ":trigger_value"',
+ 'rule_trigger_notes_end_choice' => 'Le note finiscono con..',
+ 'rule_trigger_notes_end' => 'Le note finiscono con ":trigger_value"',
+ 'rule_action_set_category' => 'Imposta categoria a ":action_value"',
+ 'rule_action_clear_category' => 'Cancella categoria',
+ 'rule_action_set_budget' => 'Imposta il bilancio su ":action_value"',
+ 'rule_action_clear_budget' => 'Cancella bilancio',
+ 'rule_action_add_tag' => 'Aggiungi etichetta ":action_value"',
+ 'rule_action_remove_tag' => 'Rimuovi etichetta ":action_value"',
+ 'rule_action_remove_all_tags' => 'Rimuovi tutte le etichette',
+ 'rule_action_set_description' => 'Imposta la descrizione a ":action_value"',
+ 'rule_action_append_description' => 'Aggiungi descrizione con ":action_value"',
+ 'rule_action_prepend_description' => 'Anteporre descrizione con ":action_value"',
+ 'rule_action_set_category_choice' => 'Imposta categoria a..',
+ 'rule_action_clear_category_choice' => 'Cancella qualsiasi categoria',
+ 'rule_action_set_budget_choice' => 'Imposta il bilancio su..',
+ 'rule_action_clear_budget_choice' => 'Cancella qualsiasi bilancio',
+ 'rule_action_add_tag_choice' => 'Aggiungi etichetta..',
+ 'rule_action_remove_tag_choice' => 'Rimuovi etichetta..',
+ 'rule_action_remove_all_tags_choice' => 'Rimuovi tutte le etichette',
+ 'rule_action_set_description_choice' => 'Imposta la descrizione a..',
+ 'rule_action_append_description_choice' => 'Aggiungi descrizione con..',
+ 'rule_action_prepend_description_choice' => 'Anteporre descrizione..',
+ 'rule_action_set_source_account_choice' => 'Imposta l\'account di origine su...',
+ 'rule_action_set_source_account' => 'Imposta l\'account di origine su :action_value',
+ 'rule_action_set_destination_account_choice' => 'Imposta l\'account di destinazione su...',
+ 'rule_action_set_destination_account' => 'Imposta l\'account di destinazione su :action_value',
+ 'rule_action_append_notes_choice' => 'Aggiungi note con..',
+ 'rule_action_append_notes' => 'Aggiungi note con ":action_value"',
+ 'rule_action_prepend_notes_choice' => 'Anteponi note con..',
+ 'rule_action_prepend_notes' => 'Anteponi note con ":action_value"',
+ 'rule_action_clear_notes_choice' => 'Rimuovi eventuali note',
+ 'rule_action_clear_notes' => 'Rimuovi eventuali note',
+ 'rule_action_set_notes_choice' => 'Imposta le note su..',
+ 'rule_action_set_notes' => 'Imposta le note su ":action_value"',
+
+ 'rules_have_read_warning' => 'Hai letto l\'avvertimento?',
+ 'apply_rule_warning' => 'Avvertenza: l\'esecuzione di una regola (gruppo) su una vasta selezione di transazioni potrebbe richiedere anni e potrebbe scadere. In caso affermativo, la regola (gruppo) verrà applicata solo a un sottoinsieme sconosciuto delle tue transazioni. Questo potrebbe lasciare la tua amministrazione finanziaria a brandelli. Fate attenzione.',
+
+ // tags
+ 'store_new_tag' => 'Salva la nuova etichetta',
+ 'update_tag' => 'Aggiorna etichetta',
+ 'no_location_set' => 'Nessuna posizione impostata.',
+ 'meta_data' => 'Meta dati',
+ 'location' => 'Posizione',
+ 'without_date' => 'Senza data',
+ 'result' => 'Risultato',
+ 'sums_apply_to_range' => 'Tutte le somme si applicano all\'intervallo selezionato',
+ 'mapbox_api_key' => 'Per utilizzare la mappa, ottieni una chiave API da Mapbox. Apri il tuo file .env e inserisci questo codice dopo MAPBOX_API_KEY=.',
+ 'press_tag_location' => 'Fai clic destro o premi a lungo per impostare la posizione dell\'erichetta.',
+ 'clear_location' => 'Cancella posizione',
+
+ // preferences
+ 'pref_home_screen_accounts' => 'Conti nella schermata iniziale',
+ 'pref_home_screen_accounts_help' => 'Quali conti dovrebbero essere visualizzati sulla home page?',
+ 'pref_view_range' => 'Visualizza gamma',
+ 'pref_view_range_help' => 'Alcuni grafici sono raggruppati automaticamente in periodi. Che periodo preferiresti?',
+ 'pref_1D' => '1 Giorno',
+ 'pref_1W' => '1 Settimana',
+ 'pref_1M' => '1 Mese',
+ 'pref_3M' => 'Tre mesi (trimestre)',
+ 'pref_6M' => 'Sei mesi',
+ 'pref_1Y' => 'Un anno',
+ 'pref_languages' => 'Lingue',
+ 'pref_languages_help' => 'Firefly III supporta diverse lingue.',
+ 'pref_custom_fiscal_year' => 'Impostazioni anno fiscale',
+ 'pref_custom_fiscal_year_label' => 'Abilita',
+ 'pref_custom_fiscal_year_help' => 'Nei paesi che utilizzano un anno finanziario diverso dal 1 ° gennaio al 31 dicembre, è possibile attivarlo e specificare i giorni di inizio / fine anno fiscale',
+ 'pref_fiscal_year_start_label' => 'Data di inizio anno fiscale',
+ 'pref_two_factor_auth' => 'Verifica in due passaggi',
+ 'pref_two_factor_auth_help' => 'Quando abiliti la verifica in due passaggi (nota anche come autenticazione a due fattori), aggiungi un ulteriore livello di sicurezza al tuo account. Accedi con qualcosa che conosci (la tua password) e qualcosa che hai (un codice di verifica). I codici di verifica sono generati da un\'applicazione sul telefono, come Authy o Autenticatore Google.',
+ 'pref_enable_two_factor_auth' => 'Abilita la verifica in due passaggi',
+ 'pref_two_factor_auth_disabled' => 'Codice di verifica in due passaggi rimosso e disabilitato',
+ 'pref_two_factor_auth_remove_it' => 'Non dimenticare di rimuovere l\'account dalla tua app di autenticazione!',
+ 'pref_two_factor_auth_code' => 'Verificare il codice',
+ 'pref_two_factor_auth_code_help' => 'Esegui la scansione del codice QR con un\'applicazione sul tuo telefono come Authy o Google Authenticator e inserisci il codice generato.',
+ 'pref_two_factor_auth_reset_code' => 'Reimposta il codice di verifica',
+ 'pref_two_factor_auth_disable_2fa' => 'Disable 2FA',
+ 'pref_save_settings' => 'Salva le impostazioni',
+ 'saved_preferences' => 'Preferenze salvate!',
+ 'preferences_general' => 'Generale',
+ 'preferences_frontpage' => 'Schermata Home',
+ 'preferences_security' => 'Sicurezza',
+ 'preferences_layout' => 'Impaginazione',
+ 'pref_home_show_deposits' => 'Mostra i depositi sulla schermata principale',
+ 'pref_home_show_deposits_info' => 'La schermata iniziale mostra già i tuoi conti spese. Dovrebbe mostrare anche i tuoi account delle entrate?',
+ 'pref_home_do_show_deposits' => 'Sì, mostrali',
+ 'successful_count' => 'di cui :count con successo',
+ 'list_page_size_title' => 'Dimensioni pagina',
+ 'list_page_size_help' => 'Qualsiasi elenco di cose (conti, transazioni, ecc.) Mostra al massimo questo numero per pagina.',
+ 'list_page_size_label' => 'Dimensioni pagina',
+ 'between_dates' => '(:start e :end)',
+ 'pref_optional_fields_transaction' => 'Campi opzionali per le transazioni',
+ 'pref_optional_fields_transaction_help' => 'Per impostazione predefinita, non tutti i campi sono abilitati quando si crea una nuova transazione (a causa della confusione). Di seguito, puoi abilitare questi campi se ritieni che possano essere utili per te. Ovviamente, qualsiasi campo che è disabilitato, ma già compilato, sarà visibile indipendentemente dall\'impostazione.',
+ 'optional_tj_date_fields' => 'Campi data',
+ 'optional_tj_business_fields' => 'Campi aziendali',
+ 'optional_tj_attachment_fields' => 'Campi allegati',
+ 'pref_optional_tj_interest_date' => 'Data di interesse',
+ 'pref_optional_tj_book_date' => 'Data del libro',
+ 'pref_optional_tj_process_date' => 'Data di lavorazione',
+ 'pref_optional_tj_due_date' => 'Scadenza',
+ 'pref_optional_tj_payment_date' => 'Data di pagamento',
+ 'pref_optional_tj_invoice_date' => 'Data fattura',
+ 'pref_optional_tj_internal_reference' => 'Riferimento interno',
+ 'pref_optional_tj_notes' => 'Note',
+ 'pref_optional_tj_attachments' => 'Allegati',
+ 'optional_field_meta_dates' => 'Dati',
+ 'optional_field_meta_business' => 'Attività commerciale',
+ 'optional_field_attachments' => 'Allegati',
+ 'optional_field_meta_data' => 'Metadati opzionali',
+
+ // profile:
+ 'change_your_password' => 'Cambia la tua password',
+ 'delete_account' => 'Elimina account',
+ 'current_password' => 'Password corrente',
+ 'new_password' => 'Nuova password',
+ 'new_password_again' => 'Nuova password (ancora)',
+ 'delete_your_account' => 'cancella il tuo account',
+ 'delete_your_account_help' => 'L\'eliminazione del tuo account eliminerà anche conti, transazioni, qualsiasi cosa che potresti aver salvato in Firefly III. Sarà ELIMINATO.',
+ 'delete_your_account_password' => 'Inserisci la tua password per continuare.',
+ 'password' => 'Password',
+ 'are_you_sure' => 'Sei sicuro? Non puoi annullare questo.',
+ 'delete_account_button' => 'ELIMINA il tuo account',
+ 'invalid_current_password' => 'Password attuale non valida!',
+ 'password_changed' => 'Password cambiata!',
+ 'should_change' => 'L\'idea è di cambiare la tua password.',
+ 'invalid_password' => 'Password non valida!',
+ 'what_is_pw_security' => 'Che cos\'è "verifica la sicurezza della password"?',
+ 'secure_pw_title' => 'Come scegliere una password sicura',
+ 'secure_pw_history' => 'Nell\'agosto 2017, il noto ricercatore di sicurezza Troy Hunt ha pubblicato una lista di 306 milioni di password rubate. Queste password sono state rubate durante i break in aziende come LinkedIn, Adobe e NeoPets (e molte altre).',
+ 'secure_pw_check_box' => 'Selezionando la casella, Firefly III invierà l\'hash SHA1 della tua password a il sito web di Troy Hunt per vedere se è presente nell\'elenco. Questo ti impedirà di usare password non sicure come raccomandato nell\'ultima Pubblicazione speciale NIST su questo argomento.',
+ 'secure_pw_sha1' => 'Ma pensavo che SHA1 fosse rotto?',
+ 'secure_pw_hash_speed' => 'Sì, ma non in questo contesto. Come puoi leggere su il sito web che spiega come hanno rotto SHA1 , ora è leggermente più facile trovare una "collisione": un\'altra stringa che risulta nello stesso hash SHA1. Ora ci vogliono solo 10.000 anni usando una macchina a GPU singola.',
+ 'secure_pw_hash_security' => 'Questa collisione non sarebbe uguale alla tua password, né sarebbe utile su (un sito come) Firefly III. Questa applicazione non utilizza SHA1 per la verifica della password. Quindi è sicuro controllare questa casella. La tua password viene sottoposta a hash e inviata tramite HTTPS.',
+ 'secure_pw_should' => 'Devo controllare la scatola?',
+ 'secure_pw_long_password' => 'Se hai appena generato una password lunga e monouso per Firefly III utilizzando un qualche tipo di generatore di password: no.',
+ 'secure_pw_short' => 'Se hai appena inserito la password, usi sempre: Si prega di.',
+ 'command_line_token' => 'Token della riga di comando',
+ 'explain_command_line_token' => 'È necessario questo token per eseguire le opzioni della riga di comando, come l\'importazione o l\'esportazione di dati. Senza di esso, tali comandi sensibili non funzioneranno. Non condividere il token della riga di comando. Nessuno ti chiederà questo segno, nemmeno io. Se temi di aver perso questo, o quando sei insicuro, rigenera questo token usando il pulsante.',
+ 'regenerate_command_line_token' => 'Rigenera il token della riga di comando',
+ 'token_regenerated' => 'È stato generato un nuovo token della riga di comando',
+ 'change_your_email' => 'Cambia il tuo indirizzo email',
+ 'email_verification' => 'Un messaggio di posta elettronica verrà inviato al tuo vecchio e nuovo indirizzo email. Per motivi di sicurezza, non potrai accedere fino a quando non avrai verificato il tuo nuovo indirizzo email. Se non si è sicuri che l\'installazione di Firefly III sia in grado di inviare e-mail, si prega di non utilizzare questa funzione. Se sei un amministratore, puoi verificarlo nella amministrazione.',
+ 'email_changed_logout' => 'Fino a quando non verifichi il tuo indirizzo email, non puoi effettuare il login.',
+ 'login_with_new_email' => 'Ora puoi accedere con il tuo nuovo indirizzo email.',
+ 'login_with_old_email' => 'Ora puoi accedere nuovamente con il tuo vecchio indirizzo email.',
+
+ // attachments
+ 'nr_of_attachments' => 'Un allegato|:count attachments',
+ 'attachments' => 'Allegati',
+ 'edit_attachment' => 'Modifica allegato ":name"',
+ 'update_attachment' => 'Aggiorna allegati',
+ 'delete_attachment' => 'Elimina allegato ":name"',
+ 'attachment_deleted' => 'Allegato eliminato ":name"',
+ 'attachment_updated' => 'Allegato aggiornato ":name"',
+ 'upload_max_file_size' => 'Dimensione massima del file: :size',
+
+ // transaction index
+ 'title_expenses' => 'Spese',
+ 'title_withdrawal' => 'Spese',
+ 'title_revenue' => 'Reddito / Entrata',
+ 'title_deposit' => 'Reddito / Entrata',
+ 'title_transfer' => 'Trasferimenti',
+ 'title_transfers' => 'Trasferimenti',
+
+ // convert stuff:
+ 'convert_is_already_type_Withdrawal' => 'Questa transazione è già un prelievo',
+ 'convert_is_already_type_Deposit' => 'Questa transazione è già un deposito',
+ 'convert_is_already_type_Transfer' => 'Questa transazione è già un giroconto',
+ 'convert_to_Withdrawal' => 'Converti ":description" in un prelievo',
+ 'convert_to_Deposit' => 'Converti ":description" in un deposito',
+ 'convert_to_Transfer' => 'Converti ":description" in un giroconto',
+ 'convert_options_WithdrawalDeposit' => 'Convertire un prelievo in un deposito',
+ 'convert_options_WithdrawalTransfer' => 'Convertire un prelievo in un giroconto',
+ 'convert_options_DepositTransfer' => 'Convertire un deposito in un giroconto',
+ 'convert_options_DepositWithdrawal' => 'Converti un deposito in un prelievo',
+ 'convert_options_TransferWithdrawal' => 'Convertire un giroconto in un prelievo',
+ 'convert_options_TransferDeposit' => 'Converti un bonifico in un deposito',
+ 'convert_Withdrawal_to_deposit' => 'Converti questo prelievo in un deposito',
+ 'convert_Withdrawal_to_transfer' => 'Converti questo prelievo in un giroconto',
+ 'convert_Deposit_to_withdrawal' => 'Converti questo deposito in un prelievo',
+ 'convert_Deposit_to_transfer' => 'Converti questo deposito in un giroconto',
+ 'convert_Transfer_to_deposit' => 'Converti questo giroconto in un deposito',
+ 'convert_Transfer_to_withdrawal' => 'Converti questo giroconto in un prelievo',
+ 'convert_please_set_revenue_source' => 'Si prega di scegliere il conto delle entrate da dove verranno i soldi.',
+ 'convert_please_set_asset_destination' => 'Si prega di scegliere il conto patrimoniale dove andranno i soldi.',
+ 'convert_please_set_expense_destination' => 'Si prega di scegliere il conto spese dove andranno i soldi.',
+ 'convert_please_set_asset_source' => 'Si prega di scegliere il conto patrimoniale da dove verranno i soldi.',
+ 'convert_explanation_withdrawal_deposit' => 'Se converti questo prelievo in un deposito, l\'importo verrà :amount depositato in :sourceName anziché prelevato da esso.',
+ 'convert_explanation_withdrawal_transfer' => 'Se converti questo prelievo in un giroconto, l\'importo verrà :amount trasferito da :sourceName a un nuovo conto attività, invece di essere pagato a :destinationName.',
+ 'convert_explanation_deposit_withdrawal' => 'Se converti questo deposito in un prelievo, l\'importo verrà rimosso :amount da :destinationName anziché aggiunto ad esso.',
+ 'convert_explanation_deposit_transfer' => 'Se converti questo deposito in un giroconto, :amount verrà trasferito da un conto attivo di tua scelta in :destinationName.',
+ 'convert_explanation_transfer_withdrawal' => 'Se converti questo giroconto in un prelievo, l\'importo :amount andrà da :sourceName a una nuova destinazione a titolo di spesa, anziché a :destinationName come giroconto.',
+ 'convert_explanation_transfer_deposit' => 'Se converti questo giroconto in un deposito, :amount verrà depositato nell\'account :destinationName anziché essere trasferito lì.',
+ 'converted_to_Withdrawal' => 'La transazione è stata convertita in un prelievo',
+ 'converted_to_Deposit' => 'La transazione è stata convertita in un deposito',
+ 'converted_to_Transfer' => 'La transazione è stata convertita in un giroconto',
+ 'invalid_convert_selection' => 'Tl\'account che hai selezionato è già utilizzato in questa transazione o non esiste.',
+
+ // create new stuff:
+ 'create_new_withdrawal' => 'Crea un nuovo prelievo',
+ 'create_new_deposit' => 'Crea una nuova entrata',
+ 'create_new_transfer' => 'Crea nuovo giroconto',
+ 'create_new_asset' => 'Crea un nuovo conto attività',
+ 'create_new_expense' => 'Crea un nuovo conto di spesa',
+ 'create_new_revenue' => 'Crea un nuovo conto di entrate',
+ 'create_new_piggy_bank' => 'Crea un nuovo salvadanaio',
+ 'create_new_bill' => 'Crea una nuova fattura',
+
+ // currencies:
+ 'create_currency' => 'Crea una nuova valuta',
+ 'store_currency' => 'Salva nuova valuta',
+ 'update_currency' => 'Aggiorna valuta',
+ 'new_default_currency' => ':name ora è la valuta predefinita.',
+ 'cannot_delete_currency' => 'Impossibile eliminare :name perché è ancora in uso.',
+ 'deleted_currency' => 'Valuta :name elimina',
+ 'created_currency' => 'Valuta :name creata',
+ 'updated_currency' => 'Valuta :name aggiornata',
+ 'ask_site_owner' => 'Chiedi a :owner di aggiungere, rimuovere o modificare valute.',
+ 'currencies_intro' => 'Firefly III supporta varie valute che è possibile impostare e abilitare qui.',
+ 'make_default_currency' => 'rendere predefinito',
+ 'default_currency' => 'predefinito',
+
+ // forms:
+ 'mandatoryFields' => 'Campi obbligatori',
+ 'optionalFields' => 'Campi opzionali',
+ 'options' => 'Opzioni',
+
+ // budgets:
+ 'create_new_budget' => 'Crea nuovo bilancio',
+ 'store_new_budget' => 'Salva il nuovo bilancio',
+ 'stored_new_budget' => 'Nuovo bilancio salvato ":name"',
+ 'available_between' => 'Disponibile tra :start e :end',
+ 'transactionsWithoutBudget' => 'Spese senza bilancio',
+ 'transactions_no_budget' => 'Spese senza bilancio tra :start e :end',
+ 'spent_between' => 'Speso tra :start e :end',
+ 'createBudget' => 'Nuovo bilancio',
+ 'inactiveBudgets' => 'Bilanci disattivati',
+ 'without_budget_between' => 'Transazioni senza un bilancio tra :start e :end',
+ 'delete_budget' => 'Elimina Bilancio ":name"',
+ 'deleted_budget' => 'Bilancio eliminato ":name"',
+ 'edit_budget' => 'Modifica Bilancio ":name"',
+ 'updated_budget' => 'Bilancio aggiornato ":name"',
+ 'update_amount' => 'Importo aggiornato',
+ 'update_budget' => 'Bilancio aggiornato',
+ 'update_budget_amount_range' => 'Aggiornamento (previsto) importo disponibile tra :start and :end',
+ 'budget_period_navigator' => 'Navigatore periodico',
+ 'info_on_available_amount' => 'Cosa ho a disposizione?',
+ 'available_amount_indication' => 'Utilizza questi importi per ottenere un\'indicazione di quale potrebbe essere il tuo budget totale.',
+ 'suggested' => 'Consigliato',
+ 'average_between' => 'Media tra :start e :end',
+ 'over_budget_warn' => ' Normally you budget about :amount per day. This is :over_amount per day.',
+
+ // bills:
+ 'matching_on' => 'Accoppiamento',
+ 'between_amounts' => 'fra :low e :high.',
+ 'repeats' => 'Ripeti',
+ 'connected_journals' => 'Transazioni connesse',
+ 'auto_match_on' => 'Abbinato automaticamente da Firefly III',
+ 'auto_match_off' => 'Non abbinato automaticamente a Firefly III',
+ 'next_expected_match' => 'Prossima partita prevista',
+ 'delete_bill' => 'Elimina fattura ":name"',
+ 'deleted_bill' => 'Fattura eliminata ":name"',
+ 'edit_bill' => 'Modifica fattura ":name"',
+ 'more' => 'Altro',
+ 'rescan_old' => 'Riscansiona vecchie transazioni',
+ 'update_bill' => 'Aggiorna fattura',
+ 'updated_bill' => 'Fattura aggiornata ":name"',
+ 'store_new_bill' => 'Salva la nuova fattura',
+ 'stored_new_bill' => 'Nuova fattura memorizzata ":name"',
+ 'cannot_scan_inactive_bill' => 'Le fatture non attive non possono essere scansionate.',
+ 'rescanned_bill' => 'Riscritto tutto.',
+ 'average_bill_amount_year' => 'Importo medio della fattura (:year)',
+ 'average_bill_amount_overall' => 'Importo medio della fattura (totale)',
+ 'bill_is_active' => 'Fattura attiva',
+ 'bill_expected_between' => 'Previsto tra :start e :end',
+ 'bill_will_automatch' => 'La ricevuta verrà automaticamente collegata alle transazioni corrispondenti',
+ 'skips_over' => 'salta sopra',
+
+ // accounts:
+ 'details_for_asset' => 'Dettagli per conto attività ":name"',
+ 'details_for_expense' => 'Dettagli per conto spese ":name"',
+ 'details_for_revenue' => 'Dettagli per conto delle entrate ":name"',
+ 'details_for_cash' => 'Dettagli per conto in contanti ":name"',
+ 'store_new_asset_account' => 'Salva nuovo conto attività',
+ 'store_new_expense_account' => 'Salva il nuovo conto spese',
+ 'store_new_revenue_account' => 'Salva il nuovo conto entrate',
+ 'edit_asset_account' => 'Modifica conto attività ":name"',
+ 'edit_expense_account' => 'Modifica conto spese ":name"',
+ 'edit_revenue_account' => 'Modifica conto entrate ":name"',
+ 'delete_asset_account' => 'Elimina conto attività ":name"',
+ 'delete_expense_account' => 'Elimina conto spese ":name"',
+ 'delete_revenue_account' => 'Elimina conto entrate ":name"',
+ 'asset_deleted' => 'Conto attività eliminato correttamente ":name"',
+ 'expense_deleted' => 'Conto spese eliminato correttamente ":name"',
+ 'revenue_deleted' => 'Conto entrate eliminato correttamente ":name"',
+ 'update_asset_account' => 'Aggiorna conto attività',
+ 'update_expense_account' => 'Aggiorna conto spese',
+ 'update_revenue_account' => 'Aggiorna conto entrate',
+ 'make_new_asset_account' => 'Crea un nuovo conto attività',
+ 'make_new_expense_account' => 'Crea un nuovo conto spesa',
+ 'make_new_revenue_account' => 'Crea nuovo conto entrate',
+ 'asset_accounts' => 'Conti patrimoniali',
+ 'expense_accounts' => 'Conti spese',
+ 'revenue_accounts' => 'Conti entrate',
+ 'cash_accounts' => 'Conti cassa',
+ 'Cash account' => 'Conto cassa',
+ 'reconcile_account' => 'Riconciliazione conto ":account"',
+ 'delete_reconciliation' => 'Elimina riconciliazione',
+ 'update_reconciliation' => 'Aggiorna riconciliazione',
+ 'amount_cannot_be_zero' => 'The amount cannot be zero',
+ 'end_of_reconcile_period' => 'Fine periodo riconciliazione: :period',
+ 'start_of_reconcile_period' => 'Inizio periodo riconciliazione: :period',
+ 'start_balance' => 'Saldo inizio',
+ 'end_balance' => 'Saldo fine',
+ 'update_balance_dates_instruction' => 'Abbina gli importi e le date sopra al tuo estratto conto e premi "Inizia la riconciliazione"',
+ 'select_transactions_instruction' => 'Seleziona le transazioni che appaiono sul tuo estratto conto.',
+ 'select_range_and_balance' => 'Innanzitutto verifica l\'intervallo di date e i saldi. Quindi premere "Inizia riconciliazione"',
+ 'date_change_instruction' => 'Se cambi ora l\'intervallo di date, qualsiasi progresso andrà perso.',
+ 'update_selection' => 'Aggiorna selezione',
+ 'store_reconcile' => 'Memorizza la riconciliazione',
+ 'reconciliation_transaction' => 'Transazione di riconciliazione',
+ 'Reconciliation' => 'Riconciliazione',
+ 'reconciliation' => 'Riconciliazione',
+ 'reconcile_options' => 'Opzioni di riconciliazione',
+ 'reconcile_range' => 'Intervallo di riconciliazione',
+ 'start_reconcile' => 'Avvia la riconciliazione',
+ 'cash' => 'cassa',
+ 'account_type' => 'Tipo conto',
+ 'save_transactions_by_moving' => 'Salva questa(e) transazione(i) spostandola(e) in un altro conto:',
+ 'stored_new_account' => 'Nuovo conto ":name" stored!',
+ 'updated_account' => 'Aggiorna conto ":name"',
+ 'credit_card_options' => 'Opzioni Carta di Credito',
+ 'no_transactions_account' => 'Non ci sono transazioni (in questo periodo) per il conto attività ":name".',
+ 'no_data_for_chart' => 'Non ci sono (ancora) abbastanza informazioni per generare questo grafico.',
+ 'select_more_than_one_account' => 'Si prega di selezionare più di un conto',
+ 'select_more_than_one_category' => 'Si prega di selezionare più di una categoria',
+ 'select_more_than_one_budget' => 'Si prega di selezionare più di un bilancio',
+ 'select_more_than_one_tag' => 'Si prega di selezionare più di una etichetta',
+ 'account_default_currency' => 'Se selezioni un\'altra valuta, le nuove transazioni di questo conto avranno questa valuta predefinita.',
+ 'reconcile_has_more' => 'Il tuo conto Firefly III ha più denaro irispetto a quanto afferma la tua banca. Ci sono diverse opzioni Si prega di scegliere cosa fare. Quindi, premere "Conferma riconciliazione".',
+ 'reconcile_has_less' => 'Il tuo conto Firefly III ha meno denaro rispetto a quanto afferma la tua banca. Ci sono diverse opzioni Si prega di scegliere cosa fare. Quindi, premi "Conferma riconciliazione".',
+ 'reconcile_is_equal' => 'La tua contabilità di Firefly III e le tue coordinate bancarie corrispondono. Non c\'è niente da fare. Si prega di premere "Conferma riconciliazione" per confermare l\'inserimento.',
+ 'create_pos_reconcile_transaction' => 'Cancella le transazioni selezionate e crea una correzione aggiungendo :amount a questo conto attività.',
+ 'create_neg_reconcile_transaction' => 'Cancella le transazioni selezionate e crea una correzione rimuovendo :amount da questo conto attività.',
+ 'reconcile_do_nothing' => 'Cancella le transazioni selezionate, ma non correggere.',
+ 'reconcile_go_back' => 'Puoi sempre modificare o eliminare una correzione in un secondo momento.',
+ 'must_be_asset_account' => 'È possibile riconciliare solo i conti attività',
+ 'reconciliation_stored' => 'Riconciliazione memorizzata',
+ 'reconcilliation_transaction_title' => 'Riconciliazione (:from a :to)',
+ 'reconcile_this_account' => 'Riconcilia questo conto',
+ 'confirm_reconciliation' => 'Conferma riconciliazione',
+ 'submitted_start_balance' => 'Bilancio di partenza presentato',
+ 'selected_transactions' => 'Transazioni selezionate (:count)',
+ 'already_cleared_transactions' => 'Transazioni selezionate (:count)',
+ 'submitted_end_balance' => 'Bilancio finale inviato',
+ 'initial_balance_description' => 'Saldo iniziale per ":account"',
+
+ // categories:
+ 'new_category' => 'Nuova categoria',
+ 'create_new_category' => 'Crea nuova categoria',
+ 'without_category' => 'Senza categoria',
+ 'update_category' => 'Aggiorna categoria',
+ 'updated_category' => 'Aggiorna categoria ":name"',
+ 'categories' => 'Categorie',
+ 'edit_category' => 'Modifica categoria ":name"',
+ 'no_category' => '(nessuna categoria)',
+ 'category' => 'Categoria',
+ 'delete_category' => 'Elimina categoria ":name"',
+ 'deleted_category' => 'Categoria eliminata ":name"',
+ 'store_category' => 'Salva nuova categoria',
+ 'stored_category' => 'Salva nuova categoria ":name"',
+ 'without_category_between' => 'Senza categoria tra :start e :end',
+
+ // transactions:
+ 'update_withdrawal' => 'Aggiorna spesa',
+ 'update_deposit' => 'Aggiorna entrata',
+ 'update_transfer' => 'Aggiorna giroconto',
+ 'updated_withdrawal' => 'Spesa aggiornata ":description"',
+ 'updated_deposit' => 'Entrata aggiornata ":description"',
+ 'updated_transfer' => 'Giroconto aggiornato ":description"',
+ 'delete_withdrawal' => 'Elimina spesa ":description"',
+ 'delete_deposit' => 'Elimina entrata ":description"',
+ 'delete_transfer' => 'Elimina giroconto ":description"',
+ 'deleted_withdrawal' => 'Spesa eliminata correttamente ":description"',
+ 'deleted_deposit' => 'Entrata eliminata correttamente ":description"',
+ 'deleted_transfer' => 'Giroconto eliminato correttamente ":description"',
+ 'stored_journal' => 'Nuova transazione creata correttamente ":description"',
+ 'select_transactions' => 'Seleziona transazioni',
+ 'rule_group_select_transactions' => 'Applica ":title" a transazioni',
+ 'rule_select_transactions' => 'Applica ":title" a transazioni',
+ 'stop_selection' => 'Smetti di selezionare le transazioni',
+ 'reconcile_selected' => 'Riconcilia',
+ 'mass_delete_journals' => 'Elimina un numero di transazioni',
+ 'mass_edit_journals' => 'Modifica un numero di transazioni',
+ 'mass_bulk_journals' => 'Modifica in blocco un numero di transazioni',
+ 'mass_bulk_journals_explain' => 'Se non si desidera modificare le transazioni una alla volta utilizzando la funzione di modifica di massa, è possibile aggiornarle in una volta sola. Basta selezionare la categoria, le etichette o il bilancio preferiti nei campi sottostanti e tutte le transazioni nella tabella verranno aggiornate.',
+ 'bulk_set_new_values' => 'Usa gli inserimenti qui sotto per impostare nuovi valori. Se li lasci vuoti, saranno resi vuoti per tutti. Inoltre, si noti che solo i prelievi avranno un bilancio.',
+ 'no_bulk_category' => 'Non aggiornare la categoria',
+ 'no_bulk_budget' => 'Non aggiornare il bilancio',
+ 'no_bulk_tags' => 'Non aggiornare la(e) etichetta(e)',
+ 'bulk_edit' => 'Modifica collettiva',
+ 'cannot_edit_other_fields' => 'Non puoi modificare in massa altri campi oltre a quelli qui, perché non c\'è spazio per mostrarli. Segui il link e modificali uno per uno, se è necessario modificare questi campi.',
+ 'no_budget' => 'nessuno',
+ 'no_budget_squared' => '(nessun bilancio)',
+ 'perm-delete-many' => 'Eliminare molti oggetti in una volta sola può essere molto pericoloso. Per favore sii cauto.',
+ 'mass_deleted_transactions_success' => 'Transazione(i) eliminata(e) :amount.',
+ 'mass_edited_transactions_success' => 'Transazione(i) aggiornata(e) :amount.',
+ 'opt_group_no_account_type' => '(nessun tipo di conto)',
+ 'opt_group_defaultAsset' => 'Conto attività predefinito',
+ 'opt_group_savingAsset' => 'Conti risparmio',
+ 'opt_group_sharedAsset' => 'Conti risorse condivise',
+ 'opt_group_ccAsset' => 'Carte di credito',
+ 'notes' => 'Note',
+
+ // new user:
+ 'welcome' => 'Benvenuto in Firefly III!',
+ 'submit' => 'Invia',
+ 'getting_started' => 'Inizia',
+ 'to_get_started' => 'È bello vedere che hai installato Firefly III con successo. Per iniziare con questo strumento, inserisci il nome della tua banca e il saldo del tuo conto corrente principale. Non preoccuparti se hai più account. È possibile aggiungere quelli più tardi. Firefly III ha bisogno di qualcosa per iniziare.',
+ 'savings_balance_text' => 'Firefly III creerà automaticamente un conto di risparmio per te. Per impostazione predefinita, non ci saranno soldi nel tuo conto di risparmio, ma se comunichi a Firefly III il saldo verrà archiviato come tale.',
+ 'finish_up_new_user' => 'Questo è tutto! Puoi continuare premendo Invia. Verrai indirizzato all\'indice di Firefly III.',
+ 'stored_new_accounts_new_user' => 'I tuoi nuovi conti sono stati salvati.',
+
+ // home page:
+ 'yourAccounts' => 'I tuoi conti',
+ 'budgetsAndSpending' => 'Bilanci e Spese',
+ 'savings' => 'Risparmi',
+ 'newWithdrawal' => 'Nuova uscita',
+ 'newDeposit' => 'Nuovo deposito',
+ 'newTransfer' => 'Nuovo giroconto',
+ 'bills_to_pay' => 'Fatture da pagare',
+ 'per_day' => 'Al giorno',
+ 'left_to_spend_per_day' => 'Spese al giorno',
+ 'bills_paid' => 'Fatture pagate',
+
+ // menu and titles, should be recycled as often as possible:
+ 'currency' => 'Valuta',
+ 'preferences' => 'Preferenze',
+ 'logout' => 'Esci',
+ 'toggleNavigation' => 'Attiva / disattiva la navigazione',
+ 'searchPlaceholder' => 'Cerca...',
+ 'version' => 'Versione',
+ 'dashboard' => 'Cruscotto',
+ 'currencies' => 'Valute',
+ 'accounts' => 'Conti',
+ 'Asset account' => 'Conto attività',
+ 'Default account' => 'Conto predefinito',
+ 'Expense account' => 'Conto spese',
+ 'Revenue account' => 'Conto entrate',
+ 'Initial balance account' => 'Saldo iniziale conto',
+ 'budgets' => 'Bilanci',
+ 'tags' => 'Etichette',
+ 'reports' => 'Stampe',
+ 'transactions' => 'Transazioni',
+ 'expenses' => 'Spese',
+ 'income' => 'Reddito / Entrata',
+ 'transfers' => 'Trasferimenti',
+ 'moneyManagement' => 'Gestione danaro',
+ 'piggyBanks' => 'Salvadanai',
+ 'bills' => 'Fatture',
+ 'withdrawal' => 'Uscite',
+ 'opening_balance' => 'Saldo di apertura',
+ 'deposit' => 'Entrata',
+ 'account' => 'Conto',
+ 'transfer' => 'Giroconto',
+ 'Withdrawal' => 'Spesa',
+ 'Deposit' => 'Entrata',
+ 'Transfer' => 'Giroconto',
+ 'bill' => 'Fattura',
+ 'yes' => 'Si',
+ 'no' => 'No',
+ 'amount' => 'Conto',
+ 'overview' => 'Panoramica',
+ 'saveOnAccount' => 'Risparmio sul conto',
+ 'unknown' => 'Sconosciuto',
+ 'daily' => 'Giornaliero',
+ 'monthly' => 'Mensile',
+ 'profile' => 'Profilo',
+ 'errors' => 'Errori',
+
+ // reports:
+ 'report_default' => 'Stampa predefinita delle tue finanze tra :start e :end',
+ 'report_audit' => 'Panoramica cronologica delle transazioni tra :start e :end',
+ 'report_category' => 'Stampa categoria tra :start e :end',
+ 'report_account' => 'Stampa Conti spese / entrate tra :start e :end',
+ 'report_budget' => 'Stampa Bilancio tra :start e :end',
+ 'report_tag' => 'Stampa etichetta tra :start e :end',
+ 'quick_link_reports' => 'Collegamenti veloci',
+ 'quick_link_default_report' => 'Stampa finanze predefinita',
+ 'quick_link_audit_report' => 'Panoramica cronologica delle transazioni',
+ 'report_this_month_quick' => 'Mese corrente - tutti i conti',
+ 'report_this_year_quick' => 'Anno corrente - tutti i conti',
+ 'report_this_fiscal_year_quick' => 'Anno fiscale corrente - tutti i conti',
+ 'report_all_time_quick' => 'Sempre tutti i conti',
+ 'reports_can_bookmark' => 'Ricorda che le stampe possono essere aggiunte ai segnalibri.',
+ 'incomeVsExpenses' => 'Entrate verso spese',
+ 'accountBalances' => 'Saldo dei conti',
+ 'balanceStart' => 'Saldo inizio periodo',
+ 'balanceEnd' => 'Saldo fine del periodo',
+ 'splitByAccount' => 'Dividi per conto',
+ 'coveredWithTags' => 'Coperto con etichetta',
+ 'leftUnbalanced' => 'Sbilanciato a sinistra',
+ 'leftInBudget' => 'Rimasto nel bilancio',
+ 'sumOfSums' => 'Somma dei conti',
+ 'noCategory' => '(nessuna categoria)',
+ 'notCharged' => 'Non caricato (ancora)',
+ 'inactive' => 'Disattivo',
+ 'active' => 'Attivo',
+ 'difference' => 'Differenze',
+ 'money_flowing_in' => 'Entrate',
+ 'money_flowing_out' => 'Uscite',
+ 'topX' => 'Superiore :number',
+ 'show_full_list' => 'Mostra elenco completo',
+ 'show_only_top' => 'Mostra solo in alto :number',
+ 'report_type' => 'Tipo stampa',
+ 'report_type_default' => 'Stampa finanze predefinita',
+ 'report_type_audit' => 'Panoramica cronologica delle transazioni (controllo)',
+ 'report_type_category' => 'Stampa categoria',
+ 'report_type_budget' => 'Stampa bilancio',
+ 'report_type_tag' => 'Stampa etichetta',
+ 'report_type_account' => 'Stampa conto spese / entrate',
+ 'more_info_help' => 'Ulteriori informazioni su questi tipi distampe sono disponibili nelle pagine della guida. Premi l\'icona (?) Nell\'angolo in alto a destra.',
+ 'report_included_accounts' => 'Conti inclusi',
+ 'report_date_range' => 'Date intervallo',
+ 'report_preset_ranges' => 'Intervalli preimpostati',
+ 'shared' => 'Condiviso',
+ 'fiscal_year' => 'Anno fiscale',
+ 'income_entry' => 'Entrate del conto ":name" tra :start e :end',
+ 'expense_entry' => 'Spese per il conto ":name" tra :start e :end',
+ 'category_entry' => 'Spese nella categoria ":name" tra :start e :end',
+ 'budget_spent_amount' => 'Spese di bilancio ":budget" tra :start e :end',
+ 'balance_amount' => 'Spese nel bilancio ":budget" pagate dal conto ":account" tra :start e :end',
+ 'no_audit_activity' => 'Nessuna attività è stata registrata nel conto :account_name tra :start e :end.',
+ 'audit_end_balance' => 'Il saldo del conto di :account_name alla fine di :end era: :balance',
+ 'reports_extra_options' => 'Opzioni extra',
+ 'report_has_no_extra_options' => 'Questa stampa non ha opzioni extra',
+ 'reports_submit' => 'Mostra stampa',
+ 'end_after_start_date' => 'La data della fine della stampa deve essere successiva alla data di inizio.',
+ 'select_category' => 'Seleziona la(e) categoria (e)',
+ 'select_budget' => 'Seleziona il(i) bilancio(i).',
+ 'select_tag' => 'Seleziona etichetta(e).',
+ 'income_per_category' => 'Reddito per categoria',
+ 'expense_per_category' => 'Spese per categoria',
+ 'expense_per_budget' => 'Spese per bilancio',
+ 'income_per_account' => 'Reddito per conto',
+ 'expense_per_account' => 'Spese per conto',
+ 'expense_per_tag' => 'Spese per etichetta',
+ 'income_per_tag' => 'Reddito per etichetta',
+ 'include_expense_not_in_budget' => 'Spese non incluse nel(nei) bilancio(i) selezionato(i)',
+ 'include_expense_not_in_account' => 'Spese non incluse nel(nei) conto(i) selezionato(i)',
+ 'include_expense_not_in_category' => 'Spese incluse / non incluse nella(e) categoria(e) selezionata(e)',
+ 'include_income_not_in_category' => 'Entrate non incluse nella(e) categoria(e) selezionata(e)',
+ 'include_income_not_in_account' => 'Entrate non incluse nel(i) conto(i) selezionato(i)',
+ 'include_income_not_in_tags' => 'Entrate incluse / non incluse nella(e) etichetta(e) selezionata(e)',
+ 'include_expense_not_in_tags' => 'Spese incluse / non incluse nella(e) etichetta(e) selezionata(e)',
+ 'everything_else' => 'Tutto il resto',
+ 'income_and_expenses' => 'Entrate e spese',
+ 'spent_average' => 'Speso (media)',
+ 'income_average' => 'Reddito (media)',
+ 'transaction_count' => 'Conteggio transazioni',
+ 'average_spending_per_account' => 'Spesa media per conto',
+ 'average_income_per_account' => 'Reddito medio per conto',
+ 'total' => 'Totale',
+ 'description' => 'Descrizione',
+ 'sum_of_period' => 'Somma del periodo',
+ 'average_in_period' => 'Media nel periodo',
+ 'account_role_defaultAsset' => 'Conto attività predefinito',
+ 'account_role_sharedAsset' => 'Conto attività condiviso',
+ 'account_role_savingAsset' => 'Conto risparmio',
+ 'account_role_ccAsset' => 'Carta di credito',
+ 'budget_chart_click' => 'Fai clic su un nome del bilancio nella tabella sopra per vedere un grafico.',
+ 'category_chart_click' => 'Fare clic sul nome di una categoria nella tabella sopra per vedere un grafico.',
+ 'in_out_accounts' => 'Guadagnati e spesi per combinazione',
+ 'in_out_per_category' => 'Guadagnati e spesi per categoria',
+ 'out_per_budget' => 'Speso per bilancio',
+ 'select_expense_revenue' => 'Seleziona conto spese / entrate',
+
+ // charts:
+ 'chart' => 'Grafico',
+ 'month' => 'Mese',
+ 'budget' => 'Bilancio',
+ 'spent' => 'Speso',
+ 'spent_in_budget' => 'Speso in bilancio',
+ 'left_to_spend' => 'Altro da spendere',
+ 'earned' => 'Guadagnato',
+ 'overspent' => 'Speso troppo',
+ 'left' => 'Resto',
+ 'max-amount' => 'Importo massimo',
+ 'min-amount' => 'Importo minimo',
+ 'journal-amount' => 'Entrata fattura corrente',
+ 'name' => 'Nome',
+ 'date' => 'Data',
+ 'paid' => 'Pagato',
+ 'unpaid' => 'Da pagare',
+ 'day' => 'Giorno',
+ 'budgeted' => 'Preventivato',
+ 'period' => 'Periodo',
+ 'balance' => 'Bilancio',
+ 'sum' => 'Somma',
+ 'average' => 'Media',
+ 'balanceFor' => 'Bilancio per :name',
+
+ // piggy banks:
+ 'add_money_to_piggy' => 'Aggiungi denaro al salvadanaio":name"',
+ 'piggy_bank' => 'Salvadanaio',
+ 'new_piggy_bank' => 'Nuovo salvadanaio',
+ 'store_piggy_bank' => 'Salva il nuovo salvadanaio',
+ 'stored_piggy_bank' => 'Salva il nuovo salvadanaio ":name"',
+ 'account_status' => 'Stato conto',
+ 'left_for_piggy_banks' => 'Lasciato nei salvadanai',
+ 'sum_of_piggy_banks' => 'Somma di salvadanai',
+ 'saved_so_far' => 'Salvato finora',
+ 'left_to_save' => 'Lasciato per salvare',
+ 'suggested_amount' => 'Quantità mensile consigliata da salvare',
+ 'add_money_to_piggy_title' => 'Aggiungi denaro al salvadanaio ":name"',
+ 'remove_money_from_piggy_title' => 'Rimuovi i soldi dal salvadanaio ":name"',
+ 'add' => 'Aggiungi',
+ 'no_money_for_piggy' => 'non hai soldi da mettere in questo salvadanaio.',
+
+ 'remove' => 'Rimuovi',
+ 'max_amount_add' => 'L\'importo massimo che puoi aggiungere è',
+ 'max_amount_remove' => 'L\'importo massimo che puoi rimuovere è',
+ 'update_piggy_button' => 'Aggiorna salvadanaio',
+ 'update_piggy_title' => 'Aggiorna salvadanaio ":name"',
+ 'updated_piggy_bank' => 'Aggiorna salvadanaio ":name"',
+ 'details' => 'Dettagli',
+ 'events' => 'Eventi',
+ 'target_amount' => 'Importo obiettivo',
+ 'start_date' => 'Data inizio',
+ 'target_date' => 'Data fine',
+ 'no_target_date' => 'Nessuna data fine',
+ 'table' => 'Tabella',
+ 'delete_piggy_bank' => 'Elimina salvadanaio ":name"',
+ 'cannot_add_amount_piggy' => 'Impossibile aggiungere :amount a ":name".',
+ 'cannot_remove_from_piggy' => 'Impossibile rimuovere :amount a ":name".',
+ 'deleted_piggy_bank' => 'Salvadanaio eliminato ":name"',
+ 'added_amount_to_piggy' => 'Aggiunto :amount a ":name"',
+ 'removed_amount_from_piggy' => 'Rimosso :amount a ":name"',
+
+ // tags
+ 'delete_tag' => 'Elimina etichetta ":tag"',
+ 'deleted_tag' => 'Etichetta eliminata ":tag"',
+ 'new_tag' => 'Crea nuova etichetta',
+ 'edit_tag' => 'Modifica etichetta ":tag"',
+ 'updated_tag' => 'Etichetta aggiornata ":tag"',
+ 'created_tag' => 'Etichetta ":tag" creata correttamente',
+
+ 'transaction_journal_information' => 'Informazione Transazione',
+ 'transaction_journal_meta' => 'Meta informazioni',
+ 'total_amount' => 'Importo totale',
+ 'number_of_decimals' => 'Numero decimali',
+
+ // administration
+ 'administration' => 'Amministrazione',
+ 'user_administration' => 'Amministrazione utenti',
+ 'list_all_users' => 'Tutti gli utenti',
+ 'all_users' => 'Tutti gli utenti',
+ 'instance_configuration' => 'Configurazione',
+ 'firefly_instance_configuration' => 'Opzioni Configurazione di Firefly III',
+ 'setting_single_user_mode' => 'Modo utente singolo',
+ 'setting_single_user_mode_explain' => 'Per impostazione predefinita, Firefly III accetta solo una (1) registrazione: tu. Questa è una misura di sicurezza, che impedisce ad altri di usare la tua istanza a meno che tu non le autorizzi. Le future registrazioni sono bloccate. Bene! quando deselezioni questa casella, gli altri possono usare la tua istanza, supponendo che possano raggiungerla (quando è connessa a Internet).',
+ 'store_configuration' => 'Salva configurazione',
+ 'single_user_administration' => 'Amministrazione utenti per :email',
+ 'edit_user' => 'Modifica utente :email',
+ 'hidden_fields_preferences' => 'Non tutti i campi sono visibili in questo momento. Devi attivarli nelle impostazioni.',
+ 'user_data_information' => 'Dati utente',
+ 'user_information' => 'Informazioni Utente',
+ 'total_size' => 'dimensione totale',
+ 'budget_or_budgets' => 'bilancio(i)',
+ 'budgets_with_limits' => 'bilancio(i) con importo configurato',
+ 'nr_of_rules_in_total_groups' => 'regola(e) :count_rules in gruppo(i) :count_groups',
+ 'tag_or_tags' => 'etichetta(e)',
+ 'configuration_updated' => 'La configurazione è stata aggiornata',
+ 'setting_is_demo_site' => 'Sito Demo',
+ 'setting_is_demo_site_explain' => 'Se si seleziona questa casella, questa installazione si comporterà come se fosse il sito demo, che può avere strani effetti collaterali.',
+ 'block_code_bounced' => 'Il(i) messaggio(i) email rimbalzati',
+ 'block_code_expired' => 'Conto demo scaduto',
+ 'no_block_code' => 'Nessun motivo per bloccare o non bloccare un utente',
+ 'block_code_email_changed' => 'L\'utente non ha ancora confermato il nuovo indirizzo emails',
+ 'admin_update_email' => 'Contrariamente alla pagina del profilo, l\'utente NON riceverà alcuna notifica al proprio indirizzo email!',
+ 'update_user' => 'Aggiorna utente',
+ 'updated_user' => 'I dati dell\'utente sono stati modificati.',
+ 'delete_user' => 'Elimia utente :email',
+ 'user_deleted' => 'L\'utente è stato eliminato',
+ 'send_test_email' => 'Invia un messaggio di posta elettronica di prova',
+ 'send_test_email_text' => 'Per vedere se la tua installazione è in grado di inviare e-mail, ti preghiamo di premere questo pulsante. Qui non vedrai un errore (se presente), i file di log rifletteranno eventuali errori. Puoi premere questo pulsante tutte le volte che vuoi. Non c\'è controllo dello spam. Il messaggio verrà inviato a :email e dovrebbe arrivare a breve.',
+ 'send_message' => 'Invia messaggio',
+ 'send_test_triggered' => 'Il test è stato attivato. Controlla la tua casella di posta e i file di registro.',
+
+ // links
+ 'journal_link_configuration' => 'Configurazione dei collegamenti di transazione',
+ 'create_new_link_type' => 'Crea un nuovo tipo di collegamento',
+ 'store_new_link_type' => 'Memorizza nuovo tipo di collegamento',
+ 'update_link_type' => 'Aggiorna il tipo di collegamento',
+ 'edit_link_type' => 'Modifica il tipo di collegamento ":name"',
+ 'updated_link_type' => 'Tipo di collegamento aggiornato ":name"',
+ 'delete_link_type' => 'Elimina il tipo di collegamento ":name"',
+ 'deleted_link_type' => 'Tipo di collegamento eliminato ":name"',
+ 'stored_new_link_type' => 'Memorizza nuovo tipo di collegamento ":name"',
+ 'cannot_edit_link_type' => 'Impossibile modificare il tipo di collegamento ":name"',
+ 'link_type_help_name' => 'Ie. "Duplicati"',
+ 'link_type_help_inward' => 'Ie. "duplicati"',
+ 'link_type_help_outward' => 'Ie. "è duplicato da"',
+ 'save_connections_by_moving' => 'Salvare il collegamento tra questa(e) transazione(i) spostandola(e) su un altro tipo di collegamento:',
+ 'do_not_save_connection' => '(non salvare la connessione)',
+ 'link_transaction' => 'Collega transazione',
+ 'link_to_other_transaction' => 'Collega questa transazione a un\'altra transazione',
+ 'select_transaction_to_link' => 'Seleziona una transazione per collegare questa transazione a',
+ 'this_transaction' => 'Questa transazione',
+ 'transaction' => 'Transazione',
+ 'comments' => 'Commenti',
+ 'to_link_not_found' => 'Se la transazione a cui desideri effettuare il collegamento non è elencata, inserisci semplicemente il suo ID.',
+ 'invalid_link_selection' => 'Impossibile collegare queste transazioni',
+ 'journals_linked' => 'Le transazioni sono collegate.',
+ 'journals_error_linked' => 'Queste transazioni sono già collegate.',
+ 'journals_link_to_self' => 'You cannot link a transaction to itself',
+ 'journal_links' => 'Collegamenti di transazione',
+ 'this_withdrawal' => 'Questa spesa',
+ 'this_deposit' => 'Questa entrata',
+ 'this_transfer' => 'Questo giroconto',
+ 'overview_for_link' => 'Panoramica per tipo di collegamento ":name"',
+ 'source_transaction' => 'Transazione di origine',
+ 'link_description' => 'Descrizione del collegamento',
+ 'destination_transaction' => 'Transazione di destinazione',
+ 'delete_journal_link' => 'Elimina il collegamento tra :source e :destination',
+ 'deleted_link' => 'Elimina collegamento',
+
+ // link translations:
+ 'relates to_inward' => 'inerente a',
+ 'is (partially) refunded by_inward' => 'è (parzialmente) rimborsato da',
+ 'is (partially) paid for by_inward' => 'è (parzialmente) pagato da',
+ 'is (partially) reimbursed by_inward' => 'è (parzialmente) rimborsato da',
+ 'relates to_outward' => 'inerente a',
+ '(partially) refunds_outward' => '(parzialmente) rimborsi',
+ '(partially) pays for_outward' => '(parzialmente) paga per',
+ '(partially) reimburses_outward' => '(parzialmente) rimborsa',
+
+ // split a transaction:
+ 'splits' => 'Dividi',
+ 'add_another_split' => 'Aggiungi un\'altra divisione',
+ 'split-transactions' => 'Dividi le transazioni',
+ 'do_split' => 'Fai una divisione',
+ 'split_this_withdrawal' => 'Dividi questa spesa',
+ 'split_this_deposit' => 'Dividi questa entrata',
+ 'split_this_transfer' => 'Dividi questo giroconto',
+ 'cannot_edit_multiple_source' => 'Non è possibile modificare la transazione n. #:id con la descrizione ":description" perché contiene più conti di origine.',
+ 'cannot_edit_multiple_dest' => 'Non è possibile modificare la transazione n. #:id con la descrizione ":description" perché contiene più conti di destinazione.',
+ 'cannot_edit_reconciled' => 'Non è possibile modificare la transazione n. #:id con la descrizione ":description" perché è stata contrassegnata come riconciliata.',
+ 'cannot_edit_opening_balance' => 'Non è possibile modificare il bilancio di apertura di un conto.',
+ 'no_edit_multiple_left' => 'Non hai selezionato transazioni valide da modificare.',
+ 'cannot_convert_split_journal' => 'Impossibile convertire una transazione divisa',
+
+ // import bread crumbs and titles:
+ 'import' => 'Importa',
+ 'import_data' => 'Importa i dati',
+ 'import_general_index_file' => 'Importa un file',
+ 'import_from_bunq' => 'Importare dal bunq',
+ 'import_using_spectre' => 'Importa usando Spettro',
+ 'import_using_plaid' => 'Importa usando Plaid',
+ 'import_config_bread_crumb' => 'Configura la tua importazione',
+
+ // import index page:
+ 'import_index_title' => 'Importa i dati in Firefly III',
+ 'import_index_sub_title' => 'Indice',
+ 'import_general_index_intro' => 'Benvenuti nella routine di importazione di Firefly III. Esistono alcuni modi per importare dati in Firefly III, visualizzati qui come pulsanti.',
+
+ // sandstorm.io errors and messages:
+ 'sandstorm_not_available' => 'Questa funzione non è disponibile quando si utilizza Firefly III in un ambiente Sandstorm.io.',
+
+ // empty lists? no objects? instructions:
+ 'no_accounts_title_asset' => 'Creiamo un conto attività!',
+ 'no_accounts_intro_asset' => 'Non hai ancora un conto attività. I conti cespiti sono i tuoi conti principali: il tuo conto corrente, il tuo conto di risparmio, il conto condiviso o persino la tua carta di credito.',
+ 'no_accounts_imperative_asset' => 'Per iniziare a utilizzare Firefly III è necessario creare almeno un conto attività. Facciamo così ora:',
+ 'no_accounts_create_asset' => 'Crea un conto attività',
+ 'no_accounts_title_expense' => 'Creiamo un conto spese!',
+ 'no_accounts_intro_expense' => 'Non hai ancora un conto spesa. I conti spese sono i luoghi in cui si spendono soldi, come negozi e supermercati.',
+ 'no_accounts_imperative_expense' => 'I conti spesa vengono creati automaticamente quando si creano le transazioni, ma è possibile crearne anche manualmente, se lo si desidera. Ne creiamo uno ora:',
+ 'no_accounts_create_expense' => 'Crea conto spesa',
+ 'no_accounts_title_revenue' => 'Creiamo un conto entrate!',
+ 'no_accounts_intro_revenue' => 'Non hai ancora un conto entrate. I conti delle entrate sono i luoghi in cui ricevi denaro, come il tuo stipendio e altre entrate.',
+ 'no_accounts_imperative_revenue' => 'I conti entrate vengono creati automaticamente quando si creano le transazioni, ma è possibile crearne anche manualmente, se lo si desidera. Ne creiamo uno ora:',
+ 'no_accounts_create_revenue' => 'Crea conto entrate',
+ 'no_budgets_title_default' => 'Creiamo un conto bilancio',
+ 'no_budgets_intro_default' => 'Non hai ancora i bilanci. I bilanci sono usati per organizzare le tue spese in gruppi logici, che puoi dare un indicazione per limitare le tue spese.',
+ 'no_budgets_imperative_default' => 'I bilanci sono gli strumenti di base della gestione finanziaria. Ne creiamo uno ora:',
+ 'no_budgets_create_default' => 'Crea bilancio',
+ 'no_categories_title_default' => 'Creaiamo una categoria!',
+ 'no_categories_intro_default' => 'Non hai ancora categorie. Le categorie vengono utilizzate per mettere a punto le transazioni e etichettarle con la categoria designata.',
+ 'no_categories_imperative_default' => 'Le categorie vengono create automaticamente quando si creano le transazioni, ma è possibile crearne anche manualmente. Ne creiamo una ora:',
+ 'no_categories_create_default' => 'Crea categoria',
+ 'no_tags_title_default' => 'Creiamo una etichetta!',
+ 'no_tags_intro_default' => 'Non hai ancora un etichetta. Le etichette vengono utilizzate per mettere a punto le transazioni e etichettarle con parole chiave specifiche.',
+ 'no_tags_imperative_default' => 'Le etichette vengono create automaticamente quando si creano le transazioni, ma è possibile crearne anche manualmente. Creiamo una ora:',
+ 'no_tags_create_default' => 'Crea etichetta',
+ 'no_transactions_title_withdrawal' => 'Creiamo una spesa!',
+ 'no_transactions_intro_withdrawal' => 'Non hai ancora spese. Dovresti creare delle spese per iniziare a gestire le tue finanze.',
+ 'no_transactions_imperative_withdrawal' => 'Hai effettuato delle spese? Dovresti registrarle:',
+ 'no_transactions_create_withdrawal' => 'Crea spese',
+ 'no_transactions_title_deposit' => 'Creiamo delle entrate!',
+ 'no_transactions_intro_deposit' => 'non hai ancora entrate registrate. È necessario creare voci di reddito per iniziare a gestire le tue finanze.',
+ 'no_transactions_imperative_deposit' => 'Hai ricevuto dei soldi? Dovresti scriverlo:',
+ 'no_transactions_create_deposit' => 'Crea una entrata',
+ 'no_transactions_title_transfers' => 'Creiamo un giroconto!',
+ 'no_transactions_intro_transfers' => 'Non hai ancora giroconti. Quando sposti denaro tra i conti attività, viene registrato come giroconto.',
+ 'no_transactions_imperative_transfers' => 'Hai spostato dei soldi in giro? Dovresti scriverlo:',
+ 'no_transactions_create_transfers' => 'Crea un giroconto',
+ 'no_piggies_title_default' => 'Creiamo un salvadanaio!',
+ 'no_piggies_intro_default' => 'Non hai ancora salvadanai. Puoi creare salvadanai per dividere i tuoi risparmi e tenere traccia di ciò per cui stai risparmiando.',
+ 'no_piggies_imperative_default' => 'Hai cose per le quali stai risparmiando? Crea un salvadanaio e tieni traccia:',
+ 'no_piggies_create_default' => 'Crea un nuovo salvadanaio',
+ 'no_bills_title_default' => 'Creiamo una fattura!',
+ 'no_bills_intro_default' => 'Non hai ancora nessuna fattura. Puoi creare fatture per tenere traccia delle spese regolari, come il tuo affitto o l\'assicurazione.',
+ 'no_bills_imperative_default' => 'Hai delle fatture regolari? Crea una fattura e tieni traccia dei tuoi pagamenti:',
+ 'no_bills_create_default' => 'Crea fattura',
+];
diff --git a/resources/lang/it_IT/form.php b/resources/lang/it_IT/form.php
new file mode 100644
index 0000000000..c8e80cd94a
--- /dev/null
+++ b/resources/lang/it_IT/form.php
@@ -0,0 +1,210 @@
+.
+ */
+
+return [
+ // new user:
+ 'bank_name' => 'Nome Banca',
+ 'bank_balance' => 'Saldo',
+ 'savings_balance' => 'Saldo risparmio',
+ 'credit_card_limit' => 'Limite Carta di Credito',
+ 'automatch' => 'Partita automaticamente',
+ 'skip' => 'Salta',
+ 'name' => 'Nome',
+ 'active' => 'Attivo',
+ 'amount_min' => 'Importo minimo',
+ 'amount_max' => 'Importo massimo',
+ 'match' => 'Partite su',
+ 'repeat_freq' => 'Ripetizioni',
+ 'journal_currency_id' => 'Valuta',
+ 'currency_id' => 'Valuta',
+ 'attachments' => 'Allegati',
+ 'journal_amount' => 'Importo',
+ 'journal_source_account_name' => 'Conto entrate (origine)',
+ 'journal_source_account_id' => 'Conto attività (origine)',
+ 'BIC' => 'BIC',
+ 'verify_password' => 'Verifica password di sicurezza',
+ 'source_account' => 'Conto sorgente',
+ 'destination_account' => 'Conto destinazione',
+ 'journal_destination_account_id' => 'Conto attività (destinatione)',
+ 'asset_destination_account' => 'Conto attività (destinatione)',
+ 'asset_source_account' => 'Conto attività (sorgente)',
+ 'journal_description' => 'Descrizione',
+ 'note' => 'Note',
+ 'split_journal' => 'Dividi questa transazione',
+ 'split_journal_explanation' => 'Dividi questa transazione in più parti',
+ 'currency' => 'Valuta',
+ 'account_id' => 'Conto attività',
+ 'budget_id' => 'Bilancio',
+ 'openingBalance' => 'Saldo di apertura',
+ 'tagMode' => 'Modalità etichetta',
+ 'tag_position' => 'Posizione etichetta',
+ 'virtualBalance' => 'Saldo virtuale',
+ 'targetamount' => 'Importo obiettivo',
+ 'accountRole' => 'Ruolo del conto',
+ 'openingBalanceDate' => 'Data di apertura del bilancio',
+ 'ccType' => 'Piano di pagamento con carta di credito',
+ 'ccMonthlyPaymentDate' => 'Data di pagamento mensile della carta di credito',
+ 'piggy_bank_id' => 'Salvadanaio',
+ 'returnHere' => 'Ritorna qui',
+ 'returnHereExplanation' => 'Dopo averlo archiviato, torna qui per crearne un altro.',
+ 'returnHereUpdateExplanation' => 'Dopo l\'aggiornamento, torna qui.',
+ 'description' => 'Descrizione',
+ 'expense_account' => 'Conto spese',
+ 'revenue_account' => 'Conto entrate',
+ 'decimal_places' => 'Decimali',
+ 'exchange_rate_instruction' => 'Valuta straniera',
+ 'source_amount' => 'Importo (origine)',
+ 'destination_amount' => 'Importo (destinazione)',
+ 'native_amount' => 'Importo nativo',
+ 'new_email_address' => 'Nuovo indirizzo email',
+ 'verification' => 'Verifica',
+ 'api_key' => 'Chiave API',
+ 'remember_me' => 'Ricordami',
+
+ 'source_account_asset' => 'Conto origine (conto risorse)',
+ 'destination_account_expense' => 'Conto destinazione (conto spese)',
+ 'destination_account_asset' => 'Conto destinazione (conto risorse)',
+ 'source_account_revenue' => 'Conto sorgente (conto entrate)',
+ 'type' => 'Tipo',
+ 'convert_Withdrawal' => 'Converti spesa',
+ 'convert_Deposit' => 'Converti entrata',
+ 'convert_Transfer' => 'Converti giroconto',
+
+ 'amount' => 'Importo',
+ 'date' => 'Data',
+ 'interest_date' => 'Data interesse',
+ 'book_date' => 'Agenda',
+ 'process_date' => 'Data di lavorazione',
+ 'category' => 'Categoria',
+ 'tags' => 'Etichette',
+ 'deletePermanently' => 'Elimina definitivamente',
+ 'cancel' => 'Cancella',
+ 'targetdate' => 'Data fine',
+ 'startdate' => 'Data inizio',
+ 'tag' => 'Etichetta',
+ 'under' => 'Sotto',
+ 'symbol' => 'Simbolo',
+ 'code' => 'Codice',
+ 'iban' => 'IBAN',
+ 'accountNumber' => 'Numero conto',
+ 'creditCardNumber' => 'Numero Carta di credito',
+ 'has_headers' => 'Intestazioni',
+ 'date_format' => 'Formato data',
+ 'specifix' => 'Correzioni bancarie o file specifiche',
+ 'attachments[]' => 'Allegati',
+ 'store_new_withdrawal' => 'Salva nuovo prelievo',
+ 'store_new_deposit' => 'Salva nuovo deposito',
+ 'store_new_transfer' => 'Salva nuova trasferimento',
+ 'add_new_withdrawal' => 'Aggiungi nuovo prelievo',
+ 'add_new_deposit' => 'Aggiungi nuovo deposito',
+ 'add_new_transfer' => 'Aggiungi nuovo giroconto',
+ 'title' => 'Titolo',
+ 'notes' => 'Note',
+ 'filename' => 'Nome file',
+ 'mime' => 'Tipo Mime',
+ 'size' => 'Dimensione',
+ 'trigger' => 'Trigger',
+ 'stop_processing' => 'Interrompere l\'elaborazione',
+ 'start_date' => 'Inizio periodo',
+ 'end_date' => 'Fine periodo',
+ 'export_start_range' => 'Inizio intervallo esportazione',
+ 'export_end_range' => 'Fine intervallo esportazione',
+ 'export_format' => 'Formato file',
+ 'include_attachments' => 'Includi allegati caricati',
+ 'include_old_uploads' => 'Includi dati importati',
+ 'accounts' => 'Esporta le transazioni da questi conti',
+ 'delete_account' => 'Elimina conto ":name"',
+ 'delete_bill' => 'Elimina fattura ":name"',
+ 'delete_budget' => 'Elimina bilancio ":name"',
+ 'delete_category' => 'Elimina categoria ":name"',
+ 'delete_currency' => 'Elimina valuta ":name"',
+ 'delete_journal' => 'Elimina transazione con descrizione ":description"',
+ 'delete_attachment' => 'Elimina allegato ":name"',
+ 'delete_rule' => 'Elimina regola ":title"',
+ 'delete_rule_group' => 'Elimina gruppo regole":title"',
+ 'delete_link_type' => 'Elimina tipo collegamento ":name"',
+ 'delete_user' => 'Elimina utente ":email"',
+ 'user_areYouSure' => 'Se cancelli l\'utente ":email", verrà eliminato tutto. Non sarà più possibile recuperare i dati eliminati. Se cancelli te stesso, perderai l\'accesso a questa istanza di Firefly III.',
+ 'attachment_areYouSure' => 'Sei sicuro di voler eliminare l\'allegato ":name"?',
+ 'account_areYouSure' => 'Sei sicuro di voler eliminare il conto ":name"?',
+ 'bill_areYouSure' => 'Sei sicuro di voler eliminare il conto ":name"?',
+ 'rule_areYouSure' => 'Sei sicuro di voler eliminare la regola ":title"?',
+ 'ruleGroup_areYouSure' => 'Sei sicuro di voler eliminare il gruppo regole ":title"?',
+ 'budget_areYouSure' => 'Sei sicuro di voler eliminare il bilancio ":name"?',
+ 'category_areYouSure' => 'Sei sicuro di voler eliminare categoria ":name"?',
+ 'currency_areYouSure' => 'Sei sicuro di voler eliminare la valuta ":name"?',
+ 'piggyBank_areYouSure' => 'Sei sicuro di voler eliminare il salvadanaio ":name"?',
+ 'journal_areYouSure' => 'Sei sicuro di voler eliminare la transazione ":description"?',
+ 'mass_journal_are_you_sure' => 'Sei sicuro di voler eliminare queste transazioni?',
+ 'tag_areYouSure' => 'Sei sicuro di voler eliminare l\'etichetta ":tag"?',
+ 'journal_link_areYouSure' => 'Sei sicuro di voler eliminare il collegamento tra :source e :destination?',
+ 'linkType_areYouSure' => 'Sei sicuro di voler eliminare il tipo di collegamento ":name" (":inward" / ":outward")?',
+ 'permDeleteWarning' => 'L\'eliminazione dei dati da Firefly III è permanente e non può essere annullata.',
+ 'mass_make_selection' => 'Puoi comunque impedire l\'eliminazione degli elementi rimuovendo la spunta nella casella di controllo.',
+ 'delete_all_permanently' => 'Elimina selezionato in modo permanente',
+ 'update_all_journals' => 'Aggiorna queste transazioni',
+ 'also_delete_transactions' => 'Bene! verrà cancellata anche l\'unica transazione connessa a questo conto. | Bene! Tutte :count le transazioni di conteggio collegate a questo conto verranno eliminate.',
+ 'also_delete_connections' => 'L\'unica transazione collegata a questo tipo di collegamento perderà questa connessione. | Tutto :count le transazioni di conteggio collegate a questo tipo di collegamento perderanno la connessione.',
+ 'also_delete_rules' => 'Anche l\'unica regola collegata a questo gruppo di regole verrà eliminata. | Tutto :count verranno eliminate anche le regole di conteggio collegate a questo gruppo di regole.',
+ 'also_delete_piggyBanks' => 'Verrà eliminato anche l\'unico salvadanaio collegato a questo conto. | Tutti :count il conteggio del salvadanaio collegato a questo conto verrà eliminato.',
+ 'bill_keep_transactions' => 'L\'unica transazione connessa a questa fattura non verrà eliminata. | Tutto :count le transazioni del conto collegate a questa fattura non verranno cancellate.',
+ 'budget_keep_transactions' => 'L\'unica transazione collegata a questo bilancio non verrà eliminata. | Tutto :count le transazioni del conto collegate a questo bilancio non verranno cancellate.',
+ 'category_keep_transactions' => 'L\'unica transazione collegata a questa categoria non verrà eliminata. | Tutto :count le transazioni del conto collegate a questa categoria non verranno cancellate.',
+ 'tag_keep_transactions' => 'L\'unica transazione connessa a questa etichetta non verrà eliminata. | Tutto :count le transazioni del conto collegate a questa etichetta non verranno cancellate.',
+ 'check_for_updates' => 'Controlla gli aggiornamenti',
+
+ 'email' => 'Indirizzo Email',
+ 'password' => 'Password',
+ 'password_confirmation' => 'Password (ancora)',
+ 'blocked' => 'È bloccato?',
+ 'blocked_code' => 'Motivo del blocco',
+
+ // admin
+ 'domain' => 'Dominio',
+ 'single_user_mode' => 'Disabilita registrazione utente',
+ 'is_demo_site' => 'È un sito demo',
+
+ // import
+ 'import_file' => 'Importa file',
+ 'configuration_file' => 'Configurazione file',
+ 'import_file_type' => 'Importa tipo file',
+ 'csv_comma' => 'A virgola (,)',
+ 'csv_semicolon' => 'A punto e virgola (;)',
+ 'csv_tab' => 'A spazio (invisibile)',
+ 'csv_delimiter' => 'Delimitatore campi CSV',
+ 'csv_import_account' => 'Conto di importazione predefinito',
+ 'csv_config' => 'Configurazione importa CSV',
+ 'client_id' => 'ID Client',
+ 'service_secret' => 'Servizio segreto',
+ 'app_secret' => 'App segreto',
+ 'public_key' => 'Chiave Pubblica',
+ 'country_code' => 'Codice Nazione',
+ 'provider_code' => 'Banca o fornitore di dati',
+
+ 'due_date' => 'Data scadenza',
+ 'payment_date' => 'Data pagamento',
+ 'invoice_date' => 'Data fattura',
+ 'internal_reference' => 'Referenze interne',
+ 'inward' => 'Descrizione interna',
+ 'outward' => 'Descrizione esterna',
+ 'rule_group_id' => 'Gruppo regole',
+];
diff --git a/resources/lang/it_IT/import.php b/resources/lang/it_IT/import.php
new file mode 100644
index 0000000000..d2b1454508
--- /dev/null
+++ b/resources/lang/it_IT/import.php
@@ -0,0 +1,203 @@
+.
+ */
+
+return [
+ // status of import:
+ 'status_wait_title' => 'Per favore attendere...',
+ 'status_wait_text' => 'Questa finestra si chiuderà tra un momento.',
+ 'status_fatal_title' => 'Si è verificato un errore irreversibile',
+ 'status_fatal_text' => 'Si è verificato un errore irreversibile per cui non è stato possibile ripristinare la routine di importazione. Si prega di vedere la spiegazione in rosso qui sotto.',
+ 'status_fatal_more' => 'Se l\'errore è un timeout, l\'importazione si sarà interrotta a metà. Per alcune configurazioni del server, o semplicemente il server che si è fermato mentre l\'importazione continua a funzionare in sottofondo. Per verificare questo, controlla il file di registro. Se il problema persiste, prendere in considerazione l\'importazione sulla riga di comando.',
+ 'status_ready_title' => 'L\'importazione è pronta per iniziare',
+ 'status_ready_text' => 'L\'importazione è pronta per iniziare. È stata eseguita tutta la configurazione necessaria. Si prega di scaricare il file di configurazione. Ti aiuterà con l\'importazione se non dovesse andare come previsto. Per eseguire effettivamente l\'importazione, è possibile eseguire il seguente comando nella console o eseguire l\'importazione basata sul Web. A seconda della configurazione, l\'importazione della console ti darà più feedback.',
+ 'status_ready_noconfig_text' => 'L\'importazione è pronta per iniziare. È stata eseguita tutta la configurazione necessaria. Per eseguire effettivamente l\'importazione, è possibile eseguire il seguente comando nella console o eseguire l\'importazione basata sul Web. A seconda della configurazione, l\'importazione della console ti darà più feedback.',
+ 'status_ready_config' => 'Scarica configurazione',
+ 'status_ready_start' => 'Inizia l\'importazione',
+ 'status_ready_share' => 'Ti preghiamo di considerare di scaricare la tua configurazione e di condividerla nel centro di configurazione dell\'importazione. Ciò consentirà ad altri utenti di Firefly III di importare i propri file più facilmente.',
+ 'status_job_new' => 'Il lavoro è nuovo di zecca.',
+ 'status_job_configuring' => 'L\'importazione è in fase di configurazione.',
+ 'status_job_configured' => 'L\'importazione è configurata.',
+ 'status_job_running' => 'L\'importazione è in esecuzione... Attendere...',
+ 'status_job_error' => 'Il lavoro ha generato un errore.',
+ 'status_job_finished' => 'L\'importazione è finita!',
+ 'status_running_title' => 'L\'importazione è in esecuzione',
+ 'status_running_placeholder' => 'Si prega di effettuare un aggiornamento...',
+ 'status_finished_title' => 'Routine importa terminata',
+ 'status_finished_text' => 'La routine di importazione ha importato i tuoi dati.',
+ 'status_errors_title' => 'Errori durante l\'importazione',
+ 'status_errors_single' => 'Si è verificato un errore durante l\'importazione. Non sembra essere fatale.',
+ 'status_errors_multi' => 'Alcuni errori si sono verificati durante l\'importazione. Questi non sembrano essere fatali.',
+ 'status_bread_crumb' => 'Stato importazione',
+ 'status_sub_title' => 'Stato importazione',
+ 'config_sub_title' => 'Configura la tua importazione',
+ 'status_finished_job' => 'Le transazioni :count importate possono essere trovate nel tag :tag .',
+ 'status_finished_no_tag' => 'Firefly III non ha raccolto alcuna transazione dal tuo file di importazione.',
+ 'import_with_key' => 'Importa con chiave \':key\'',
+
+ // file, upload something
+ 'file_upload_title' => 'Importa configurazione (1/4) - Carica il tuo file',
+ 'file_upload_text' => 'Questa routine ti aiuterà a importare file dalla tua banca in Firefly III. Si prega di consultare le pagine di aiuto nell\'angolo in alto a destra.',
+ 'file_upload_fields' => 'Campi',
+ 'file_upload_help' => 'Seleziona il tuo file',
+ 'file_upload_config_help' => 'Se hai precedentemente importato i dati in Firefly III, potresti avere un file di configurazione, con preimpostato i valori di configurazione per te. Per alcune banche, altri utenti hanno gentilmente fornito il loro configurazione file ',
+ 'file_upload_type_help' => 'Seleziona il tipo di file che carichi',
+ 'file_upload_submit' => 'File caricati',
+
+ // file, upload types
+ 'import_file_type_csv' => 'CSV (valori separati da virgola)',
+
+ // file, initial config for CSV
+ 'csv_initial_title' => 'Importa configurazione (2/4) - Impostazione di importazione CSV di base',
+ 'csv_initial_text' => 'Per poter importare correttamente il tuo file, ti preghiamo di convalidare le opzioni di seguito.',
+ 'csv_initial_box' => 'Configurazione di importazione CSV di base',
+ 'csv_initial_box_title' => 'Opzioni di impostazione dell\'importazione CSV di base',
+ 'csv_initial_header_help' => 'Seleziona questa casella se la prima riga del tuo file CSV sono i titoli delle colonne.',
+ 'csv_initial_date_help' => 'Formato della data e ora nel tuo CSV. Segui il formato indica questa pagina. Il valore predefinito analizzerà le date che assomigliano a questo: :dateExample.',
+ 'csv_initial_delimiter_help' => 'Scegli il delimitatore di campo che viene utilizzato nel file di input. Se non si è sicuri, la virgola è l\'opzione più sicura.',
+ 'csv_initial_import_account_help' => 'Se il tuo file CSV NON contiene informazioni sui tuoi conti di attività, utilizza questo menu a discesa per selezionare a quale conto appartengono le transazioni nel CSV.',
+ 'csv_initial_submit' => 'Continue with step 3/4',
+
+ // file, new options:
+ 'file_apply_rules_title' => 'Applica regole',
+ 'file_apply_rules_description' => 'Applica le tue regole. Si noti che questo rallenta l\'importazione in modo significativo.',
+ 'file_match_bills_title' => 'Abbina le fatture',
+ 'file_match_bills_description' => 'Abbina le tue fatture ai prelievi di nuova creazione. Si noti che questo rallenta l\'importazione in modo significativo.',
+
+ // file, roles config
+ 'csv_roles_title' => 'Importa configurazione (3/4) - Definisci il ruolo di ogni colonna',
+ 'csv_roles_text' => 'Ogni colonna nel tuo file CSV contiene determinati dati. Si prega di indicare il tipo di dati che l\'importatore dovrebbe aspettarsi. L\'opzione per "mappare" i dati significa che collegherete ogni voce trovata nella colonna con un valore nel vostro database. Una colonna spesso mappata è la colonna che contiene l\'IBAN del conto. Questo può essere facilmente abbinato all\'IBAN già presente nel tuo database.',
+ 'csv_roles_table' => 'Tabella',
+ 'csv_roles_column_name' => 'Nome colonna',
+ 'csv_roles_column_example' => 'Colonna dati esempio',
+ 'csv_roles_column_role' => 'Significato dei dati di colonna',
+ 'csv_roles_do_map_value' => 'Mappa questi valori',
+ 'csv_roles_column' => 'Colonna',
+ 'csv_roles_no_example_data' => 'Nessun dato esempio disponibile',
+ 'csv_roles_submit' => 'Continua con il punto 4/4',
+
+ // not csv, but normal warning
+ 'roles_warning' => 'Per lo meno, contrassegnare una colonna come colonna importo. Si consiglia di selezionare anche una colonna per la descrizione, la data e il conto avversario.',
+ 'foreign_amount_warning' => 'Se contrassegni una colonna come contenente un importo in una valuta straniera, devi anche impostare la colonna che contiene la valuta in cui si trova.',
+
+ // file, map data
+ 'file_map_title' => 'Importa configurazione (4/4) - Collega i dati di importazione ai dati di Firefly III',
+ 'file_map_text' => 'Nelle seguenti tabelle, il valore a sinistra mostra le informazioni trovate nel file caricato. È tuo compito mappare questo valore, se possibile, su un valore già presente nel tuo database. Firefly si atterrà a questa mappatura. Se non ci sono valori da mappare o non si desidera mappare il valore specifico, selezionare nulla.',
+ 'file_map_field_value' => 'Valore campo',
+ 'file_map_field_mapped_to' => 'Mappato a',
+ 'map_do_not_map' => '(non mappare)',
+ 'file_map_submit' => 'Inizia l\'importazione',
+ 'file_nothing_to_map' => 'Non ci sono dati presenti nel tuo file che puoi mappare a valori esistenti. Si prega di premere "Inizia l\'importazione" per continuare.',
+
+ // map things.
+ 'column__ignore' => '(ignora questa colonna)',
+ 'column_account-iban' => 'Conto patrimonio (IBAN)',
+ 'column_account-id' => 'Conto patrimonio ID (matching FF3)',
+ 'column_account-name' => 'Conto patrimonio (nome)',
+ 'column_amount' => 'Importo',
+ 'column_amount_foreign' => 'Importo (in altra valuta)',
+ 'column_amount_debit' => 'Importo (colonna debito)',
+ 'column_amount_credit' => 'Importo (colonna credito)',
+ 'column_amount-comma-separated' => 'Importo (virgola come separatore decimale)',
+ 'column_bill-id' => 'ID conto (matching FF3)',
+ 'column_bill-name' => 'Nome conto',
+ 'column_budget-id' => 'ID Bilancio (matching FF3)',
+ 'column_budget-name' => 'Nome bilancio',
+ 'column_category-id' => 'ID Categoria (matching FF3)',
+ 'column_category-name' => 'Nome categoria',
+ 'column_currency-code' => 'Codice valuta (ISO 4217)',
+ 'column_foreign-currency-code' => 'Codice valuta straniera (ISO 4217)',
+ 'column_currency-id' => 'ID valuta (matching FF3)',
+ 'column_currency-name' => 'Nome valuta (matching FF3)',
+ 'column_currency-symbol' => 'Simbolo valuta (matching FF3)',
+ 'column_date-interest' => 'Data calcolo interessi',
+ 'column_date-book' => 'Data prenotazione della transazione',
+ 'column_date-process' => 'Data processo della transazione',
+ 'column_date-transaction' => 'Data',
+ 'column_date-due' => 'Transaction due date',
+ 'column_date-payment' => 'Transaction payment date',
+ 'column_date-invoice' => 'Transaction invoice date',
+ 'column_description' => 'Descrizione',
+ 'column_opposing-iban' => 'Conto opposto (IBAN)',
+ 'column_opposing-bic' => 'Opposing account (BIC)',
+ 'column_opposing-id' => 'ID Conto opposto (matching FF3)',
+ 'column_external-id' => 'ID esterno',
+ 'column_opposing-name' => 'Conto opposto (nome)',
+ 'column_rabo-debit-credit' => 'Indicatore Rabo di addebito / accredito specifico della banca',
+ 'column_ing-debit-credit' => 'Indicatore di debito / credito specifico ING',
+ 'column_sepa-ct-id' => 'ID end-to-end del bonifico SEPA',
+ 'column_sepa-ct-op' => 'Conto opposto bonifico SEPA',
+ 'column_sepa-db' => 'Addebito diretto SEPA',
+ 'column_sepa-cc' => 'SEPA Clearing Code',
+ 'column_sepa-ci' => 'SEPA Creditor Identifier',
+ 'column_sepa-ep' => 'SEPA External Purpose',
+ 'column_sepa-country' => 'SEPA Country Code',
+ 'column_tags-comma' => 'Etichette (separate da virgola)',
+ 'column_tags-space' => 'Etichette (separate con spazio)',
+ 'column_account-number' => 'Conto patrimonio (numero conto)',
+ 'column_opposing-number' => 'Conto opposto (numero conto)',
+ 'column_note' => 'Nota(e)',
+ 'column_internal-reference' => 'Internal reference',
+
+ // prerequisites
+ 'prerequisites' => 'Prerequisiti',
+
+ // bunq
+ 'bunq_prerequisites_title' => 'Prerequisiti per un\'importazione da bunq',
+ 'bunq_prerequisites_text' => 'Per importare da bunq, è necessario ottenere una chiave API. Puoi farlo attraverso l\'applicazione.',
+ 'bunq_do_import' => 'Yes, import from this account',
+ 'bunq_accounts_title' => 'Bunq accounts',
+ 'bunq_accounts_text' => 'These are the accounts associated with your bunq account. Please select the accounts from which you want to import, and in which account the transactions must be imported.',
+
+ // Spectre
+ 'spectre_title' => 'Importa usando uno Spectre',
+ 'spectre_prerequisites_title' => 'Prerequisiti per un\'importazione utilizzando Spectre',
+ 'spectre_prerequisites_text' => 'Per importare i dati usando l\'API Spectre, devi fornire a Firefly III due valori segreti. Possono essere trovati nella pagina codifiche.',
+ 'spectre_enter_pub_key' => 'L\'importazione funzionerà solo quando inserisci questa chiave pubblica nella pagina di sicurezza.',
+ 'spectre_accounts_title' => 'Seleziona i conti dai quali importare',
+ 'spectre_accounts_text' => 'Ogni account sulla sinistra in basso è stato trovato da Spectre e può essere importato in Firefly III. Seleziona il conto attività che dovrebbe contenere una determinata transazione. Se non desideri importare da un conto specifico, rimuovi il segno di spunta dalla casella di controllo.',
+ 'spectre_do_import' => 'Si, importa da questo conto',
+
+ // keys from "extra" array:
+ 'spectre_extra_key_iban' => 'IBAN',
+ 'spectre_extra_key_swift' => 'SWIFT',
+ 'spectre_extra_key_status' => 'Stato',
+ 'spectre_extra_key_card_type' => 'Tipo carta',
+ 'spectre_extra_key_account_name' => 'Nome conto',
+ 'spectre_extra_key_client_name' => 'Nome cliente',
+ 'spectre_extra_key_account_number' => 'Numero conto',
+ 'spectre_extra_key_blocked_amount' => 'Importo bloccato',
+ 'spectre_extra_key_available_amount' => 'Importo disponibile',
+ 'spectre_extra_key_credit_limit' => 'Limite di credito',
+ 'spectre_extra_key_interest_rate' => 'Tasso d\'interesse',
+ 'spectre_extra_key_expiry_date' => 'Data scadenza',
+ 'spectre_extra_key_open_date' => 'Data apertura',
+ 'spectre_extra_key_current_time' => 'Ora corrente',
+ 'spectre_extra_key_current_date' => 'Data corrente',
+ 'spectre_extra_key_cards' => 'Carte',
+ 'spectre_extra_key_units' => 'Unità',
+ 'spectre_extra_key_unit_price' => 'Prezzo unità',
+ 'spectre_extra_key_transactions_count' => 'Conteggio delle transazioni',
+
+ // various other strings:
+ 'imported_from_account' => 'Importato da ":account"',
+];
diff --git a/resources/lang/it_IT/intro.php b/resources/lang/it_IT/intro.php
new file mode 100644
index 0000000000..d9e82ca8bd
--- /dev/null
+++ b/resources/lang/it_IT/intro.php
@@ -0,0 +1,133 @@
+.
+ */
+
+return [
+ // index
+ 'index_intro' => 'Benvenuti nella pagina indice di Firefly III. Si prega di prendersi il tempo necessario per questa introduzione per avere un\'idea di come funziona Firefly III.',
+ 'index_accounts-chart' => 'Questo grafico mostra il saldo attuale dei contit risorse. Puoi selezionare gli conti visibili qui nelle tue preferenze.',
+ 'index_box_out_holder' => 'Questa piccola casella e le caselle accanto a questa ti daranno una rapida panoramica della tua situazione finanziaria.',
+ 'index_help' => 'Se hai bisogno di aiuto per una pagina o un modulo, premi questo pulsante.',
+ 'index_outro' => 'La maggior parte delle pagine di Firefly III inizieranno con un piccolo tour come questo. Vi prego di contattarci quando avete domande o commenti. Grazie!',
+ 'index_sidebar-toggle' => 'Per creare nuove transazioni, conto o altre cose, usa il menu sotto questa icona.',
+
+ // create account:
+ 'accounts_create_iban' => 'Dai ai tuoi conti un IBAN valido. Ciò potrebbe rendere molto facile l\'importazione dei dati in futuro.',
+ 'accounts_create_asset_opening_balance' => 'I conti attività possono avere un "saldo di apertura", che indica l\'inizio della cronologia di questo conto in Firefly III.',
+ 'accounts_create_asset_currency' => 'Firefly III supporta più valute. I conti attività hanno una valuta principale, che devi impostare qui.',
+ 'accounts_create_asset_virtual' => 'A volte può aiutare a fornire al tuo conto un saldo virtuale: un importo aggiuntivo sempre aggiunto o rimosso dal saldo effettivo.',
+
+ // budgets index
+ 'budgets_index_intro' => 'I bilanci sono usati per gestire le tue finanze e formano una delle funzioni principali di Firefly III.',
+ 'budgets_index_set_budget' => 'Imposta il tuo bilancio totale per ogni periodo in modo che Firefly III possa dirti se hai messo a bilancio tutti i soldi disponibili.',
+ 'budgets_index_see_expenses_bar' => 'Le spese effettuate riempiranno lentamente questa barra.',
+ 'budgets_index_navigate_periods' => 'Naviga attraverso i periodi per impostare facilmente i bilanci in anticipo.',
+ 'budgets_index_new_budget' => 'Crea nuovi bilanci come meglio credi.',
+ 'budgets_index_list_of_budgets' => 'Usa questa tabella per impostare gli importi per ciascun bilancio e vedere l\'andamento.',
+ 'budgets_index_outro' => 'Per saperne di più sul bilancio, controlla l\'icona della guida nell\'angolo in alto a destra.',
+
+ // reports (index)
+ 'reports_index_intro' => 'Utilizza queste stampe per ottenere informazioni dettagliate sulle tue finanze.',
+ 'reports_index_inputReportType' => 'Scegli un tipo di stampa. Consulta le pagine della guida per vedere cosa ti mostra ciascuna stampa.',
+ 'reports_index_inputAccountsSelect' => 'Puoi escludere o includere i conti attività come ritieni opportuno.',
+ 'reports_index_inputDateRange' => 'L\'intervallo di date selezionato dipende interamente da te: da un giorno a 10 anni.',
+ 'reports_index_extra-options-box' => 'A seconda della stampao che hai selezionato, puoi selezionare filtri e opzioni aggiuntive qui. Guarda questa casella quando cambi i tipi di stampa.',
+
+ // reports (reports)
+ 'reports_report_default_intro' => 'Questa stampa ti fornirà una panoramica rapida e completa delle tue finanze. Se desideri vedere qualcos\'altro, per favore non esitare a contattarmi!',
+ 'reports_report_audit_intro' => 'Questa stampa ti fornirà approfondimenti dettagliati sui tuoi conti attività.',
+ 'reports_report_audit_optionsBox' => 'Utilizza queste caselle di controllo per mostrare o nascondere le colonne che ti interessano.',
+
+ 'reports_report_category_intro' => 'Questa stampa ti fornirà informazioni su una o più categorie.',
+ 'reports_report_category_pieCharts' => 'Questi grafici ti daranno un\'idea delle spese e del reddito per categoria o per conto.',
+ 'reports_report_category_incomeAndExpensesChart' => 'Questo grafico mostra le tue spese e il reddito per categoria.',
+
+ 'reports_report_tag_intro' => 'Questa stampa ti fornirà informazioni su uno o più etichette.',
+ 'reports_report_tag_pieCharts' => 'Questi grafici ti daranno un\'idea delle spese e del reddito per etichetta, conto, categoria o bilancio.',
+ 'reports_report_tag_incomeAndExpensesChart' => 'Questo grafico mostra le tue spese e entrate per etichetta.',
+
+ 'reports_report_budget_intro' => 'Questa stampa ti fornirà informazioni su uno o più bilancio(i).',
+ 'reports_report_budget_pieCharts' => 'Questi grafici ti daranno un\'idea delle spese per bilancio o per conto.',
+ 'reports_report_budget_incomeAndExpensesChart' => 'Questo grafico mostra le tue spese per bilancio.',
+
+ // create transaction
+ 'transactions_create_switch_box' => 'Usa questi pulsanti per cambiare rapidamente il tipo di transazione che desideri salvare.',
+ 'transactions_create_ffInput_category' => 'Puoi scrivere liberamente in questo campo. Saranno suggerite categorie precedentemente create.',
+ 'transactions_create_withdrawal_ffInput_budget' => 'Collega il tuo prelievo a un bilancio per un migliore controllo finanziario.',
+ 'transactions_create_withdrawal_currency_dropdown_amount' => 'Usa questo menu a discesa quando il prelievo è in un\'altra valuta.',
+ 'transactions_create_deposit_currency_dropdown_amount' => 'Usa questo menu a discesa quando il tuo deposito è in un\'altra valuta.',
+ 'transactions_create_transfer_ffInput_piggy_bank_id' => 'Seleziona un salvadanaio e collega questo trasferimento ai tuoi risparmi.',
+
+ // piggy banks index:
+ 'piggy-banks_index_saved' => 'Questo campo ti mostra quanto hai salvato in ogni salvadanaio.',
+ 'piggy-banks_index_button' => 'Accanto a questa barra di avanzamento ci sono due pulsanti (+ e -) per aggiungere o rimuovere denaro da ogni salvadanaio.',
+ 'piggy-banks_index_accountStatus' => 'Per ogni conto attività con almeno un salvadanaio lo stato è elencato in questa tabella.',
+
+ // create piggy
+ 'piggy-banks_create_name' => 'Qual è il tuo obiettivo? Un nuovo divano, una macchina fotografica, soldi per le emergenze?',
+ 'piggy-banks_create_date' => 'È possibile impostare una data di destinazione o una scadenza per il salvadanaio.',
+
+ // show piggy
+ 'piggy-banks_show_piggyChart' => 'Questo grafico mostrerà lo storico di questo salvadanaio.',
+ 'piggy-banks_show_piggyDetails' => 'Alcuni dettagli sul tuo salvadanaio',
+ 'piggy-banks_show_piggyEvents' => 'Anche eventuali aggiunte o rimozioni sono elencate qui.',
+
+ // bill index
+ 'bills_index_paid_in_period' => 'Questo campo indica quando il conto è stato pagato l\'ultima volta.',
+ 'bills_index_expected_in_period' => 'Questo campo indica per ciascuna fattura se e quando ci si aspetta che la fattura successiva arrivi.',
+
+ // show bill
+ 'bills_show_billInfo' => 'Questa tabella mostra alcune informazioni generali su questa fattura.',
+ 'bills_show_billButtons' => 'Utilizzare questo pulsante per rieseguire la scansione delle vecchie transazioni in modo che corrispondano a questa fattura.',
+ 'bills_show_billChart' => 'Questo grafico mostra le transazioni collegate a questa fattura.',
+
+ // create bill
+ 'bills_create_name' => 'Utilizzare un nome descrittivo come "Affitto" o "Assicurazione sanitaria".',
+ 'bills_create_match' => 'Per abbinare le transazioni, utilizzare i termini di tali transazioni o il conto spese coinvolto. Tutte le parole devono corrispondere',
+ 'bills_create_amount_min_holder' => 'Seleziona un importo minimo e massimo per questo conto.',
+ 'bills_create_repeat_freq_holder' => 'La maggior parte dei pagamenti si ripetono mensilmente, ma qui puoi impostare un\'altra frequenza.',
+ 'bills_create_skip_holder' => 'Ad esempio, se un conto si ripete ogni 2 settimane, il campo "Salta" dovrebbe essere impostato su "1" per saltare ogni altra settimana.',
+
+ // rules index
+ 'rules_index_intro' => 'Firefly III ti consente di gestire le regole, che verranno automaticamente applicate a qualsiasi transazione creata o modificata.',
+ 'rules_index_new_rule_group' => 'È possibile combinare le regole in gruppi per una gestione più semplice.',
+ 'rules_index_new_rule' => 'Crea quante regole desideri.',
+ 'rules_index_prio_buttons' => 'Ordinali come meglio credi.',
+ 'rules_index_test_buttons' => 'Puoi testare le tue regole o applicarle a transazioni esistenti.',
+ 'rules_index_rule-triggers' => 'Le regole hanno "trigger" e "azioni" che puoi ordinare trascinandole.',
+ 'rules_index_outro' => 'Assicurati di controllare le pagine della guida usando l\'icona (?) In alto a destra!',
+
+ // create rule:
+ 'rules_create_mandatory' => 'Scegli un titolo descrittivo e imposta quando deve essere attivata la regola.',
+ 'rules_create_ruletriggerholder' => 'Aggiungi tutti i trigger che desideri, ma ricorda che TUTTI i trigger devono corrispondere prima che vengano attivate azioni.',
+ 'rules_create_test_rule_triggers' => 'Usa questo pulsante per vedere quali transazioni corrispondono alla tua regola.',
+ 'rules_create_actions' => 'Imposta tutte le azioni che vuoi.',
+
+ // preferences
+ 'preferences_index_tabs' => 'Altre opzioni sono disponibili dietro queste schede.',
+
+ // currencies
+ 'currencies_index_intro' => 'Firefly III supporta più valute, che è possibile modificare su questa pagina.',
+ 'currencies_index_default' => 'Firefly III ha una valuta predefinita. Puoi sempre cambiare valuta usando questi pulsanti.',
+
+ // create currency
+ 'currencies_create_code' => 'Questo codice dovrebbe essere conforme ISO (Google per la tua nuova valuta).',
+];
diff --git a/resources/lang/it_IT/list.php b/resources/lang/it_IT/list.php
new file mode 100644
index 0000000000..524800b95b
--- /dev/null
+++ b/resources/lang/it_IT/list.php
@@ -0,0 +1,114 @@
+.
+ */
+
+return [
+ 'buttons' => 'Pulsanti',
+ 'icon' => 'Icona',
+ 'id' => 'ID',
+ 'create_date' => 'Creato a',
+ 'update_date' => 'Aggiornato a',
+ 'updated_at' => 'Aggiornato a',
+ 'balance_before' => 'Bilancio prima',
+ 'balance_after' => 'Bilancio dopo',
+ 'name' => 'Nome',
+ 'role' => 'Ruolo',
+ 'currentBalance' => 'Bilancio corrente',
+ 'active' => 'Attivo',
+ 'lastActivity' => 'Ultima attività',
+ 'balanceDiff' => 'Differenze bilancio',
+ 'matchesOn' => 'Abbinato',
+ 'account_type' => 'Tipo conto',
+ 'created_at' => 'Creato a',
+ 'account' => 'Conto',
+ 'matchingAmount' => 'Importo',
+ 'split_number' => 'Diviso #',
+ 'destination' => 'Destinazione',
+ 'source' => 'Sorgente',
+ 'next_expected_match' => 'Prossimo abbinamento previsto',
+ 'automatch' => 'Abbinamento automatico?',
+ 'repeat_freq' => 'Ripetizioni',
+ 'description' => 'Descrizione',
+ 'amount' => 'Importo',
+ 'internal_reference' => 'Referenze interne',
+ 'date' => 'Data',
+ 'interest_date' => 'Data interessi',
+ 'book_date' => 'Agenda',
+ 'process_date' => 'Data lavorazione',
+ 'due_date' => 'Data scadenza',
+ 'payment_date' => 'Data pagamento',
+ 'invoice_date' => 'Data fattura',
+ 'interal_reference' => 'Referenze interne',
+ 'notes' => 'Note',
+ 'from' => 'Da',
+ 'piggy_bank' => 'Salvadanaio',
+ 'to' => 'A',
+ 'budget' => 'Bilancio',
+ 'category' => 'Categoria',
+ 'bill' => 'Conto',
+ 'withdrawal' => 'Spesa',
+ 'deposit' => 'Deposito',
+ 'transfer' => 'Giroconto',
+ 'type' => 'Tipo',
+ 'completed' => 'Completato',
+ 'iban' => 'IBAN',
+ 'paid_current_period' => 'Pagato in questo periodo',
+ 'email' => 'Email',
+ 'registered_at' => 'Registrato a',
+ 'is_blocked' => 'È bloccato',
+ 'is_admin' => 'È amministratore',
+ 'has_two_factor' => 'Ha 2 Fattori',
+ 'blocked_code' => 'Codice blocco',
+ 'source_account' => 'Conto sorgente',
+ 'destination_account' => 'Conto destinazione',
+ 'accounts_count' => 'Numero conti',
+ 'journals_count' => 'Numero transazioni',
+ 'attachments_count' => 'Numero allegati',
+ 'bills_count' => 'Numero conti',
+ 'categories_count' => 'Numero categorie',
+ 'export_jobs_count' => 'Numero esportazioni',
+ 'import_jobs_count' => 'Numero importazioni',
+ 'budget_count' => 'Numero bilanci',
+ 'rule_and_groups_count' => 'Numero regole e gruppi regole',
+ 'tags_count' => 'Numero etichette',
+ 'tags' => 'Etichette',
+ 'inward' => 'Descrizione interna',
+ 'outward' => 'Descrizione esterna',
+ 'number_of_transactions' => 'Numero transazioni',
+ 'total_amount' => 'Importo totale',
+ 'sum' => 'Somma',
+ 'sum_excluding_transfers' => 'Somma (esclusi i giroconti)',
+ 'sum_withdrawals' => 'Somma prelievi',
+ 'sum_deposits' => 'Somma versamenti',
+ 'sum_transfers' => 'Somma giroconti',
+ 'reconcile' => 'Riconcilia',
+ 'account_on_spectre' => 'Conto (Spectre)',
+ 'do_import' => 'Importo da questo conto',
+ 'sepa-ct-id' => 'SEPA End to End Identifier',
+ 'sepa-ct-op' => 'SEPA Opposing Account Identifier',
+ 'sepa-db' => 'SEPA Mandate Identifier',
+ 'sepa-country' => 'SEPA Country',
+ 'sepa-cc' => 'SEPA Clearing Code',
+ 'sepa-ep' => 'SEPA External Purpose',
+ 'sepa-ci' => 'SEPA Creditor Identifier',
+ 'account_at_bunq' => 'Account with bunq',
+];
diff --git a/resources/lang/it_IT/pagination.php b/resources/lang/it_IT/pagination.php
new file mode 100644
index 0000000000..7225cd59d4
--- /dev/null
+++ b/resources/lang/it_IT/pagination.php
@@ -0,0 +1,26 @@
+.
+ */
+
+return [
+ 'previous' => '« Precedente',
+ 'next' => 'Avanti »',
+];
diff --git a/resources/lang/it_IT/passwords.php b/resources/lang/it_IT/passwords.php
new file mode 100644
index 0000000000..7294fdca24
--- /dev/null
+++ b/resources/lang/it_IT/passwords.php
@@ -0,0 +1,30 @@
+.
+ */
+
+return [
+ 'password' => 'Le password devono contenere almeno sei caratteri e devono corrispondere alla conferma.',
+ 'user' => 'Non possiamo trovare un utente con questo indirizzo e-mail.',
+ 'token' => 'Questo token di reimpostazione della password non è valido.',
+ 'sent' => 'Abbiamo inviato via e-mail il tuo link per la reimpostazione della password!',
+ 'reset' => 'La tua password è stata resettata!',
+ 'blocked' => 'Riprova.',
+];
diff --git a/resources/lang/it_IT/validation.php b/resources/lang/it_IT/validation.php
new file mode 100644
index 0000000000..9dfe0dcbf4
--- /dev/null
+++ b/resources/lang/it_IT/validation.php
@@ -0,0 +1,148 @@
+.
+ */
+
+return [
+ 'iban' => 'Questo non è un IBAN valido.',
+ 'source_equals_destination' => 'The source account equals the destination account',
+ 'unique_account_number_for_user' => 'Sembra che questo numero di conto sia già in uso.',
+ 'unique_iban_for_user' => 'Sembra che questo IBAN sia già in uso.',
+ 'deleted_user' => 'A causa dei vincoli di sicurezza, non è possibile registrarsi utilizzando questo indirizzo email.',
+ 'rule_trigger_value' => 'Questo valore non è valido per il trigger selezionato.',
+ 'rule_action_value' => 'Questo valore non è valido per l\'azione selezionata.',
+ 'file_already_attached' => 'Il file caricato ":name" è già associato a questo oggetto.',
+ 'file_attached' => 'File caricato con successo ":name".',
+ 'must_exist' => 'L\'ID nel campo :attribute non esiste nel database.',
+ 'all_accounts_equal' => 'Tutti i conti in questo campo devono essere uguali.',
+ 'invalid_selection' => 'La tua selezione non è valida',
+ 'belongs_user' => 'Questo valore non è valido per questo campo.',
+ 'at_least_one_transaction' => 'Hai bisogno di almeno una transazione.',
+ 'require_currency_info' => 'Il contenuto di questo campo non è valido senza informazioni sulla valuta.',
+ 'equal_description' => 'La descrizione della transazione non deve essere uguale alla descrizione globale.',
+ 'file_invalid_mime' => 'Il file ":name" è di tipo ":mime" che non è accettato come nuovo caricamento.',
+ 'file_too_large' => 'Il file ":name" è troppo grande.',
+ 'belongs_to_user' => 'Il valore di :attribute è sconosciuto',
+ 'accepted' => 'L\' :attribute deve essere accettato.',
+ 'bic' => 'Questo non è un BIC valido.',
+ 'more' => ':attribute deve essere maggiore di zero.',
+ 'active_url' => ':attribute non è un URL valido.',
+ 'after' => ':attribute deve essere una data dopo :date.',
+ 'alpha' => ':attribute può contenere solo lettere.',
+ 'alpha_dash' => ':attribute può contenere solo lettere, numeri e trattini.',
+ 'alpha_num' => ':attribute può contenere solo lettere e numeri.',
+ 'array' => ':attribute deve essere una matrice.',
+ 'unique_for_user' => 'C\'è già una voce con questo :attribute.',
+ 'before' => ':attribute deve essere una data prima :date.',
+ 'unique_object_for_user' => 'Questo nome è già in uso',
+ 'unique_account_for_user' => 'Questo nome conto è già in uso',
+ 'between.numeric' => ':attribute con questo nome conto è già in uso :min e :max.',
+ 'between.file' => ':attribute deve essere :min e :max kilobyte.',
+ 'between.string' => ':attribute deve essere tra :min e :max caratteri.',
+ 'between.array' => ':attribute deve essere tra :min e :max voci.',
+ 'boolean' => ':attribute deve essere vero o falso.',
+ 'confirmed' => ':attribute la conferma non corrisponde.',
+ 'date' => ':attribute non è una data valida',
+ 'date_format' => ':attribute non corrisponde al formato :format.',
+ 'different' => ':attribute e :other deve essere diverso.',
+ 'digits' => ':attribute deve essere :digits cifre.',
+ 'digits_between' => ':attribute deve essere :min e :max cifre.',
+ 'email' => ':attribute deve essere un indirizzo email valido.',
+ 'filled' => ':attribute il campo è obbligatiorio.',
+ 'exists' => ':attribute selezionato non è valido.',
+ 'image' => ':attribute deve essere un\'immagine.',
+ 'in' => ':attribute selezionato non è valido.',
+ 'integer' => ':attribute deve essere un numero intero.',
+ 'ip' => ':attribute deve essere un indirizzo IP valido.',
+ 'json' => ':attribute deve essere una stringa JSON.',
+ 'max.numeric' => ':attribute non può essere maggiore di :max.',
+ 'max.file' => ':attribute non può essere maggiore di :max kilobytes.',
+ 'max.string' => ':attribute non può essere maggiore di :max caratteri.',
+ 'max.array' => ':attribute potrebbe non avere più di :max voce.',
+ 'mimes' => ':attribute deve essere un file di tipo: :values.',
+ 'min.numeric' => ':attribute deve essere almeno :min.',
+ 'min.file' => ':attribute deve essere almeno :min kilobytes.',
+ 'min.string' => ':attribute deve essere almeno :min caratteri.',
+ 'min.array' => ':attribute deve avere almeno :min voci.',
+ 'not_in' => ':attribute selezionato è invalido.',
+ 'numeric' => ':attribute deve essere un numero.',
+ 'regex' => ':attribute formato non valido',
+ 'required' => ':attribute il campo è obbligatiorio.',
+ 'required_if' => ':attribute il campo è richiesto quando :other is :value.',
+ 'required_unless' => ':attribute il campo è richiesto a meno che :other è in :values.',
+ 'required_with' => ':attribute il campo è richiesto quando :values è presente.',
+ 'required_with_all' => ':attribute il campo è richiesto quando :values è presente.',
+ 'required_without' => ':attribute il campo è richiesto quando :values non è presente.',
+ 'required_without_all' => ':attribute il campo è richiesto quando nessuno di :values sono presenti.',
+ 'same' => ':attribute e :other deve combaciare.',
+ 'size.numeric' => ':attribute deve essere :size.',
+ 'amount_min_over_max' => 'L\'importo minimo non può essere maggiore dell\'importo massimo.',
+ 'size.file' => ':attribute deve essere :size kilobytes.',
+ 'size.string' => ':attribute deve essere :size caratteri.',
+ 'size.array' => ':attribute deve contenere :size voci.',
+ 'unique' => ':attribute è già stato preso.',
+ 'string' => ':attribute deve essere una stringa.',
+ 'url' => ':attribute il formato non è valido.',
+ 'timezone' => ':attribute deve essere una zona valida.',
+ '2fa_code' => ':attribute il campo non è valido.',
+ 'dimensions' => ':attribute ha dimensioni di immagine non valide.',
+ 'distinct' => ':attribute il campo ha un valore doppio.',
+ 'file' => ':attribute deve essere un file.',
+ 'in_array' => ':attribute il campo non esiste in :other.',
+ 'present' => ':attribute il campo deve essere presente.',
+ 'amount_zero' => 'L\'importo totale non può essere zero',
+ 'secure_password' => 'Questa non è una password sicura. Per favore riprova. Per ulteriori informazioni, visitare https://goo.gl/NCh2tN',
+ 'attributes' => [
+ 'email' => 'indirizzo email',
+ 'description' => 'descrizione',
+ 'amount' => 'importo',
+ 'name' => 'nome',
+ 'piggy_bank_id' => 'ID salvadanaio',
+ 'targetamount' => 'importo obiettivo',
+ 'openingBalanceDate' => 'data bilancio apertura',
+ 'openingBalance' => 'saldo apertura',
+ 'match' => 'partita',
+ 'amount_min' => 'importo minimo',
+ 'amount_max' => 'importo massimo',
+ 'title' => 'titolo',
+ 'tag' => 'etichetta',
+ 'transaction_description' => 'descrizione transazione',
+ 'rule-action-value.1' => 'regola valore azione #1',
+ 'rule-action-value.2' => 'regola valore azione #2',
+ 'rule-action-value.3' => 'regola valore azione #3',
+ 'rule-action-value.4' => 'regola valore azione #4',
+ 'rule-action-value.5' => 'regola valore azione #5',
+ 'rule-action.1' => 'regola azione #1',
+ 'rule-action.2' => 'regola azione #2',
+ 'rule-action.3' => 'regola azione #3',
+ 'rule-action.4' => 'regola azione #4',
+ 'rule-action.5' => 'regola azione #5',
+ 'rule-trigger-value.1' => 'regola valore trigger #1',
+ 'rule-trigger-value.2' => 'regola valore trigger #2',
+ 'rule-trigger-value.3' => 'regola valore trigger #3',
+ 'rule-trigger-value.4' => 'regola valore trigger #4',
+ 'rule-trigger-value.5' => 'regola valore trigger #5',
+ 'rule-trigger.1' => 'esegui regola #1',
+ 'rule-trigger.2' => 'esegui regola #2',
+ 'rule-trigger.3' => 'esegui regola #3',
+ 'rule-trigger.4' => 'esegui regola #4',
+ 'rule-trigger.5' => 'esegui regola #5',
+ ],
+];
diff --git a/resources/lang/nl_NL/auth.php b/resources/lang/nl_NL/auth.php
index be5f29709a..2e605f3650 100644
--- a/resources/lang/nl_NL/auth.php
+++ b/resources/lang/nl_NL/auth.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
/*
diff --git a/resources/lang/nl_NL/bank.php b/resources/lang/nl_NL/bank.php
index ef0d636f91..b6a86faa4b 100644
--- a/resources/lang/nl_NL/bank.php
+++ b/resources/lang/nl_NL/bank.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
];
diff --git a/resources/lang/nl_NL/breadcrumbs.php b/resources/lang/nl_NL/breadcrumbs.php
index e137f106cb..2df72204e4 100644
--- a/resources/lang/nl_NL/breadcrumbs.php
+++ b/resources/lang/nl_NL/breadcrumbs.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'home' => 'Home',
diff --git a/resources/lang/nl_NL/components.php b/resources/lang/nl_NL/components.php
index b88c239f03..4f6718b20f 100644
--- a/resources/lang/nl_NL/components.php
+++ b/resources/lang/nl_NL/components.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// profile
diff --git a/resources/lang/nl_NL/config.php b/resources/lang/nl_NL/config.php
index 4128c1abc5..9342d5460e 100644
--- a/resources/lang/nl_NL/config.php
+++ b/resources/lang/nl_NL/config.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'html_language' => 'nl',
diff --git a/resources/lang/nl_NL/csv.php b/resources/lang/nl_NL/csv.php
index d61316b632..892c8beac4 100644
--- a/resources/lang/nl_NL/csv.php
+++ b/resources/lang/nl_NL/csv.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
];
diff --git a/resources/lang/nl_NL/demo.php b/resources/lang/nl_NL/demo.php
index 1d87431edc..6344bae76b 100644
--- a/resources/lang/nl_NL/demo.php
+++ b/resources/lang/nl_NL/demo.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
- 'no_demo_text' => 'Sorry, er is geen extra uitleg voor deze pagina.',
- 'see_help_icon' => 'Maar het -icoontje kan je wellicht meer vertellen.',
- '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 ondersteunt een aantal 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',
+ 'no_demo_text' => 'Sorry, er is geen extra uitleg voor deze pagina.',
+ 'see_help_icon' => 'Maar het -icoontje kan je wellicht meer vertellen.',
+ '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 ondersteunt een aantal 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',
];
diff --git a/resources/lang/nl_NL/firefly.php b/resources/lang/nl_NL/firefly.php
index 4ceaac77e5..b4c056aa29 100644
--- a/resources/lang/nl_NL/firefly.php
+++ b/resources/lang/nl_NL/firefly.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
// general stuff:
@@ -170,7 +171,9 @@ return [
'want_to_login' => 'Ik wil inloggen',
'button_register' => 'Registreren',
'authorization' => 'Toestemming',
-
+ 'active_bills_only' => 'alleen actieve contracten',
+ 'average_per_bill' => 'gemiddeld per contract',
+ 'expected_total' => 'verwacht totaal',
// API access
'authorization_request' => 'Firefly III v:version autorisatieverzoek',
'authorization_request_intro' => ':client vraagt toestemming om toegang te krijgen tot je financiële administratie. Wil je :client autoriseren om toegang te krijgen tot je gegevens?',
@@ -403,590 +406,589 @@ return [
'rule_action_set_notes_choice' => 'Verander notitie in..',
'rule_action_set_notes' => 'Verander notitie in ":action_value"',
- 'rules_have_read_warning' => 'Heb je de waarschuwing gelezen?',
- 'apply_rule_warning' => 'Let op! Het kan heel lang duren voor een regel(groep) is toegepast op een grote selectie transacties. Er kan een time-out optreden. Als dat gebeurt is de regel(groep) niet toegepast op alle transacties, en dat kan je administratie behoorlijk verprutsen. Wees dus voorzichtig.',
+ 'rules_have_read_warning' => 'Heb je de waarschuwing gelezen?',
+ 'apply_rule_warning' => 'Let op! Het kan heel lang duren voor een regel(groep) is toegepast op een grote selectie transacties. Er kan een time-out optreden. Als dat gebeurt is de regel(groep) niet toegepast op alle transacties, en dat kan je administratie behoorlijk verprutsen. Wees dus voorzichtig.',
// tags
- 'store_new_tag' => 'Sla tag op',
- 'update_tag' => 'Sla wijzigingen op',
- 'no_location_set' => 'Zonder plaats',
- 'meta_data' => 'Metagegevens',
- 'location' => 'Plaats',
- 'without_date' => 'Zonder datum',
- 'result' => 'Resultaat',
- 'sums_apply_to_range' => 'Alle sommen gelden voor het geselecteerde bereik',
- 'mapbox_api_key' => 'Om de kaart te gebruiken regel je een API-key bij Mapbox. Open je .env-bestand en zet deze achter MAPBOX_API_KEY=.',
- 'press_tag_location' => 'Klik met de rechtermuisknop of druk lang om de locatie van de tag in te stellen.',
- 'clear_location' => 'Wis locatie',
+ 'store_new_tag' => 'Sla tag op',
+ 'update_tag' => 'Sla wijzigingen op',
+ 'no_location_set' => 'Zonder plaats',
+ 'meta_data' => 'Metagegevens',
+ 'location' => 'Plaats',
+ 'without_date' => 'Zonder datum',
+ 'result' => 'Resultaat',
+ 'sums_apply_to_range' => 'Alle sommen gelden voor het geselecteerde bereik',
+ 'mapbox_api_key' => 'Om de kaart te gebruiken regel je een API-key bij Mapbox. Open je .env-bestand en zet deze achter MAPBOX_API_KEY=.',
+ 'press_tag_location' => 'Klik met de rechtermuisknop of druk lang om de locatie van de tag in te stellen.',
+ 'clear_location' => 'Wis locatie',
// preferences
- 'pref_home_screen_accounts' => 'Voorpaginarekeningen',
- 'pref_home_screen_accounts_help' => 'Welke betaalrekeningen wil je op de voorpagina zien?',
- 'pref_view_range' => 'Bereik',
- 'pref_view_range_help' => 'Sommige pagina\'s springen naar een standaard bereik. Welk bereik heeft jouw voorkeur?',
- 'pref_1D' => 'Eén dag',
- 'pref_1W' => 'Eén week',
- 'pref_1M' => 'Eén maand',
- 'pref_3M' => 'Drie maanden (kwartaal)',
- 'pref_6M' => 'Zes maanden',
- 'pref_1Y' => 'Eén jaar',
- 'pref_languages' => 'Talen',
- 'pref_languages_help' => 'Firefly III ondersteunt meerdere talen. Welke heeft jouw voorkeur?',
- 'pref_custom_fiscal_year' => 'Instellingen voor boekjaar',
- 'pref_custom_fiscal_year_label' => 'Ingeschakeld',
- 'pref_custom_fiscal_year_help' => 'Voor in landen die een boekjaar gebruiken anders dan 1 januari tot 31 december',
- 'pref_fiscal_year_start_label' => 'Start van boekjaar',
- 'pref_two_factor_auth' => 'Authenticatie in twee stappen',
- 'pref_two_factor_auth_help' => 'Als je authenticatie in twee stappen (ook wel twee-factor authenticatie genoemd) inschakelt voeg je een extra beveiligingslaag toe aan je account. Je logt in met iets dat je weet (je wachtwoord) en iets dat je hebt (een verificatiecode). Verificatiecodes worden gegeneerd door apps op je telefoon, zoals Authy en Google Authenticator.',
- 'pref_enable_two_factor_auth' => 'Authenticatie in twee stappen inschakelen',
- 'pref_two_factor_auth_disabled' => 'Je verificatiecode voor authenticatie in twee stappen is verwijderd, en uitgeschakeld',
- 'pref_two_factor_auth_remove_it' => 'Vergeet niet om je Firefly III account uit je authenticatie appje te verwijderen!',
- 'pref_two_factor_auth_code' => 'Bevestig de code',
- 'pref_two_factor_auth_code_help' => 'Scan deze QR code met een app op je telefoon (zoals Authy of Google Authenticator). Vul de code die je terug krijgt hier in.',
- 'pref_two_factor_auth_reset_code' => 'Reset de verificatiecode',
- 'pref_two_factor_auth_remove_code' => 'Verwijder de verificatiecode',
- 'pref_two_factor_auth_remove_will_disable' => '(hiermee zet je authenticatie in twee stappen ook uit)',
- 'pref_save_settings' => 'Instellingen opslaan',
- 'saved_preferences' => 'Voorkeuren opgeslagen!',
- 'preferences_general' => 'Algemeen',
- 'preferences_frontpage' => 'Homepagina',
- 'preferences_security' => 'Veiligheid',
- 'preferences_layout' => 'Uiterlijk',
- 'pref_home_show_deposits' => 'Laat inkomsten zien op de homepagina',
- 'pref_home_show_deposits_info' => 'De homepagina laat al crediteuren zien. Wil je ook je debiteuren zien?',
- 'pref_home_do_show_deposits' => 'Ja, kom maar op',
- 'successful_count' => 'waarvan :count met succes',
- 'list_page_size_title' => 'Paginalengte',
- 'list_page_size_help' => 'Per lijst met dingen (accounts, transacties, enz.) zie je hooguit zoveel items.',
- 'list_page_size_label' => 'Paginalengte',
- 'between_dates' => '(:start en :end)',
- 'pref_optional_fields_transaction' => 'Optionele velden voor transacties',
- 'pref_optional_fields_transaction_help' => 'Standaard staan niet alle velden aan (vanwege het overzicht). Hier kan je zulke extra velden alsnog aanzetten, als je denkt dat ze handig zijn. Als je een veld uitzet, maar deze heeft wel degelijk een waarde, dan is-ie altijd zichtbaar, wat je ook doet.',
- 'optional_tj_date_fields' => 'Datumvelden',
- 'optional_tj_business_fields' => 'Zakelijke velden',
- 'optional_tj_attachment_fields' => 'Bijlagen',
- 'pref_optional_tj_interest_date' => 'Rentedatum',
- 'pref_optional_tj_book_date' => 'Boekdatum',
- 'pref_optional_tj_process_date' => 'Verwerkingsdatum',
- 'pref_optional_tj_due_date' => 'Vervaldatum',
- 'pref_optional_tj_payment_date' => 'Betalingsdatum',
- 'pref_optional_tj_invoice_date' => 'Factuurdatum',
- 'pref_optional_tj_internal_reference' => 'Interne verwijzing',
- 'pref_optional_tj_notes' => 'Notities',
- 'pref_optional_tj_attachments' => 'Bijlagen',
- 'optional_field_meta_dates' => 'Data',
- 'optional_field_meta_business' => 'Zakelijk',
- 'optional_field_attachments' => 'Bijlagen',
- 'optional_field_meta_data' => 'Optionele meta-gegevens',
+ 'pref_home_screen_accounts' => 'Voorpaginarekeningen',
+ 'pref_home_screen_accounts_help' => 'Welke betaalrekeningen wil je op de voorpagina zien?',
+ 'pref_view_range' => 'Bereik',
+ 'pref_view_range_help' => 'Sommige pagina\'s springen naar een standaard bereik. Welk bereik heeft jouw voorkeur?',
+ 'pref_1D' => 'Eén dag',
+ 'pref_1W' => 'Eén week',
+ 'pref_1M' => 'Eén maand',
+ 'pref_3M' => 'Drie maanden (kwartaal)',
+ 'pref_6M' => 'Zes maanden',
+ 'pref_1Y' => 'Eén jaar',
+ 'pref_languages' => 'Talen',
+ 'pref_languages_help' => 'Firefly III ondersteunt meerdere talen. Welke heeft jouw voorkeur?',
+ 'pref_custom_fiscal_year' => 'Instellingen voor boekjaar',
+ 'pref_custom_fiscal_year_label' => 'Ingeschakeld',
+ 'pref_custom_fiscal_year_help' => 'Voor in landen die een boekjaar gebruiken anders dan 1 januari tot 31 december',
+ 'pref_fiscal_year_start_label' => 'Start van boekjaar',
+ 'pref_two_factor_auth' => 'Authenticatie in twee stappen',
+ 'pref_two_factor_auth_help' => 'Als je authenticatie in twee stappen (ook wel twee-factor authenticatie genoemd) inschakelt voeg je een extra beveiligingslaag toe aan je account. Je logt in met iets dat je weet (je wachtwoord) en iets dat je hebt (een verificatiecode). Verificatiecodes worden gegeneerd door apps op je telefoon, zoals Authy en Google Authenticator.',
+ 'pref_enable_two_factor_auth' => 'Authenticatie in twee stappen inschakelen',
+ 'pref_two_factor_auth_disabled' => 'Je verificatiecode voor authenticatie in twee stappen is verwijderd, en uitgeschakeld',
+ 'pref_two_factor_auth_remove_it' => 'Vergeet niet om je Firefly III account uit je authenticatie appje te verwijderen!',
+ 'pref_two_factor_auth_code' => 'Bevestig de code',
+ 'pref_two_factor_auth_code_help' => 'Scan deze QR code met een app op je telefoon (zoals Authy of Google Authenticator). Vul de code die je terug krijgt hier in.',
+ 'pref_two_factor_auth_reset_code' => 'Reset de verificatiecode',
+ 'pref_two_factor_auth_disable_2fa' => '2FA uitzetten',
+ 'pref_save_settings' => 'Instellingen opslaan',
+ 'saved_preferences' => 'Voorkeuren opgeslagen!',
+ 'preferences_general' => 'Algemeen',
+ 'preferences_frontpage' => 'Homepagina',
+ 'preferences_security' => 'Veiligheid',
+ 'preferences_layout' => 'Uiterlijk',
+ 'pref_home_show_deposits' => 'Laat inkomsten zien op de homepagina',
+ 'pref_home_show_deposits_info' => 'De homepagina laat al crediteuren zien. Wil je ook je debiteuren zien?',
+ 'pref_home_do_show_deposits' => 'Ja, kom maar op',
+ 'successful_count' => 'waarvan :count met succes',
+ 'list_page_size_title' => 'Paginalengte',
+ 'list_page_size_help' => 'Per lijst met dingen (accounts, transacties, enz.) zie je hooguit zoveel items.',
+ 'list_page_size_label' => 'Paginalengte',
+ 'between_dates' => '(:start en :end)',
+ 'pref_optional_fields_transaction' => 'Optionele velden voor transacties',
+ 'pref_optional_fields_transaction_help' => 'Standaard staan niet alle velden aan (vanwege het overzicht). Hier kan je zulke extra velden alsnog aanzetten, als je denkt dat ze handig zijn. Als je een veld uitzet, maar deze heeft wel degelijk een waarde, dan is-ie altijd zichtbaar, wat je ook doet.',
+ 'optional_tj_date_fields' => 'Datumvelden',
+ 'optional_tj_business_fields' => 'Zakelijke velden',
+ 'optional_tj_attachment_fields' => 'Bijlagen',
+ 'pref_optional_tj_interest_date' => 'Rentedatum',
+ 'pref_optional_tj_book_date' => 'Boekdatum',
+ 'pref_optional_tj_process_date' => 'Verwerkingsdatum',
+ 'pref_optional_tj_due_date' => 'Vervaldatum',
+ 'pref_optional_tj_payment_date' => 'Betalingsdatum',
+ 'pref_optional_tj_invoice_date' => 'Factuurdatum',
+ 'pref_optional_tj_internal_reference' => 'Interne verwijzing',
+ 'pref_optional_tj_notes' => 'Notities',
+ 'pref_optional_tj_attachments' => 'Bijlagen',
+ 'optional_field_meta_dates' => 'Data',
+ 'optional_field_meta_business' => 'Zakelijk',
+ 'optional_field_attachments' => 'Bijlagen',
+ 'optional_field_meta_data' => 'Optionele meta-gegevens',
// profile:
- 'change_your_password' => 'Verander je wachtwoord',
- 'delete_account' => 'Verwijder je account',
- 'current_password' => 'Huidige wachtwoord',
- 'new_password' => 'Nieuw wachtwoord',
- 'new_password_again' => 'Nieuw wachtwoord (bevestiging)',
- 'delete_your_account' => 'Verwijder je account',
- 'delete_your_account_help' => 'Als je je account verwijdert worden ook al je rekeningen, transacties en alle andere zaken verwijderd. Alles is dan WEG.',
- 'delete_your_account_password' => 'Voer je wachtwoord in om door te gaan.',
- 'password' => 'Wachtwoord',
- 'are_you_sure' => 'Zeker weten? Je kan niet meer terug!',
- 'delete_account_button' => 'VERWIJDER je account',
- 'invalid_current_password' => 'Huidige wachtwoord is niet geldig!',
- 'password_changed' => 'Je wachtwoord is veranderd!',
- 'should_change' => 'Vul ook echt een ander wachtwoord in.',
- 'invalid_password' => 'Ongeldig wachtwoord!',
- 'what_is_pw_security' => 'Wat is "Bevestig wachtwoordsterkte"?',
- 'secure_pw_title' => 'Hoe kies je een veilig wachtwoord',
- 'secure_pw_history' => 'De bekende security onderzoeker Troy Hunt gaf in augustus 2017 een lijst vrij van 306 miljoen gestolen wachtwoorden. Deze wachtwoorden waren gestolen tijdens hacks van bekende bedrijven zoals LinkedIn, Adobe en NeoPets (en vele anderen).',
- 'secure_pw_check_box' => 'Zet het vinkje, en Firefly III stuurt de SHA1-hash van je wachtwoord naar de website van Troy Hunt om te zien of-ie op de lijst staat. Dit voorkomt dat je een onveilig wachtwoord gebruikt, zoals is voorgeschreven in een speciale publicatie van het NIST over dit onderwerp.',
- 'secure_pw_sha1' => 'Maar SHA1 is toch gebroken?',
- 'secure_pw_hash_speed' => 'Ja, maar niet in deze context. Zoals je kan lezen op de website over SHA1 is het nu makkelijker geworden om een "collision" te vinden: twee stukken tekst die dezelfde SHA1-hash opleveren. Dit kan nu in 10.000 jaar op een machine met één grafische kaart.',
- 'secure_pw_hash_security' => 'Deze collision is niet gelijk aan jouw wachtwoord, noch is deze te gebruiken op een site (zoals) Firefly III. Deze app gebruikt geen SHA1 voor wachtwoordverificatie. Dat maakt het veilig om de checkbox aan te vinken. Je wachtwoord wordt gehasht en verstuurt over HTTPS.',
- 'secure_pw_should' => 'Vinkje zetten of niet?',
- 'secure_pw_long_password' => 'Als je net een lang wachtwoord hebt gegenereerd met een password generator tool: nee.',
- 'secure_pw_short' => 'Gebruik je het wachtwoord dat je altijd gebruikt? Ja, doen!',
- 'command_line_token' => 'Opdrachtprompt-token',
- 'explain_command_line_token' => 'Je hebt dit token nodig als je commando\'s op de commandline draait, zoals het invoeren of uitvoeren van data. Zonder dit token werken zulke gevoelige opdrachten niet. Deel je opdrachtprompt-token niet. Niemand zal hier naar vragen, zelfs ik niet. Als je bang bent dat-ie op straat ligt, genereer dan een nieuw token.',
- 'regenerate_command_line_token' => 'Nieuw opdrachtprompt-token genereren',
- 'token_regenerated' => 'Er is een nieuw opdrachtprompt-token gegenereerd',
- 'change_your_email' => 'Verander je emailadres',
- 'email_verification' => 'Het systeem verstuurt een mailtje naar je oude EN nieuwe emailadres. Uit veiligheidsoverwegingen ben je zometeen uitgelogd en kan je pas weer inloggen als je je emailadres hebt bevestigd. Doe dit niet als je niet zeker weet of je Firefly III installatie wel mail kan versturen. Als je een admin bent, test dit dan eerst in de administratie.',
- 'email_changed_logout' => 'Je kan niet inloggen tot je je emailadres bevestigd.',
- 'login_with_new_email' => 'Je kan nu inloggen met je nieuwe emailadres.',
- 'login_with_old_email' => 'Je kan nu weer inloggen met je oude emailadres.',
+ 'change_your_password' => 'Verander je wachtwoord',
+ 'delete_account' => 'Verwijder je account',
+ 'current_password' => 'Huidige wachtwoord',
+ 'new_password' => 'Nieuw wachtwoord',
+ 'new_password_again' => 'Nieuw wachtwoord (bevestiging)',
+ 'delete_your_account' => 'Verwijder je account',
+ 'delete_your_account_help' => 'Als je je account verwijdert worden ook al je rekeningen, transacties en alle andere zaken verwijderd. Alles is dan WEG.',
+ 'delete_your_account_password' => 'Voer je wachtwoord in om door te gaan.',
+ 'password' => 'Wachtwoord',
+ 'are_you_sure' => 'Zeker weten? Je kan niet meer terug!',
+ 'delete_account_button' => 'VERWIJDER je account',
+ 'invalid_current_password' => 'Huidige wachtwoord is niet geldig!',
+ 'password_changed' => 'Je wachtwoord is veranderd!',
+ 'should_change' => 'Vul ook echt een ander wachtwoord in.',
+ 'invalid_password' => 'Ongeldig wachtwoord!',
+ 'what_is_pw_security' => 'Wat is "Bevestig wachtwoordsterkte"?',
+ 'secure_pw_title' => 'Hoe kies je een veilig wachtwoord',
+ 'secure_pw_history' => 'De bekende security onderzoeker Troy Hunt gaf in augustus 2017 een lijst vrij van 306 miljoen gestolen wachtwoorden. Deze wachtwoorden waren gestolen tijdens hacks van bekende bedrijven zoals LinkedIn, Adobe en NeoPets (en vele anderen).',
+ 'secure_pw_check_box' => 'Zet het vinkje, en Firefly III stuurt de eerste vijf karakters van de SHA1-hash van je wachtwoord naar de website van Troy Hunt om te zien of-ie op de lijst staat. Dit voorkomt dat je een onveilig wachtwoord gebruikt, zoals is voorgeschreven in een speciale publicatie van het NIST over dit onderwerp.',
+ 'secure_pw_sha1' => 'Maar SHA1 is toch gebroken?',
+ 'secure_pw_hash_speed' => 'Ja, maar niet in deze context. Zoals je kan lezen op de website over SHA1 is het nu makkelijker geworden om een "collision" te vinden: twee stukken tekst die dezelfde SHA1-hash opleveren. Dit kan nu in 10.000 jaar op een machine met één grafische kaart.',
+ 'secure_pw_hash_security' => 'Deze collision is niet gelijk aan jouw wachtwoord, noch is deze te gebruiken op een site (zoals) Firefly III. Deze app gebruikt geen SHA1 voor wachtwoordverificatie. Dat maakt het veilig om de checkbox aan te vinken. Je wachtwoord wordt gehasht en alleen de eerste vijf karakters van die hash worden verstuurt over HTTPS.',
+ 'secure_pw_should' => 'Vinkje zetten of niet?',
+ 'secure_pw_long_password' => 'Als je net een lang wachtwoord hebt gegenereerd met een password generator tool: nee.',
+ 'secure_pw_short' => 'Gebruik je het wachtwoord dat je altijd gebruikt? Ja, doen!',
+ 'command_line_token' => 'Opdrachtprompt-token',
+ 'explain_command_line_token' => 'Je hebt dit token nodig als je commando\'s op de commandline draait, zoals het invoeren of uitvoeren van data. Zonder dit token werken zulke gevoelige opdrachten niet. Deel je opdrachtprompt-token niet. Niemand zal hier naar vragen, zelfs ik niet. Als je bang bent dat-ie op straat ligt, genereer dan een nieuw token.',
+ 'regenerate_command_line_token' => 'Nieuw opdrachtprompt-token genereren',
+ 'token_regenerated' => 'Er is een nieuw opdrachtprompt-token gegenereerd',
+ 'change_your_email' => 'Verander je emailadres',
+ 'email_verification' => 'Het systeem verstuurt een mailtje naar je oude EN nieuwe emailadres. Uit veiligheidsoverwegingen ben je zometeen uitgelogd en kan je pas weer inloggen als je je emailadres hebt bevestigd. Doe dit niet als je niet zeker weet of je Firefly III installatie wel mail kan versturen. Als je een admin bent, test dit dan eerst in de administratie.',
+ 'email_changed_logout' => 'Je kan niet inloggen tot je je emailadres bevestigd.',
+ 'login_with_new_email' => 'Je kan nu inloggen met je nieuwe emailadres.',
+ 'login_with_old_email' => 'Je kan nu weer inloggen met je oude emailadres.',
// attachments
- 'nr_of_attachments' => 'Eén bijlage|:count bijlagen',
- 'attachments' => 'Bijlagen',
- 'edit_attachment' => 'Wijzig bijlage ":name"',
- 'update_attachment' => 'Update bijlage',
- 'delete_attachment' => 'Verwijder bijlage ":name"',
- 'attachment_deleted' => 'Bijlage ":name" verwijderd',
- 'attachment_updated' => 'Attachment ":name" geüpdatet',
- 'upload_max_file_size' => 'Maximale grootte: :size',
+ 'nr_of_attachments' => 'Eén bijlage|:count bijlagen',
+ 'attachments' => 'Bijlagen',
+ 'edit_attachment' => 'Wijzig bijlage ":name"',
+ 'update_attachment' => 'Update bijlage',
+ 'delete_attachment' => 'Verwijder bijlage ":name"',
+ 'attachment_deleted' => 'Bijlage ":name" verwijderd',
+ 'attachment_updated' => 'Attachment ":name" geüpdatet',
+ 'upload_max_file_size' => 'Maximale grootte: :size',
// transaction index
- 'title_expenses' => 'Uitgaven',
- 'title_withdrawal' => 'Uitgaven',
- 'title_revenue' => 'Inkomsten',
- 'title_deposit' => 'Inkomsten',
- 'title_transfer' => 'Overschrijvingen',
- 'title_transfers' => 'Overschrijvingen',
+ 'title_expenses' => 'Uitgaven',
+ 'title_withdrawal' => 'Uitgaven',
+ 'title_revenue' => 'Inkomsten',
+ 'title_deposit' => 'Inkomsten',
+ 'title_transfer' => 'Overschrijvingen',
+ 'title_transfers' => 'Overschrijvingen',
// convert stuff:
- 'convert_is_already_type_Withdrawal' => 'Deze transactie is al een uitgave',
- 'convert_is_already_type_Deposit' => 'Deze transactie is al inkomsten',
- 'convert_is_already_type_Transfer' => 'Deze transactie is al een overschrijving',
- 'convert_to_Withdrawal' => 'Verander ":description" in een uitgave',
- 'convert_to_Deposit' => 'Verander ":description" in inkomsten',
- 'convert_to_Transfer' => 'Verander ":description" in een overschrijving',
- 'convert_options_WithdrawalDeposit' => 'Verander een uitgave in inkomsten',
- 'convert_options_WithdrawalTransfer' => 'Verander een uitgave in een overschrijving',
- 'convert_options_DepositTransfer' => 'Verander inkomsten in een overschrijving',
- 'convert_options_DepositWithdrawal' => 'Verander inkomsten in een uitgave',
- 'convert_options_TransferWithdrawal' => 'Verander een overschrijving in een uitgave',
- 'convert_options_TransferDeposit' => 'Verander een overschrijving in inkomsten',
- 'convert_Withdrawal_to_deposit' => 'Verander deze uitgave in inkomsten',
- 'convert_Withdrawal_to_transfer' => 'Verander deze uitgave in een overschrijving',
- 'convert_Deposit_to_withdrawal' => 'Verander deze inkomsten in een uitgave',
- 'convert_Deposit_to_transfer' => 'Verander deze inkomsten in een overschrijving',
- 'convert_Transfer_to_deposit' => 'Verander deze overschrijving in inkomsten',
- 'convert_Transfer_to_withdrawal' => 'Verander deze overschrijving in een uitgave',
- 'convert_please_set_revenue_source' => 'Kies de debiteur waar het geld vandaan gaat komen.',
- 'convert_please_set_asset_destination' => 'Kies de betaalrekening waar het geld heen zal gaan.',
- 'convert_please_set_expense_destination' => 'Kies de crediteur waar het geld heen zal gaan.',
- 'convert_please_set_asset_source' => 'Kies de betaalrekening waar het geld vandaan zal komen.',
- 'convert_explanation_withdrawal_deposit' => 'Als je deze uitgave in inkomsten verandert zal :amount gestort worden op :sourceName in plaats van afgeboekt worden.',
- 'convert_explanation_withdrawal_transfer' => 'Als je deze uitgave in een overschrijving verandert zal :amount overgeschreven worden van :sourceName naar een andere betaalrekening, in plaats van uitgegeven te worden bij :destinationName.',
- 'convert_explanation_deposit_withdrawal' => 'Als je deze inkomsten verandert in een uitgave zal :amount afgeboekt worden van :destinationName in plaats van bijgeboekt.',
- 'convert_explanation_deposit_transfer' => 'Als je deze uitgave in een overschrijving verandert zal :amount gestort worden op :destinationName vanaf een betaalrekening naar keuze.',
- 'convert_explanation_transfer_withdrawal' => 'Als je deze overschrijving verandert in een uitgave zal :amount afgeboekt worden van :sourceName en overgemaakt worden naar een te kiezen crediteur, in plaats van overgemaakt te worden naar :destinationName.',
- 'convert_explanation_transfer_deposit' => 'Als je deze overschrijving verandert in inkomsten zal :amount gestort worden in :destinationName vanaf een debiteur in plaats van overgeschreven te worden vanaf je eigen betaalrekening.',
- 'converted_to_Withdrawal' => 'De transactie is veranderd in een uitgave',
- 'converted_to_Deposit' => 'De transactie is veranderd in inkomsten',
- 'converted_to_Transfer' => 'De transactie is veranderd in een overschrijving',
- 'invalid_convert_selection' => 'De rekening die je hebt geselecteerd wordt al gebruikt in deze transactie, of bestaat niet.',
+ 'convert_is_already_type_Withdrawal' => 'Deze transactie is al een uitgave',
+ 'convert_is_already_type_Deposit' => 'Deze transactie is al inkomsten',
+ 'convert_is_already_type_Transfer' => 'Deze transactie is al een overschrijving',
+ 'convert_to_Withdrawal' => 'Verander ":description" in een uitgave',
+ 'convert_to_Deposit' => 'Verander ":description" in inkomsten',
+ 'convert_to_Transfer' => 'Verander ":description" in een overschrijving',
+ 'convert_options_WithdrawalDeposit' => 'Verander een uitgave in inkomsten',
+ 'convert_options_WithdrawalTransfer' => 'Verander een uitgave in een overschrijving',
+ 'convert_options_DepositTransfer' => 'Verander inkomsten in een overschrijving',
+ 'convert_options_DepositWithdrawal' => 'Verander inkomsten in een uitgave',
+ 'convert_options_TransferWithdrawal' => 'Verander een overschrijving in een uitgave',
+ 'convert_options_TransferDeposit' => 'Verander een overschrijving in inkomsten',
+ 'convert_Withdrawal_to_deposit' => 'Verander deze uitgave in inkomsten',
+ 'convert_Withdrawal_to_transfer' => 'Verander deze uitgave in een overschrijving',
+ 'convert_Deposit_to_withdrawal' => 'Verander deze inkomsten in een uitgave',
+ 'convert_Deposit_to_transfer' => 'Verander deze inkomsten in een overschrijving',
+ 'convert_Transfer_to_deposit' => 'Verander deze overschrijving in inkomsten',
+ 'convert_Transfer_to_withdrawal' => 'Verander deze overschrijving in een uitgave',
+ 'convert_please_set_revenue_source' => 'Kies de debiteur waar het geld vandaan gaat komen.',
+ 'convert_please_set_asset_destination' => 'Kies de betaalrekening waar het geld heen zal gaan.',
+ 'convert_please_set_expense_destination' => 'Kies de crediteur waar het geld heen zal gaan.',
+ 'convert_please_set_asset_source' => 'Kies de betaalrekening waar het geld vandaan zal komen.',
+ 'convert_explanation_withdrawal_deposit' => 'Als je deze uitgave in inkomsten verandert zal :amount gestort worden op :sourceName in plaats van afgeboekt worden.',
+ 'convert_explanation_withdrawal_transfer' => 'Als je deze uitgave in een overschrijving verandert zal :amount overgeschreven worden van :sourceName naar een andere betaalrekening, in plaats van uitgegeven te worden bij :destinationName.',
+ 'convert_explanation_deposit_withdrawal' => 'Als je deze inkomsten verandert in een uitgave zal :amount afgeboekt worden van :destinationName in plaats van bijgeboekt.',
+ 'convert_explanation_deposit_transfer' => 'Als je deze uitgave in een overschrijving verandert zal :amount gestort worden op :destinationName vanaf een betaalrekening naar keuze.',
+ 'convert_explanation_transfer_withdrawal' => 'Als je deze overschrijving verandert in een uitgave zal :amount afgeboekt worden van :sourceName en overgemaakt worden naar een te kiezen crediteur, in plaats van overgemaakt te worden naar :destinationName.',
+ 'convert_explanation_transfer_deposit' => 'Als je deze overschrijving verandert in inkomsten zal :amount gestort worden in :destinationName vanaf een debiteur in plaats van overgeschreven te worden vanaf je eigen betaalrekening.',
+ 'converted_to_Withdrawal' => 'De transactie is veranderd in een uitgave',
+ 'converted_to_Deposit' => 'De transactie is veranderd in inkomsten',
+ 'converted_to_Transfer' => 'De transactie is veranderd in een overschrijving',
+ 'invalid_convert_selection' => 'De rekening die je hebt geselecteerd wordt al gebruikt in deze transactie, of bestaat niet.',
// create new stuff:
- 'create_new_withdrawal' => 'Nieuwe uitgave',
- 'create_new_deposit' => 'Nieuwe inkomsten',
- 'create_new_transfer' => 'Nieuwe overschrijving',
- 'create_new_asset' => 'Nieuwe betaalrekening',
- 'create_new_expense' => 'Nieuwe crediteur',
- 'create_new_revenue' => 'Nieuwe debiteur',
- 'create_new_piggy_bank' => 'Nieuw spaarpotje',
- 'create_new_bill' => 'Nieuw contract',
+ 'create_new_withdrawal' => 'Nieuwe uitgave',
+ 'create_new_deposit' => 'Nieuwe inkomsten',
+ 'create_new_transfer' => 'Nieuwe overschrijving',
+ 'create_new_asset' => 'Nieuwe betaalrekening',
+ 'create_new_expense' => 'Nieuwe crediteur',
+ 'create_new_revenue' => 'Nieuwe debiteur',
+ 'create_new_piggy_bank' => 'Nieuw spaarpotje',
+ 'create_new_bill' => 'Nieuw contract',
// currencies:
- 'create_currency' => 'Voeg nieuwe valuta toe',
- 'store_currency' => 'Sla nieuwe valuta op',
- 'update_currency' => 'Wijzig valuta',
- 'new_default_currency' => ':name is nu de standaard valuta.',
- 'cannot_delete_currency' => 'Kan ":name" niet verwijderen, want deze is in gebruik.',
- 'deleted_currency' => 'Valuta :name verwijderd',
- 'created_currency' => 'Nieuwe valuta :name opgeslagen',
- 'updated_currency' => 'Valuta :name bijgewerkt',
- 'ask_site_owner' => 'Vraag :owner of deze valuta wilt toevoegen, verwijderen of wijzigen.',
- 'currencies_intro' => 'Firefly III ondersteunt diverse valuta die je hier kan instellen en bewerken.',
- 'make_default_currency' => 'maak standaard',
- 'default_currency' => 'standaard',
+ 'create_currency' => 'Voeg nieuwe valuta toe',
+ 'store_currency' => 'Sla nieuwe valuta op',
+ 'update_currency' => 'Wijzig valuta',
+ 'new_default_currency' => ':name is nu de standaard valuta.',
+ 'cannot_delete_currency' => 'Kan ":name" niet verwijderen, want deze is in gebruik.',
+ 'deleted_currency' => 'Valuta :name verwijderd',
+ 'created_currency' => 'Nieuwe valuta :name opgeslagen',
+ 'updated_currency' => 'Valuta :name bijgewerkt',
+ 'ask_site_owner' => 'Vraag :owner of deze valuta wilt toevoegen, verwijderen of wijzigen.',
+ 'currencies_intro' => 'Firefly III ondersteunt diverse valuta die je hier kan instellen en bewerken.',
+ 'make_default_currency' => 'maak standaard',
+ 'default_currency' => 'standaard',
// forms:
- 'mandatoryFields' => 'Verplichte velden',
- 'optionalFields' => 'Optionele velden',
- 'options' => 'Opties',
+ 'mandatoryFields' => 'Verplichte velden',
+ 'optionalFields' => 'Optionele velden',
+ 'options' => 'Opties',
// budgets:
- 'create_new_budget' => 'Maak een nieuw budget',
- 'store_new_budget' => 'Sla nieuw budget op',
- 'stored_new_budget' => 'Nieuw budget ":name" opgeslagen',
- 'available_between' => 'Beschikbaar tussen :start en :end',
- 'transactionsWithoutBudget' => 'Uitgaven zonder budget',
- 'transactions_no_budget' => 'Uitgaven zonder budget tussen :start en :end',
- 'spent_between' => 'Uitgegeven tussen :start en :end',
- 'createBudget' => 'Maak nieuw budget',
- 'inactiveBudgets' => 'Inactieve budgetten',
- 'without_budget_between' => 'Transacties zonder budget tussen :start en :end',
- 'delete_budget' => 'Verwijder budget ":name"',
- 'deleted_budget' => 'Budget ":name" verwijderd',
- 'edit_budget' => 'Wijzig budget ":name"',
- 'updated_budget' => 'Budget ":name" geüpdatet',
- 'update_amount' => 'Bedrag bijwerken',
- 'update_budget' => 'Budget bijwerken',
- 'update_budget_amount_range' => 'Update het verwacht beschikbare bedrag tussen :start en :end',
- 'budget_period_navigator' => 'Periodenavigator',
- 'info_on_available_amount' => 'Wat heb ik beschikbaar?',
- 'available_amount_indication' => 'Gebruik deze bedragen om een indruk te krijgen van wat je totale budget zou kunnen zijn.',
- 'suggested' => 'Gesuggereerd',
- 'average_between' => 'Gemiddelde tussen :start en :end',
+ 'create_new_budget' => 'Maak een nieuw budget',
+ 'store_new_budget' => 'Sla nieuw budget op',
+ 'stored_new_budget' => 'Nieuw budget ":name" opgeslagen',
+ 'available_between' => 'Beschikbaar tussen :start en :end',
+ 'transactionsWithoutBudget' => 'Uitgaven zonder budget',
+ 'transactions_no_budget' => 'Uitgaven zonder budget tussen :start en :end',
+ 'spent_between' => 'Uitgegeven tussen :start en :end',
+ 'createBudget' => 'Maak nieuw budget',
+ 'inactiveBudgets' => 'Inactieve budgetten',
+ 'without_budget_between' => 'Transacties zonder budget tussen :start en :end',
+ 'delete_budget' => 'Verwijder budget ":name"',
+ 'deleted_budget' => 'Budget ":name" verwijderd',
+ 'edit_budget' => 'Wijzig budget ":name"',
+ 'updated_budget' => 'Budget ":name" geüpdatet',
+ 'update_amount' => 'Bedrag bijwerken',
+ 'update_budget' => 'Budget bijwerken',
+ 'update_budget_amount_range' => 'Update het verwacht beschikbare bedrag tussen :start en :end',
+ 'budget_period_navigator' => 'Periodenavigator',
+ 'info_on_available_amount' => 'Wat heb ik beschikbaar?',
+ 'available_amount_indication' => 'Gebruik deze bedragen om een indruk te krijgen van wat je totale budget zou kunnen zijn.',
+ 'suggested' => 'Gesuggereerd',
+ 'average_between' => 'Gemiddelde tussen :start en :end',
+ 'over_budget_warn' => ' Normaalgesproken budgetteer je :amount per dag. Nu sta je op :over_amount per dag.',
// bills:
- 'matching_on' => 'Wordt herkend',
- 'between_amounts' => 'tussen :low en :high.',
- 'repeats' => 'Herhaalt',
- 'connected_journals' => 'Verbonden transacties',
- 'auto_match_on' => 'Automatisch herkend door Firefly III',
- 'auto_match_off' => 'Niet automatisch herkend door Firefly III',
- 'next_expected_match' => 'Volgende verwachte transactie',
- 'delete_bill' => 'Verwijder contract ":name"',
- 'deleted_bill' => 'Contract ":name" verwijderd',
- 'edit_bill' => 'Wijzig contract ":name"',
- 'more' => 'Meer',
- 'rescan_old' => 'Scan oude transacties opnieuw',
- 'update_bill' => 'Wijzig contract',
- 'updated_bill' => 'Contract ":name" geüpdatet',
- 'store_new_bill' => 'Sla nieuw contract op',
- 'stored_new_bill' => 'Nieuw contract ":name" opgeslagen',
- 'cannot_scan_inactive_bill' => 'Inactieve contracten kunnen niet worden gescand.',
- 'rescanned_bill' => 'Alles is opnieuw gescand.',
- 'average_bill_amount_year' => 'Gemiddeld contractbedrag (:year)',
- 'average_bill_amount_overall' => 'Gemiddeld contractbedrag (gehele periode)',
- 'bill_is_active' => 'Contract is actief',
- 'bill_expected_between' => 'Verwacht tussen :start en :end',
- 'bill_will_automatch' => 'Waar van toepassing wordt dit contract automatisch gekoppeld aan transacties',
- 'skips_over' => 'slaat over',
-
+ 'matching_on' => 'Wordt herkend',
+ 'between_amounts' => 'tussen :low en :high.',
+ 'repeats' => 'Herhaalt',
+ 'connected_journals' => 'Verbonden transacties',
+ 'auto_match_on' => 'Automatisch herkend door Firefly III',
+ 'auto_match_off' => 'Niet automatisch herkend door Firefly III',
+ 'next_expected_match' => 'Volgende verwachte transactie',
+ 'delete_bill' => 'Verwijder contract ":name"',
+ 'deleted_bill' => 'Contract ":name" verwijderd',
+ 'edit_bill' => 'Wijzig contract ":name"',
+ 'more' => 'Meer',
+ 'rescan_old' => 'Scan oude transacties opnieuw',
+ 'update_bill' => 'Wijzig contract',
+ 'updated_bill' => 'Contract ":name" geüpdatet',
+ 'store_new_bill' => 'Sla nieuw contract op',
+ 'stored_new_bill' => 'Nieuw contract ":name" opgeslagen',
+ 'cannot_scan_inactive_bill' => 'Inactieve contracten kunnen niet worden gescand.',
+ 'rescanned_bill' => 'Alles is opnieuw gescand.',
+ 'average_bill_amount_year' => 'Gemiddeld contractbedrag (:year)',
+ 'average_bill_amount_overall' => 'Gemiddeld contractbedrag (gehele periode)',
+ 'bill_is_active' => 'Contract is actief',
+ 'bill_expected_between' => 'Verwacht tussen :start en :end',
+ 'bill_will_automatch' => 'Waar van toepassing wordt dit contract automatisch gekoppeld aan transacties',
+ 'skips_over' => 'slaat over',
// accounts:
- 'details_for_asset' => 'Overzicht voor betaalrekening ":name"',
- 'details_for_expense' => 'Overzicht voor crediteur ":name"',
- 'details_for_revenue' => 'Overzicht voor debiteur ":name"',
- 'details_for_cash' => 'Overzicht voor contant geldrekening ":name"',
- 'store_new_asset_account' => 'Sla nieuwe betaalrekening op',
- 'store_new_expense_account' => 'Sla nieuwe crediteur op',
- 'store_new_revenue_account' => 'Sla nieuwe debiteur op',
- 'edit_asset_account' => 'Wijzig betaalrekening ":name"',
- 'edit_expense_account' => 'Wijzig crediteur ":name"',
- 'edit_revenue_account' => 'Wijzig debiteur ":name"',
- 'delete_asset_account' => 'Verwijder betaalrekening ":name"',
- 'delete_expense_account' => 'Verwijder crediteur ":name"',
- 'delete_revenue_account' => 'Verwijder debiteur ":name"',
- 'asset_deleted' => 'Betaalrekening ":name" is verwijderd.',
- 'expense_deleted' => 'Crediteur ":name" is verwijderd.',
- 'revenue_deleted' => 'Debiteur ":name" is verwijderd.',
- 'update_asset_account' => 'Wijzig betaalrekening',
- 'update_expense_account' => 'Wijzig crediteur',
- 'update_revenue_account' => 'Wijzig debiteur',
- 'make_new_asset_account' => 'Nieuwe betaalrekening',
- 'make_new_expense_account' => 'Nieuwe crediteur',
- 'make_new_revenue_account' => 'Nieuwe debiteur',
- 'asset_accounts' => 'Betaalrekeningen',
- 'expense_accounts' => 'Crediteuren',
- 'revenue_accounts' => 'Debiteuren',
- 'cash_accounts' => 'Contant geldrekeningen',
- 'Cash account' => 'Contant geldrekening',
- 'reconcile_account' => 'Afstemmen betaalrekening ":account"',
- 'delete_reconciliation' => 'Verwijder correctie',
- 'update_reconciliation' => 'Update correctie',
- 'amount_cannot_be_zero' => 'Het bedrag mag niet nul zijn',
- 'end_of_reconcile_period' => 'Einde van verrekenperiode: :period',
- 'start_of_reconcile_period' => 'Begin van verrekenperiode: :period',
- 'start_balance' => 'Startsaldo',
- 'end_balance' => 'Eindsaldo',
- 'update_balance_dates_instruction' => 'Vergelijk de bedragen en datums hierboven met uw bankafschrift en druk op "Begin met afstemmen"',
- 'select_transactions_instruction' => 'Selecteer de transacties die op je bankafschrift staan.',
- 'select_range_and_balance' => 'Controleer eerst het datumbereik en de saldo\'s. Druk vervolgens op "Begin met afstemmen"',
- 'date_change_instruction' => 'Als je het datumbereik nu wijzigt, gaat je voortgang verloren.',
- 'update_selection' => 'Selectie bijwerken',
- 'store_reconcile' => 'Afstemming opslaan',
- 'reconciliation_transaction' => 'Corrigerende transactie',
- 'Reconciliation' => 'Correctie',
- 'reconciliation' => 'Correctie',
- 'reconcile_options' => 'Afstemmingsopties',
- 'reconcile_range' => 'Afstemmingsbereik',
- 'start_reconcile' => 'Begin met afstemmen',
- 'cash' => 'contant',
- 'account_type' => 'Rekeningtype',
- 'save_transactions_by_moving' => 'Bewaar deze transacties door ze aan een andere rekening te koppelen:',
- 'stored_new_account' => 'Nieuwe rekening ":name" opgeslagen!',
- 'updated_account' => 'Rekening ":name" geüpdatet',
- 'credit_card_options' => 'Opties voor credit cards',
- 'no_transactions_account' => 'Betaalrekening ":name" heeft geen transacties (in deze periode).',
- 'no_data_for_chart' => 'Er is (nog) niet genoeg informatie om deze grafiek te tekenen.',
- 'select_more_than_one_account' => 'Selecteer meer dan één rekening',
- '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',
- 'account_default_currency' => 'Nieuwe transacties van deze betaalrekening krijgen automatisch deze valuta.',
- 'reconcile_has_more' => 'Je Firefly III boekhouding bevat meer geld dan je bank beweert dat er in zou moeten zitten. Je hebt verschillende opties. Kies wat je wilt doen, en klik dan "Bevestig correctie".',
- 'reconcile_has_less' => 'Je Firefly III boekhouding bevat minder geld dan je bank beweert dat er in zou moeten zitten. Je hebt verschillende opties. Kies wat je wilt doen, en klik dan "Bevestig correctie".',
- 'reconcile_is_equal' => 'Je Firefly III boekhouding en je bankafschriften lopen gelijk. Je hoeft niets te doen. Klik op "Bevestig correctie" om je invoer te bevestigen.',
- 'create_pos_reconcile_transaction' => 'Markeer de geselecteerde transacties als afgestemd, en voeg :amount toe aan de betaalrekening.',
- 'create_neg_reconcile_transaction' => 'Markeer de geselecteerde transacties als afgestemd, en verwijder :amount van de betaalrekening.',
- 'reconcile_do_nothing' => 'Markeer de geselecteerde transacties als afgestemd, maar maak geen correctie.',
- 'reconcile_go_back' => 'Je kan een correctie later altijd wijzigen.',
- 'must_be_asset_account' => 'Je kan alleen betaalrekeningen corrigeren',
- 'reconciliation_stored' => 'Correctie opgeslagen',
- 'reconcilliation_transaction_title' => 'Correctie (:from tot :to)',
- 'reconcile_this_account' => 'Corrigeer deze rekening',
- 'confirm_reconciliation' => 'Bevestig correctie',
- 'submitted_start_balance' => 'Ingevoerd startsaldo',
- 'selected_transactions' => 'Geselecteerde transacties (:count)',
- 'already_cleared_transactions' => 'Al afgestemde transacties (:count)',
- 'submitted_end_balance' => 'Ingevoerd eindsaldo',
- 'initial_balance_description' => 'Startsaldo voor ":account"',
+ 'details_for_asset' => 'Overzicht voor betaalrekening ":name"',
+ 'details_for_expense' => 'Overzicht voor crediteur ":name"',
+ 'details_for_revenue' => 'Overzicht voor debiteur ":name"',
+ 'details_for_cash' => 'Overzicht voor contant geldrekening ":name"',
+ 'store_new_asset_account' => 'Sla nieuwe betaalrekening op',
+ 'store_new_expense_account' => 'Sla nieuwe crediteur op',
+ 'store_new_revenue_account' => 'Sla nieuwe debiteur op',
+ 'edit_asset_account' => 'Wijzig betaalrekening ":name"',
+ 'edit_expense_account' => 'Wijzig crediteur ":name"',
+ 'edit_revenue_account' => 'Wijzig debiteur ":name"',
+ 'delete_asset_account' => 'Verwijder betaalrekening ":name"',
+ 'delete_expense_account' => 'Verwijder crediteur ":name"',
+ 'delete_revenue_account' => 'Verwijder debiteur ":name"',
+ 'asset_deleted' => 'Betaalrekening ":name" is verwijderd.',
+ 'expense_deleted' => 'Crediteur ":name" is verwijderd.',
+ 'revenue_deleted' => 'Debiteur ":name" is verwijderd.',
+ 'update_asset_account' => 'Wijzig betaalrekening',
+ 'update_expense_account' => 'Wijzig crediteur',
+ 'update_revenue_account' => 'Wijzig debiteur',
+ 'make_new_asset_account' => 'Nieuwe betaalrekening',
+ 'make_new_expense_account' => 'Nieuwe crediteur',
+ 'make_new_revenue_account' => 'Nieuwe debiteur',
+ 'asset_accounts' => 'Betaalrekeningen',
+ 'expense_accounts' => 'Crediteuren',
+ 'revenue_accounts' => 'Debiteuren',
+ 'cash_accounts' => 'Contant geldrekeningen',
+ 'Cash account' => 'Contant geldrekening',
+ 'reconcile_account' => 'Afstemmen betaalrekening ":account"',
+ 'delete_reconciliation' => 'Verwijder correctie',
+ 'update_reconciliation' => 'Update correctie',
+ 'amount_cannot_be_zero' => 'Het bedrag mag niet nul zijn',
+ 'end_of_reconcile_period' => 'Einde van verrekenperiode: :period',
+ 'start_of_reconcile_period' => 'Begin van verrekenperiode: :period',
+ 'start_balance' => 'Startsaldo',
+ 'end_balance' => 'Eindsaldo',
+ 'update_balance_dates_instruction' => 'Vergelijk de bedragen en datums hierboven met uw bankafschrift en druk op "Begin met afstemmen"',
+ 'select_transactions_instruction' => 'Selecteer de transacties die op je bankafschrift staan.',
+ 'select_range_and_balance' => 'Controleer eerst het datumbereik en de saldo\'s. Druk vervolgens op "Begin met afstemmen"',
+ 'date_change_instruction' => 'Als je het datumbereik nu wijzigt, gaat je voortgang verloren.',
+ 'update_selection' => 'Selectie bijwerken',
+ 'store_reconcile' => 'Afstemming opslaan',
+ 'reconciliation_transaction' => 'Corrigerende transactie',
+ 'Reconciliation' => 'Correctie',
+ 'reconciliation' => 'Correctie',
+ 'reconcile_options' => 'Afstemmingsopties',
+ 'reconcile_range' => 'Afstemmingsbereik',
+ 'start_reconcile' => 'Begin met afstemmen',
+ 'cash' => 'contant',
+ 'account_type' => 'Rekeningtype',
+ 'save_transactions_by_moving' => 'Bewaar deze transacties door ze aan een andere rekening te koppelen:',
+ 'stored_new_account' => 'Nieuwe rekening ":name" opgeslagen!',
+ 'updated_account' => 'Rekening ":name" geüpdatet',
+ 'credit_card_options' => 'Opties voor credit cards',
+ 'no_transactions_account' => 'Betaalrekening ":name" heeft geen transacties (in deze periode).',
+ 'no_data_for_chart' => 'Er is (nog) niet genoeg informatie om deze grafiek te tekenen.',
+ 'select_more_than_one_account' => 'Selecteer meer dan één rekening',
+ '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',
+ 'account_default_currency' => 'Nieuwe transacties van deze betaalrekening krijgen automatisch deze valuta.',
+ 'reconcile_has_more' => 'Je Firefly III boekhouding bevat meer geld dan je bank beweert dat er in zou moeten zitten. Je hebt verschillende opties. Kies wat je wilt doen, en klik dan "Bevestig correctie".',
+ 'reconcile_has_less' => 'Je Firefly III boekhouding bevat minder geld dan je bank beweert dat er in zou moeten zitten. Je hebt verschillende opties. Kies wat je wilt doen, en klik dan "Bevestig correctie".',
+ 'reconcile_is_equal' => 'Je Firefly III boekhouding en je bankafschriften lopen gelijk. Je hoeft niets te doen. Klik op "Bevestig correctie" om je invoer te bevestigen.',
+ 'create_pos_reconcile_transaction' => 'Markeer de geselecteerde transacties als afgestemd, en voeg :amount toe aan de betaalrekening.',
+ 'create_neg_reconcile_transaction' => 'Markeer de geselecteerde transacties als afgestemd, en verwijder :amount van de betaalrekening.',
+ 'reconcile_do_nothing' => 'Markeer de geselecteerde transacties als afgestemd, maar maak geen correctie.',
+ 'reconcile_go_back' => 'Je kan een correctie later altijd wijzigen.',
+ 'must_be_asset_account' => 'Je kan alleen betaalrekeningen corrigeren',
+ 'reconciliation_stored' => 'Correctie opgeslagen',
+ 'reconcilliation_transaction_title' => 'Correctie (:from tot :to)',
+ 'reconcile_this_account' => 'Corrigeer deze rekening',
+ 'confirm_reconciliation' => 'Bevestig correctie',
+ 'submitted_start_balance' => 'Ingevoerd startsaldo',
+ 'selected_transactions' => 'Geselecteerde transacties (:count)',
+ 'already_cleared_transactions' => 'Al afgestemde transacties (:count)',
+ 'submitted_end_balance' => 'Ingevoerd eindsaldo',
+ 'initial_balance_description' => 'Startsaldo voor ":account"',
// categories:
- 'new_category' => 'Nieuwe categorie',
- 'create_new_category' => 'Nieuwe categorie',
- 'without_category' => 'Zonder categorie',
- 'update_category' => 'Update categorie',
- 'updated_category' => 'Categorie ":name" geüpdatet',
- 'categories' => 'Categorieën',
- 'edit_category' => 'Wijzig categorie ":name"',
- 'no_category' => '(geen categorie)',
- 'category' => 'Categorie',
- 'delete_category' => 'Verwijder categorie ":name"',
- 'deleted_category' => 'Categorie ":name" verwijderd',
- 'store_category' => 'Sla nieuwe categorie op',
- 'stored_category' => 'Nieuwe categorie ":name" opgeslagen',
- 'without_category_between' => 'Zonder categorie tussen :start en :end',
+ 'new_category' => 'Nieuwe categorie',
+ 'create_new_category' => 'Nieuwe categorie',
+ 'without_category' => 'Zonder categorie',
+ 'update_category' => 'Update categorie',
+ 'updated_category' => 'Categorie ":name" geüpdatet',
+ 'categories' => 'Categorieën',
+ 'edit_category' => 'Wijzig categorie ":name"',
+ 'no_category' => '(geen categorie)',
+ 'category' => 'Categorie',
+ 'delete_category' => 'Verwijder categorie ":name"',
+ 'deleted_category' => 'Categorie ":name" verwijderd',
+ 'store_category' => 'Sla nieuwe categorie op',
+ 'stored_category' => 'Nieuwe categorie ":name" opgeslagen',
+ 'without_category_between' => 'Zonder categorie tussen :start en :end',
// transactions:
- 'update_withdrawal' => 'Wijzig uitgave',
- 'update_deposit' => 'Wijzig inkomsten',
- 'update_transfer' => 'Wijzig overschrijving',
- 'updated_withdrawal' => 'Uitgave ":description" geüpdatet',
- 'updated_deposit' => 'Inkomsten ":description" geüpdatet',
- 'updated_transfer' => 'Overschrijving ":description" geüpdatet',
- 'delete_withdrawal' => 'Verwijder uitgave ":description"',
- 'delete_deposit' => 'Verwijder inkomsten ":description"',
- 'delete_transfer' => 'Verwijder overschrijving ":description"',
- 'deleted_withdrawal' => 'Uitgave ":description" verwijderd',
- 'deleted_deposit' => 'Inkomsten ":description" verwijderd',
- 'deleted_transfer' => 'Overschrijving ":description" verwijderd',
- 'stored_journal' => 'Nieuw transactie ":description" opgeslagen',
- 'select_transactions' => 'Selecteer transacties',
- 'rule_group_select_transactions' => '":title" op transacties toepassen',
- 'rule_select_transactions' => '":title" op transacties toepassen',
- 'stop_selection' => 'Stop met selecteren',
- 'reconcile_selected' => 'Verrekenen',
- 'mass_delete_journals' => 'Verwijder een aantal transacties',
- 'mass_edit_journals' => 'Wijzig een aantal transacties',
- 'mass_bulk_journals' => 'Wijzig een aantal transacties in bulk',
- 'mass_bulk_journals_explain' => 'Als je je transacties niet één voor één wilt wijzigen met de daarvoor bestemde functie, kan je ze ook allemaal in één keer wijzigen. Selecteer de gewenste categorie, budget of tag(s) hieronder en alle transacties in de tabel zullen deze waarde krijgen.',
- 'bulk_set_new_values' => 'Gebruik de velden hieronder voor nieuwe waarden. Als je ze leeg laat, worden ze leeggemaakt voor alle gebruikers. Denk eraan dat alleen uitgaven een budget kunnen krijgen.',
- 'no_bulk_category' => 'Update categorie niet',
- 'no_bulk_budget' => 'Update budget niet',
- 'no_bulk_tags' => 'Update tag(s) niet',
- 'bulk_edit' => 'Wijzig in bulk',
- 'cannot_edit_other_fields' => 'Je kan andere velden dan de velden die je hier ziet niet groepsgewijs wijzigen. Er is geen ruimte om ze te laten zien. Als je deze velden toch wilt wijzigen, volg dan de link naast de transactie en wijzig ze stuk voor stuk.',
- 'no_budget' => '(geen budget)',
- 'no_budget_squared' => '(geen budget)',
- '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',
- 'notes' => 'Notities',
+ 'update_withdrawal' => 'Wijzig uitgave',
+ 'update_deposit' => 'Wijzig inkomsten',
+ 'update_transfer' => 'Wijzig overschrijving',
+ 'updated_withdrawal' => 'Uitgave ":description" geüpdatet',
+ 'updated_deposit' => 'Inkomsten ":description" geüpdatet',
+ 'updated_transfer' => 'Overschrijving ":description" geüpdatet',
+ 'delete_withdrawal' => 'Verwijder uitgave ":description"',
+ 'delete_deposit' => 'Verwijder inkomsten ":description"',
+ 'delete_transfer' => 'Verwijder overschrijving ":description"',
+ 'deleted_withdrawal' => 'Uitgave ":description" verwijderd',
+ 'deleted_deposit' => 'Inkomsten ":description" verwijderd',
+ 'deleted_transfer' => 'Overschrijving ":description" verwijderd',
+ 'stored_journal' => 'Nieuw transactie ":description" opgeslagen',
+ 'select_transactions' => 'Selecteer transacties',
+ 'rule_group_select_transactions' => '":title" op transacties toepassen',
+ 'rule_select_transactions' => '":title" op transacties toepassen',
+ 'stop_selection' => 'Stop met selecteren',
+ 'reconcile_selected' => 'Verrekenen',
+ 'mass_delete_journals' => 'Verwijder een aantal transacties',
+ 'mass_edit_journals' => 'Wijzig een aantal transacties',
+ 'mass_bulk_journals' => 'Wijzig een aantal transacties in bulk',
+ 'mass_bulk_journals_explain' => 'Als je je transacties niet één voor één wilt wijzigen met de daarvoor bestemde functie, kan je ze ook allemaal in één keer wijzigen. Selecteer de gewenste categorie, budget of tag(s) hieronder en alle transacties in de tabel zullen deze waarde krijgen.',
+ 'bulk_set_new_values' => 'Gebruik de velden hieronder voor nieuwe waarden. Als je ze leeg laat, worden ze leeggemaakt voor alle gebruikers. Denk eraan dat alleen uitgaven een budget kunnen krijgen.',
+ 'no_bulk_category' => 'Update categorie niet',
+ 'no_bulk_budget' => 'Update budget niet',
+ 'no_bulk_tags' => 'Update tag(s) niet',
+ 'bulk_edit' => 'Wijzig in bulk',
+ 'cannot_edit_other_fields' => 'Je kan andere velden dan de velden die je hier ziet niet groepsgewijs wijzigen. Er is geen ruimte om ze te laten zien. Als je deze velden toch wilt wijzigen, volg dan de link naast de transactie en wijzig ze stuk voor stuk.',
+ 'no_budget' => '(geen budget)',
+ 'no_budget_squared' => '(geen budget)',
+ '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',
+ 'notes' => 'Notities',
// new user:
- 'welcome' => 'Welkom bij Firefly III!',
- 'submit' => 'Invoeren',
- 'getting_started' => 'Aan de start!',
- 'to_get_started' => 'Het is goed om te zien dat de installatie van Firefly III gelukt is. Voer de naam van je bank in en het saldo van je belangrijkste betaalrekening. Meerdere rekeningen kan je later toevoegen, maar we moeten ergens beginnen natuurlijk.',
- 'savings_balance_text' => 'Firefly III maakt automatisch een spaarrekening voor je. Daar zit normaal geen geld in, maar je kan hier opgeven hoeveel er op staat.',
- 'finish_up_new_user' => 'That\'s it! Druk op Opslaan om door te gaan. Je gaat dan naar de homepage van Firefly III.',
- 'stored_new_accounts_new_user' => 'Hoera! Je nieuwe accounts zijn opgeslagen.',
+ 'welcome' => 'Welkom bij Firefly III!',
+ 'submit' => 'Invoeren',
+ 'getting_started' => 'Aan de start!',
+ 'to_get_started' => 'Het is goed om te zien dat de installatie van Firefly III gelukt is. Voer de naam van je bank in en het saldo van je belangrijkste betaalrekening. Meerdere rekeningen kan je later toevoegen, maar we moeten ergens beginnen natuurlijk.',
+ 'savings_balance_text' => 'Firefly III maakt automatisch een spaarrekening voor je. Daar zit normaal geen geld in, maar je kan hier opgeven hoeveel er op staat.',
+ 'finish_up_new_user' => 'That\'s it! Druk op Opslaan om door te gaan. Je gaat dan naar de homepage van Firefly III.',
+ 'stored_new_accounts_new_user' => 'Hoera! Je nieuwe accounts zijn opgeslagen.',
// home page:
- 'yourAccounts' => 'Je betaalrekeningen',
- 'budgetsAndSpending' => 'Budgetten en uitgaven',
- 'savings' => 'Sparen',
- 'newWithdrawal' => 'Nieuwe uitgave',
- 'newDeposit' => 'Nieuwe inkomsten',
- 'newTransfer' => 'Nieuwe overschrijving',
- 'bills_to_pay' => 'Openstaande contracten',
- 'per_day' => 'Per dag',
- 'left_to_spend_per_day' => 'Te besteden per dag',
- 'bills_paid' => 'Betaalde contracten',
+ 'yourAccounts' => 'Je betaalrekeningen',
+ 'budgetsAndSpending' => 'Budgetten en uitgaven',
+ 'savings' => 'Sparen',
+ 'newWithdrawal' => 'Nieuwe uitgave',
+ 'newDeposit' => 'Nieuwe inkomsten',
+ 'newTransfer' => 'Nieuwe overschrijving',
+ 'bills_to_pay' => 'Openstaande contracten',
+ 'per_day' => 'Per dag',
+ 'left_to_spend_per_day' => 'Te besteden per dag',
+ 'bills_paid' => 'Betaalde contracten',
// menu and titles, should be recycled as often as possible:
- 'currency' => 'Valuta',
- 'preferences' => 'Voorkeuren',
- 'logout' => 'Uitloggen',
- 'toggleNavigation' => 'Navigatie aan of uit',
- 'searchPlaceholder' => 'Zoeken...',
- 'version' => 'Versie',
- 'dashboard' => 'Dashboard',
- 'currencies' => 'Valuta',
- 'accounts' => 'Rekeningen',
- 'Asset account' => 'Betaalrekening',
- 'Default account' => 'Betaalrekening',
- 'Expense account' => 'Crediteur',
- 'Revenue account' => 'Debiteur',
- 'Initial balance account' => 'Startbalansrekening',
- 'budgets' => 'Budgetten',
- 'tags' => 'Tags',
- 'reports' => 'Overzichten',
- 'transactions' => 'Transacties',
- 'expenses' => 'Uitgaven',
- 'income' => 'Inkomsten',
- 'transfers' => 'Overschrijvingen',
- 'moneyManagement' => 'Geldbeheer',
- 'piggyBanks' => 'Spaarpotjes',
- 'bills' => 'Contracten',
- 'withdrawal' => 'Uitgave',
- 'opening_balance' => 'Startsaldo',
- 'deposit' => 'Inkomsten',
- 'account' => 'Rekening',
- 'transfer' => 'Overschrijving',
- 'Withdrawal' => 'Uitgave',
- 'Deposit' => 'Inkomsten',
- 'Transfer' => 'Overschrijving',
- 'bill' => 'Contract',
- 'yes' => 'Ja',
- 'no' => 'Nee',
- 'amount' => 'Bedrag',
- 'overview' => 'Overzicht',
- 'saveOnAccount' => 'Sparen op rekening',
- 'unknown' => 'Onbekend',
- 'daily' => 'Dagelijks',
- 'monthly' => 'Maandelijks',
- 'profile' => 'Profiel',
- 'errors' => 'Fouten',
+ 'currency' => 'Valuta',
+ 'preferences' => 'Voorkeuren',
+ 'logout' => 'Uitloggen',
+ 'toggleNavigation' => 'Navigatie aan of uit',
+ 'searchPlaceholder' => 'Zoeken...',
+ 'version' => 'Versie',
+ 'dashboard' => 'Dashboard',
+ 'currencies' => 'Valuta',
+ 'accounts' => 'Rekeningen',
+ 'Asset account' => 'Betaalrekening',
+ 'Default account' => 'Betaalrekening',
+ 'Expense account' => 'Crediteur',
+ 'Revenue account' => 'Debiteur',
+ 'Initial balance account' => 'Startbalansrekening',
+ 'budgets' => 'Budgetten',
+ 'tags' => 'Tags',
+ 'reports' => 'Overzichten',
+ 'transactions' => 'Transacties',
+ 'expenses' => 'Uitgaven',
+ 'income' => 'Inkomsten',
+ 'transfers' => 'Overschrijvingen',
+ 'moneyManagement' => 'Geldbeheer',
+ 'piggyBanks' => 'Spaarpotjes',
+ 'bills' => 'Contracten',
+ 'withdrawal' => 'Uitgave',
+ 'opening_balance' => 'Startsaldo',
+ 'deposit' => 'Inkomsten',
+ 'account' => 'Rekening',
+ 'transfer' => 'Overschrijving',
+ 'Withdrawal' => 'Uitgave',
+ 'Deposit' => 'Inkomsten',
+ 'Transfer' => 'Overschrijving',
+ 'bill' => 'Contract',
+ 'yes' => 'Ja',
+ 'no' => 'Nee',
+ 'amount' => 'Bedrag',
+ 'overview' => 'Overzicht',
+ 'saveOnAccount' => 'Sparen op rekening',
+ 'unknown' => 'Onbekend',
+ 'daily' => 'Dagelijks',
+ 'monthly' => 'Maandelijks',
+ 'profile' => 'Profiel',
+ 'errors' => 'Fouten',
// reports:
- 'report_default' => 'Standaard financieel rapport (:start tot :end)',
- 'report_audit' => 'Transactiehistorie-overzicht van :start tot :end',
- 'report_category' => 'Categorierapport van :start tot :end',
- 'report_account' => 'Debiteuren/crediteurenrapport tussen :start en :end',
- 'report_budget' => 'Budgetrapport van :start tot :end',
- 'report_tag' => 'Tagrapport van :start tot :end',
- 'quick_link_reports' => 'Snelle links',
- 'quick_link_default_report' => 'Standaard financieel rapport',
- 'quick_link_audit_report' => 'Transactiehistorie-overzicht',
- 'report_this_month_quick' => 'Deze maand, alle rekeningen',
- 'report_this_year_quick' => 'Dit jaar, alle rekeningen',
- 'report_this_fiscal_year_quick' => 'Huidig boekjaar, alle rekeningen',
- 'report_all_time_quick' => 'Gehele periode, alle rekeningen',
- 'reports_can_bookmark' => 'Je kan rapporten aan je favorieten toevoegen.',
- 'incomeVsExpenses' => 'Inkomsten tegenover uitgaven',
- 'accountBalances' => 'Rekeningsaldi',
- 'balanceStart' => 'Saldo aan het begin van de periode',
- 'balanceEnd' => 'Saldo aan het einde van de periode',
- 'splitByAccount' => 'Per betaalrekening',
- 'coveredWithTags' => 'Gecorrigeerd met tags',
- 'leftUnbalanced' => 'Ongecorrigeerd',
- 'leftInBudget' => 'Over van budget',
- 'sumOfSums' => 'Alles bij elkaar',
- 'noCategory' => '(zonder categorie)',
- 'notCharged' => '(Nog) niet betaald',
- 'inactive' => 'Niet actief',
- 'active' => 'Actief',
- 'difference' => 'Verschil',
- 'money_flowing_in' => 'In',
- 'money_flowing_out' => 'Uit',
- 'topX' => 'top :number',
- 'show_full_list' => 'Laat hele lijst zien',
- 'show_only_top' => 'Alleen top :number',
- '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_account' => 'Debiteuren/crediteurenrapport',
- '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',
- 'report_preset_ranges' => 'Standaardbereik',
- 'shared' => 'Gedeeld',
- 'fiscal_year' => 'Boekjaar',
- 'income_entry' => 'Inkomsten naar rekening ":name" tussen :start en :end',
- 'expense_entry' => 'Uitgaven naar rekening ":name" tussen :start en :end',
- 'category_entry' => 'Uitgaven in categorie ":name" tussen :start en :end',
- 'budget_spent_amount' => 'Uitgaven in budget ":budget" tussen :start en :end',
- 'balance_amount' => 'Uitgaven in :budget betaald van rekening ":account" tussen :start en :end',
- 'no_audit_activity' => 'Geen activiteit op betaalrekening :account_name tussen :start en :end.',
- 'audit_end_balance' => 'Aan het einde van de dag, :end, was het saldo van betaalrekening :account_name :balance',
- 'reports_extra_options' => 'Extra opties',
- 'report_has_no_extra_options' => 'Er zijn geen extra opties voor dit overzicht',
- 'reports_submit' => 'Bekijk overzicht',
- 'end_after_start_date' => 'Einddatum moet na begindatum liggen.',
- 'select_category' => 'Selecteer categorie(ën)',
- 'select_budget' => 'Selecteer budget(ten).',
- 'select_tag' => 'Selecteer tag(s).',
- 'income_per_category' => 'Inkomen per categorie',
- 'expense_per_category' => 'Uitgaven per categorie',
- 'expense_per_budget' => 'Uitgaven per budget',
- 'income_per_account' => 'Inkomen per rekening',
- 'expense_per_account' => 'Uitgaven per rekening',
- 'expense_per_tag' => 'Uitgaven per tag',
- 'income_per_tag' => 'Inkomsten per tag',
- 'include_expense_not_in_budget' => 'Inclusief uitgaven niet in deze budget(ten)',
- 'include_expense_not_in_account' => 'Inclusief uitgaven niet vanaf deze rekening(en)',
- 'include_expense_not_in_category' => 'Inclusief uitgaven niet in deze categorie(ën)',
- 'include_income_not_in_category' => 'Inclusief inkomsten niet in deze categorie(ën)',
- 'include_income_not_in_account' => 'Inclusief inkomsten niet op deze rekening(en)',
- 'include_income_not_in_tags' => 'Inclusief inkomsten niet getagged met deze tag(s)',
- 'include_expense_not_in_tags' => 'Inclusief uitgaven niet getagged met deze tag(s)',
- 'everything_else' => 'De rest',
- 'income_and_expenses' => 'Inkomsten en uitgaven',
- 'spent_average' => 'Uitgegeven (gemiddeld)',
- 'income_average' => 'Inkomsten (gemiddeld)',
- 'transaction_count' => 'Transacties',
- 'average_spending_per_account' => 'Gemiddeld uitgegeven per rekening',
- 'average_income_per_account' => 'Gemiddeld verdiend per rekening',
- 'total' => 'Totaal',
- 'description' => 'Omschrijving',
- 'sum_of_period' => 'Som van periode',
- 'average_in_period' => 'Gemiddelde in periode',
- 'account_role_defaultAsset' => 'Standaard betaalrekening',
- '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.',
- 'in_out_accounts' => 'Inkomsten en uitgaven per combinatie',
- 'in_out_per_category' => 'Verdiend en uitgegeven per categorie',
- 'out_per_budget' => 'Uitgaven per budget',
- 'select_expense_revenue' => 'Selecteer debiteur+crediteur',
+ 'report_default' => 'Standaard financieel rapport (:start tot :end)',
+ 'report_audit' => 'Transactiehistorie-overzicht van :start tot :end',
+ 'report_category' => 'Categorierapport van :start tot :end',
+ 'report_account' => 'Debiteuren/crediteurenrapport tussen :start en :end',
+ 'report_budget' => 'Budgetrapport van :start tot :end',
+ 'report_tag' => 'Tagrapport van :start tot :end',
+ 'quick_link_reports' => 'Snelle links',
+ 'quick_link_default_report' => 'Standaard financieel rapport',
+ 'quick_link_audit_report' => 'Transactiehistorie-overzicht',
+ 'report_this_month_quick' => 'Deze maand, alle rekeningen',
+ 'report_this_year_quick' => 'Dit jaar, alle rekeningen',
+ 'report_this_fiscal_year_quick' => 'Huidig boekjaar, alle rekeningen',
+ 'report_all_time_quick' => 'Gehele periode, alle rekeningen',
+ 'reports_can_bookmark' => 'Je kan rapporten aan je favorieten toevoegen.',
+ 'incomeVsExpenses' => 'Inkomsten tegenover uitgaven',
+ 'accountBalances' => 'Rekeningsaldi',
+ 'balanceStart' => 'Saldo aan het begin van de periode',
+ 'balanceEnd' => 'Saldo aan het einde van de periode',
+ 'splitByAccount' => 'Per betaalrekening',
+ 'coveredWithTags' => 'Gecorrigeerd met tags',
+ 'leftUnbalanced' => 'Ongecorrigeerd',
+ 'leftInBudget' => 'Over van budget',
+ 'sumOfSums' => 'Alles bij elkaar',
+ 'noCategory' => '(zonder categorie)',
+ 'notCharged' => '(Nog) niet betaald',
+ 'inactive' => 'Niet actief',
+ 'active' => 'Actief',
+ 'difference' => 'Verschil',
+ 'money_flowing_in' => 'In',
+ 'money_flowing_out' => 'Uit',
+ 'topX' => 'top :number',
+ 'show_full_list' => 'Laat hele lijst zien',
+ 'show_only_top' => 'Alleen top :number',
+ '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_account' => 'Debiteuren/crediteurenrapport',
+ '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',
+ 'report_preset_ranges' => 'Standaardbereik',
+ 'shared' => 'Gedeeld',
+ 'fiscal_year' => 'Boekjaar',
+ 'income_entry' => 'Inkomsten naar rekening ":name" tussen :start en :end',
+ 'expense_entry' => 'Uitgaven naar rekening ":name" tussen :start en :end',
+ 'category_entry' => 'Uitgaven in categorie ":name" tussen :start en :end',
+ 'budget_spent_amount' => 'Uitgaven in budget ":budget" tussen :start en :end',
+ 'balance_amount' => 'Uitgaven in :budget betaald van rekening ":account" tussen :start en :end',
+ 'no_audit_activity' => 'Geen activiteit op betaalrekening :account_name tussen :start en :end.',
+ 'audit_end_balance' => 'Aan het einde van de dag, :end, was het saldo van betaalrekening :account_name :balance',
+ 'reports_extra_options' => 'Extra opties',
+ 'report_has_no_extra_options' => 'Er zijn geen extra opties voor dit overzicht',
+ 'reports_submit' => 'Bekijk overzicht',
+ 'end_after_start_date' => 'Einddatum moet na begindatum liggen.',
+ 'select_category' => 'Selecteer categorie(ën)',
+ 'select_budget' => 'Selecteer budget(ten).',
+ 'select_tag' => 'Selecteer tag(s).',
+ 'income_per_category' => 'Inkomen per categorie',
+ 'expense_per_category' => 'Uitgaven per categorie',
+ 'expense_per_budget' => 'Uitgaven per budget',
+ 'income_per_account' => 'Inkomen per rekening',
+ 'expense_per_account' => 'Uitgaven per rekening',
+ 'expense_per_tag' => 'Uitgaven per tag',
+ 'income_per_tag' => 'Inkomsten per tag',
+ 'include_expense_not_in_budget' => 'Inclusief uitgaven niet in deze budget(ten)',
+ 'include_expense_not_in_account' => 'Inclusief uitgaven niet vanaf deze rekening(en)',
+ 'include_expense_not_in_category' => 'Inclusief uitgaven niet in deze categorie(ën)',
+ 'include_income_not_in_category' => 'Inclusief inkomsten niet in deze categorie(ën)',
+ 'include_income_not_in_account' => 'Inclusief inkomsten niet op deze rekening(en)',
+ 'include_income_not_in_tags' => 'Inclusief inkomsten niet getagged met deze tag(s)',
+ 'include_expense_not_in_tags' => 'Inclusief uitgaven niet getagged met deze tag(s)',
+ 'everything_else' => 'De rest',
+ 'income_and_expenses' => 'Inkomsten en uitgaven',
+ 'spent_average' => 'Uitgegeven (gemiddeld)',
+ 'income_average' => 'Inkomsten (gemiddeld)',
+ 'transaction_count' => 'Transacties',
+ 'average_spending_per_account' => 'Gemiddeld uitgegeven per rekening',
+ 'average_income_per_account' => 'Gemiddeld verdiend per rekening',
+ 'total' => 'Totaal',
+ 'description' => 'Omschrijving',
+ 'sum_of_period' => 'Som van periode',
+ 'average_in_period' => 'Gemiddelde in periode',
+ 'account_role_defaultAsset' => 'Standaard betaalrekening',
+ '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.',
+ 'in_out_accounts' => 'Inkomsten en uitgaven per combinatie',
+ 'in_out_per_category' => 'Verdiend en uitgegeven per categorie',
+ 'out_per_budget' => 'Uitgaven per budget',
+ 'select_expense_revenue' => 'Selecteer debiteur+crediteur',
// charts:
- 'chart' => 'Diagram',
- 'month' => 'Maand',
- 'budget' => 'Budget',
- 'spent' => 'Uitgegeven',
- 'spent_in_budget' => 'Uitgegeven in budget',
- 'left_to_spend' => 'Over om uit te geven',
- 'earned' => 'Verdiend',
- 'overspent' => 'Teveel uitgegeven',
- 'left' => 'Over',
- 'max-amount' => 'Maximumbedrag',
- 'min-amount' => 'Minimumbedrag',
- 'journal-amount' => 'Bedrag voor dit contract',
- 'name' => 'Naam',
- 'date' => 'Datum',
- 'paid' => 'Betaald',
- 'unpaid' => 'Niet betaald',
- 'day' => 'Dag',
- 'budgeted' => 'Gebudgetteerd',
- 'period' => 'Periode',
- 'balance' => 'Saldo',
- 'sum' => 'Som',
- 'average' => 'Gemiddeld',
- 'balanceFor' => 'Saldo op :name',
+ 'chart' => 'Diagram',
+ 'month' => 'Maand',
+ 'budget' => 'Budget',
+ 'spent' => 'Uitgegeven',
+ 'spent_in_budget' => 'Uitgegeven in budget',
+ 'left_to_spend' => 'Over om uit te geven',
+ 'earned' => 'Verdiend',
+ 'overspent' => 'Teveel uitgegeven',
+ 'left' => 'Over',
+ 'max-amount' => 'Maximumbedrag',
+ 'min-amount' => 'Minimumbedrag',
+ 'journal-amount' => 'Bedrag voor dit contract',
+ 'name' => 'Naam',
+ 'date' => 'Datum',
+ 'paid' => 'Betaald',
+ 'unpaid' => 'Niet betaald',
+ 'day' => 'Dag',
+ 'budgeted' => 'Gebudgetteerd',
+ 'period' => 'Periode',
+ 'balance' => 'Saldo',
+ 'sum' => 'Som',
+ 'average' => 'Gemiddeld',
+ 'balanceFor' => 'Saldo op :name',
// piggy banks:
- 'add_money_to_piggy' => 'Stop geld in spaarpotje ":name"',
- 'piggy_bank' => 'Spaarpotje',
- 'new_piggy_bank' => 'Nieuw spaarpotje',
- 'store_piggy_bank' => 'Sla spaarpotje op',
- 'stored_piggy_bank' => 'Nieuw spaarpotje ":name" opgeslagen',
- 'account_status' => 'Rekeningoverzicht',
- 'left_for_piggy_banks' => 'Over voor spaarpotjes',
- 'sum_of_piggy_banks' => 'Som van spaarpotjes',
- 'saved_so_far' => 'Gespaard',
- 'left_to_save' => 'Te sparen',
- 'suggested_amount' => 'Voorgesteld spaarbedrag per maand',
- '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.',
+ 'add_money_to_piggy' => 'Stop geld in spaarpotje ":name"',
+ 'piggy_bank' => 'Spaarpotje',
+ 'new_piggy_bank' => 'Nieuw spaarpotje',
+ 'store_piggy_bank' => 'Sla spaarpotje op',
+ 'stored_piggy_bank' => 'Nieuw spaarpotje ":name" opgeslagen',
+ 'account_status' => 'Rekeningoverzicht',
+ 'left_for_piggy_banks' => 'Over voor spaarpotjes',
+ 'sum_of_piggy_banks' => 'Som van spaarpotjes',
+ 'saved_so_far' => 'Gespaard',
+ 'left_to_save' => 'Te sparen',
+ 'suggested_amount' => 'Voorgesteld spaarbedrag per maand',
+ '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',
@@ -1084,6 +1086,7 @@ return [
'invalid_link_selection' => 'Deze transacties kunnen niet worden gekoppeld',
'journals_linked' => 'De transacties zijn gekoppeld.',
'journals_error_linked' => 'Deze transacties zijn al gekoppeld.',
+ 'journals_link_to_self' => 'Je kan een transactie niet aan zichzelf koppelen',
'journal_links' => 'Transactiekoppelingen',
'this_withdrawal' => 'Deze uitgave',
'this_deposit' => 'Deze inkomsten',
diff --git a/resources/lang/nl_NL/form.php b/resources/lang/nl_NL/form.php
index 5397b2e7b5..ab1c58fece 100644
--- a/resources/lang/nl_NL/form.php
+++ b/resources/lang/nl_NL/form.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// new user:
diff --git a/resources/lang/nl_NL/import.php b/resources/lang/nl_NL/import.php
index f82fe7bf75..b77ad27912 100644
--- a/resources/lang/nl_NL/import.php
+++ b/resources/lang/nl_NL/import.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
// status of import:
@@ -97,6 +98,7 @@ return [
// not csv, but normal warning
'roles_warning' => 'Geef minstens de kolom aan waar het bedrag in staat. Als het even kan, ook een kolom voor de omschrijving, datum en de andere rekening.',
'foreign_amount_warning' => 'Als je een kolom markeert als "vreemde valuta" moet je ook aangeven in welke kolom de valuta staat.',
+
// file, map data
'file_map_title' => 'Importinstellingen (4/4) - Link importgegevens aan Firefly III-gegevens',
'file_map_text' => 'In deze tabellen is de linkerwaarde een waarde uit je CSV bestand. Jij moet de link leggen, als mogelijk, met een waarde uit jouw database. Firefly houdt zich hier aan. Als er geen waarde is, selecteer dan ook niets.',
@@ -131,28 +133,40 @@ return [
'column_date-book' => 'Datum (boeking)',
'column_date-process' => 'Datum (verwerking)',
'column_date-transaction' => 'Datum',
+ 'column_date-due' => 'Verstrijkingsdatum',
+ 'column_date-payment' => 'Datum (betaling)',
+ 'column_date-invoice' => 'Datum (factuur)',
'column_description' => 'Omschrijving',
'column_opposing-iban' => 'Tegenrekening (IBAN)',
+ 'column_opposing-bic' => 'BIC van tegenrekeningbank',
'column_opposing-id' => 'Tegenrekening (ID gelijk aan FF3)',
'column_external-id' => 'Externe ID',
'column_opposing-name' => 'Tegenrekeningnaam',
'column_rabo-debit-credit' => 'Rabobankspecifiek bij/af indicator',
'column_ing-debit-credit' => 'ING-specifieke bij/af indicator',
- 'column_sepa-ct-id' => 'SEPA end-to-end transactienummer',
- 'column_sepa-ct-op' => 'SEPA tegenrekeningnummer',
- 'column_sepa-db' => 'SEPA "direct debet"-nummer',
+ 'column_sepa-ct-id' => 'SEPA end-to-end identificatie',
+ 'column_sepa-ct-op' => 'SEPA identificatie tegenpartij',
+ 'column_sepa-db' => 'SEPA mandaatidentificatie',
+ 'column_sepa-cc' => 'SEPA vrijwaringscode',
+ 'column_sepa-ci' => 'SEPA crediteuridentificatie',
+ 'column_sepa-ep' => 'SEPA transactiedoeleinde',
+ 'column_sepa-country' => 'SEPA landcode',
'column_tags-comma' => 'Tags (kommagescheiden)',
'column_tags-space' => 'Tags (spatiegescheiden)',
'column_account-number' => 'Betaalrekening (rekeningnummer)',
'column_opposing-number' => 'Tegenrekening (rekeningnummer)',
'column_note' => 'Opmerking(en)',
+ 'column_internal-reference' => 'Interne referentie',
// prerequisites
'prerequisites' => 'Vereisten',
// bunq
'bunq_prerequisites_title' => 'Voorwaarden voor een import van bunq',
- 'bunq_prerequisites_text' => 'Om transacties bij bunq te importeren heb je een API sleutel nodig. Dit kan via de app.',
+ 'bunq_prerequisites_text' => 'Om te importeren vanaf bunq moet je een API key hebben. Deze kan je aanvragen in de app. Denk er aan dat deze functie in BETA is. De code is alleen getest op de sandbox API.',
+ 'bunq_do_import' => 'Ja, importeer van deze rekening',
+ 'bunq_accounts_title' => 'Bunq rekeningen',
+ 'bunq_accounts_text' => 'Dit zijn de rekeningen uit je bunq-account. Selecteer de rekeningen waaruit je wilt importeren, en welke betaalrekeningen deze transacties op terecht moeten komen.',
// Spectre
'spectre_title' => 'Importeer via Spectre',
@@ -187,4 +201,3 @@ return [
// various other strings:
'imported_from_account' => 'Geïmporteerd uit ":account"',
];
-
diff --git a/resources/lang/nl_NL/intro.php b/resources/lang/nl_NL/intro.php
index 641c02c212..381b02153a 100644
--- a/resources/lang/nl_NL/intro.php
+++ b/resources/lang/nl_NL/intro.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// index
diff --git a/resources/lang/nl_NL/list.php b/resources/lang/nl_NL/list.php
index 32cd02e734..df952495a6 100644
--- a/resources/lang/nl_NL/list.php
+++ b/resources/lang/nl_NL/list.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
'buttons' => 'Knoppen',
@@ -102,4 +103,12 @@ return [
'reconcile' => 'Afstemmen',
'account_on_spectre' => 'Rekening (Spectre)',
'do_import' => 'Importeer van deze rekening',
+ 'sepa-ct-id' => 'SEPA end-to-end identificatie',
+ 'sepa-ct-op' => 'SEPA identificatie tegenpartij',
+ 'sepa-db' => 'SEPA mandaatidentificatie',
+ 'sepa-country' => 'SEPA landcode',
+ 'sepa-cc' => 'SEPA vrijwaringscode',
+ 'sepa-ep' => 'SEPA transactiedoeleinde',
+ 'sepa-ci' => 'SEPA crediteuridentificatie',
+ 'account_at_bunq' => 'Bunq-account',
];
diff --git a/resources/lang/nl_NL/pagination.php b/resources/lang/nl_NL/pagination.php
index d463290e50..693275f8a2 100644
--- a/resources/lang/nl_NL/pagination.php
+++ b/resources/lang/nl_NL/pagination.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'previous' => '« Vorige',
diff --git a/resources/lang/nl_NL/passwords.php b/resources/lang/nl_NL/passwords.php
index 089589d0fa..ccbb78d5bd 100644
--- a/resources/lang/nl_NL/passwords.php
+++ b/resources/lang/nl_NL/passwords.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'password' => 'Wachtwoorden moeten zes karakters lang zijn, en natuurlijk 2x hetzelfde invoeren.',
diff --git a/resources/lang/nl_NL/validation.php b/resources/lang/nl_NL/validation.php
index c12b9ff77a..ae48ef8bdf 100644
--- a/resources/lang/nl_NL/validation.php
+++ b/resources/lang/nl_NL/validation.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'iban' => 'Dit is niet een geldige IBAN.',
+ 'source_equals_destination' => 'De bronrekening is gelijk aan de doelrekening',
'unique_account_number_for_user' => 'Het lijkt erop dat dit rekeningnummer al in gebruik is.',
'unique_iban_for_user' => 'Het lijkt erop dat deze IBAN al in gebruik is.',
'deleted_user' => 'Je kan je niet registreren met dit e-mailadres.',
diff --git a/resources/lang/pl_PL/auth.php b/resources/lang/pl_PL/auth.php
index 4dd2d48fa1..f4788fac3f 100644
--- a/resources/lang/pl_PL/auth.php
+++ b/resources/lang/pl_PL/auth.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
/*
diff --git a/resources/lang/pl_PL/bank.php b/resources/lang/pl_PL/bank.php
index ef0d636f91..b6a86faa4b 100644
--- a/resources/lang/pl_PL/bank.php
+++ b/resources/lang/pl_PL/bank.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
];
diff --git a/resources/lang/pl_PL/breadcrumbs.php b/resources/lang/pl_PL/breadcrumbs.php
index c95fad0724..9977c585f7 100644
--- a/resources/lang/pl_PL/breadcrumbs.php
+++ b/resources/lang/pl_PL/breadcrumbs.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'home' => 'Strona główna',
diff --git a/resources/lang/pl_PL/components.php b/resources/lang/pl_PL/components.php
index 5b4bfa75e0..295fa6cb8c 100644
--- a/resources/lang/pl_PL/components.php
+++ b/resources/lang/pl_PL/components.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// profile
diff --git a/resources/lang/pl_PL/config.php b/resources/lang/pl_PL/config.php
index 92fc995503..c64851b673 100644
--- a/resources/lang/pl_PL/config.php
+++ b/resources/lang/pl_PL/config.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'html_language' => 'pl',
diff --git a/resources/lang/pl_PL/csv.php b/resources/lang/pl_PL/csv.php
index d61316b632..892c8beac4 100644
--- a/resources/lang/pl_PL/csv.php
+++ b/resources/lang/pl_PL/csv.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
];
diff --git a/resources/lang/pl_PL/demo.php b/resources/lang/pl_PL/demo.php
index c1f584ec26..aec65367e9 100644
--- a/resources/lang/pl_PL/demo.php
+++ b/resources/lang/pl_PL/demo.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
- 'no_demo_text' => 'Niestety, nie ma dodatkowego tekstu wyjaśniającego demo dla tej strony.',
- 'see_help_icon' => 'Jednakże ikona w prawym górnym rogu może powiedzieć Ci więcej.',
- 'index' => 'Witaj w Firefly III! Na tej stronie znajduje się szybki przegląd Twoich finansów. Aby uzyskać więcej informacji sprawdź Konta → Konta aktywów oraz oczywiście strony Budżety oraz Raporty. Lub po prostu się rozejrzyj i zobacz gdzie trafisz w końcu.',
- 'accounts-index' => 'Konta aktywów są Twoimi osobistymi kontami bankowymi. Konta wydatków to konta na które wydajesz pieniądze takie jak sklepy oraz przyjaciele. Kona przychodów są kontami, z których otrzymujesz pieniądze takie jak twoja praca, zwrot podatków lub inne źródła przychodów. Na tej stronie możesz je modyfikować oraz usuwać.',
- 'budgets-index' => 'Ta strona zawiera przegląd budżetów. Górny pasek pokazuje kwotę, która jest dostępna do budżetowania. Można ją dostosować dla dowolnego okresu, klikając kwotę po prawej stronie. Kwota, którą faktycznie wydałeś, jest pokazana na pasku ponizej. Pod tym znajdują się wydatki na budżet oraz co przeznaczyłeś na nie.',
- 'reports-index-start' => 'Firefly III obsługuje wiele typów raportów. Możesz przeczytać o nich klikając ikonę w prawym górnym rogu.',
- 'reports-index-examples' => 'Sprawdź te przykłady: miesięczny przegląd finansowy, roczny przegląd finansowy i przegląd budżetu.',
- 'currencies-index' => 'Firefly obsługuje wiele walut. Chociaż domyślnie jest to euro, można go ustawić na dolara amerykańskiego i wiele innych walut. Jak widać niewielki wybór walut został uwzględniony, ale możesz dodać własne, jeśli chcesz. Zmiana domyślnej waluty nie zmieni waluty istniejących transakcji, jednak: Firefly III obsługuje korzystanie z wielu walut w tym samym czasie.',
- 'transactions-index' => 'Te wydatki, depozyty i transfery nie są szczególnie pomysłowe. Zostały wygenerowane automatycznie.',
- 'piggy-banks-index' => 'Jak widać, istnieją trzy skarbonki. Użyj przycisków plus i minus, aby wpłynąć na ilość pieniędzy w każdej skarbonce. Kliknij nazwę skarbonki, aby zobaczyć administrację każdej skarbonki.',
- 'import-index' => 'Oczywiście każdy plik CSV można zaimportować do Firefly III',
+ 'no_demo_text' => 'Niestety, nie ma dodatkowego tekstu wyjaśniającego demo dla tej strony.',
+ 'see_help_icon' => 'Jednakże ikona w prawym górnym rogu może powiedzieć Ci więcej.',
+ 'index' => 'Witaj w Firefly III! Na tej stronie znajduje się szybki przegląd Twoich finansów. Aby uzyskać więcej informacji sprawdź Konta → Konta aktywów oraz oczywiście strony Budżety oraz Raporty. Lub po prostu się rozejrzyj i zobacz gdzie trafisz w końcu.',
+ 'accounts-index' => 'Konta aktywów są Twoimi osobistymi kontami bankowymi. Konta wydatków to konta na które wydajesz pieniądze takie jak sklepy oraz przyjaciele. Kona przychodów są kontami, z których otrzymujesz pieniądze takie jak twoja praca, zwrot podatków lub inne źródła przychodów. Na tej stronie możesz je modyfikować oraz usuwać.',
+ 'budgets-index' => 'Ta strona zawiera przegląd budżetów. Górny pasek pokazuje kwotę, która jest dostępna do budżetowania. Można ją dostosować dla dowolnego okresu, klikając kwotę po prawej stronie. Kwota, którą faktycznie wydałeś, jest pokazana na pasku ponizej. Pod tym znajdują się wydatki na budżet oraz co przeznaczyłeś na nie.',
+ 'reports-index-start' => 'Firefly III obsługuje wiele typów raportów. Możesz przeczytać o nich klikając ikonę w prawym górnym rogu.',
+ 'reports-index-examples' => 'Sprawdź te przykłady: miesięczny przegląd finansowy, roczny przegląd finansowy i przegląd budżetu.',
+ 'currencies-index' => 'Firefly obsługuje wiele walut. Chociaż domyślnie jest to euro, można go ustawić na dolara amerykańskiego i wiele innych walut. Jak widać niewielki wybór walut został uwzględniony, ale możesz dodać własne, jeśli chcesz. Zmiana domyślnej waluty nie zmieni waluty istniejących transakcji, jednak: Firefly III obsługuje korzystanie z wielu walut w tym samym czasie.',
+ 'transactions-index' => 'Te wydatki, depozyty i transfery nie są szczególnie pomysłowe. Zostały wygenerowane automatycznie.',
+ 'piggy-banks-index' => 'Jak widać, istnieją trzy skarbonki. Użyj przycisków plus i minus, aby wpłynąć na ilość pieniędzy w każdej skarbonce. Kliknij nazwę skarbonki, aby zobaczyć administrację każdej skarbonki.',
+ 'import-index' => 'Oczywiście każdy plik CSV można zaimportować do Firefly III',
];
diff --git a/resources/lang/pl_PL/firefly.php b/resources/lang/pl_PL/firefly.php
index 1b516f7f21..09b0af0d86 100644
--- a/resources/lang/pl_PL/firefly.php
+++ b/resources/lang/pl_PL/firefly.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
// general stuff:
@@ -170,7 +171,9 @@ return [
'want_to_login' => 'Chcę się zalogować',
'button_register' => 'Zarejestruj',
'authorization' => 'Autoryzacja',
-
+ 'active_bills_only' => 'tylko aktywne rachunki',
+ 'average_per_bill' => 'średnia za rachunek',
+ 'expected_total' => 'oczekiwana suma',
// API access
'authorization_request' => 'Żądanie autoryzacji Firefly III v:version',
'authorization_request_intro' => ':client prosi o pozwolenie na dostęp do Twojej administracji finansowej. Czy chcesz pozwolić :client na dostęp do tych danych?',
@@ -403,590 +406,589 @@ return [
'rule_action_set_notes_choice' => 'Ustaw notatki na..',
'rule_action_set_notes' => 'Ustaw notatki na ":action_value"',
- 'rules_have_read_warning' => 'Czy przeczytałeś ostrzeżenie?',
- 'apply_rule_warning' => 'Ostrzeżenie: uruchomienie reguły (lub grupy reguł) na dużej liczbie transakcji może potrwać wieki i może przekroczyć limit czasu. W takiej sytuacji reguła (lub grupa reguł) zostanie zastosowana do nieznanego podzbioru Twoich transakcji. To może zostawić Twoją administrację finansową w strzępach. Proszę, bądź ostrożny.',
+ 'rules_have_read_warning' => 'Czy przeczytałeś ostrzeżenie?',
+ 'apply_rule_warning' => 'Ostrzeżenie: uruchomienie reguły (lub grupy reguł) na dużej liczbie transakcji może potrwać wieki i może przekroczyć limit czasu. W takiej sytuacji reguła (lub grupa reguł) zostanie zastosowana do nieznanego podzbioru Twoich transakcji. To może zostawić Twoją administrację finansową w strzępach. Proszę, bądź ostrożny.',
// tags
- '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',
- 'sums_apply_to_range' => 'Wszystkie sumy mają zastosowanie do wybranego zakresu',
- 'mapbox_api_key' => 'Aby użyć mapy, pobierz klucz API z Mapbox. Otwórz plik .env i wprowadź ten kod po MAPBOX_API_KEY=.',
- 'press_tag_location' => 'Kliknij prawym przyciskiem myszy lub naciśnij i przytrzymaj aby ustawić lokalizację taga.',
- 'clear_location' => 'Wyczyść lokalizację',
+ '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',
+ 'sums_apply_to_range' => 'Wszystkie sumy mają zastosowanie do wybranego zakresu',
+ 'mapbox_api_key' => 'Aby użyć mapy, pobierz klucz API z Mapbox. Otwórz plik .env i wprowadź ten kod po MAPBOX_API_KEY=.',
+ 'press_tag_location' => 'Kliknij prawym przyciskiem myszy lub naciśnij i przytrzymaj aby ustawić lokalizację taga.',
+ 'clear_location' => 'Wyczyść lokalizację',
// preferences
- 'pref_home_screen_accounts' => 'Konta na stronie domowej',
- 'pref_home_screen_accounts_help' => 'Które konta powinny być wyświetlane na stronie głównej?',
- 'pref_view_range' => 'Zakres widzenia',
- 'pref_view_range_help' => 'Niektóre wykresy są automatycznie grupowane w okresach. Jaki okres wolisz?',
- 'pref_1D' => 'Dzień',
- 'pref_1W' => 'Tydzień',
- 'pref_1M' => 'Miesiąc',
- 'pref_3M' => 'Trzy miesiące (kwartał)',
- 'pref_6M' => 'Sześć miesięcy',
- 'pref_1Y' => 'Rok',
- 'pref_languages' => 'Języki',
- 'pref_languages_help' => 'Firefly III obsługuje kilka języków. Który wolisz?',
- 'pref_custom_fiscal_year' => 'Ustawienia roku podatkowego',
- 'pref_custom_fiscal_year_label' => 'Włączone',
- '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' => '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' => '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)',
- 'pref_save_settings' => 'Zapisz ustawienia',
- 'saved_preferences' => 'Preferencje zostały zapisane!',
- 'preferences_general' => 'Ogólne',
- 'preferences_frontpage' => 'Ekran główny',
- 'preferences_security' => 'Bezpieczeństwo',
- 'preferences_layout' => 'Układ',
- 'pref_home_show_deposits' => 'Pokaż przychody na stronie domowej',
- 'pref_home_show_deposits_info' => 'Ekran główny pokazuje już konta wydatków. Czy chcesz wyświetlać również konta przychodów?',
- 'pref_home_do_show_deposits' => 'Tak, pokaż je',
- 'successful_count' => 'z których :count zakończone pomyślnie',
- 'list_page_size_title' => 'Rozmiar strony',
- 'list_page_size_help' => 'Każda lista rzeczy (konta, transakcje itp.) pokazuje co najwyżej tyle na stronę.',
- 'list_page_size_label' => 'Rozmiar strony',
- 'between_dates' => '(:start i :end)',
- 'pref_optional_fields_transaction' => 'Opcjonalne pola dla transakcji',
- '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' => 'Data odsetek',
- 'pref_optional_tj_book_date' => 'Data księgowania',
- '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' => 'Wewnętrzny numer',
- 'pref_optional_tj_notes' => 'Notatki',
- 'pref_optional_tj_attachments' => 'Załączniki',
- 'optional_field_meta_dates' => 'Daty',
- 'optional_field_meta_business' => 'Biznesowe',
- 'optional_field_attachments' => 'Załączniki',
- 'optional_field_meta_data' => 'Opcjonalne metadane',
+ 'pref_home_screen_accounts' => 'Konta na stronie domowej',
+ 'pref_home_screen_accounts_help' => 'Które konta powinny być wyświetlane na stronie głównej?',
+ 'pref_view_range' => 'Zakres widzenia',
+ 'pref_view_range_help' => 'Niektóre wykresy są automatycznie grupowane w okresach. Jaki okres wolisz?',
+ 'pref_1D' => 'Dzień',
+ 'pref_1W' => 'Tydzień',
+ 'pref_1M' => 'Miesiąc',
+ 'pref_3M' => 'Trzy miesiące (kwartał)',
+ 'pref_6M' => 'Sześć miesięcy',
+ 'pref_1Y' => 'Rok',
+ 'pref_languages' => 'Języki',
+ 'pref_languages_help' => 'Firefly III obsługuje kilka języków. Który wolisz?',
+ 'pref_custom_fiscal_year' => 'Ustawienia roku podatkowego',
+ 'pref_custom_fiscal_year_label' => 'Włączone',
+ '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' => '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' => '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_disable_2fa' => 'Wyłącz weryfikację dwuetapową',
+ 'pref_save_settings' => 'Zapisz ustawienia',
+ 'saved_preferences' => 'Preferencje zostały zapisane!',
+ 'preferences_general' => 'Ogólne',
+ 'preferences_frontpage' => 'Ekran główny',
+ 'preferences_security' => 'Bezpieczeństwo',
+ 'preferences_layout' => 'Układ',
+ 'pref_home_show_deposits' => 'Pokaż przychody na stronie domowej',
+ 'pref_home_show_deposits_info' => 'Ekran główny pokazuje już konta wydatków. Czy chcesz wyświetlać również konta przychodów?',
+ 'pref_home_do_show_deposits' => 'Tak, pokaż je',
+ 'successful_count' => 'z których :count zakończone pomyślnie',
+ 'list_page_size_title' => 'Rozmiar strony',
+ 'list_page_size_help' => 'Każda lista rzeczy (konta, transakcje itp.) pokazuje co najwyżej tyle na stronę.',
+ 'list_page_size_label' => 'Rozmiar strony',
+ 'between_dates' => '(:start i :end)',
+ 'pref_optional_fields_transaction' => 'Opcjonalne pola dla transakcji',
+ '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' => 'Data odsetek',
+ 'pref_optional_tj_book_date' => 'Data księgowania',
+ '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' => 'Wewnętrzny numer',
+ 'pref_optional_tj_notes' => 'Notatki',
+ 'pref_optional_tj_attachments' => 'Załączniki',
+ 'optional_field_meta_dates' => 'Daty',
+ 'optional_field_meta_business' => 'Biznesowe',
+ 'optional_field_attachments' => 'Załączniki',
+ 'optional_field_meta_data' => 'Opcjonalne metadane',
// profile:
- 'change_your_password' => 'Zmień swoje hasło',
- 'delete_account' => 'Usuń konto',
- 'current_password' => 'Bieżące hasło',
- 'new_password' => 'Nowe Hasło',
- 'new_password_again' => 'Nowe hasło (ponownie)',
- 'delete_your_account' => 'Usuń swoje konto',
- 'delete_your_account_help' => 'Usunięcie twojego konta usunie również wszystkie konta, transakcje, wszystko co mogłeś mieć zapisane w Firefly III. Po prostu ZNIKNIE.',
- 'delete_your_account_password' => 'Wprowadź hasło aby kontynuować.',
- 'password' => 'Hasło',
- 'are_you_sure' => 'Jesteś pewny? Nie możesz tego cofnąć.',
- 'delete_account_button' => 'USUŃ swoje konto',
- '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' => '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ę.',
- 'command_line_token' => 'Token wiersza poleceń',
- 'explain_command_line_token' => 'Potrzebujesz tego tokenu aby wykonywać operacje (takie jak importowanie lub eksportowanie danych) za pomocą wiersza poleceń. Bez niego takie wrażliwe polecenia nie będą działać. Nie udostępniaj nikomu swojego tokenu. Nikt Cię o niego nie zapyta, nawet ja. Jeżeli obawiasz się, że straciłeś go lub jesteś paranoikiem, wygeneruj nowy token używając przycisku.',
- 'regenerate_command_line_token' => 'Wygeneruj nowy token wiersza poleceń',
- 'token_regenerated' => 'Wygenerowano nowy token wiersza poleceń',
- 'change_your_email' => 'Zmień swój adres e-mail',
- 'email_verification' => 'Wiadomość e-mail zostanie wysłana na stary ORAZ nowy adres e-mail. Ze względów bezpieczeństwa, nie będziesz mógł się zalogować, dopóki nie zweryfikujesz nowego adresu e-mail. Jeśli nie masz pewności, czy twoja instalacja Firefly III umożliwia wysyłanie wiadomości e-mail, nie korzystaj z tej funkcji. Jeśli jesteś administratorem, możesz przetestować to w panelu administracyjnym.',
- 'email_changed_logout' => 'Dopóki nie zweryfikujesz swojego adresu e-mail, nie możesz się zalogować.',
- 'login_with_new_email' => 'Teraz możesz logować się nowym adresem e-mail.',
- 'login_with_old_email' => 'Teraz ponownie możesz logować się starym adresem e-mail.',
+ 'change_your_password' => 'Zmień swoje hasło',
+ 'delete_account' => 'Usuń konto',
+ 'current_password' => 'Bieżące hasło',
+ 'new_password' => 'Nowe Hasło',
+ 'new_password_again' => 'Nowe hasło (ponownie)',
+ 'delete_your_account' => 'Usuń swoje konto',
+ 'delete_your_account_help' => 'Usunięcie twojego konta usunie również wszystkie konta, transakcje, wszystko co mogłeś mieć zapisane w Firefly III. Po prostu ZNIKNIE.',
+ 'delete_your_account_password' => 'Wprowadź hasło aby kontynuować.',
+ 'password' => 'Hasło',
+ 'are_you_sure' => 'Jesteś pewny? Nie możesz tego cofnąć.',
+ 'delete_account_button' => 'USUŃ swoje konto',
+ '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' => '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 to pole, Firefly III wyśle pierwsze pięć znaków skrótu 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 tylko pięć pierwszych znaków tego skrótu jest wysyłanych 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ę.',
+ 'command_line_token' => 'Token wiersza poleceń',
+ 'explain_command_line_token' => 'Potrzebujesz tego tokenu aby wykonywać operacje (takie jak importowanie lub eksportowanie danych) za pomocą wiersza poleceń. Bez niego takie wrażliwe polecenia nie będą działać. Nie udostępniaj nikomu swojego tokenu. Nikt Cię o niego nie zapyta, nawet ja. Jeżeli obawiasz się, że straciłeś go lub jesteś paranoikiem, wygeneruj nowy token używając przycisku.',
+ 'regenerate_command_line_token' => 'Wygeneruj nowy token wiersza poleceń',
+ 'token_regenerated' => 'Wygenerowano nowy token wiersza poleceń',
+ 'change_your_email' => 'Zmień swój adres e-mail',
+ 'email_verification' => 'Wiadomość e-mail zostanie wysłana na stary ORAZ nowy adres e-mail. Ze względów bezpieczeństwa, nie będziesz mógł się zalogować, dopóki nie zweryfikujesz nowego adresu e-mail. Jeśli nie masz pewności, czy twoja instalacja Firefly III umożliwia wysyłanie wiadomości e-mail, nie korzystaj z tej funkcji. Jeśli jesteś administratorem, możesz przetestować to w panelu administracyjnym.',
+ 'email_changed_logout' => 'Dopóki nie zweryfikujesz swojego adresu e-mail, nie możesz się zalogować.',
+ 'login_with_new_email' => 'Teraz możesz logować się nowym adresem e-mail.',
+ 'login_with_old_email' => 'Teraz ponownie możesz logować się starym adresem e-mail.',
// attachments
- 'nr_of_attachments' => 'Jeden załącznik |:count załączników',
- 'attachments' => 'Załączniki',
- 'edit_attachment' => 'Modyfikuj załącznik ":name"',
- 'update_attachment' => 'Aktualizuj załącznik',
- 'delete_attachment' => 'Usuń załącznik ":name"',
- 'attachment_deleted' => 'Usunięto załącznik ":name"',
- 'attachment_updated' => 'Zmodyfikowano załącznik ":name"',
- 'upload_max_file_size' => 'Maksymalny rozmiar pliku to: :size',
+ 'nr_of_attachments' => 'Jeden załącznik |:count załączników',
+ 'attachments' => 'Załączniki',
+ 'edit_attachment' => 'Modyfikuj załącznik ":name"',
+ 'update_attachment' => 'Aktualizuj załącznik',
+ 'delete_attachment' => 'Usuń załącznik ":name"',
+ 'attachment_deleted' => 'Usunięto załącznik ":name"',
+ 'attachment_updated' => 'Zmodyfikowano załącznik ":name"',
+ 'upload_max_file_size' => 'Maksymalny rozmiar pliku to: :size',
// transaction index
- 'title_expenses' => 'Wydatki',
- 'title_withdrawal' => 'Wydatki',
- 'title_revenue' => 'Przychód / dochód',
- 'title_deposit' => 'Przychód / dochód',
- 'title_transfer' => 'Transfery',
- 'title_transfers' => 'Transfery',
+ 'title_expenses' => 'Wydatki',
+ 'title_withdrawal' => 'Wydatki',
+ 'title_revenue' => 'Przychód / dochód',
+ 'title_deposit' => 'Przychód / dochód',
+ 'title_transfer' => 'Transfery',
+ 'title_transfers' => 'Transfery',
// convert stuff:
- 'convert_is_already_type_Withdrawal' => 'Ta transakcja jest już wypłatą',
- 'convert_is_already_type_Deposit' => 'Ta transakcja jest już wpłatą',
- 'convert_is_already_type_Transfer' => 'Ta transakcja jest już transferem',
- 'convert_to_Withdrawal' => 'Konwertuj ":description" na wypłatę',
- 'convert_to_Deposit' => 'Konwertuj ":description" na wpłatę',
- 'convert_to_Transfer' => 'Konwertuj ":description" na transfer',
- 'convert_options_WithdrawalDeposit' => 'Konwertuj wypłatę na wpłatę',
- 'convert_options_WithdrawalTransfer' => 'Konwertuj wypłatę na transfer',
- 'convert_options_DepositTransfer' => 'Konwertuj wpłatę na transfer',
- 'convert_options_DepositWithdrawal' => 'Konwertuj wpłatę na wypłatę',
- 'convert_options_TransferWithdrawal' => 'Konwertuj transfer na wypłatę',
- 'convert_options_TransferDeposit' => 'Konwertuj transfer na wpłatę',
- 'convert_Withdrawal_to_deposit' => 'Konwertuj tę wypłatę na wpłatę',
- 'convert_Withdrawal_to_transfer' => 'Konwertuj tę wypłatę na transfer',
- 'convert_Deposit_to_withdrawal' => 'Konwertuj tę wpłatę na wypłatę',
- 'convert_Deposit_to_transfer' => 'Konwertuj tę wpłatę na transfer',
- 'convert_Transfer_to_deposit' => 'Konwertuj ten transfer na wpłatę',
- 'convert_Transfer_to_withdrawal' => 'Konwertuj ten transfer na wypłatę',
- 'convert_please_set_revenue_source' => 'Proszę wybierz konto przychodów, z którego będą przychodzić pieniądze.',
- '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' => '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',
- 'invalid_convert_selection' => 'Wybrane konto jest już używane w tej transakcji lub nie istnieje.',
+ 'convert_is_already_type_Withdrawal' => 'Ta transakcja jest już wypłatą',
+ 'convert_is_already_type_Deposit' => 'Ta transakcja jest już wpłatą',
+ 'convert_is_already_type_Transfer' => 'Ta transakcja jest już transferem',
+ 'convert_to_Withdrawal' => 'Konwertuj ":description" na wypłatę',
+ 'convert_to_Deposit' => 'Konwertuj ":description" na wpłatę',
+ 'convert_to_Transfer' => 'Konwertuj ":description" na transfer',
+ 'convert_options_WithdrawalDeposit' => 'Konwertuj wypłatę na wpłatę',
+ 'convert_options_WithdrawalTransfer' => 'Konwertuj wypłatę na transfer',
+ 'convert_options_DepositTransfer' => 'Konwertuj wpłatę na transfer',
+ 'convert_options_DepositWithdrawal' => 'Konwertuj wpłatę na wypłatę',
+ 'convert_options_TransferWithdrawal' => 'Konwertuj transfer na wypłatę',
+ 'convert_options_TransferDeposit' => 'Konwertuj transfer na wpłatę',
+ 'convert_Withdrawal_to_deposit' => 'Konwertuj tę wypłatę na wpłatę',
+ 'convert_Withdrawal_to_transfer' => 'Konwertuj tę wypłatę na transfer',
+ 'convert_Deposit_to_withdrawal' => 'Konwertuj tę wpłatę na wypłatę',
+ 'convert_Deposit_to_transfer' => 'Konwertuj tę wpłatę na transfer',
+ 'convert_Transfer_to_deposit' => 'Konwertuj ten transfer na wpłatę',
+ 'convert_Transfer_to_withdrawal' => 'Konwertuj ten transfer na wypłatę',
+ 'convert_please_set_revenue_source' => 'Proszę wybierz konto przychodów, z którego będą przychodzić pieniądze.',
+ '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' => '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',
+ 'invalid_convert_selection' => 'Wybrane konto jest już używane w tej transakcji lub nie istnieje.',
// create new stuff:
- 'create_new_withdrawal' => 'Utwórz nową wypłatę',
- 'create_new_deposit' => 'Utwórz nową wpłatę',
- 'create_new_transfer' => 'Utwórz nowy transfer',
- 'create_new_asset' => 'Utwórz nowe konto aktywów',
- 'create_new_expense' => 'Utwórz nowe konto wydatków',
- 'create_new_revenue' => 'Utwórz nowe konto przychodów',
- 'create_new_piggy_bank' => 'Utwórz nową skarbonkę',
- 'create_new_bill' => 'Utwórz nowy rachunek',
+ 'create_new_withdrawal' => 'Utwórz nową wypłatę',
+ 'create_new_deposit' => 'Utwórz nową wpłatę',
+ 'create_new_transfer' => 'Utwórz nowy transfer',
+ 'create_new_asset' => 'Utwórz nowe konto aktywów',
+ 'create_new_expense' => 'Utwórz nowe konto wydatków',
+ 'create_new_revenue' => 'Utwórz nowe konto przychodów',
+ 'create_new_piggy_bank' => 'Utwórz nową skarbonkę',
+ 'create_new_bill' => 'Utwórz nowy rachunek',
// currencies:
- 'create_currency' => 'Utwórz nową walutę',
- '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ąć 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 jako domyślną',
- 'default_currency' => 'domyślna',
+ 'create_currency' => 'Utwórz nową walutę',
+ '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ąć 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 jako domyślną',
+ 'default_currency' => 'domyślna',
// forms:
- 'mandatoryFields' => 'Pola wymagane',
- 'optionalFields' => 'Pola opcjonalne',
- 'options' => 'Opcje',
+ 'mandatoryFields' => 'Pola wymagane',
+ 'optionalFields' => 'Pola opcjonalne',
+ 'options' => 'Opcje',
// budgets:
- 'create_new_budget' => 'Utwórz nowy budżet',
- 'store_new_budget' => 'Zapisz nowy budżet',
- 'stored_new_budget' => 'Zapisano nowy budżet ":name"',
- 'available_between' => 'Dostępne od :start i :end',
- 'transactionsWithoutBudget' => 'Wydatki bez budżetu',
- 'transactions_no_budget' => 'Wydatki bez budżetu między :start i :end',
- 'spent_between' => 'Wydano między :start i :end',
- 'createBudget' => 'Nowy budżet',
- 'inactiveBudgets' => 'Nieaktywne budżety',
- 'without_budget_between' => 'Transakcje bez budżetu między :start i :end',
- 'delete_budget' => 'Usuń budżet ":name"',
- 'deleted_budget' => 'Usunięto budżet ":name"',
- 'edit_budget' => 'Modyfikuj budżet ":name"',
- 'updated_budget' => 'Zmodyfikowano budżet ":name"',
- 'update_amount' => 'Aktualizuj kwotę',
- 'update_budget' => 'Aktualizuj budżet',
- 'update_budget_amount_range' => 'Zaktualizuj (spodziewaną) dostępną kwotę między :start a :end',
- 'budget_period_navigator' => 'Nawigator okresowy',
- 'info_on_available_amount' => 'Co mam do dyspozycji?',
- 'available_amount_indication' => 'Skorzystaj z tych kwot, aby uzyskać wskazówkę ile może wynosić Twój całkowity budżet.',
- 'suggested' => 'Sugerowane',
- 'average_between' => 'Średnia pomiędzy :start a :end',
+ 'create_new_budget' => 'Utwórz nowy budżet',
+ 'store_new_budget' => 'Zapisz nowy budżet',
+ 'stored_new_budget' => 'Zapisano nowy budżet ":name"',
+ 'available_between' => 'Dostępne od :start i :end',
+ 'transactionsWithoutBudget' => 'Wydatki bez budżetu',
+ 'transactions_no_budget' => 'Wydatki bez budżetu między :start i :end',
+ 'spent_between' => 'Wydano między :start i :end',
+ 'createBudget' => 'Nowy budżet',
+ 'inactiveBudgets' => 'Nieaktywne budżety',
+ 'without_budget_between' => 'Transakcje bez budżetu między :start i :end',
+ 'delete_budget' => 'Usuń budżet ":name"',
+ 'deleted_budget' => 'Usunięto budżet ":name"',
+ 'edit_budget' => 'Modyfikuj budżet ":name"',
+ 'updated_budget' => 'Zmodyfikowano budżet ":name"',
+ 'update_amount' => 'Aktualizuj kwotę',
+ 'update_budget' => 'Aktualizuj budżet',
+ 'update_budget_amount_range' => 'Zaktualizuj (spodziewaną) dostępną kwotę między :start a :end',
+ 'budget_period_navigator' => 'Nawigator okresowy',
+ 'info_on_available_amount' => 'Co mam do dyspozycji?',
+ 'available_amount_indication' => 'Skorzystaj z tych kwot, aby uzyskać wskazówkę ile może wynosić Twój całkowity budżet.',
+ 'suggested' => 'Sugerowane',
+ 'average_between' => 'Średnia pomiędzy :start a :end',
+ 'over_budget_warn' => ' Zwykle budżetujesz około :amount dziennie. Obecna wartość to :over_amount dziennie.',
// bills:
- 'matching_on' => 'Pasuje do',
- 'between_amounts' => 'między :low i :high.',
- 'repeats' => 'Powtarza się',
- 'connected_journals' => 'Powiązane transakcje',
- 'auto_match_on' => 'Automatycznie dopasowane przez Firefly III',
- 'auto_match_off' => 'Niedopasowane automatycznie przez Firefly III',
- 'next_expected_match' => 'Następne oczekiwane dopasowanie',
- 'delete_bill' => 'Usuń rachunek ":name"',
- 'deleted_bill' => 'Usunięto rachunek ":name"',
- 'edit_bill' => 'Modyfikuj rachunek ":name"',
- 'more' => 'Więcej',
- 'rescan_old' => 'Przeskanuj stare transakcje',
- 'update_bill' => 'Aktualizuj rachunek',
- 'updated_bill' => 'Zaktualizowano rachunek ":name"',
- 'store_new_bill' => 'Zapisz nowy rachunek',
- 'stored_new_bill' => 'Zapisano nowy rachunek ":name"',
- 'cannot_scan_inactive_bill' => 'Nieaktywne rachunki nie mogą być zeskanowane.',
- 'rescanned_bill' => 'Zeskanowano wszystko.',
- 'average_bill_amount_year' => 'Średnia kwota rachunku (:year)',
- 'average_bill_amount_overall' => 'Średnia kwota rachunku (ogólnie)',
- 'bill_is_active' => 'Rachunek jest aktywny',
- 'bill_expected_between' => 'Oczekiwano między :start a :end',
- 'bill_will_automatch' => 'Rachunek będzie automatycznie powiązany z pasującymi transakcjami',
- 'skips_over' => 'pomija',
-
+ 'matching_on' => 'Pasuje do',
+ 'between_amounts' => 'między :low i :high.',
+ 'repeats' => 'Powtarza się',
+ 'connected_journals' => 'Powiązane transakcje',
+ 'auto_match_on' => 'Automatycznie dopasowane przez Firefly III',
+ 'auto_match_off' => 'Niedopasowane automatycznie przez Firefly III',
+ 'next_expected_match' => 'Następne oczekiwane dopasowanie',
+ 'delete_bill' => 'Usuń rachunek ":name"',
+ 'deleted_bill' => 'Usunięto rachunek ":name"',
+ 'edit_bill' => 'Modyfikuj rachunek ":name"',
+ 'more' => 'Więcej',
+ 'rescan_old' => 'Przeskanuj stare transakcje',
+ 'update_bill' => 'Aktualizuj rachunek',
+ 'updated_bill' => 'Zaktualizowano rachunek ":name"',
+ 'store_new_bill' => 'Zapisz nowy rachunek',
+ 'stored_new_bill' => 'Zapisano nowy rachunek ":name"',
+ 'cannot_scan_inactive_bill' => 'Nieaktywne rachunki nie mogą być zeskanowane.',
+ 'rescanned_bill' => 'Zeskanowano wszystko.',
+ 'average_bill_amount_year' => 'Średnia kwota rachunku (:year)',
+ 'average_bill_amount_overall' => 'Średnia kwota rachunku (ogólnie)',
+ 'bill_is_active' => 'Rachunek jest aktywny',
+ 'bill_expected_between' => 'Oczekiwano między :start a :end',
+ 'bill_will_automatch' => 'Rachunek będzie automatycznie powiązany z pasującymi transakcjami',
+ 'skips_over' => 'pomija',
// accounts:
- 'details_for_asset' => 'Szczegóły konta aktywów ":name"',
- 'details_for_expense' => 'Szczegóły konta wydatków ":name"',
- 'details_for_revenue' => 'Szczegóły konta przychodów ":name"',
- 'details_for_cash' => 'Szczegóły konta gotówkowego ":name"',
- 'store_new_asset_account' => 'Zapisz nowe konto aktywów',
- 'store_new_expense_account' => 'Zapisz nowe konto wydatków',
- 'store_new_revenue_account' => 'Zapisz nowe konto przychodów',
- 'edit_asset_account' => 'Modyfikuj konto aktywów ":name"',
- 'edit_expense_account' => 'Modyfikuj konto wydatków ":name"',
- 'edit_revenue_account' => 'Modyfikuj konto przychodów ":name"',
- 'delete_asset_account' => 'Usuń konto aktywów ":name"',
- 'delete_expense_account' => 'Usuń konto wydatków ":name"',
- 'delete_revenue_account' => 'Usuń konto przychodów ":name"',
- 'asset_deleted' => 'Pomyślnie usunięto konto aktywów ":name"',
- 'expense_deleted' => 'Pomyślnie usunięto konto wydatków ":name"',
- 'revenue_deleted' => 'Pomyślnie usunięto konto przychodów ":name"',
- 'update_asset_account' => 'Aktualizuj konto aktywów',
- 'update_expense_account' => 'Aktualizuj konto wydatków',
- 'update_revenue_account' => 'Aktualizuj konto przychodów',
- 'make_new_asset_account' => 'Utwórz nowe konto aktywów',
- 'make_new_expense_account' => 'Utwórz nowe konto wydatków',
- 'make_new_revenue_account' => 'Utwórz nowe konto przychodów',
- 'asset_accounts' => 'Konta aktywów',
- 'expense_accounts' => 'Konta wydatków',
- 'revenue_accounts' => 'Konta przychodów',
- 'cash_accounts' => 'Konta gotówkowe',
- 'Cash account' => 'Konto gotówkowe',
- 'reconcile_account' => 'Uzgodnij konto ":account"',
- 'delete_reconciliation' => 'Usuń uzgodnienie',
- 'update_reconciliation' => 'Zaktualizuj uzgodnienie',
- 'amount_cannot_be_zero' => 'Kwota nie może wynosić zero',
- 'end_of_reconcile_period' => 'Koniec okresu uzgodnienia: :period',
- 'start_of_reconcile_period' => 'Początek okresu uzgodnienia: :period',
- 'start_balance' => 'Saldo początkowe',
- 'end_balance' => 'Saldo końcowe',
- 'update_balance_dates_instruction' => 'Dopasuj powyższe kwoty oraz daty do wyciągu bankowego i naciśnij "Rozpocznij uzgadnianie"',
- 'select_transactions_instruction' => 'Wybierz transakcje które pojawiają się na wyciągu bankowym.',
- 'select_range_and_balance' => 'Najpierw sprawdź zakres dat i salda. Następnie naciśnij "Rozpocznij uzgadnianie"',
- 'date_change_instruction' => 'Jeśli teraz zmienisz zakres dat, jakikolwiek postęp zostanie utracony.',
- 'update_selection' => 'Zaktualizuj wybór',
- 'store_reconcile' => 'Zapisz uzgodnienia',
- 'reconciliation_transaction' => 'Transakcja uzgadniania',
- 'Reconciliation' => 'Rozrachunek',
- 'reconciliation' => 'Rozrachunek',
- 'reconcile_options' => 'Opcje uzgadniania',
- 'reconcile_range' => 'Zakres rozrachunku',
- 'start_reconcile' => 'Rozpocznij uzgadnianie',
- 'cash' => 'gotówka',
- 'account_type' => 'Typ konta',
- 'save_transactions_by_moving' => 'Zapisz te transakcje, przenosząc je do innego konta:',
- 'stored_new_account' => 'Nowe konto ":name" zostało zapisane!',
- 'updated_account' => 'Zaktualizowano konto ":name"',
- 'credit_card_options' => 'Opcje karty kredytowej',
- 'no_transactions_account' => 'Brak transakcji (w tym okresie) na koncie aktywów ":name".',
- 'no_data_for_chart' => 'Nie ma wystarczająco dużo informacji (póki co), aby wygenerować ten wykres.',
- 'select_more_than_one_account' => 'Proszę wybierz więcej niż jedno konto',
- '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',
- 'account_default_currency' => 'Jeśli wybierzesz inną walutę, nowe transakcje z tego konta będą miały tę walutę wstępnie wybraną.',
- 'reconcile_has_more' => 'Twoja księga główna Firefly III ma więcej pieniędzy niż bank twierdzi, że powinieneś mieć. Istnieje kilka opcji. Wybierz, co zrobić. Następnie naciśnij "Potwierdź uzgodnienie".',
- 'reconcile_has_less' => 'Twoja księga główna Firefly III ma mniej pieniędzy niż bank twierdzi, że powinieneś mieć. Istnieje kilka opcji. Wybierz, co zrobić. Następnie naciśnij "Potwierdź uzgodnienie".',
- 'reconcile_is_equal' => 'Twoja księga główna Firefly III i wyciągi bankowe są zgodne. Nie ma nic do zrobienia. Naciśnij "Potwierdź uzgodnienie" aby potwierdzić twój wybór.',
- 'create_pos_reconcile_transaction' => 'Oznacz wybrane transakcje jako uzgodnione i utwórz korektę dodając :amount do tego konta aktywów.',
- 'create_neg_reconcile_transaction' => 'Oznacz wybrane transakcje jako uzgodnione i utwórz korektę usuwając :amount z tego konta aktywów.',
- 'reconcile_do_nothing' => 'Oznacz wybrane transakcje jako uzgodnione, ale nic nie poprawiaj.',
- 'reconcile_go_back' => 'Możesz zawsze zmodyfikować lub usunąć korektę później.',
- 'must_be_asset_account' => 'Możesz uzgodnić tylko konta aktywów',
- 'reconciliation_stored' => 'Uzgodnienie zapisane',
- 'reconcilliation_transaction_title' => 'Uzgodnienie (:from do :to)',
- 'reconcile_this_account' => 'Uzgodnij to konto',
- 'confirm_reconciliation' => 'Potwierdź uzgodnienie',
- 'submitted_start_balance' => 'Przesłane saldo początkowe',
- 'selected_transactions' => 'Wybrane transakcje (:count)',
- 'already_cleared_transactions' => 'Transakcje uzgodnione wcześniej (:count)',
- 'submitted_end_balance' => 'Przesłane saldo końcowe',
- 'initial_balance_description' => 'Saldo początkowe dla ":account"',
+ 'details_for_asset' => 'Szczegóły konta aktywów ":name"',
+ 'details_for_expense' => 'Szczegóły konta wydatków ":name"',
+ 'details_for_revenue' => 'Szczegóły konta przychodów ":name"',
+ 'details_for_cash' => 'Szczegóły konta gotówkowego ":name"',
+ 'store_new_asset_account' => 'Zapisz nowe konto aktywów',
+ 'store_new_expense_account' => 'Zapisz nowe konto wydatków',
+ 'store_new_revenue_account' => 'Zapisz nowe konto przychodów',
+ 'edit_asset_account' => 'Modyfikuj konto aktywów ":name"',
+ 'edit_expense_account' => 'Modyfikuj konto wydatków ":name"',
+ 'edit_revenue_account' => 'Modyfikuj konto przychodów ":name"',
+ 'delete_asset_account' => 'Usuń konto aktywów ":name"',
+ 'delete_expense_account' => 'Usuń konto wydatków ":name"',
+ 'delete_revenue_account' => 'Usuń konto przychodów ":name"',
+ 'asset_deleted' => 'Pomyślnie usunięto konto aktywów ":name"',
+ 'expense_deleted' => 'Pomyślnie usunięto konto wydatków ":name"',
+ 'revenue_deleted' => 'Pomyślnie usunięto konto przychodów ":name"',
+ 'update_asset_account' => 'Aktualizuj konto aktywów',
+ 'update_expense_account' => 'Aktualizuj konto wydatków',
+ 'update_revenue_account' => 'Aktualizuj konto przychodów',
+ 'make_new_asset_account' => 'Utwórz nowe konto aktywów',
+ 'make_new_expense_account' => 'Utwórz nowe konto wydatków',
+ 'make_new_revenue_account' => 'Utwórz nowe konto przychodów',
+ 'asset_accounts' => 'Konta aktywów',
+ 'expense_accounts' => 'Konta wydatków',
+ 'revenue_accounts' => 'Konta przychodów',
+ 'cash_accounts' => 'Konta gotówkowe',
+ 'Cash account' => 'Konto gotówkowe',
+ 'reconcile_account' => 'Uzgodnij konto ":account"',
+ 'delete_reconciliation' => 'Usuń uzgodnienie',
+ 'update_reconciliation' => 'Zaktualizuj uzgodnienie',
+ 'amount_cannot_be_zero' => 'Kwota nie może wynosić zero',
+ 'end_of_reconcile_period' => 'Koniec okresu uzgodnienia: :period',
+ 'start_of_reconcile_period' => 'Początek okresu uzgodnienia: :period',
+ 'start_balance' => 'Saldo początkowe',
+ 'end_balance' => 'Saldo końcowe',
+ 'update_balance_dates_instruction' => 'Dopasuj powyższe kwoty oraz daty do wyciągu bankowego i naciśnij "Rozpocznij uzgadnianie"',
+ 'select_transactions_instruction' => 'Wybierz transakcje które pojawiają się na wyciągu bankowym.',
+ 'select_range_and_balance' => 'Najpierw sprawdź zakres dat i salda. Następnie naciśnij "Rozpocznij uzgadnianie"',
+ 'date_change_instruction' => 'Jeśli teraz zmienisz zakres dat, jakikolwiek postęp zostanie utracony.',
+ 'update_selection' => 'Zaktualizuj wybór',
+ 'store_reconcile' => 'Zapisz uzgodnienia',
+ 'reconciliation_transaction' => 'Transakcja uzgadniania',
+ 'Reconciliation' => 'Rozrachunek',
+ 'reconciliation' => 'Rozrachunek',
+ 'reconcile_options' => 'Opcje uzgadniania',
+ 'reconcile_range' => 'Zakres rozrachunku',
+ 'start_reconcile' => 'Rozpocznij uzgadnianie',
+ 'cash' => 'gotówka',
+ 'account_type' => 'Typ konta',
+ 'save_transactions_by_moving' => 'Zapisz te transakcje, przenosząc je do innego konta:',
+ 'stored_new_account' => 'Nowe konto ":name" zostało zapisane!',
+ 'updated_account' => 'Zaktualizowano konto ":name"',
+ 'credit_card_options' => 'Opcje karty kredytowej',
+ 'no_transactions_account' => 'Brak transakcji (w tym okresie) na koncie aktywów ":name".',
+ 'no_data_for_chart' => 'Nie ma wystarczająco dużo informacji (póki co), aby wygenerować ten wykres.',
+ 'select_more_than_one_account' => 'Proszę wybierz więcej niż jedno konto',
+ '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',
+ 'account_default_currency' => 'Jeśli wybierzesz inną walutę, nowe transakcje z tego konta będą miały tę walutę wstępnie wybraną.',
+ 'reconcile_has_more' => 'Twoja księga główna Firefly III ma więcej pieniędzy niż bank twierdzi, że powinieneś mieć. Istnieje kilka opcji. Wybierz, co zrobić. Następnie naciśnij "Potwierdź uzgodnienie".',
+ 'reconcile_has_less' => 'Twoja księga główna Firefly III ma mniej pieniędzy niż bank twierdzi, że powinieneś mieć. Istnieje kilka opcji. Wybierz, co zrobić. Następnie naciśnij "Potwierdź uzgodnienie".',
+ 'reconcile_is_equal' => 'Twoja księga główna Firefly III i wyciągi bankowe są zgodne. Nie ma nic do zrobienia. Naciśnij "Potwierdź uzgodnienie" aby potwierdzić twój wybór.',
+ 'create_pos_reconcile_transaction' => 'Oznacz wybrane transakcje jako uzgodnione i utwórz korektę dodając :amount do tego konta aktywów.',
+ 'create_neg_reconcile_transaction' => 'Oznacz wybrane transakcje jako uzgodnione i utwórz korektę usuwając :amount z tego konta aktywów.',
+ 'reconcile_do_nothing' => 'Oznacz wybrane transakcje jako uzgodnione, ale nic nie poprawiaj.',
+ 'reconcile_go_back' => 'Możesz zawsze zmodyfikować lub usunąć korektę później.',
+ 'must_be_asset_account' => 'Możesz uzgodnić tylko konta aktywów',
+ 'reconciliation_stored' => 'Uzgodnienie zapisane',
+ 'reconcilliation_transaction_title' => 'Uzgodnienie (:from do :to)',
+ 'reconcile_this_account' => 'Uzgodnij to konto',
+ 'confirm_reconciliation' => 'Potwierdź uzgodnienie',
+ 'submitted_start_balance' => 'Przesłane saldo początkowe',
+ 'selected_transactions' => 'Wybrane transakcje (:count)',
+ 'already_cleared_transactions' => 'Transakcje uzgodnione wcześniej (:count)',
+ 'submitted_end_balance' => 'Przesłane saldo końcowe',
+ 'initial_balance_description' => 'Saldo początkowe dla ":account"',
// categories:
- 'new_category' => 'Nowa kategoria',
- 'create_new_category' => 'Utwórz nową kategorię',
- 'without_category' => 'Bez kategorii',
- 'update_category' => 'Aktualizuj kategorię',
- 'updated_category' => 'Zmodyfikowano kategorię ":name"',
- 'categories' => 'Kategorie',
- 'edit_category' => 'Edytuj kategorię ":name"',
- 'no_category' => '(bez kategorii)',
- 'category' => 'Kategoria',
- 'delete_category' => 'Usuń kategorię ":name"',
- 'deleted_category' => 'Usunięto kategorię ":name"',
- 'store_category' => 'Zapisz nową kategorię',
- 'stored_category' => 'Zapisano nową kategorię ":name"',
- 'without_category_between' => 'Bez kategorii między :start i :end',
+ 'new_category' => 'Nowa kategoria',
+ 'create_new_category' => 'Utwórz nową kategorię',
+ 'without_category' => 'Bez kategorii',
+ 'update_category' => 'Aktualizuj kategorię',
+ 'updated_category' => 'Zmodyfikowano kategorię ":name"',
+ 'categories' => 'Kategorie',
+ 'edit_category' => 'Edytuj kategorię ":name"',
+ 'no_category' => '(bez kategorii)',
+ 'category' => 'Kategoria',
+ 'delete_category' => 'Usuń kategorię ":name"',
+ 'deleted_category' => 'Usunięto kategorię ":name"',
+ 'store_category' => 'Zapisz nową kategorię',
+ 'stored_category' => 'Zapisano nową kategorię ":name"',
+ 'without_category_between' => 'Bez kategorii między :start i :end',
// transactions:
- 'update_withdrawal' => 'Modyfikuj wypłatę',
- 'update_deposit' => 'Modyfikuj wpłatę',
- 'update_transfer' => 'Modyfikuj transfer',
- 'updated_withdrawal' => 'Zaktualizowano wypłatę ":description"',
- 'updated_deposit' => 'Zaktualizowano wpłatę ":description"',
- 'updated_transfer' => 'Zaktualizowano transfer ":description"',
- 'delete_withdrawal' => 'Usunięto wypłatę ":description"',
- 'delete_deposit' => 'Usuń wpłatę ":description"',
- 'delete_transfer' => 'Usuń transfer ":description"',
- 'deleted_withdrawal' => 'Pomyślnie usunięto wypłatę ":description"',
- 'deleted_deposit' => 'Pomyślnie usunięto depozyt ":description"',
- 'deleted_transfer' => 'Pomyślnie usunięto transfer ":description"',
- 'stored_journal' => 'Pomyślnie utworzono nową transakcję ":description"',
- 'select_transactions' => 'Wybierz transakcje',
- 'rule_group_select_transactions' => 'Zastosuj ":title" do transakcji',
- 'rule_select_transactions' => 'Zastosuj ":title" do transakcji',
- 'stop_selection' => 'Przestań wybierać transakcje',
- 'reconcile_selected' => 'Uzgodnij',
- 'mass_delete_journals' => 'Usuń wiele transakcji',
- 'mass_edit_journals' => 'Modyfikuj wiele transakcji',
- 'mass_bulk_journals' => 'Hurtowa edycja wielu transakcji',
- 'mass_bulk_journals_explain' => 'Jeśli nie chcesz modyfikować transakcji jedna po drugiej za pomocą funkcji masowej edycji, możesz zaktualizować je za jednym razem. Po prostu wybierz preferowaną kategorię, tag(i) lub budżet w poniższych polach i wszystkie transakcje z tabeli zostaną zaktualizowane.',
- 'bulk_set_new_values' => 'Użyj pól poniżej, aby ustawić nowe wartości. Jeżeli zostawisz je puste, zostaną wyczyszczone dla wszystkich transakcji. Pamiętaj także, że budżet zostanie ustawiony tylko dla wypłat.',
- 'no_bulk_category' => 'Nie aktualizuj kategorii',
- 'no_bulk_budget' => 'Nie aktualizuj budżetu',
- 'no_bulk_tags' => 'Nie aktualizuj tagów',
- 'bulk_edit' => 'Hurtowa edycja',
- '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.',
- 'no_budget' => '(bez budżetu)',
- 'no_budget_squared' => '(brak budżetu)',
- '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',
- 'notes' => 'Notatki',
+ 'update_withdrawal' => 'Modyfikuj wypłatę',
+ 'update_deposit' => 'Modyfikuj wpłatę',
+ 'update_transfer' => 'Modyfikuj transfer',
+ 'updated_withdrawal' => 'Zaktualizowano wypłatę ":description"',
+ 'updated_deposit' => 'Zaktualizowano wpłatę ":description"',
+ 'updated_transfer' => 'Zaktualizowano transfer ":description"',
+ 'delete_withdrawal' => 'Usunięto wypłatę ":description"',
+ 'delete_deposit' => 'Usuń wpłatę ":description"',
+ 'delete_transfer' => 'Usuń transfer ":description"',
+ 'deleted_withdrawal' => 'Pomyślnie usunięto wypłatę ":description"',
+ 'deleted_deposit' => 'Pomyślnie usunięto depozyt ":description"',
+ 'deleted_transfer' => 'Pomyślnie usunięto transfer ":description"',
+ 'stored_journal' => 'Pomyślnie utworzono nową transakcję ":description"',
+ 'select_transactions' => 'Wybierz transakcje',
+ 'rule_group_select_transactions' => 'Zastosuj ":title" do transakcji',
+ 'rule_select_transactions' => 'Zastosuj ":title" do transakcji',
+ 'stop_selection' => 'Przestań wybierać transakcje',
+ 'reconcile_selected' => 'Uzgodnij',
+ 'mass_delete_journals' => 'Usuń wiele transakcji',
+ 'mass_edit_journals' => 'Modyfikuj wiele transakcji',
+ 'mass_bulk_journals' => 'Hurtowa edycja wielu transakcji',
+ 'mass_bulk_journals_explain' => 'Jeśli nie chcesz modyfikować transakcji jedna po drugiej za pomocą funkcji masowej edycji, możesz zaktualizować je za jednym razem. Po prostu wybierz preferowaną kategorię, tag(i) lub budżet w poniższych polach i wszystkie transakcje z tabeli zostaną zaktualizowane.',
+ 'bulk_set_new_values' => 'Użyj pól poniżej, aby ustawić nowe wartości. Jeżeli zostawisz je puste, zostaną wyczyszczone dla wszystkich transakcji. Pamiętaj także, że budżet zostanie ustawiony tylko dla wypłat.',
+ 'no_bulk_category' => 'Nie aktualizuj kategorii',
+ 'no_bulk_budget' => 'Nie aktualizuj budżetu',
+ 'no_bulk_tags' => 'Nie aktualizuj tagów',
+ 'bulk_edit' => 'Hurtowa edycja',
+ '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.',
+ 'no_budget' => '(bez budżetu)',
+ 'no_budget_squared' => '(brak budżetu)',
+ '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',
+ 'notes' => 'Notatki',
// new user:
- 'welcome' => 'Witaj w Firefly III!',
- 'submit' => 'Prześlij',
- 'getting_started' => 'Pierwsze kroki',
- 'to_get_started' => 'Dobrze, że udało ci się zainstalować Firefly III. Aby rozpocząć korzystanie z tego narzędzia, wprowadź nazwę swojego banku i saldo głównego rachunku bieżącego. Nie martw się, jeśli masz wiele kont. Możesz dodać je później. Po prostu Firefly III potrzebuje czegoś na początek.',
- 'savings_balance_text' => 'Firefly III automatycznie utworzy dla ciebie konto oszczędnościowe. Domyślnie na twoim koncie oszczędnościowym nie ma pieniędzy, ale jeśli chcesz, Firefly III może je tam przechowywać.',
- 'finish_up_new_user' => 'To wszystko! Możesz kontynuować, naciskając Zatwierdź. Zostaniesz przeniesiony do strony głównej Firefly III.',
- 'stored_new_accounts_new_user' => 'Yay! Twoje nowe konta zostały zapisane.',
+ 'welcome' => 'Witaj w Firefly III!',
+ 'submit' => 'Prześlij',
+ 'getting_started' => 'Pierwsze kroki',
+ 'to_get_started' => 'Dobrze, że udało ci się zainstalować Firefly III. Aby rozpocząć korzystanie z tego narzędzia, wprowadź nazwę swojego banku i saldo głównego rachunku bieżącego. Nie martw się, jeśli masz wiele kont. Możesz dodać je później. Po prostu Firefly III potrzebuje czegoś na początek.',
+ 'savings_balance_text' => 'Firefly III automatycznie utworzy dla ciebie konto oszczędnościowe. Domyślnie na twoim koncie oszczędnościowym nie ma pieniędzy, ale jeśli chcesz, Firefly III może je tam przechowywać.',
+ 'finish_up_new_user' => 'To wszystko! Możesz kontynuować, naciskając Zatwierdź. Zostaniesz przeniesiony do strony głównej Firefly III.',
+ 'stored_new_accounts_new_user' => 'Yay! Twoje nowe konta zostały zapisane.',
// home page:
- 'yourAccounts' => 'Twoje konta',
- 'budgetsAndSpending' => 'Budżety i wydatki',
- 'savings' => 'Oszczędności',
- 'newWithdrawal' => 'Nowy wydatek',
- 'newDeposit' => 'Nowa wpłata',
- 'newTransfer' => 'Nowy transfer',
- 'bills_to_pay' => 'Rachunki do zapłacenia',
- 'per_day' => 'Dziennie',
- 'left_to_spend_per_day' => 'Kwota możliwa do wydania codziennie',
- 'bills_paid' => 'Zapłacone rachunki',
+ 'yourAccounts' => 'Twoje konta',
+ 'budgetsAndSpending' => 'Budżety i wydatki',
+ 'savings' => 'Oszczędności',
+ 'newWithdrawal' => 'Nowy wydatek',
+ 'newDeposit' => 'Nowa wpłata',
+ 'newTransfer' => 'Nowy transfer',
+ 'bills_to_pay' => 'Rachunki do zapłacenia',
+ 'per_day' => 'Dziennie',
+ 'left_to_spend_per_day' => 'Kwota możliwa do wydania codziennie',
+ 'bills_paid' => 'Zapłacone rachunki',
// menu and titles, should be recycled as often as possible:
- 'currency' => 'Waluta',
- 'preferences' => 'Preferencje',
- 'logout' => 'Wyloguj',
- 'toggleNavigation' => 'Przełącz nawigację',
- 'searchPlaceholder' => 'Szukaj...',
- 'version' => 'Wersja',
- 'dashboard' => 'Kokpit',
- 'currencies' => 'Waluty',
- 'accounts' => 'Konta',
- 'Asset account' => 'Konto aktywów',
- 'Default account' => 'Konto aktywów',
- 'Expense account' => 'Konto wydatków',
- 'Revenue account' => 'Konto przychodów',
- 'Initial balance account' => 'Początkowe saldo konta',
- 'budgets' => 'Budżety',
- 'tags' => 'Tagi',
- 'reports' => 'Raporty',
- 'transactions' => 'Transakcje',
- 'expenses' => 'Wydatki',
- 'income' => 'Przychody / dochody',
- 'transfers' => 'Transfery',
- 'moneyManagement' => 'Zarządzanie pieniędzmi',
- 'piggyBanks' => 'Skarbonki',
- 'bills' => 'Rachunki',
- 'withdrawal' => 'Wypłata',
- 'opening_balance' => 'Saldo początkowe',
- 'deposit' => 'Wpłata',
- 'account' => 'Konto',
- 'transfer' => 'Transfer',
- 'Withdrawal' => 'Wypłata',
- 'Deposit' => 'Wpłata',
- 'Transfer' => 'Transfer',
- 'bill' => 'Rachunek',
- 'yes' => 'Tak',
- 'no' => 'Nie',
- 'amount' => 'Kwota',
- 'overview' => 'Przegląd',
- 'saveOnAccount' => 'Oszczędzaj na koncie',
- 'unknown' => 'Nieznane',
- 'daily' => 'Dziennie',
- 'monthly' => 'Miesięcznie',
- 'profile' => 'Profil',
- 'errors' => 'Błędy',
+ 'currency' => 'Waluta',
+ 'preferences' => 'Preferencje',
+ 'logout' => 'Wyloguj',
+ 'toggleNavigation' => 'Przełącz nawigację',
+ 'searchPlaceholder' => 'Szukaj...',
+ 'version' => 'Wersja',
+ 'dashboard' => 'Kokpit',
+ 'currencies' => 'Waluty',
+ 'accounts' => 'Konta',
+ 'Asset account' => 'Konto aktywów',
+ 'Default account' => 'Konto aktywów',
+ 'Expense account' => 'Konto wydatków',
+ 'Revenue account' => 'Konto przychodów',
+ 'Initial balance account' => 'Początkowe saldo konta',
+ 'budgets' => 'Budżety',
+ 'tags' => 'Tagi',
+ 'reports' => 'Raporty',
+ 'transactions' => 'Transakcje',
+ 'expenses' => 'Wydatki',
+ 'income' => 'Przychody / dochody',
+ 'transfers' => 'Transfery',
+ 'moneyManagement' => 'Zarządzanie pieniędzmi',
+ 'piggyBanks' => 'Skarbonki',
+ 'bills' => 'Rachunki',
+ 'withdrawal' => 'Wypłata',
+ 'opening_balance' => 'Saldo początkowe',
+ 'deposit' => 'Wpłata',
+ 'account' => 'Konto',
+ 'transfer' => 'Transfer',
+ 'Withdrawal' => 'Wypłata',
+ 'Deposit' => 'Wpłata',
+ 'Transfer' => 'Transfer',
+ 'bill' => 'Rachunek',
+ 'yes' => 'Tak',
+ 'no' => 'Nie',
+ 'amount' => 'Kwota',
+ 'overview' => 'Przegląd',
+ 'saveOnAccount' => 'Oszczędzaj na koncie',
+ 'unknown' => 'Nieznane',
+ 'daily' => 'Dziennie',
+ 'monthly' => 'Miesięcznie',
+ 'profile' => 'Profil',
+ 'errors' => 'Błędy',
// 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 a :end',
- 'report_account' => 'Raport dotyczący wydatków/przychodów 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' => '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',
- 'balanceStart' => 'Saldo na początku okresu',
- 'balanceEnd' => 'Saldo na końcu okresu',
- 'splitByAccount' => 'Podziel według konta',
- 'coveredWithTags' => 'Objęte tagami',
- 'leftUnbalanced' => 'Pozostawiono niewyważone',
- 'leftInBudget' => 'Pozostało w budżecie',
- 'sumOfSums' => 'Suma sum',
- 'noCategory' => '(bez kategorii)',
- 'notCharged' => 'Brak opłaty (jeszcze)',
- 'inactive' => 'Nieaktywne',
- 'active' => 'Aktywne',
- 'difference' => 'Różnica',
- 'money_flowing_in' => 'Przychodzące',
- 'money_flowing_out' => 'Wychodzące',
- 'topX' => 'czołówka :number',
- 'show_full_list' => 'Pokaż całą listę',
- 'show_only_top' => 'Pokazuj tylko czołową :number',
- '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_account' => 'Raport dotyczący konta wydatków/przychodów',
- 'more_info_help' => 'Więcej informacji na temat typów raportów można znaleźć na stronach pomocy. Naciśnij ikonę (?) w prawym górnym rogu.',
- 'report_included_accounts' => 'Uwzględnione konta',
- 'report_date_range' => 'Zakres dat',
- 'report_preset_ranges' => 'Predefiniowane zakresy',
- 'shared' => 'Udostępnione',
- 'fiscal_year' => 'Rok podatkowy',
- 'income_entry' => 'Dochód z konta ":name" między: :start a :end',
- 'expense_entry' => 'Wydatki na konto ":name" między :start a :end',
- 'category_entry' => 'Wydatki w kategorii ":name" między :start i :end',
- 'budget_spent_amount' => 'Wydatki w budżecie ":budget" między :start i :end',
- 'balance_amount' => 'Wydatki w budżecie ":budget" zapłacone z konta ":account" między :start a :end',
- 'no_audit_activity' => 'Nie zarejestrowano żadnej aktywności na koncie :account_name między :start a :end.',
- 'audit_end_balance' => 'Saldo konta :account_name na koniec :end wynosiło: :balance',
- 'reports_extra_options' => 'Dodatkowe opcje',
- 'report_has_no_extra_options' => 'Ten raport nie ma dodatkowych opcji',
- 'reports_submit' => 'Zobacz raport',
- 'end_after_start_date' => 'Data zakończenia raportu musi być po dacie rozpoczęcia.',
- 'select_category' => 'Wybierz kategorię(e)',
- 'select_budget' => 'Wybierz budżet(y).',
- 'select_tag' => 'Wybierz tag(i).',
- '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)',
- 'income_average' => 'Dochód (średnia)',
- 'transaction_count' => 'Liczba transakcji',
- 'average_spending_per_account' => 'Średnie wydatki per konto',
- 'average_income_per_account' => 'Średni dochód per konto',
- 'total' => 'Łącznie',
- 'description' => 'Opis',
- 'sum_of_period' => 'Suma dla tego okresu',
- 'average_in_period' => 'Średnia dla tego okresu',
- 'account_role_defaultAsset' => 'Domyślne konto aktywów',
- 'account_role_sharedAsset' => 'Współdzielone konto aktywów',
- 'account_role_savingAsset' => 'Konto oszczędnościowe',
- 'account_role_ccAsset' => 'Karta kredytowa',
- 'budget_chart_click' => 'Kliknij na nazwę budżetu w tabeli powyżej, aby zobaczyć wykres.',
- 'category_chart_click' => 'Kliknij na nazwę kategorii w tabeli powyżej, aby zobaczyć wykres.',
- 'in_out_accounts' => 'Zarobione oraz wydane wg kombinacji',
- 'in_out_per_category' => 'Zarobione oraz wydane wg kategorii',
- 'out_per_budget' => 'Wydane wg budżetu',
- 'select_expense_revenue' => 'Wybierz konto wydatków/przychodów',
+ '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 a :end',
+ 'report_account' => 'Raport dotyczący wydatków/przychodów 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' => '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',
+ 'balanceStart' => 'Saldo na początku okresu',
+ 'balanceEnd' => 'Saldo na końcu okresu',
+ 'splitByAccount' => 'Podziel według konta',
+ 'coveredWithTags' => 'Objęte tagami',
+ 'leftUnbalanced' => 'Pozostawiono niewyważone',
+ 'leftInBudget' => 'Pozostało w budżecie',
+ 'sumOfSums' => 'Suma sum',
+ 'noCategory' => '(bez kategorii)',
+ 'notCharged' => 'Brak opłaty (jeszcze)',
+ 'inactive' => 'Nieaktywne',
+ 'active' => 'Aktywne',
+ 'difference' => 'Różnica',
+ 'money_flowing_in' => 'Przychodzące',
+ 'money_flowing_out' => 'Wychodzące',
+ 'topX' => 'czołówka :number',
+ 'show_full_list' => 'Pokaż całą listę',
+ 'show_only_top' => 'Pokazuj tylko czołową :number',
+ '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_account' => 'Raport dotyczący konta wydatków/przychodów',
+ 'more_info_help' => 'Więcej informacji na temat typów raportów można znaleźć na stronach pomocy. Naciśnij ikonę (?) w prawym górnym rogu.',
+ 'report_included_accounts' => 'Uwzględnione konta',
+ 'report_date_range' => 'Zakres dat',
+ 'report_preset_ranges' => 'Predefiniowane zakresy',
+ 'shared' => 'Udostępnione',
+ 'fiscal_year' => 'Rok podatkowy',
+ 'income_entry' => 'Dochód z konta ":name" między: :start a :end',
+ 'expense_entry' => 'Wydatki na konto ":name" między :start a :end',
+ 'category_entry' => 'Wydatki w kategorii ":name" między :start i :end',
+ 'budget_spent_amount' => 'Wydatki w budżecie ":budget" między :start i :end',
+ 'balance_amount' => 'Wydatki w budżecie ":budget" zapłacone z konta ":account" między :start a :end',
+ 'no_audit_activity' => 'Nie zarejestrowano żadnej aktywności na koncie :account_name między :start a :end.',
+ 'audit_end_balance' => 'Saldo konta :account_name na koniec :end wynosiło: :balance',
+ 'reports_extra_options' => 'Dodatkowe opcje',
+ 'report_has_no_extra_options' => 'Ten raport nie ma dodatkowych opcji',
+ 'reports_submit' => 'Zobacz raport',
+ 'end_after_start_date' => 'Data zakończenia raportu musi być po dacie rozpoczęcia.',
+ 'select_category' => 'Wybierz kategorię(e)',
+ 'select_budget' => 'Wybierz budżet(y).',
+ 'select_tag' => 'Wybierz tag(i).',
+ '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)',
+ 'income_average' => 'Dochód (średnia)',
+ 'transaction_count' => 'Liczba transakcji',
+ 'average_spending_per_account' => 'Średnie wydatki per konto',
+ 'average_income_per_account' => 'Średni dochód per konto',
+ 'total' => 'Łącznie',
+ 'description' => 'Opis',
+ 'sum_of_period' => 'Suma dla tego okresu',
+ 'average_in_period' => 'Średnia dla tego okresu',
+ 'account_role_defaultAsset' => 'Domyślne konto aktywów',
+ 'account_role_sharedAsset' => 'Współdzielone konto aktywów',
+ 'account_role_savingAsset' => 'Konto oszczędnościowe',
+ 'account_role_ccAsset' => 'Karta kredytowa',
+ 'budget_chart_click' => 'Kliknij na nazwę budżetu w tabeli powyżej, aby zobaczyć wykres.',
+ 'category_chart_click' => 'Kliknij na nazwę kategorii w tabeli powyżej, aby zobaczyć wykres.',
+ 'in_out_accounts' => 'Zarobione oraz wydane wg kombinacji',
+ 'in_out_per_category' => 'Zarobione oraz wydane wg kategorii',
+ 'out_per_budget' => 'Wydane wg budżetu',
+ 'select_expense_revenue' => 'Wybierz konto wydatków/przychodów',
// charts:
- 'chart' => 'Wykres',
- 'month' => 'Miesiąc',
- 'budget' => 'Budżet',
- 'spent' => 'Wydano',
- 'spent_in_budget' => 'Wydano w budżecie',
- 'left_to_spend' => 'Pozostało do wydania',
- 'earned' => 'Zarobiono',
- 'overspent' => 'Przepłacono',
- 'left' => 'Pozostało',
- 'max-amount' => 'Maksymalna kwota',
- 'min-amount' => 'Minimalna kwota',
- 'journal-amount' => 'Faktyczna kwota',
- 'name' => 'Nazwa',
- 'date' => 'Data',
- 'paid' => 'Zpłacone',
- 'unpaid' => 'Niezapłacone',
- 'day' => 'Dzień',
- 'budgeted' => 'Zabudżetowano',
- 'period' => 'Okres',
- 'balance' => 'Saldo',
- 'sum' => 'Suma',
- 'average' => 'Średno',
- 'balanceFor' => 'Saldo dla :name',
+ 'chart' => 'Wykres',
+ 'month' => 'Miesiąc',
+ 'budget' => 'Budżet',
+ 'spent' => 'Wydano',
+ 'spent_in_budget' => 'Wydano w budżecie',
+ 'left_to_spend' => 'Pozostało do wydania',
+ 'earned' => 'Zarobiono',
+ 'overspent' => 'Przepłacono',
+ 'left' => 'Pozostało',
+ 'max-amount' => 'Maksymalna kwota',
+ 'min-amount' => 'Minimalna kwota',
+ 'journal-amount' => 'Faktyczna kwota',
+ 'name' => 'Nazwa',
+ 'date' => 'Data',
+ 'paid' => 'Zpłacone',
+ 'unpaid' => 'Niezapłacone',
+ 'day' => 'Dzień',
+ 'budgeted' => 'Zabudżetowano',
+ 'period' => 'Okres',
+ 'balance' => 'Saldo',
+ 'sum' => 'Suma',
+ 'average' => 'Średno',
+ 'balanceFor' => 'Saldo dla :name',
// piggy banks:
- 'add_money_to_piggy' => 'Dodaj pieniądze do skarbonki ":name"',
- 'piggy_bank' => 'Skarbonka',
- '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' => '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' => '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.',
+ 'add_money_to_piggy' => 'Dodaj pieniądze do skarbonki ":name"',
+ 'piggy_bank' => 'Skarbonka',
+ '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' => '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' => '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',
@@ -1084,6 +1086,7 @@ return [
'invalid_link_selection' => 'Nie można powiązać tych transakcji',
'journals_linked' => 'Transakcje zostały powiązane.',
'journals_error_linked' => 'Wybrane transakcje są już powiązane.',
+ 'journals_link_to_self' => 'Nie możesz powiązać transakcji z samą sobą',
'journal_links' => 'Powiązane transakcje',
'this_withdrawal' => 'Ta wypłata',
'this_deposit' => 'Ta wpłata',
diff --git a/resources/lang/pl_PL/form.php b/resources/lang/pl_PL/form.php
index 3fe5e33b97..8cb45c4613 100644
--- a/resources/lang/pl_PL/form.php
+++ b/resources/lang/pl_PL/form.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// new user:
diff --git a/resources/lang/pl_PL/import.php b/resources/lang/pl_PL/import.php
index a2a686e984..fca3a37578 100644
--- a/resources/lang/pl_PL/import.php
+++ b/resources/lang/pl_PL/import.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
// status of import:
@@ -97,6 +98,7 @@ return [
// not csv, but normal warning
'roles_warning' => 'Zaznacz jedną z kolumn jako kolumnę z kwotami. Wskazane jest również wybranie kolumny dla opisu, daty oraz konta przeciwnego.',
'foreign_amount_warning' => 'Jeśli zaznaczysz kolumnę jako zawierającą kwotę w obcej walucie, musisz także ustawić kolumnę, która zawiera kod tej waluty.',
+
// file, map data
'file_map_title' => 'Ustawienia importu (4/4) - Połącz dane importu z danymi Firefly III',
'file_map_text' => 'W poniższych tabelach lewa wartość pokazuje informacje znalezione w przesłanym pliku. Twoim zadaniem jest zamapowanie tej wartości, jeśli to możliwe, na wartość już obecną w bazie danych. Firefly będzie trzymać się tego mapowania. Jeśli nie ma wartości do odwzorowania lub nie chcesz mapować określonej wartości, nie wybieraj niczego.',
@@ -131,28 +133,40 @@ return [
'column_date-book' => 'Data księgowania transakcji',
'column_date-process' => 'Data przetworzenia transakcji',
'column_date-transaction' => 'Data',
+ 'column_date-due' => 'Transaction due date',
+ 'column_date-payment' => 'Transaction payment date',
+ 'column_date-invoice' => 'Transaction invoice date',
'column_description' => 'Opis',
'column_opposing-iban' => 'Przeciwstawne konto (IBAN)',
+ 'column_opposing-bic' => 'Opposing account (BIC)',
'column_opposing-id' => 'ID przeciwstawnego konta (z bazy FF3)',
'column_external-id' => 'Zewnętrzne ID',
'column_opposing-name' => 'Przeciwstawne konto (nazwa)',
'column_rabo-debit-credit' => 'Specyficzny wskaźnik obciążenia/kredytu Rabobank',
'column_ing-debit-credit' => 'Specyficzny wskaźnik obciążenia/kredytu ING',
- 'column_sepa-ct-id' => 'SEPA transferu od końca do końca ID',
- 'column_sepa-ct-op' => 'SEPA przelew na przeciwne konto',
- 'column_sepa-db' => 'SEPA polecenie zapłaty',
+ 'column_sepa-ct-id' => 'SEPA end-to-end Identifier',
+ 'column_sepa-ct-op' => 'SEPA Opposing Account Identifier',
+ 'column_sepa-db' => 'SEPA Mandate Identifier',
+ 'column_sepa-cc' => 'SEPA Clearing Code',
+ 'column_sepa-ci' => 'SEPA Creditor Identifier',
+ 'column_sepa-ep' => 'SEPA External Purpose',
+ 'column_sepa-country' => 'SEPA Country Code',
'column_tags-comma' => 'Tagi (oddzielone przecinkami)',
'column_tags-space' => 'Tagi (oddzielone spacjami)',
'column_account-number' => 'Konto aktywów (numer konta)',
'column_opposing-number' => 'Konto przeciwne (numer konta)',
'column_note' => 'Notatki',
+ 'column_internal-reference' => 'Internal reference',
// prerequisites
'prerequisites' => 'Wymagania',
// bunq
'bunq_prerequisites_title' => 'Wymagania wstępne dla importu z bunq',
- 'bunq_prerequisites_text' => 'Aby zaimportować z bunq, musisz uzyskać klucz API. Możesz to zrobić za pomocą aplikacji.',
+ 'bunq_prerequisites_text' => 'Aby importować z Bunq, musisz uzyskać klucz API. Możesz to zrobić za pomocą aplikacji. Zwróć uwagę, że funkcja importu z Bunq jest w wersji BETA. Została przetestowana tylko przy użyciu testowej wersji API.',
+ 'bunq_do_import' => 'Tak, importuj z tego konta',
+ 'bunq_accounts_title' => 'Konta Bunq',
+ 'bunq_accounts_text' => 'Te konta są powiązane z Twoim kontem Bunq. Wybierz konta, z których chcesz importować transakcje i na które konto mają trafić.',
// Spectre
'spectre_title' => 'Importuj za pomocą Spectre',
@@ -187,4 +201,3 @@ return [
// various other strings:
'imported_from_account' => 'Zaimportowane z ":account"',
];
-
diff --git a/resources/lang/pl_PL/intro.php b/resources/lang/pl_PL/intro.php
index b9099e0e55..9ca0a5a4cb 100644
--- a/resources/lang/pl_PL/intro.php
+++ b/resources/lang/pl_PL/intro.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// index
diff --git a/resources/lang/pl_PL/list.php b/resources/lang/pl_PL/list.php
index 25ae2552a0..4305286f0b 100644
--- a/resources/lang/pl_PL/list.php
+++ b/resources/lang/pl_PL/list.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
'buttons' => 'Przyciski',
@@ -102,4 +103,12 @@ return [
'reconcile' => 'Uzgodnij',
'account_on_spectre' => 'Konto (Spectre)',
'do_import' => 'Importuj z tego konta',
+ 'sepa-ct-id' => 'SEPA End to End Identifier',
+ 'sepa-ct-op' => 'SEPA Opposing Account Identifier',
+ 'sepa-db' => 'SEPA Mandate Identifier',
+ 'sepa-country' => 'SEPA Country',
+ 'sepa-cc' => 'SEPA Clearing Code',
+ 'sepa-ep' => 'SEPA External Purpose',
+ 'sepa-ci' => 'SEPA Creditor Identifier',
+ 'account_at_bunq' => 'Konto bunq',
];
diff --git a/resources/lang/pl_PL/pagination.php b/resources/lang/pl_PL/pagination.php
index bb11d2362e..62d42ffdb6 100644
--- a/resources/lang/pl_PL/pagination.php
+++ b/resources/lang/pl_PL/pagination.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'previous' => '« Poprzednia',
diff --git a/resources/lang/pl_PL/passwords.php b/resources/lang/pl_PL/passwords.php
index fe468dc88d..27825c70ca 100644
--- a/resources/lang/pl_PL/passwords.php
+++ b/resources/lang/pl_PL/passwords.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'password' => 'Hasło musi zawierać przynajmniej 6 znaków i musi się zgadzać z potwierdzeniem.',
diff --git a/resources/lang/pl_PL/validation.php b/resources/lang/pl_PL/validation.php
index 4563203afa..eaa42b7a7e 100644
--- a/resources/lang/pl_PL/validation.php
+++ b/resources/lang/pl_PL/validation.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'iban' => 'To nie jest prawidłowy IBAN.',
+ 'source_equals_destination' => 'Konto źródłowe jest równe kontu docelowemu',
'unique_account_number_for_user' => 'Wygląda na to, że ten numer konta jest już w użyciu.',
'unique_iban_for_user' => 'Wygląda na to, że ten IBAN jest już w użyciu.',
'deleted_user' => 'Ze względu na zabezpieczenia nie możesz się zarejestrować używając tego adresu e-mail.',
diff --git a/resources/lang/pt_BR/auth.php b/resources/lang/pt_BR/auth.php
index 80dc51917e..0cccc053eb 100644
--- a/resources/lang/pt_BR/auth.php
+++ b/resources/lang/pt_BR/auth.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
/*
diff --git a/resources/lang/pt_BR/bank.php b/resources/lang/pt_BR/bank.php
index ef0d636f91..b6a86faa4b 100644
--- a/resources/lang/pt_BR/bank.php
+++ b/resources/lang/pt_BR/bank.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
];
diff --git a/resources/lang/pt_BR/breadcrumbs.php b/resources/lang/pt_BR/breadcrumbs.php
index 941fca6cd2..5e7cb1e71c 100644
--- a/resources/lang/pt_BR/breadcrumbs.php
+++ b/resources/lang/pt_BR/breadcrumbs.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'home' => 'Início',
diff --git a/resources/lang/pt_BR/components.php b/resources/lang/pt_BR/components.php
index c555e1437b..7427062e5c 100644
--- a/resources/lang/pt_BR/components.php
+++ b/resources/lang/pt_BR/components.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// profile
diff --git a/resources/lang/pt_BR/config.php b/resources/lang/pt_BR/config.php
index d2c895ed73..2885efffc6 100644
--- a/resources/lang/pt_BR/config.php
+++ b/resources/lang/pt_BR/config.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'html_language' => 'pt-br',
'locale' => 'pt-br, pt_BR, pt_BR.utf8, pt_BR.UTF-8',
- 'month' => '%B %Yü',
+ 'month' => '%B %Y',
'month_and_day' => '%e de %B de %Y',
'date_time' => '%B %e, %Y, @ %T',
'specific_day' => '%e %B %Y',
'week_in_year' => 'Semana %W, %Y',
'year' => '%Y',
- 'half_year' => '%B %Yü',
+ 'half_year' => '%B %Y',
'month_js' => 'MMMM YYYY',
'month_and_day_js' => 'MMMM Do, YYYY',
'date_time_js' => 'MMMM Do, YYYY, @ HH:mm:ss',
diff --git a/resources/lang/pt_BR/csv.php b/resources/lang/pt_BR/csv.php
index d61316b632..892c8beac4 100644
--- a/resources/lang/pt_BR/csv.php
+++ b/resources/lang/pt_BR/csv.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
];
diff --git a/resources/lang/pt_BR/demo.php b/resources/lang/pt_BR/demo.php
index 4435f65f97..5b5745ac4d 100644
--- a/resources/lang/pt_BR/demo.php
+++ b/resources/lang/pt_BR/demo.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
- 'no_demo_text' => 'Desculpe, não há nenhum texto extra de explicação para esta página.',
- 'see_help_icon' => 'No entanto, o -ícone no canto superior direito pode lhe dizer mais.',
- 'index' => 'Bem-vindo ao Firefly III! Nesta página você pode obter uma rápida visão geral de suas finanças. Para mais informações, confira Contas de Ativos → Contas de Ativos e, claro, as páginas de Orçamentos e Relatório.Ou então, dê uma olhada ao redor e veja onde você vai parar.',
- 'accounts-index' => 'Contas de ativos são suas contas bancárias pessoais. Contas de despesas são as contas em que você gasta dinheiro, como por exemplo, com lojas, amigos. Contas de receita são as contas em que você recebe dinheiro, como seu emprego, auxílio do governo ou outras formas de receita. Nesta página, você pode editá-los ou removê-los.',
- 'budgets-index' => 'Esta página mostra a você uma visão geral dos seus orçamentos. A barra superior mostra a quantidade disponível a ser orçamentada. Isto pode ser personalizado para qualquer valor clicando o montante à direita. A quantidade que você gastou de fato é mostrada na barra abaixo. Abaixo, estão as despesas para cada orçamento e o que você orçou neles.',
- 'reports-index-start' => 'Firefly III suporta vários tipos de relatórios. Leia sobre eles clicando no-ícone no canto superior direito.',
- 'reports-index-examples' => 'Certifique-se de verificar estes exemplos: um quadro financeiro mensal, um quadro financeiro anual e uma visão geral orçamentária.',
- 'currencies-index' => 'Firefly III oferece suporte a várias moedas. Embora o padrão seja o Euro, ela pode ser definida para o dólar americano e muitas outras moedas. Como você pode ver uma pequena seleção de moedas foi incluída, mas você pode adicionar suas próprias se desejar. No entanto, alterar a moeda padrão não vai mudar a moeda de transações existentes: Firefly III suporta o uso de várias moedas ao mesmo tempo.',
- 'transactions-index' => 'Estas despesas, depósitos e transferências não são fantasiosas. Elas foram geradas automaticamente.',
- 'piggy-banks-index' => 'Como você pode ver, existem três cofrinhos. Use o sinal de mais e menos botões para influenciar a quantidade de dinheiro em cada cofrinho. Clique no nome do cofrinho para ver a administração de cada cofrinho.',
- 'import-index' => 'Sim, qualquer arquivo CSV pode ser importado para Firefly III',
+ 'no_demo_text' => 'Desculpe, não há nenhum texto extra de explicação para esta página.',
+ 'see_help_icon' => 'No entanto, o -ícone no canto superior direito pode lhe dizer mais.',
+ 'index' => 'Bem-vindo ao Firefly III! Nesta página você pode obter uma rápida visão geral de suas finanças. Para mais informações, confira Contas de Ativos → Contas de Ativos e, claro, as páginas de Orçamentos e Relatório.Ou então, dê uma olhada ao redor e veja onde você vai parar.',
+ 'accounts-index' => 'Contas de ativos são suas contas bancárias pessoais. Contas de despesas são as contas em que você gasta dinheiro, como por exemplo, com lojas, amigos. Contas de receita são as contas em que você recebe dinheiro, como seu emprego, auxílio do governo ou outras formas de receita. Nesta página, você pode editá-los ou removê-los.',
+ 'budgets-index' => 'Esta página mostra a você uma visão geral dos seus orçamentos. A barra superior mostra a quantidade disponível a ser orçamentada. Isto pode ser personalizado para qualquer valor clicando o montante à direita. A quantidade que você gastou de fato é mostrada na barra abaixo. Abaixo, estão as despesas para cada orçamento e o que você orçou neles.',
+ 'reports-index-start' => 'Firefly III suporta vários tipos de relatórios. Leia sobre eles clicando no-ícone no canto superior direito.',
+ 'reports-index-examples' => 'Certifique-se de verificar estes exemplos: um quadro financeiro mensal, um quadro financeiro anual e uma visão geral orçamentária.',
+ 'currencies-index' => 'Firefly III oferece suporte a várias moedas. Embora o padrão seja o Euro, ela pode ser definida para o dólar americano e muitas outras moedas. Como você pode ver uma pequena seleção de moedas foi incluída, mas você pode adicionar suas próprias se desejar. No entanto, alterar a moeda padrão não vai mudar a moeda de transações existentes: Firefly III suporta o uso de várias moedas ao mesmo tempo.',
+ 'transactions-index' => 'Estas despesas, depósitos e transferências não são fantasiosas. Elas foram geradas automaticamente.',
+ 'piggy-banks-index' => 'Como você pode ver, existem três cofrinhos. Use o sinal de mais e menos botões para influenciar a quantidade de dinheiro em cada cofrinho. Clique no nome do cofrinho para ver a administração de cada cofrinho.',
+ 'import-index' => 'Sim, qualquer arquivo CSV pode ser importado para Firefly III',
];
diff --git a/resources/lang/pt_BR/firefly.php b/resources/lang/pt_BR/firefly.php
index f06e8d38c0..99ffefcce5 100644
--- a/resources/lang/pt_BR/firefly.php
+++ b/resources/lang/pt_BR/firefly.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
// general stuff:
@@ -93,8 +94,8 @@ return [
'destination_accounts' => 'Conta(s) de destino',
'user_id_is' => 'Seu id de usuário é :user',
'field_supports_markdown' => 'Este campo suporta Markdown.',
- 'need_more_help' => 'Se você precisa de mais ajuda usando o Firefly III, por favor abra um ticket no Github.',
- 'reenable_intro_text' => 'Você pode também reativar o guia de introdução.',
+ 'need_more_help' => 'Se você precisa de mais ajuda usando o Firefly III, por favor abra um ticket no Github.',
+ 'reenable_intro_text' => 'Você pode também reativar o guia de introdução.',
'intro_boxes_after_refresh' => 'As caixas de introdução reaparecerão quando você atualizar a página.',
'show_all_no_filter' => 'Mostre todas as transações sem agrupá-las por data.',
'expenses_by_category' => 'Despesa por categoria',
@@ -170,7 +171,9 @@ return [
'want_to_login' => 'Eu quero fazer o login',
'button_register' => 'Registrar',
'authorization' => 'Authorization',
-
+ 'active_bills_only' => 'active bills only',
+ 'average_per_bill' => 'average per bill',
+ 'expected_total' => 'expected total',
// API access
'authorization_request' => 'Firefly III v:version Pedido de autorização',
'authorization_request_intro' => ':client está pedindo permissão para acessar sua administração financeira. Gostaria de autorizar :client para acessar esses registros?',
@@ -403,590 +406,589 @@ return [
'rule_action_set_notes_choice' => 'Defina notas para..',
'rule_action_set_notes' => 'Defina notas para ":action_value"',
- 'rules_have_read_warning' => 'Você leu o aviso?',
- 'apply_rule_warning' => 'Aviso: executar uma regra (grupo) em uma grande seleção de transações pode levar tempo, e pode atingir um tempo limite. Se o fizer, a regra (grupo) só será aplicada a um subconjunto desconhecido de suas transações. Isso pode deixar a sua administração financeira aos pedaços. Por favor, seja cuidadoso.',
+ 'rules_have_read_warning' => 'Você leu o aviso?',
+ 'apply_rule_warning' => 'Aviso: executar uma regra (grupo) em uma grande seleção de transações pode levar tempo, e pode atingir um tempo limite. Se o fizer, a regra (grupo) só será aplicada a um subconjunto desconhecido de suas transações. Isso pode deixar a sua administração financeira aos pedaços. Por favor, seja cuidadoso.',
// tags
- 'store_new_tag' => 'Armazenar nova tag',
- 'update_tag' => 'Atualizar tag',
- 'no_location_set' => 'Nenhuma localização.',
- 'meta_data' => 'Meta dados',
- 'location' => 'Localização',
- 'without_date' => 'Sem data',
- 'result' => 'Resultado',
- 'sums_apply_to_range' => 'Todas as somas aplicam-se ao intervalo selecionado',
- 'mapbox_api_key' => 'Para usar o mapa, obtenha uma chave API de Mapbox. Abra seu .env arquivo e digite este código após MAPBOX_API_KEY = .',
- 'press_tag_location' => 'Clique com o botão direito ou pressione longamente para definir a localização da tag.',
- 'clear_location' => 'Limpar localização',
+ 'store_new_tag' => 'Armazenar nova tag',
+ 'update_tag' => 'Atualizar tag',
+ 'no_location_set' => 'Nenhuma localização.',
+ 'meta_data' => 'Meta dados',
+ 'location' => 'Localização',
+ 'without_date' => 'Sem data',
+ 'result' => 'Resultado',
+ 'sums_apply_to_range' => 'Todas as somas aplicam-se ao intervalo selecionado',
+ 'mapbox_api_key' => 'Para usar o mapa, obtenha uma chave API de Mapbox. Abra seu .env arquivo e digite este código após MAPBOX_API_KEY = .',
+ 'press_tag_location' => 'Clique com o botão direito ou pressione longamente para definir a localização da tag.',
+ 'clear_location' => 'Limpar localização',
// preferences
- 'pref_home_screen_accounts' => 'Conta da tela inicial',
- 'pref_home_screen_accounts_help' => 'Que conta deve ser exibida na tela inicial?',
- 'pref_view_range' => 'Ver intervalo',
- 'pref_view_range_help' => 'Alguns gráficos são agrupados automaticamente em períodos. Qual período você prefere?',
- 'pref_1D' => 'Um dia',
- 'pref_1W' => 'Uma semana',
- 'pref_1M' => 'Um mês',
- 'pref_3M' => 'Trimestral',
- 'pref_6M' => 'Semestral',
- 'pref_1Y' => 'Um ano',
- 'pref_languages' => 'Idiomas',
- 'pref_languages_help' => 'Firefly III suporta muitos idiomas. Qual você prefere?',
- 'pref_custom_fiscal_year' => 'Configurações de ano fiscal',
- 'pref_custom_fiscal_year_label' => 'Habilitado',
- 'pref_custom_fiscal_year_help' => 'Nos países que usam um exercício diferente de 1 de Janeiro a 31 de Dezembro, você pode ativar isto e especificar início / fim do ano fiscal',
- 'pref_fiscal_year_start_label' => 'Data de início de ano fiscal',
- 'pref_two_factor_auth' => 'Verificação em duas etapas',
- 'pref_two_factor_auth_help' => 'Quando você habilitar verificação em 2-passos (também conhecido como Two Factor Authentication), você adicionar uma camada extra de segurança para sua conta. Você entra com alguma coisa que você sabe (sua senha) e algo que você tem (um código de verificação). Os códigos de verificação são gerados por um aplicativo em seu telefone, como Authy ou Google Authenticator.',
- 'pref_enable_two_factor_auth' => 'Habilitar a verificação de 2 etapas',
- 'pref_two_factor_auth_disabled' => 'código de verificação em 2 etapas removido e desativado',
- 'pref_two_factor_auth_remove_it' => 'Não se esqueça de remover a conta de seu aplicativo de autenticação!',
- 'pref_two_factor_auth_code' => 'Verificar código',
- 'pref_two_factor_auth_code_help' => 'Scaneie o código QR com um aplicativo em seu telefone como Authy ou Google Authenticator e insira o código gerado.',
- 'pref_two_factor_auth_reset_code' => 'Redefinir o código de verificação',
- 'pref_two_factor_auth_remove_code' => 'Remover o código de verificação',
- 'pref_two_factor_auth_remove_will_disable' => '(isso também irá desativar a autenticação de duas etapas)',
- 'pref_save_settings' => 'Salvar definições',
- 'saved_preferences' => 'Preferências salvas!',
- 'preferences_general' => 'Geral',
- 'preferences_frontpage' => 'Tela inicial',
- 'preferences_security' => 'Segurança',
- 'preferences_layout' => 'Interface',
- 'pref_home_show_deposits' => 'Depósitos de mostrar na tela inicial',
- 'pref_home_show_deposits_info' => 'A tela inicial já mostra suas contas de despesas. Deveria também mostrar suas receitas?',
- 'pref_home_do_show_deposits' => 'Sim, mostrar-lhes',
- 'successful_count' => 'dos quais :count bem sucedida',
- 'list_page_size_title' => 'Tamanho da página',
- 'list_page_size_help' => 'Qualquer lista de coisas (contas, transações, etc.) mostra, no máximo, este tanto por página.',
- 'list_page_size_label' => 'Tamanho da página',
- 'between_dates' => '(:start e :end)',
- 'pref_optional_fields_transaction' => 'Campos opcionais para transações',
- 'pref_optional_fields_transaction_help' => 'Por padrão, nem todos os campos estão ativados ao criar uma nova transação (por causa da desordem). Abaixo, você pode habilitar esses campos se você acha que eles podem ser úteis para você. Claro, qualquer campo desabilitado, mas já preenchido, será visível, independentemente da configuração.',
- 'optional_tj_date_fields' => 'Campos de data',
- 'optional_tj_business_fields' => 'Campos de negócios',
- 'optional_tj_attachment_fields' => 'Campos de anexo',
- 'pref_optional_tj_interest_date' => 'Data de interesse',
- 'pref_optional_tj_book_date' => 'Data reserva',
- 'pref_optional_tj_process_date' => 'Data de processamento',
- 'pref_optional_tj_due_date' => 'Data de vencimento',
- 'pref_optional_tj_payment_date' => 'Data de pagamento',
- 'pref_optional_tj_invoice_date' => 'Data da Fatura',
- 'pref_optional_tj_internal_reference' => 'Referência interna',
- 'pref_optional_tj_notes' => 'Notas',
- 'pref_optional_tj_attachments' => 'Anexos',
- 'optional_field_meta_dates' => 'Datas',
- 'optional_field_meta_business' => 'Negócios',
- 'optional_field_attachments' => 'Anexos',
- 'optional_field_meta_data' => 'Meta dados opcionais',
+ 'pref_home_screen_accounts' => 'Conta da tela inicial',
+ 'pref_home_screen_accounts_help' => 'Que conta deve ser exibida na tela inicial?',
+ 'pref_view_range' => 'Ver intervalo',
+ 'pref_view_range_help' => 'Alguns gráficos são agrupados automaticamente em períodos. Qual período você prefere?',
+ 'pref_1D' => 'Um dia',
+ 'pref_1W' => 'Uma semana',
+ 'pref_1M' => 'Um mês',
+ 'pref_3M' => 'Trimestral',
+ 'pref_6M' => 'Semestral',
+ 'pref_1Y' => 'Um ano',
+ 'pref_languages' => 'Idiomas',
+ 'pref_languages_help' => 'Firefly III suporta muitos idiomas. Qual você prefere?',
+ 'pref_custom_fiscal_year' => 'Configurações de ano fiscal',
+ 'pref_custom_fiscal_year_label' => 'Habilitado',
+ 'pref_custom_fiscal_year_help' => 'Nos países que usam um exercício diferente de 1 de Janeiro a 31 de Dezembro, você pode ativar isto e especificar início / fim do ano fiscal',
+ 'pref_fiscal_year_start_label' => 'Data de início de ano fiscal',
+ 'pref_two_factor_auth' => 'Verificação em duas etapas',
+ 'pref_two_factor_auth_help' => 'Quando você habilitar verificação em 2-passos (também conhecido como Two Factor Authentication), você adicionar uma camada extra de segurança para sua conta. Você entra com alguma coisa que você sabe (sua senha) e algo que você tem (um código de verificação). Os códigos de verificação são gerados por um aplicativo em seu telefone, como Authy ou Google Authenticator.',
+ 'pref_enable_two_factor_auth' => 'Habilitar a verificação de 2 etapas',
+ 'pref_two_factor_auth_disabled' => 'código de verificação em 2 etapas removido e desativado',
+ 'pref_two_factor_auth_remove_it' => 'Não se esqueça de remover a conta de seu aplicativo de autenticação!',
+ 'pref_two_factor_auth_code' => 'Verificar código',
+ 'pref_two_factor_auth_code_help' => 'Scaneie o código QR com um aplicativo em seu telefone como Authy ou Google Authenticator e insira o código gerado.',
+ 'pref_two_factor_auth_reset_code' => 'Redefinir o código de verificação',
+ 'pref_two_factor_auth_disable_2fa' => 'Disable 2FA',
+ 'pref_save_settings' => 'Salvar definições',
+ 'saved_preferences' => 'Preferências salvas!',
+ 'preferences_general' => 'Geral',
+ 'preferences_frontpage' => 'Tela inicial',
+ 'preferences_security' => 'Segurança',
+ 'preferences_layout' => 'Interface',
+ 'pref_home_show_deposits' => 'Depósitos de mostrar na tela inicial',
+ 'pref_home_show_deposits_info' => 'A tela inicial já mostra suas contas de despesas. Deveria também mostrar suas receitas?',
+ 'pref_home_do_show_deposits' => 'Sim, mostrar-lhes',
+ 'successful_count' => 'dos quais :count bem sucedida',
+ 'list_page_size_title' => 'Tamanho da página',
+ 'list_page_size_help' => 'Qualquer lista de coisas (contas, transações, etc.) mostra, no máximo, este tanto por página.',
+ 'list_page_size_label' => 'Tamanho da página',
+ 'between_dates' => '(:start e :end)',
+ 'pref_optional_fields_transaction' => 'Campos opcionais para transações',
+ 'pref_optional_fields_transaction_help' => 'Por padrão, nem todos os campos estão ativados ao criar uma nova transação (por causa da desordem). Abaixo, você pode habilitar esses campos se você acha que eles podem ser úteis para você. Claro, qualquer campo desabilitado, mas já preenchido, será visível, independentemente da configuração.',
+ 'optional_tj_date_fields' => 'Campos de data',
+ 'optional_tj_business_fields' => 'Campos de negócios',
+ 'optional_tj_attachment_fields' => 'Campos de anexo',
+ 'pref_optional_tj_interest_date' => 'Data de interesse',
+ 'pref_optional_tj_book_date' => 'Data reserva',
+ 'pref_optional_tj_process_date' => 'Data de processamento',
+ 'pref_optional_tj_due_date' => 'Data de vencimento',
+ 'pref_optional_tj_payment_date' => 'Data de pagamento',
+ 'pref_optional_tj_invoice_date' => 'Data da Fatura',
+ 'pref_optional_tj_internal_reference' => 'Referência interna',
+ 'pref_optional_tj_notes' => 'Notas',
+ 'pref_optional_tj_attachments' => 'Anexos',
+ 'optional_field_meta_dates' => 'Datas',
+ 'optional_field_meta_business' => 'Negócios',
+ 'optional_field_attachments' => 'Anexos',
+ 'optional_field_meta_data' => 'Meta dados opcionais',
// profile:
- 'change_your_password' => 'Alterar sua senha',
- 'delete_account' => 'Apagar conta',
- 'current_password' => 'Senha atual',
- 'new_password' => 'Nova senha',
- 'new_password_again' => 'Nova senha (novamente)',
- 'delete_your_account' => 'Apagar sua conta',
- 'delete_your_account_help' => 'Excluindo sua conta também vai apagar quaisquer contas, transações, qualquer coisa que você pode ter salvo no Firefly III. Tudo será perdido.',
- 'delete_your_account_password' => 'Coloque sua senha para continuar.',
- 'password' => 'Senha',
- 'are_you_sure' => 'Você tem certeza? Você não poderá desfazer isso.',
- 'delete_account_button' => 'Apagar sua conta',
- 'invalid_current_password' => 'Senha atual inválida!',
- 'password_changed' => 'Senha alterada!',
- 'should_change' => 'A idéia é alterar sua senha.',
- 'invalid_password' => 'Senha inválida!',
- 'what_is_pw_security' => 'O que é "verificar a segurança da senha"?',
- 'secure_pw_title' => 'Como escolher uma senha segura',
- 'secure_pw_history' => 'Em agosto de 2017, a conhecida pesquisadora de segurança Troy Hunt lançou uma lista de 306 milhões de senhas roubadas. Essas senhas foram roubadas durante assalto em empresas como LinkedIn, Adobe e NeoPets (e muito mais).',
- 'secure_pw_check_box' => 'Ao marcar a caixa, o Firefly III enviará o hash SHA1 de sua senha para o site the Troy Hunt para ver se está na lista. Isso irá impedi-lo de usar senhas inseguras, como é recomendado na última publicação NIST Special sobre esse assunto.',
- 'secure_pw_sha1' => 'Mas pensei que SHA1 estava quebrado?',
- 'secure_pw_hash_speed' => 'Sim, mas não neste contexto. Como você pode ler no site , detalhando como eles quebraram SHA1, agora é um pouco mais fácil encontrar uma "colisão": outra seqüência que resulta na mesma marca SHA1-hash. Agora, apenas leva 10.000 anos usando uma máquina de GPU única.',
- 'secure_pw_hash_security' => 'Esta colisão não seria igual à sua senha, nem seria útil em (um site como) o Firefly III. Esta aplicação não usa SHA1 para verificação de senha. Portanto, é seguro marcar esta caixa. Sua senha é hashed e enviada pelo HTTPS.',
- 'secure_pw_should' => 'Devo verificar a caixa?',
- 'secure_pw_long_password' => 'Se você apenas gerou uma senha longa e de uso único para o Firefly III usando algum tipo de gerador de senhas: não.',
- 'secure_pw_short' => 'Se você acabou de inserir a senha que você usa sempre: Por favor, sim.',
- 'command_line_token' => 'Token de linha de comando',
- 'explain_command_line_token' => 'Você precisa desse token para executar opções de linha de comando, como importar ou exportar dados. Sem isso, tais comandos sensíveis não funcionarão. Não compartilhe seu token de acesso. Ninguém pedirá por este token, nem mesmo eu. Se você tem medo de perder isso, ou quando você se preocupar, regenere esse token usando o botão.',
- 'regenerate_command_line_token' => 'Regenerar token de linha de comando',
- 'token_regenerated' => 'Foi gerado um novo token de linha de comando',
- 'change_your_email' => 'Altere seu endereço de email',
- 'email_verification' => 'Uma mensagem de e-mail será enviada para o seu antigo e novo endereço de e-mail. Por motivos de segurança, você não poderá fazer o login até verificar seu novo endereço de e-mail. Se você não tem certeza se a sua instalação do Firefly III é capaz de enviar e-mails, não use esse recurso. Se você é um administrador, você pode testar isso no Administração.',
- 'email_changed_logout' => 'Até que você verifique seu endereço de e-mail, não pode iniciar sessão.',
- 'login_with_new_email' => 'Agora você pode fazer login com seu novo endereço de e-mail.',
- 'login_with_old_email' => 'Agora você pode fazer login novamente com o seu endereço de e-mail antigo.',
+ 'change_your_password' => 'Alterar sua senha',
+ 'delete_account' => 'Apagar conta',
+ 'current_password' => 'Senha atual',
+ 'new_password' => 'Nova senha',
+ 'new_password_again' => 'Nova senha (novamente)',
+ 'delete_your_account' => 'Apagar sua conta',
+ 'delete_your_account_help' => 'Excluindo sua conta também vai apagar quaisquer contas, transações, qualquer coisa que você pode ter salvo no Firefly III. Tudo será perdido.',
+ 'delete_your_account_password' => 'Coloque sua senha para continuar.',
+ 'password' => 'Senha',
+ 'are_you_sure' => 'Você tem certeza? Você não poderá desfazer isso.',
+ 'delete_account_button' => 'Apagar sua conta',
+ 'invalid_current_password' => 'Senha atual inválida!',
+ 'password_changed' => 'Senha alterada!',
+ 'should_change' => 'A idéia é alterar sua senha.',
+ 'invalid_password' => 'Senha inválida!',
+ 'what_is_pw_security' => 'O que é "verificar a segurança da senha"?',
+ 'secure_pw_title' => 'Como escolher uma senha segura',
+ 'secure_pw_history' => 'Em agosto de 2017, a conhecida pesquisadora de segurança Troy Hunt lançou uma lista de 306 milhões de senhas roubadas. Essas senhas foram roubadas durante assalto em empresas como LinkedIn, Adobe e NeoPets (e muito mais).',
+ 'secure_pw_check_box' => 'By checking the box, Firefly III will send the first five characters of 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' => 'Mas pensei que SHA1 estava quebrado?',
+ 'secure_pw_hash_speed' => 'Sim, mas não neste contexto. Como você pode ler no site, detalhando como eles quebraram SHA1, agora é um pouco mais fácil encontrar uma "colisão": outra seqüência que resulta na mesma marca SHA1-hash. Agora, apenas leva 10.000 anos usando uma máquina de GPU única.',
+ '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 only the first five characters of this hash are sent over HTTPS.',
+ 'secure_pw_should' => 'Devo verificar a caixa?',
+ 'secure_pw_long_password' => 'Se você apenas gerou uma senha longa e de uso único para o Firefly III usando algum tipo de gerador de senhas: não.',
+ 'secure_pw_short' => 'Se você acabou de inserir a senha que você usa sempre: Por favor, sim.',
+ 'command_line_token' => 'Token de linha de comando',
+ 'explain_command_line_token' => 'Você precisa desse token para executar opções de linha de comando, como importar ou exportar dados. Sem isso, tais comandos sensíveis não funcionarão. Não compartilhe seu token de acesso. Ninguém pedirá por este token, nem mesmo eu. Se você tem medo de perder isso, ou quando você se preocupar, regenere esse token usando o botão.',
+ 'regenerate_command_line_token' => 'Regenerar token de linha de comando',
+ 'token_regenerated' => 'Foi gerado um novo token de linha de comando',
+ 'change_your_email' => 'Altere seu endereço de email',
+ 'email_verification' => 'Uma mensagem de e-mail será enviada para o seu antigo e novo endereço de e-mail. Por motivos de segurança, você não poderá fazer o login até verificar seu novo endereço de e-mail. Se você não tem certeza se a sua instalação do Firefly III é capaz de enviar e-mails, não use esse recurso. Se você é um administrador, você pode testar isso no Administração.',
+ 'email_changed_logout' => 'Até que você verifique seu endereço de e-mail, não pode iniciar sessão.',
+ 'login_with_new_email' => 'Agora você pode fazer login com seu novo endereço de e-mail.',
+ 'login_with_old_email' => 'Agora você pode fazer login novamente com o seu endereço de e-mail antigo.',
// attachments
- 'nr_of_attachments' => 'Um anexo|:count anexos',
- 'attachments' => 'Anexos',
- 'edit_attachment' => 'Editar anexo ":name"',
- 'update_attachment' => 'Atualizar anexo',
- 'delete_attachment' => 'Apagar anexo ":name"',
- 'attachment_deleted' => 'Anexo apagado ":name"',
- 'attachment_updated' => 'Anexo atualizado ":name"',
- 'upload_max_file_size' => 'Tamanho máximo do arquivo: :size',
+ 'nr_of_attachments' => 'Um anexo|:count anexos',
+ 'attachments' => 'Anexos',
+ 'edit_attachment' => 'Editar anexo ":name"',
+ 'update_attachment' => 'Atualizar anexo',
+ 'delete_attachment' => 'Apagar anexo ":name"',
+ 'attachment_deleted' => 'Anexo apagado ":name"',
+ 'attachment_updated' => 'Anexo atualizado ":name"',
+ 'upload_max_file_size' => 'Tamanho máximo do arquivo: :size',
// transaction index
- 'title_expenses' => 'Despesas',
- 'title_withdrawal' => 'Despesas',
- 'title_revenue' => 'Receitas / Renda',
- 'title_deposit' => 'Receita / Renda',
- 'title_transfer' => 'Transferências',
- 'title_transfers' => 'Transferências',
+ 'title_expenses' => 'Despesas',
+ 'title_withdrawal' => 'Despesas',
+ 'title_revenue' => 'Receitas / Renda',
+ 'title_deposit' => 'Receita / Renda',
+ 'title_transfer' => 'Transferências',
+ 'title_transfers' => 'Transferências',
// convert stuff:
- 'convert_is_already_type_Withdrawal' => 'Esta transação é já uma retirada',
- 'convert_is_already_type_Deposit' => 'Esta operação já é um depósito',
- 'convert_is_already_type_Transfer' => 'Esta transação é já uma transferência',
- 'convert_to_Withdrawal' => 'Converter ":description" a uma retirada',
- 'convert_to_Deposit' => 'Converter ":description" de um depósito',
- 'convert_to_Transfer' => 'Converter ":description" para uma transferência',
- 'convert_options_WithdrawalDeposit' => 'Converter uma retirada em um depósito',
- 'convert_options_WithdrawalTransfer' => 'Converter uma retirada em uma transferência',
- 'convert_options_DepositTransfer' => 'Converter um depósito em uma transferência',
- 'convert_options_DepositWithdrawal' => 'Converter um depósito em uma retirada',
- 'convert_options_TransferWithdrawal' => 'Converter uma transferência em uma retirada',
- 'convert_options_TransferDeposit' => 'Converter uma transferência em um depósito',
- 'convert_Withdrawal_to_deposit' => 'Converter esta retirada de um depósito',
- 'convert_Withdrawal_to_transfer' => 'Converter esta retirada para uma transferência',
- 'convert_Deposit_to_withdrawal' => 'Converter este depósito para uma retirada',
- 'convert_Deposit_to_transfer' => 'Converter este depósito para uma transferência',
- 'convert_Transfer_to_deposit' => 'Converter esta transferência para um depósito',
- 'convert_Transfer_to_withdrawal' => 'Converter esta transferência a uma retirada',
- 'convert_please_set_revenue_source' => 'Por favor, escolha a conta de receitas de onde virá o dinheiro.',
- 'convert_please_set_asset_destination' => 'Por favor, escolha a conta de ativo para onde vai o dinheiro.',
- 'convert_please_set_expense_destination' => 'Por favor, escolha a conta de despesas para onde o dinheiro vai.',
- 'convert_please_set_asset_source' => 'Por favor, escolha a conta de ativo, de onde virá o dinheiro.',
- 'convert_explanation_withdrawal_deposit' => 'Se você converter esta retirada em um depósito, :amount será depositado em :sourceName em vez de retirado dele.',
- 'convert_explanation_withdrawal_transfer' => 'Se você converter esta retirada em uma transferência, :amount será transferido de :sourceName para uma nova conta ativa, em vez de ser pago para :destinationName.',
- 'convert_explanation_deposit_withdrawal' => 'Se você converter este depósito em uma retirada, :amount será removido de :destinationName em vez de adicionado a ele.',
- 'convert_explanation_deposit_transfer' => 'Se você converter esse depósito em uma transferência, :amount será transferido de uma conta ativa de sua escolha para :destinationName.',
- 'convert_explanation_transfer_withdrawal' => 'Se você converter essa transferência para uma retirada, :amount passará de :sourceName para um novo destino como despesa, em vez de :destinationName como transferência.',
- 'convert_explanation_transfer_deposit' => 'Se você converter esta transferência para um depósito, :amount será depositado na conta :destinationName em vez de ser transferido para lá.',
- 'converted_to_Withdrawal' => 'A transação foi convertida em uma retirada',
- 'converted_to_Deposit' => 'A transação foi convertida em depósito',
- 'converted_to_Transfer' => 'A transação foi convertida em uma transferência',
- 'invalid_convert_selection' => 'A conta que você selecionou já é usada nesta transação ou não existe.',
+ 'convert_is_already_type_Withdrawal' => 'Esta transação é já uma retirada',
+ 'convert_is_already_type_Deposit' => 'Esta operação já é um depósito',
+ 'convert_is_already_type_Transfer' => 'Esta transação é já uma transferência',
+ 'convert_to_Withdrawal' => 'Converter ":description" a uma retirada',
+ 'convert_to_Deposit' => 'Converter ":description" de um depósito',
+ 'convert_to_Transfer' => 'Converter ":description" para uma transferência',
+ 'convert_options_WithdrawalDeposit' => 'Converter uma retirada em um depósito',
+ 'convert_options_WithdrawalTransfer' => 'Converter uma retirada em uma transferência',
+ 'convert_options_DepositTransfer' => 'Converter um depósito em uma transferência',
+ 'convert_options_DepositWithdrawal' => 'Converter um depósito em uma retirada',
+ 'convert_options_TransferWithdrawal' => 'Converter uma transferência em uma retirada',
+ 'convert_options_TransferDeposit' => 'Converter uma transferência em um depósito',
+ 'convert_Withdrawal_to_deposit' => 'Converter esta retirada de um depósito',
+ 'convert_Withdrawal_to_transfer' => 'Converter esta retirada para uma transferência',
+ 'convert_Deposit_to_withdrawal' => 'Converter este depósito para uma retirada',
+ 'convert_Deposit_to_transfer' => 'Converter este depósito para uma transferência',
+ 'convert_Transfer_to_deposit' => 'Converter esta transferência para um depósito',
+ 'convert_Transfer_to_withdrawal' => 'Converter esta transferência a uma retirada',
+ 'convert_please_set_revenue_source' => 'Por favor, escolha a conta de receitas de onde virá o dinheiro.',
+ 'convert_please_set_asset_destination' => 'Por favor, escolha a conta de ativo para onde vai o dinheiro.',
+ 'convert_please_set_expense_destination' => 'Por favor, escolha a conta de despesas para onde o dinheiro vai.',
+ 'convert_please_set_asset_source' => 'Por favor, escolha a conta de ativo, de onde virá o dinheiro.',
+ 'convert_explanation_withdrawal_deposit' => 'Se você converter esta retirada em um depósito, :amount será depositado em :sourceName em vez de retirado dele.',
+ 'convert_explanation_withdrawal_transfer' => 'Se você converter esta retirada em uma transferência, :amount será transferido de :sourceName para uma nova conta ativa, em vez de ser pago para :destinationName.',
+ 'convert_explanation_deposit_withdrawal' => 'Se você converter este depósito em uma retirada, :amount será removido de :destinationName em vez de adicionado a ele.',
+ 'convert_explanation_deposit_transfer' => 'Se você converter esse depósito em uma transferência, :amount será transferido de uma conta ativa de sua escolha para :destinationName.',
+ 'convert_explanation_transfer_withdrawal' => 'Se você converter essa transferência para uma retirada, :amount passará de :sourceName para um novo destino como despesa, em vez de :destinationName como transferência.',
+ 'convert_explanation_transfer_deposit' => 'Se você converter esta transferência para um depósito, :amount será depositado na conta :destinationName em vez de ser transferido para lá.',
+ 'converted_to_Withdrawal' => 'A transação foi convertida em uma retirada',
+ 'converted_to_Deposit' => 'A transação foi convertida em depósito',
+ 'converted_to_Transfer' => 'A transação foi convertida em uma transferência',
+ 'invalid_convert_selection' => 'A conta que você selecionou já é usada nesta transação ou não existe.',
// create new stuff:
- 'create_new_withdrawal' => 'Criar nova retirada',
- 'create_new_deposit' => 'Criar um novo depósito',
- 'create_new_transfer' => 'Criar nova transferência',
- 'create_new_asset' => 'Criar nova conta de ativo',
- 'create_new_expense' => 'Criar nova conta de despesa',
- 'create_new_revenue' => 'Criar nova conta de receita',
- 'create_new_piggy_bank' => 'Criar novo cofrinho',
- 'create_new_bill' => 'Criar nova fatura',
+ 'create_new_withdrawal' => 'Criar nova retirada',
+ 'create_new_deposit' => 'Criar um novo depósito',
+ 'create_new_transfer' => 'Criar nova transferência',
+ 'create_new_asset' => 'Criar nova conta de ativo',
+ 'create_new_expense' => 'Criar nova conta de despesa',
+ 'create_new_revenue' => 'Criar nova conta de receita',
+ 'create_new_piggy_bank' => 'Criar novo cofrinho',
+ 'create_new_bill' => 'Criar nova fatura',
// currencies:
- 'create_currency' => 'Criar uma nova moeda',
- 'store_currency' => 'Armazenar nova moeda',
- 'update_currency' => 'Atualizar moeda',
- 'new_default_currency' => 'Agora :name é a moeda padrão.',
- 'cannot_delete_currency' => 'Não é possível excluir :name porque ainda está em uso.',
- 'deleted_currency' => 'Moeda :name excluída',
- 'created_currency' => 'Moeda :name criada',
- 'updated_currency' => 'Moeda :name atualizada',
- 'ask_site_owner' => 'Por favor, pergunte ao :owner para adicionar, remover ou editar moedas.',
- 'currencies_intro' => 'Firefly III oferece suporte a várias moedas que você pode definir e ativar aqui.',
- 'make_default_currency' => 'tornar padrão',
- 'default_currency' => 'padrão',
+ 'create_currency' => 'Criar uma nova moeda',
+ 'store_currency' => 'Armazenar nova moeda',
+ 'update_currency' => 'Atualizar moeda',
+ 'new_default_currency' => 'Agora :name é a moeda padrão.',
+ 'cannot_delete_currency' => 'Não é possível excluir :name porque ainda está em uso.',
+ 'deleted_currency' => 'Moeda :name excluída',
+ 'created_currency' => 'Moeda :name criada',
+ 'updated_currency' => 'Moeda :name atualizada',
+ 'ask_site_owner' => 'Por favor, pergunte ao :owner para adicionar, remover ou editar moedas.',
+ 'currencies_intro' => 'Firefly III oferece suporte a várias moedas que você pode definir e ativar aqui.',
+ 'make_default_currency' => 'tornar padrão',
+ 'default_currency' => 'padrão',
// forms:
- 'mandatoryFields' => 'Campos obrigatórios',
- 'optionalFields' => 'Campos opcionais',
- 'options' => 'Opções',
+ 'mandatoryFields' => 'Campos obrigatórios',
+ 'optionalFields' => 'Campos opcionais',
+ 'options' => 'Opções',
// budgets:
- 'create_new_budget' => 'Criar um novo orçamento',
- 'store_new_budget' => 'Armazenar novo orçamento',
- 'stored_new_budget' => 'Novo orçamento armazenado ":name"',
- 'available_between' => 'Disponível entre :start e :end',
- 'transactionsWithoutBudget' => 'Despesas sem orçamentos',
- 'transactions_no_budget' => 'Despesas sem orçamento entre :start e :end',
- 'spent_between' => 'Gasto entre :start e :end',
- 'createBudget' => 'Novo orçamento',
- 'inactiveBudgets' => 'Orçamentos inativos',
- 'without_budget_between' => 'Transações sem um orçamento entre :start e :end',
- 'delete_budget' => 'Excluir orçamento ":name"',
- 'deleted_budget' => 'Orçamento ":name" excluído',
- 'edit_budget' => 'Editar orçamento ":name"',
- 'updated_budget' => 'Orçamento atualizado ":name"',
- 'update_amount' => 'Atualizar quantia',
- 'update_budget' => 'Atualizar Orçamento',
- 'update_budget_amount_range' => 'Atualizar quantia disponível (esperada) entre :start e :end',
- 'budget_period_navigator' => 'Navegador do período',
- 'info_on_available_amount' => 'O que tenho disponível?',
- 'available_amount_indication' => 'Use esses montantes para obter uma indicação do que seu orçamento total poderia ser.',
- 'suggested' => 'Sugerido',
- 'average_between' => 'Média entre :start e :end',
+ 'create_new_budget' => 'Criar um novo orçamento',
+ 'store_new_budget' => 'Armazenar novo orçamento',
+ 'stored_new_budget' => 'Novo orçamento armazenado ":name"',
+ 'available_between' => 'Disponível entre :start e :end',
+ 'transactionsWithoutBudget' => 'Despesas sem orçamentos',
+ 'transactions_no_budget' => 'Despesas sem orçamento entre :start e :end',
+ 'spent_between' => 'Gasto entre :start e :end',
+ 'createBudget' => 'Novo orçamento',
+ 'inactiveBudgets' => 'Orçamentos inativos',
+ 'without_budget_between' => 'Transações sem um orçamento entre :start e :end',
+ 'delete_budget' => 'Excluir orçamento ":name"',
+ 'deleted_budget' => 'Orçamento ":name" excluído',
+ 'edit_budget' => 'Editar orçamento ":name"',
+ 'updated_budget' => 'Orçamento atualizado ":name"',
+ 'update_amount' => 'Atualizar quantia',
+ 'update_budget' => 'Atualizar Orçamento',
+ 'update_budget_amount_range' => 'Atualizar quantia disponível (esperada) entre :start e :end',
+ 'budget_period_navigator' => 'Navegador do período',
+ 'info_on_available_amount' => 'O que tenho disponível?',
+ 'available_amount_indication' => 'Use esses montantes para obter uma indicação do que seu orçamento total poderia ser.',
+ 'suggested' => 'Sugerido',
+ 'average_between' => 'Média entre :start e :end',
+ 'over_budget_warn' => ' Normally you budget about :amount per day. This is :over_amount per day.',
// bills:
- 'matching_on' => 'Corresponde em',
- 'between_amounts' => 'entre :low e :high.',
- 'repeats' => 'Repetições',
- 'connected_journals' => 'Transações conectadas',
- 'auto_match_on' => 'Automaticamente correspondente com Firefly III',
- 'auto_match_off' => 'Não corresponde automaticamente com Firefly III',
- 'next_expected_match' => 'Próximo correspondente esperado',
- 'delete_bill' => 'Apagar fatura ":name"',
- 'deleted_bill' => 'Fatura apagada ":name"',
- 'edit_bill' => 'Editar fatura ":name"',
- 'more' => 'Mais',
- 'rescan_old' => 'Examinar novamente o transações antigas',
- 'update_bill' => 'Atualizar fatura',
- 'updated_bill' => 'Fatura atualizada ":name"',
- 'store_new_bill' => 'Armazenar nova fatura',
- 'stored_new_bill' => 'Nova fatura armazenada ":name"',
- 'cannot_scan_inactive_bill' => 'Faturas inativas não podem ser verificadas.',
- 'rescanned_bill' => 'Tudo examinado novamente.',
- 'average_bill_amount_year' => 'Média de fatura (:year)',
- 'average_bill_amount_overall' => 'Média de fatura (geral)',
- 'bill_is_active' => 'Fatura está ativa',
- 'bill_expected_between' => 'Esperado entre :start e :end',
- 'bill_will_automatch' => 'A fatura será automaticamente vinculada a transações correspondentes',
- 'skips_over' => 'ignorar',
-
+ 'matching_on' => 'Corresponde em',
+ 'between_amounts' => 'entre :low e :high.',
+ 'repeats' => 'Repetições',
+ 'connected_journals' => 'Transações conectadas',
+ 'auto_match_on' => 'Automaticamente correspondente com Firefly III',
+ 'auto_match_off' => 'Não corresponde automaticamente com Firefly III',
+ 'next_expected_match' => 'Próximo correspondente esperado',
+ 'delete_bill' => 'Apagar fatura ":name"',
+ 'deleted_bill' => 'Fatura apagada ":name"',
+ 'edit_bill' => 'Editar fatura ":name"',
+ 'more' => 'Mais',
+ 'rescan_old' => 'Examinar novamente o transações antigas',
+ 'update_bill' => 'Atualizar fatura',
+ 'updated_bill' => 'Fatura atualizada ":name"',
+ 'store_new_bill' => 'Armazenar nova fatura',
+ 'stored_new_bill' => 'Nova fatura armazenada ":name"',
+ 'cannot_scan_inactive_bill' => 'Faturas inativas não podem ser verificadas.',
+ 'rescanned_bill' => 'Tudo examinado novamente.',
+ 'average_bill_amount_year' => 'Média de fatura (:year)',
+ 'average_bill_amount_overall' => 'Média de fatura (geral)',
+ 'bill_is_active' => 'Fatura está ativa',
+ 'bill_expected_between' => 'Esperado entre :start e :end',
+ 'bill_will_automatch' => 'A fatura será automaticamente vinculada a transações correspondentes',
+ 'skips_over' => 'ignorar',
// accounts:
- 'details_for_asset' => 'Detalhes para a conta de ativo ":name"',
- 'details_for_expense' => 'Detalhes para a conta de despesas ":name"',
- 'details_for_revenue' => 'Detalhes para a conta de receitas ":name"',
- 'details_for_cash' => 'Detalhes para a conta de dinheiro ":name"',
- 'store_new_asset_account' => 'Armazenar nova conta de ativo',
- 'store_new_expense_account' => 'Armazenar nova conta de despesa',
- 'store_new_revenue_account' => 'Armazenar nova conta de receita',
- 'edit_asset_account' => 'Editar conta de ativo ":name"',
- 'edit_expense_account' => 'Editar conta de despesa ":name"',
- 'edit_revenue_account' => 'Editar conta de receitas ":name"',
- 'delete_asset_account' => 'Excluir conta do activo ":name"',
- 'delete_expense_account' => 'Excluir conta de despesas ":name"',
- 'delete_revenue_account' => 'Excluir conta de receitas ":name"',
- 'asset_deleted' => 'Conta de ativo ":name" excluído com sucesso',
- 'expense_deleted' => 'Conta de despesa ":name" excluída com sucesso',
- 'revenue_deleted' => 'Conta de receitas ":name" excluída com sucesso',
- 'update_asset_account' => 'Atualizar de conta de ativo',
- 'update_expense_account' => 'Atualizar conta de despesas',
- 'update_revenue_account' => 'Atualizar conta de receita',
- 'make_new_asset_account' => 'Criar uma nova conta de ativo',
- 'make_new_expense_account' => 'Criar uma nova conta de despesa',
- 'make_new_revenue_account' => 'Criar uma nova conta de receita',
- 'asset_accounts' => 'Contas de ativo',
- 'expense_accounts' => 'Contas de despesas',
- 'revenue_accounts' => 'Contas de receitas',
- 'cash_accounts' => 'Contas Correntes',
- 'Cash account' => 'Conta Corrente',
- 'reconcile_account' => 'Reconciliar conta ":account"',
- 'delete_reconciliation' => 'Eliminar reconciliação',
- 'update_reconciliation' => 'Atualizar a reconciliação',
- 'amount_cannot_be_zero' => 'O valor não pode ser zero',
- 'end_of_reconcile_period' => 'Período de fim de reconciliação: :period',
- 'start_of_reconcile_period' => 'Início do período de reconciliação: :period',
- 'start_balance' => 'Saldo Inicial',
- 'end_balance' => 'Saldo Final',
- 'update_balance_dates_instruction' => 'Corresponda os valores e datas acima do seu extracto bancário e pressione "Começar reconciliar"',
- 'select_transactions_instruction' => 'Selecione as transações que aparecem no extrato bancário.',
- 'select_range_and_balance' => 'Primeiro, verifique o intervalo de datas e os saldos. Em seguida, pressione "Iniciar reconciliação"',
- 'date_change_instruction' => 'Se você alterar o intervalo de datas agora, qualquer progresso será perdido.',
- 'update_selection' => 'Atualizar seleção',
- 'store_reconcile' => 'Armazenar reconciliação',
- 'reconciliation_transaction' => 'Transação de reconciliação',
- 'Reconciliation' => 'Reconciliação',
- 'reconciliation' => 'Reconciliação',
- 'reconcile_options' => 'Opções de reconciliação',
- 'reconcile_range' => 'Intervalo de reconciliação',
- 'start_reconcile' => 'Comece a reconciliar',
- 'cash' => 'dinheiro',
- 'account_type' => 'Tipo de conta',
- 'save_transactions_by_moving' => 'Salve essas transações, movendo-os para outra conta:',
- 'stored_new_account' => 'Nova conta ":name" armazenado!',
- 'updated_account' => 'Conta ":name" atualizada',
- 'credit_card_options' => 'Opções de cartão de crédito',
- 'no_transactions_account' => 'Não há transações (neste período) para a conta ativa ":name".',
- 'no_data_for_chart' => 'Não há informações suficientes (ainda) para gerar este gráfico.',
- 'select_more_than_one_account' => 'Por favor, selecione mais de uma conta',
- 'select_more_than_one_category' => 'Por favor, selecione mais de uma categoria',
- 'select_more_than_one_budget' => 'Por favor, selecione mais de um orçamento',
- 'select_more_than_one_tag' => 'Por favor, selecione mais de uma tag',
- 'account_default_currency' => 'Se você selecionar outra moeda, as novas transações desta conta terão essa moeda pré-selecionada.',
- 'reconcile_has_more' => 'Seu registro do Firefly III tem mais dinheiro nele do que o seu banco afirma que você deveria ter. Existem várias opções. Escolha o que fazer. Em seguida, pressione "Confirmar reconciliação".',
- 'reconcile_has_less' => 'Seu registro do Firefly III tem menos dinheiro nele do que o seu banco afirma que você deveria ter. Existem várias opções. Escolha o que fazer. Em seguida, pressione "Confirmar reconciliação".',
- 'reconcile_is_equal' => 'Seu registro do Firefly III e seus registros bancários combinam. Não há nada a se fazer. Pressione "Confirmar reconciliação" para confirmar sua entrada.',
- 'create_pos_reconcile_transaction' => 'Desmarque as transações selecionadas e, em seguida, crie uma correção adicionando :amount para esta conta ativa.',
- 'create_neg_reconcile_transaction' => 'Desmarque as transações selecionadas e, em seguida, crie uma correção removendo :amount para esta conta ativa.',
- 'reconcile_do_nothing' => 'Desmarcar as transações selecionadas, mas não corrigir.',
- 'reconcile_go_back' => 'Você sempre pode editar ou excluir uma correção mais tarde.',
- 'must_be_asset_account' => 'Você só pode conciliar contas de ativos',
- 'reconciliation_stored' => 'Reconciliação armazenada',
- 'reconcilliation_transaction_title' => 'Reconciliação (:from a :to)',
- 'reconcile_this_account' => 'Concilie esta conta',
- 'confirm_reconciliation' => 'Confirmar reconciliação',
- 'submitted_start_balance' => 'Saldo inicial enviado',
- 'selected_transactions' => 'Transações selecionadas (:count)',
- 'already_cleared_transactions' => 'Transações já removidas (:count)',
- 'submitted_end_balance' => 'Saldo final enviado',
- 'initial_balance_description' => 'Saldo inicial para ":account"',
+ 'details_for_asset' => 'Detalhes para a conta de ativo ":name"',
+ 'details_for_expense' => 'Detalhes para a conta de despesas ":name"',
+ 'details_for_revenue' => 'Detalhes para a conta de receitas ":name"',
+ 'details_for_cash' => 'Detalhes para a conta de dinheiro ":name"',
+ 'store_new_asset_account' => 'Armazenar nova conta de ativo',
+ 'store_new_expense_account' => 'Armazenar nova conta de despesa',
+ 'store_new_revenue_account' => 'Armazenar nova conta de receita',
+ 'edit_asset_account' => 'Editar conta de ativo ":name"',
+ 'edit_expense_account' => 'Editar conta de despesa ":name"',
+ 'edit_revenue_account' => 'Editar conta de receitas ":name"',
+ 'delete_asset_account' => 'Excluir conta do activo ":name"',
+ 'delete_expense_account' => 'Excluir conta de despesas ":name"',
+ 'delete_revenue_account' => 'Excluir conta de receitas ":name"',
+ 'asset_deleted' => 'Conta de ativo ":name" excluído com sucesso',
+ 'expense_deleted' => 'Conta de despesa ":name" excluída com sucesso',
+ 'revenue_deleted' => 'Conta de receitas ":name" excluída com sucesso',
+ 'update_asset_account' => 'Atualizar de conta de ativo',
+ 'update_expense_account' => 'Atualizar conta de despesas',
+ 'update_revenue_account' => 'Atualizar conta de receita',
+ 'make_new_asset_account' => 'Criar uma nova conta de ativo',
+ 'make_new_expense_account' => 'Criar uma nova conta de despesa',
+ 'make_new_revenue_account' => 'Criar uma nova conta de receita',
+ 'asset_accounts' => 'Contas de ativo',
+ 'expense_accounts' => 'Contas de despesas',
+ 'revenue_accounts' => 'Contas de receitas',
+ 'cash_accounts' => 'Contas Correntes',
+ 'Cash account' => 'Conta Corrente',
+ 'reconcile_account' => 'Reconciliar conta ":account"',
+ 'delete_reconciliation' => 'Eliminar reconciliação',
+ 'update_reconciliation' => 'Atualizar a reconciliação',
+ 'amount_cannot_be_zero' => 'O valor não pode ser zero',
+ 'end_of_reconcile_period' => 'Período de fim de reconciliação: :period',
+ 'start_of_reconcile_period' => 'Início do período de reconciliação: :period',
+ 'start_balance' => 'Saldo Inicial',
+ 'end_balance' => 'Saldo Final',
+ 'update_balance_dates_instruction' => 'Corresponda os valores e datas acima do seu extracto bancário e pressione "Começar reconciliar"',
+ 'select_transactions_instruction' => 'Selecione as transações que aparecem no extrato bancário.',
+ 'select_range_and_balance' => 'Primeiro, verifique o intervalo de datas e os saldos. Em seguida, pressione "Iniciar reconciliação"',
+ 'date_change_instruction' => 'Se você alterar o intervalo de datas agora, qualquer progresso será perdido.',
+ 'update_selection' => 'Atualizar seleção',
+ 'store_reconcile' => 'Armazenar reconciliação',
+ 'reconciliation_transaction' => 'Transação de reconciliação',
+ 'Reconciliation' => 'Reconciliação',
+ 'reconciliation' => 'Reconciliação',
+ 'reconcile_options' => 'Opções de reconciliação',
+ 'reconcile_range' => 'Intervalo de reconciliação',
+ 'start_reconcile' => 'Comece a reconciliar',
+ 'cash' => 'dinheiro',
+ 'account_type' => 'Tipo de conta',
+ 'save_transactions_by_moving' => 'Salve essas transações, movendo-os para outra conta:',
+ 'stored_new_account' => 'Nova conta ":name" armazenado!',
+ 'updated_account' => 'Conta ":name" atualizada',
+ 'credit_card_options' => 'Opções de cartão de crédito',
+ 'no_transactions_account' => 'Não há transações (neste período) para a conta ativa ":name".',
+ 'no_data_for_chart' => 'Não há informações suficientes (ainda) para gerar este gráfico.',
+ 'select_more_than_one_account' => 'Por favor, selecione mais de uma conta',
+ 'select_more_than_one_category' => 'Por favor, selecione mais de uma categoria',
+ 'select_more_than_one_budget' => 'Por favor, selecione mais de um orçamento',
+ 'select_more_than_one_tag' => 'Por favor, selecione mais de uma tag',
+ 'account_default_currency' => 'Se você selecionar outra moeda, as novas transações desta conta terão essa moeda pré-selecionada.',
+ 'reconcile_has_more' => 'Seu registro do Firefly III tem mais dinheiro nele do que o seu banco afirma que você deveria ter. Existem várias opções. Escolha o que fazer. Em seguida, pressione "Confirmar reconciliação".',
+ 'reconcile_has_less' => 'Seu registro do Firefly III tem menos dinheiro nele do que o seu banco afirma que você deveria ter. Existem várias opções. Escolha o que fazer. Em seguida, pressione "Confirmar reconciliação".',
+ 'reconcile_is_equal' => 'Seu registro do Firefly III e seus registros bancários combinam. Não há nada a se fazer. Pressione "Confirmar reconciliação" para confirmar sua entrada.',
+ 'create_pos_reconcile_transaction' => 'Desmarque as transações selecionadas e, em seguida, crie uma correção adicionando :amount para esta conta ativa.',
+ 'create_neg_reconcile_transaction' => 'Desmarque as transações selecionadas e, em seguida, crie uma correção removendo :amount para esta conta ativa.',
+ 'reconcile_do_nothing' => 'Desmarcar as transações selecionadas, mas não corrigir.',
+ 'reconcile_go_back' => 'Você sempre pode editar ou excluir uma correção mais tarde.',
+ 'must_be_asset_account' => 'Você só pode conciliar contas de ativos',
+ 'reconciliation_stored' => 'Reconciliação armazenada',
+ 'reconcilliation_transaction_title' => 'Reconciliação (:from a :to)',
+ 'reconcile_this_account' => 'Concilie esta conta',
+ 'confirm_reconciliation' => 'Confirmar reconciliação',
+ 'submitted_start_balance' => 'Saldo inicial enviado',
+ 'selected_transactions' => 'Transações selecionadas (:count)',
+ 'already_cleared_transactions' => 'Transações já removidas (:count)',
+ 'submitted_end_balance' => 'Saldo final enviado',
+ 'initial_balance_description' => 'Saldo inicial para ":account"',
// categories:
- 'new_category' => 'Nova categoria',
- 'create_new_category' => 'Criar uma nova categoria',
- 'without_category' => 'Sem uma categoria',
- 'update_category' => 'Atualizar Categoria',
- 'updated_category' => 'Atualizado categoria ":name"',
- 'categories' => 'Categorias',
- 'edit_category' => 'Editar categoria ":name"',
- 'no_category' => '(sem categoria)',
- 'category' => 'Categoria',
- 'delete_category' => 'Excluir categoria ":name"',
- 'deleted_category' => 'Categoria ":name" excluída',
- 'store_category' => 'Armazenar nova categoria',
- 'stored_category' => 'Armazenada nova categoria ":name"',
- 'without_category_between' => 'Sem categoria entre :start e :end',
+ 'new_category' => 'Nova categoria',
+ 'create_new_category' => 'Criar uma nova categoria',
+ 'without_category' => 'Sem uma categoria',
+ 'update_category' => 'Atualizar Categoria',
+ 'updated_category' => 'Atualizado categoria ":name"',
+ 'categories' => 'Categorias',
+ 'edit_category' => 'Editar categoria ":name"',
+ 'no_category' => '(sem categoria)',
+ 'category' => 'Categoria',
+ 'delete_category' => 'Excluir categoria ":name"',
+ 'deleted_category' => 'Categoria ":name" excluída',
+ 'store_category' => 'Armazenar nova categoria',
+ 'stored_category' => 'Armazenada nova categoria ":name"',
+ 'without_category_between' => 'Sem categoria entre :start e :end',
// transactions:
- 'update_withdrawal' => 'Atualizar retirada',
- 'update_deposit' => 'Atualizar de depósito',
- 'update_transfer' => 'Atualizar transferência',
- 'updated_withdrawal' => 'Retirada Atualizada ":description"',
- 'updated_deposit' => 'Depósito atualizado ":description"',
- 'updated_transfer' => 'Transferência atualizada ":description"',
- 'delete_withdrawal' => 'Excluir a retirada ":description"',
- 'delete_deposit' => 'Apagar depósito ":description"',
- 'delete_transfer' => 'Apagar transferência ":description"',
- 'deleted_withdrawal' => 'Retirada ":description" excluída com sucesso',
- 'deleted_deposit' => 'Depósito ":description" excluído com sucesso',
- 'deleted_transfer' => 'Transferência ":description" excluída com sucesso',
- 'stored_journal' => 'Transação ":description" excluída com sucesso',
- 'select_transactions' => 'Selecione as transações',
- 'rule_group_select_transactions' => 'Aplicar ":title" às transações',
- 'rule_select_transactions' => 'Aplicar ":title" às transações',
- 'stop_selection' => 'Parar de selecionar transações',
- 'reconcile_selected' => 'Reconciliar',
- 'mass_delete_journals' => 'Excluir um número de transacções',
- 'mass_edit_journals' => 'Editar um número de transacções',
- 'mass_bulk_journals' => 'Editar um grande número de transações',
- 'mass_bulk_journals_explain' => 'Se você não quer mudar suas transações uma a uma, usando a função de edição em massa, você pode atualizá-los de uma só vez. Basta selecionar a categoria, tag(s) ou orçamento preferidos nos campos abaixo e todas as transações na tabela serão atualizadas.',
- 'bulk_set_new_values' => 'Use as entradas abaixo para definir novos valores. Se você deixá-los vazios, eles serão feitos vazios para todos. Além disso, note que apenas as retiradas receberão um orçamento.',
- 'no_bulk_category' => 'Não atualize a categoria',
- 'no_bulk_budget' => 'Não atualize o orçamento',
- 'no_bulk_tags' => 'Não atualize a(s) tag(s)',
- 'bulk_edit' => 'Editar vários',
- 'cannot_edit_other_fields' => 'Você não pode editar em massa outros campos que não esse aqui, porque não há espaço para mostrá-los. Por favor siga o link e editá-los por um por um, se você precisar editar esses campos.',
- 'no_budget' => '(sem orçamento)',
- 'no_budget_squared' => '(sem orçamento)',
- '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' => '(sem o tipo de conta)',
- 'opt_group_defaultAsset' => 'Contas padrão',
- 'opt_group_savingAsset' => 'Contas de poupança',
- 'opt_group_sharedAsset' => 'Contas de ativos compartilhadas',
- 'opt_group_ccAsset' => 'Cartões de crédito',
- 'notes' => 'Notas',
+ 'update_withdrawal' => 'Atualizar retirada',
+ 'update_deposit' => 'Atualizar de depósito',
+ 'update_transfer' => 'Atualizar transferência',
+ 'updated_withdrawal' => 'Retirada Atualizada ":description"',
+ 'updated_deposit' => 'Depósito atualizado ":description"',
+ 'updated_transfer' => 'Transferência atualizada ":description"',
+ 'delete_withdrawal' => 'Excluir a retirada ":description"',
+ 'delete_deposit' => 'Apagar depósito ":description"',
+ 'delete_transfer' => 'Apagar transferência ":description"',
+ 'deleted_withdrawal' => 'Retirada ":description" excluída com sucesso',
+ 'deleted_deposit' => 'Depósito ":description" excluído com sucesso',
+ 'deleted_transfer' => 'Transferência ":description" excluída com sucesso',
+ 'stored_journal' => 'Transação ":description" excluída com sucesso',
+ 'select_transactions' => 'Selecione as transações',
+ 'rule_group_select_transactions' => 'Aplicar ":title" às transações',
+ 'rule_select_transactions' => 'Aplicar ":title" às transações',
+ 'stop_selection' => 'Parar de selecionar transações',
+ 'reconcile_selected' => 'Reconciliar',
+ 'mass_delete_journals' => 'Excluir um número de transacções',
+ 'mass_edit_journals' => 'Editar um número de transacções',
+ 'mass_bulk_journals' => 'Editar um grande número de transações',
+ 'mass_bulk_journals_explain' => 'Se você não quer mudar suas transações uma a uma, usando a função de edição em massa, você pode atualizá-los de uma só vez. Basta selecionar a categoria, tag(s) ou orçamento preferidos nos campos abaixo e todas as transações na tabela serão atualizadas.',
+ 'bulk_set_new_values' => 'Use as entradas abaixo para definir novos valores. Se você deixá-los vazios, eles serão feitos vazios para todos. Além disso, note que apenas as retiradas receberão um orçamento.',
+ 'no_bulk_category' => 'Não atualize a categoria',
+ 'no_bulk_budget' => 'Não atualize o orçamento',
+ 'no_bulk_tags' => 'Não atualize a(s) tag(s)',
+ 'bulk_edit' => 'Editar vários',
+ 'cannot_edit_other_fields' => 'Você não pode editar em massa outros campos que não esse aqui, porque não há espaço para mostrá-los. Por favor siga o link e editá-los por um por um, se você precisar editar esses campos.',
+ 'no_budget' => '(sem orçamento)',
+ 'no_budget_squared' => '(sem orçamento)',
+ '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' => '(sem o tipo de conta)',
+ 'opt_group_defaultAsset' => 'Contas padrão',
+ 'opt_group_savingAsset' => 'Contas de poupança',
+ 'opt_group_sharedAsset' => 'Contas de ativos compartilhadas',
+ 'opt_group_ccAsset' => 'Cartões de crédito',
+ 'notes' => 'Notas',
// new user:
- 'welcome' => 'Bem Vindo ao Firefly III!',
- 'submit' => 'Enviar',
- 'getting_started' => 'Iniciar',
- 'to_get_started' => 'É bom ver que você instalou o Firefly III com sucesso. Para começar com esta ferramenta, insira o nome do banco e o saldo da sua principal conta corrente. Não se preocupe ainda se você tiver várias contas. Você pode adicionar aqueles mais tarde. É só que o Firefly III precisa de algo para começar.',
- 'savings_balance_text' => 'O Firefly III criará automaticamente uma conta de poupança para você. Por padrão, não haverá dinheiro na sua conta de poupança, mas se você contar o saldo ao Firefly III, ele será armazenado como tal.',
- 'finish_up_new_user' => 'É isso aí! Você pode continuar pressionando Enviar. Você será levado ao índice de Firefly III.',
- 'stored_new_accounts_new_user' => 'Yay! Suas novas contas foram armazenadas.',
+ 'welcome' => 'Bem Vindo ao Firefly III!',
+ 'submit' => 'Enviar',
+ 'getting_started' => 'Iniciar',
+ 'to_get_started' => 'É bom ver que você instalou o Firefly III com sucesso. Para começar com esta ferramenta, insira o nome do banco e o saldo da sua principal conta corrente. Não se preocupe ainda se você tiver várias contas. Você pode adicionar aqueles mais tarde. É só que o Firefly III precisa de algo para começar.',
+ 'savings_balance_text' => 'O Firefly III criará automaticamente uma conta de poupança para você. Por padrão, não haverá dinheiro na sua conta de poupança, mas se você contar o saldo ao Firefly III, ele será armazenado como tal.',
+ 'finish_up_new_user' => 'É isso aí! Você pode continuar pressionando Enviar. Você será levado ao índice de Firefly III.',
+ 'stored_new_accounts_new_user' => 'Yay! Suas novas contas foram armazenadas.',
// home page:
- 'yourAccounts' => 'Suas contas',
- 'budgetsAndSpending' => 'Orçamentos e despesas',
- 'savings' => 'Poupanças',
- 'newWithdrawal' => 'Nova despesa',
- 'newDeposit' => 'Novo depósito',
- 'newTransfer' => 'Nova transferência',
- 'bills_to_pay' => 'Faturas a pagar',
- 'per_day' => 'Por dia',
- 'left_to_spend_per_day' => 'Restante para gastar por dia',
- 'bills_paid' => 'Faturas pagas',
+ 'yourAccounts' => 'Suas contas',
+ 'budgetsAndSpending' => 'Orçamentos e despesas',
+ 'savings' => 'Poupanças',
+ 'newWithdrawal' => 'Nova despesa',
+ 'newDeposit' => 'Novo depósito',
+ 'newTransfer' => 'Nova transferência',
+ 'bills_to_pay' => 'Faturas a pagar',
+ 'per_day' => 'Por dia',
+ 'left_to_spend_per_day' => 'Restante para gastar por dia',
+ 'bills_paid' => 'Faturas pagas',
// menu and titles, should be recycled as often as possible:
- 'currency' => 'Moeda',
- 'preferences' => 'Preferências',
- 'logout' => 'Desconectar',
- 'toggleNavigation' => 'Alternar navegação',
- 'searchPlaceholder' => 'Pesquisar...',
- 'version' => 'Versão',
- 'dashboard' => 'Painel de Controle',
- 'currencies' => 'Moedas',
- 'accounts' => 'Contas',
- 'Asset account' => 'Conta de ativo',
- 'Default account' => 'Conta de ativo',
- 'Expense account' => 'Conta de Despesa',
- 'Revenue account' => 'Conta de Receita',
- 'Initial balance account' => 'Saldo inicial da conta',
- 'budgets' => 'Orçamentos',
- 'tags' => 'Tags',
- 'reports' => 'Relatórios',
- 'transactions' => 'Transações',
- 'expenses' => 'Despesas',
- 'income' => 'Receita / Renda',
- 'transfers' => 'Transferências',
- 'moneyManagement' => 'Gerenciamento de Dinheiro',
- 'piggyBanks' => 'Cofrinhos',
- 'bills' => 'Faturas',
- 'withdrawal' => 'Retirada',
- 'opening_balance' => 'Saldo inicial',
- 'deposit' => 'Depósito',
- 'account' => 'Conta',
- 'transfer' => 'Transferência',
- 'Withdrawal' => 'Retirada',
- 'Deposit' => 'Depósito',
- 'Transfer' => 'Transferência',
- 'bill' => 'Fatura',
- 'yes' => 'Sim',
- 'no' => 'Não',
- 'amount' => 'Valor',
- 'overview' => 'Visão Geral',
- 'saveOnAccount' => 'Salvar na conta',
- 'unknown' => 'Desconhecido',
- 'daily' => 'Diário',
- 'monthly' => 'Mensal',
- 'profile' => 'Perfil',
- 'errors' => 'Erros',
+ 'currency' => 'Moeda',
+ 'preferences' => 'Preferências',
+ 'logout' => 'Desconectar',
+ 'toggleNavigation' => 'Alternar navegação',
+ 'searchPlaceholder' => 'Pesquisar...',
+ 'version' => 'Versão',
+ 'dashboard' => 'Painel de Controle',
+ 'currencies' => 'Moedas',
+ 'accounts' => 'Contas',
+ 'Asset account' => 'Conta de ativo',
+ 'Default account' => 'Conta de ativo',
+ 'Expense account' => 'Conta de Despesa',
+ 'Revenue account' => 'Conta de Receita',
+ 'Initial balance account' => 'Saldo inicial da conta',
+ 'budgets' => 'Orçamentos',
+ 'tags' => 'Tags',
+ 'reports' => 'Relatórios',
+ 'transactions' => 'Transações',
+ 'expenses' => 'Despesas',
+ 'income' => 'Receita / Renda',
+ 'transfers' => 'Transferências',
+ 'moneyManagement' => 'Gerenciamento de Dinheiro',
+ 'piggyBanks' => 'Cofrinhos',
+ 'bills' => 'Faturas',
+ 'withdrawal' => 'Retirada',
+ 'opening_balance' => 'Saldo inicial',
+ 'deposit' => 'Depósito',
+ 'account' => 'Conta',
+ 'transfer' => 'Transferência',
+ 'Withdrawal' => 'Retirada',
+ 'Deposit' => 'Depósito',
+ 'Transfer' => 'Transferência',
+ 'bill' => 'Fatura',
+ 'yes' => 'Sim',
+ 'no' => 'Não',
+ 'amount' => 'Valor',
+ 'overview' => 'Visão Geral',
+ 'saveOnAccount' => 'Salvar na conta',
+ 'unknown' => 'Desconhecido',
+ 'daily' => 'Diário',
+ 'monthly' => 'Mensal',
+ 'profile' => 'Perfil',
+ 'errors' => 'Erros',
// reports:
- 'report_default' => 'Relatório financeiro padrão entre :start e :end',
- 'report_audit' => 'Visão geral do histórico de transação entre :start e :end',
- 'report_category' => 'Relatório de categoria entre :start e :end',
- 'report_account' => 'Relatórios de despesas/receitas entre :start e :end',
- 'report_budget' => 'Relatório de orçamento entre :start e :end',
- 'report_tag' => 'Relatório de tag entre :start e :end',
- 'quick_link_reports' => 'Ligações rápidas',
- 'quick_link_default_report' => 'Relatório financeiro padrão',
- 'quick_link_audit_report' => 'Visão geral do histórico de transação',
- 'report_this_month_quick' => 'Mês atual, todas as contas',
- 'report_this_year_quick' => 'Ano atual, todas as contas',
- 'report_this_fiscal_year_quick' => 'Ano fiscal atual, todas as contas',
- 'report_all_time_quick' => 'Todos os tempos, todas as contas',
- 'reports_can_bookmark' => 'Lembre-se que relatórios podem ser marcados.',
- 'incomeVsExpenses' => 'Renda vs. Despesas',
- 'accountBalances' => 'Saldos de Contas',
- 'balanceStart' => 'Saldo no início do período',
- 'balanceEnd' => 'Saldo no final do período',
- 'splitByAccount' => 'Dividir por conta',
- 'coveredWithTags' => 'Coberto com tags',
- 'leftUnbalanced' => 'Deixar desequilibrado',
- 'leftInBudget' => 'Deixou no orçamento',
- 'sumOfSums' => 'Soma dos montantes',
- 'noCategory' => '(sem categoria)',
- 'notCharged' => 'Não cobrado (ainda)',
- 'inactive' => 'Inativo',
- 'active' => 'Ativo',
- 'difference' => 'Diferente',
- 'money_flowing_in' => 'Entrada',
- 'money_flowing_out' => 'Saída',
- 'topX' => 'topo :number',
- 'show_full_list' => 'Mostrar a lista inteira',
- 'show_only_top' => 'Mostrar apenas os topo :number',
- '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' => 'Relatório de orçamento',
- 'report_type_tag' => 'Relatório de tag',
- 'report_type_account' => 'Relatório de conta de despesas/receitas',
- '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',
- 'report_preset_ranges' => 'Intervalos pré-definidos',
- 'shared' => 'Compartilhado',
- 'fiscal_year' => 'Ano fiscal',
- 'income_entry' => 'Rendimento da conta ":name" entre :start e :end',
- 'expense_entry' => 'Despesas da conta ":name" entre :start e :end',
- 'category_entry' => 'Despesas na categoria ":name" entre :start e :end',
- 'budget_spent_amount' => 'Despesas no orçamento ":name" entre :start e :end',
- 'balance_amount' => 'Despesas no orçamento ":budget" pagas por conta":account" entre :start e :end',
- 'no_audit_activity' => 'Nenhuma atividade foi registrada na conta :account_name entre :start e :end.',
- 'audit_end_balance' => 'Saldo da conta :account_name no final de :end foi :balance',
- 'reports_extra_options' => 'Opções adicionais',
- 'report_has_no_extra_options' => 'Este relatório não tem mais opções',
- 'reports_submit' => 'Visualizar relatório',
- 'end_after_start_date' => 'Data de término do relatório deve ser depois da data de início.',
- 'select_category' => 'Selecionar categoria(s)',
- 'select_budget' => 'Selecionar orçamento(s).',
- 'select_tag' => 'Selecionar tag(s).',
- 'income_per_category' => 'Receitas por categoria',
- 'expense_per_category' => 'Despesa por categoria',
- 'expense_per_budget' => 'Despesa por orçamento',
- 'income_per_account' => 'Rendimento por conta',
- 'expense_per_account' => 'Por conta de despesas',
- 'expense_per_tag' => 'Despesa por tag',
- 'income_per_tag' => 'Rendimento por tag',
- 'include_expense_not_in_budget' => 'Despesas não incluídas no(s) orçamento(s) selecionado(s)',
- 'include_expense_not_in_account' => 'Despesas não incluídas na(s) contas(s) selecionada(s)',
- 'include_expense_not_in_category' => 'Despesas não incluídas na(s) categoria(s) selecionada(s)',
- 'include_income_not_in_category' => 'Rendimento não incluído na(s) categoria(s) selecionada(s)',
- 'include_income_not_in_account' => 'Rendimento não incluído na(s) conta(s) selecionada(s)',
- 'include_income_not_in_tags' => 'Rendimento não incluído na(s) tag(s) selecionada(s)',
- 'include_expense_not_in_tags' => 'Despesas não incluídas na(s) tag(s) selecionada(s)',
- 'everything_else' => 'Todo o resto',
- 'income_and_expenses' => 'Receitas e despesas',
- 'spent_average' => 'Gastos (média)',
- 'income_average' => 'Renda (média)',
- 'transaction_count' => 'Contagem de transações',
- 'average_spending_per_account' => 'Média de gastos por conta',
- 'average_income_per_account' => 'Rendimento médio por conta',
- 'total' => 'Total',
- 'description' => 'Descrição',
- 'sum_of_period' => 'Soma de período',
- 'average_in_period' => 'Média do período',
- 'account_role_defaultAsset' => 'Conta padrão',
- 'account_role_sharedAsset' => 'Contas de ativos compartilhadas',
- 'account_role_savingAsset' => 'Conta poupança',
- 'account_role_ccAsset' => 'Cartão de crédito',
- 'budget_chart_click' => 'Clique no nome do orçamento na tabela acima para ver um gráfico.',
- 'category_chart_click' => 'Clique no nome da categoria na tabela acima para ver um gráfico.',
- 'in_out_accounts' => 'Ganhou e gastou por combinação',
- 'in_out_per_category' => 'Ganhou e gastou por categoria',
- 'out_per_budget' => 'Gasto por orçamento',
- 'select_expense_revenue' => 'Selecione conta de despesa/receita',
+ 'report_default' => 'Relatório financeiro padrão entre :start e :end',
+ 'report_audit' => 'Visão geral do histórico de transação entre :start e :end',
+ 'report_category' => 'Relatório de categoria entre :start e :end',
+ 'report_account' => 'Relatórios de despesas/receitas entre :start e :end',
+ 'report_budget' => 'Relatório de orçamento entre :start e :end',
+ 'report_tag' => 'Relatório de tag entre :start e :end',
+ 'quick_link_reports' => 'Ligações rápidas',
+ 'quick_link_default_report' => 'Relatório financeiro padrão',
+ 'quick_link_audit_report' => 'Visão geral do histórico de transação',
+ 'report_this_month_quick' => 'Mês atual, todas as contas',
+ 'report_this_year_quick' => 'Ano atual, todas as contas',
+ 'report_this_fiscal_year_quick' => 'Ano fiscal atual, todas as contas',
+ 'report_all_time_quick' => 'Todos os tempos, todas as contas',
+ 'reports_can_bookmark' => 'Lembre-se que relatórios podem ser marcados.',
+ 'incomeVsExpenses' => 'Renda vs. Despesas',
+ 'accountBalances' => 'Saldos de Contas',
+ 'balanceStart' => 'Saldo no início do período',
+ 'balanceEnd' => 'Saldo no final do período',
+ 'splitByAccount' => 'Dividir por conta',
+ 'coveredWithTags' => 'Coberto com tags',
+ 'leftUnbalanced' => 'Deixar desequilibrado',
+ 'leftInBudget' => 'Deixou no orçamento',
+ 'sumOfSums' => 'Soma dos montantes',
+ 'noCategory' => '(sem categoria)',
+ 'notCharged' => 'Não cobrado (ainda)',
+ 'inactive' => 'Inativo',
+ 'active' => 'Ativo',
+ 'difference' => 'Diferente',
+ 'money_flowing_in' => 'Entrada',
+ 'money_flowing_out' => 'Saída',
+ 'topX' => 'topo :number',
+ 'show_full_list' => 'Mostrar a lista inteira',
+ 'show_only_top' => 'Mostrar apenas os topo :number',
+ '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' => 'Relatório de orçamento',
+ 'report_type_tag' => 'Relatório de tag',
+ 'report_type_account' => 'Relatório de conta de despesas/receitas',
+ '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',
+ 'report_preset_ranges' => 'Intervalos pré-definidos',
+ 'shared' => 'Compartilhado',
+ 'fiscal_year' => 'Ano fiscal',
+ 'income_entry' => 'Rendimento da conta ":name" entre :start e :end',
+ 'expense_entry' => 'Despesas da conta ":name" entre :start e :end',
+ 'category_entry' => 'Despesas na categoria ":name" entre :start e :end',
+ 'budget_spent_amount' => 'Despesas no orçamento ":name" entre :start e :end',
+ 'balance_amount' => 'Despesas no orçamento ":budget" pagas por conta":account" entre :start e :end',
+ 'no_audit_activity' => 'Nenhuma atividade foi registrada na conta :account_name entre :start e :end.',
+ 'audit_end_balance' => 'Saldo da conta :account_name no final de :end foi :balance',
+ 'reports_extra_options' => 'Opções adicionais',
+ 'report_has_no_extra_options' => 'Este relatório não tem mais opções',
+ 'reports_submit' => 'Visualizar relatório',
+ 'end_after_start_date' => 'Data de término do relatório deve ser depois da data de início.',
+ 'select_category' => 'Selecionar categoria(s)',
+ 'select_budget' => 'Selecionar orçamento(s).',
+ 'select_tag' => 'Selecionar tag(s).',
+ 'income_per_category' => 'Receitas por categoria',
+ 'expense_per_category' => 'Despesa por categoria',
+ 'expense_per_budget' => 'Despesa por orçamento',
+ 'income_per_account' => 'Rendimento por conta',
+ 'expense_per_account' => 'Por conta de despesas',
+ 'expense_per_tag' => 'Despesa por tag',
+ 'income_per_tag' => 'Rendimento por tag',
+ 'include_expense_not_in_budget' => 'Despesas não incluídas no(s) orçamento(s) selecionado(s)',
+ 'include_expense_not_in_account' => 'Despesas não incluídas na(s) contas(s) selecionada(s)',
+ 'include_expense_not_in_category' => 'Despesas não incluídas na(s) categoria(s) selecionada(s)',
+ 'include_income_not_in_category' => 'Rendimento não incluído na(s) categoria(s) selecionada(s)',
+ 'include_income_not_in_account' => 'Rendimento não incluído na(s) conta(s) selecionada(s)',
+ 'include_income_not_in_tags' => 'Rendimento não incluído na(s) tag(s) selecionada(s)',
+ 'include_expense_not_in_tags' => 'Despesas não incluídas na(s) tag(s) selecionada(s)',
+ 'everything_else' => 'Todo o resto',
+ 'income_and_expenses' => 'Receitas e despesas',
+ 'spent_average' => 'Gastos (média)',
+ 'income_average' => 'Renda (média)',
+ 'transaction_count' => 'Contagem de transações',
+ 'average_spending_per_account' => 'Média de gastos por conta',
+ 'average_income_per_account' => 'Rendimento médio por conta',
+ 'total' => 'Total',
+ 'description' => 'Descrição',
+ 'sum_of_period' => 'Soma de período',
+ 'average_in_period' => 'Média do período',
+ 'account_role_defaultAsset' => 'Conta padrão',
+ 'account_role_sharedAsset' => 'Contas de ativos compartilhadas',
+ 'account_role_savingAsset' => 'Conta poupança',
+ 'account_role_ccAsset' => 'Cartão de crédito',
+ 'budget_chart_click' => 'Clique no nome do orçamento na tabela acima para ver um gráfico.',
+ 'category_chart_click' => 'Clique no nome da categoria na tabela acima para ver um gráfico.',
+ 'in_out_accounts' => 'Ganhou e gastou por combinação',
+ 'in_out_per_category' => 'Ganhou e gastou por categoria',
+ 'out_per_budget' => 'Gasto por orçamento',
+ 'select_expense_revenue' => 'Selecione conta de despesa/receita',
// charts:
- 'chart' => 'Gráfico',
- 'month' => 'Mês',
- 'budget' => 'Orçamento',
- 'spent' => 'Gasto',
- 'spent_in_budget' => 'Gasto no orçamento',
- 'left_to_spend' => 'Restante para gastar',
- 'earned' => 'Ganho',
- 'overspent' => 'Gasto excedido',
- 'left' => 'Esquerda',
- 'max-amount' => 'Valor Máximo',
- 'min-amount' => 'Valor Mínimo',
- 'journal-amount' => 'Entrada de fatura atual',
- 'name' => 'Nome',
- 'date' => 'Data',
- 'paid' => 'Pago',
- 'unpaid' => 'Não pago',
- 'day' => 'Dia',
- 'budgeted' => 'Orçado',
- 'period' => 'Período',
- 'balance' => 'Saldo',
- 'sum' => 'Soma',
- 'average' => 'Média',
- 'balanceFor' => 'Saldo para ":name"',
+ 'chart' => 'Gráfico',
+ 'month' => 'Mês',
+ 'budget' => 'Orçamento',
+ 'spent' => 'Gasto',
+ 'spent_in_budget' => 'Gasto no orçamento',
+ 'left_to_spend' => 'Restante para gastar',
+ 'earned' => 'Ganho',
+ 'overspent' => 'Gasto excedido',
+ 'left' => 'Esquerda',
+ 'max-amount' => 'Valor Máximo',
+ 'min-amount' => 'Valor Mínimo',
+ 'journal-amount' => 'Entrada de fatura atual',
+ 'name' => 'Nome',
+ 'date' => 'Data',
+ 'paid' => 'Pago',
+ 'unpaid' => 'Não pago',
+ 'day' => 'Dia',
+ 'budgeted' => 'Orçado',
+ 'period' => 'Período',
+ 'balance' => 'Saldo',
+ 'sum' => 'Soma',
+ 'average' => 'Média',
+ 'balanceFor' => 'Saldo para ":name"',
// piggy banks:
- 'add_money_to_piggy' => 'Adicionar dinheiro ao cofrinho ":name"',
- 'piggy_bank' => 'Cofrinho',
- 'new_piggy_bank' => 'Nova poupança',
- 'store_piggy_bank' => 'Armazenar novo cofrinho',
- 'stored_piggy_bank' => 'Armazenar novo cofrinho ":name"',
- 'account_status' => 'Status da Conta',
- 'left_for_piggy_banks' => 'Deixar para cofrinhos',
- 'sum_of_piggy_banks' => 'Soma dos cofrinhos',
- 'saved_so_far' => 'Salvo até agora',
- 'left_to_save' => 'Esquerda para salvar',
- 'suggested_amount' => 'Quantia mensal sugerida para poupar',
- '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' => 'Você não tem dinheiro para colocar nessa poupança.',
+ 'add_money_to_piggy' => 'Adicionar dinheiro ao cofrinho ":name"',
+ 'piggy_bank' => 'Cofrinho',
+ 'new_piggy_bank' => 'Nova poupança',
+ 'store_piggy_bank' => 'Armazenar novo cofrinho',
+ 'stored_piggy_bank' => 'Armazenar novo cofrinho ":name"',
+ 'account_status' => 'Status da Conta',
+ 'left_for_piggy_banks' => 'Deixar para cofrinhos',
+ 'sum_of_piggy_banks' => 'Soma dos cofrinhos',
+ 'saved_so_far' => 'Salvo até agora',
+ 'left_to_save' => 'Esquerda para salvar',
+ 'suggested_amount' => 'Quantia mensal sugerida para poupar',
+ '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' => 'Você não tem dinheiro para colocar nessa poupança.',
'remove' => 'Remover',
'max_amount_add' => 'É a quantidade máxima que você pode adicionar é',
@@ -1084,6 +1086,7 @@ return [
'invalid_link_selection' => 'Não é possível ligar essas transações',
'journals_linked' => 'As transações estão ligadas.',
'journals_error_linked' => 'Essas transações já estão ligadas.',
+ 'journals_link_to_self' => 'You cannot link a transaction to itself',
'journal_links' => 'Transações ligadas',
'this_withdrawal' => 'Essa retirada',
'this_deposit' => 'Este depósito',
diff --git a/resources/lang/pt_BR/form.php b/resources/lang/pt_BR/form.php
index ccd47f9f7d..f33c53817e 100644
--- a/resources/lang/pt_BR/form.php
+++ b/resources/lang/pt_BR/form.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// new user:
diff --git a/resources/lang/pt_BR/import.php b/resources/lang/pt_BR/import.php
index 91cd87859a..699dc13613 100644
--- a/resources/lang/pt_BR/import.php
+++ b/resources/lang/pt_BR/import.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
// status of import:
@@ -97,6 +98,7 @@ return [
// not csv, but normal warning
'roles_warning' => 'No mínimo, marque uma coluna como a coluna de quantidade. É aconselhável também selecionar uma coluna para a descrição, data e a conta oposta.',
'foreign_amount_warning' => 'Se você marcar uma coluna como contendo um valor em uma moeda estrangeira, você também deve definir a coluna que contém qual moeda é.',
+
// file, map data
'file_map_title' => 'Configuração de importação (4/4) - Conecte dados de importação aos dados do Firefly III',
'file_map_text' => 'Nas tabelas a seguir, o valor à esquerda mostra informações encontradas no seu arquivo carregado. É sua tarefa mapear esse valor, se possível, para um valor já presente em seu banco de dados. O Firefly vai se ater a esse mapeamento. Se não há nenhum valor para mapear, ou não quer mapear o valor específico, não selecione nada.',
@@ -131,28 +133,40 @@ return [
'column_date-book' => 'Data da reserva de transação',
'column_date-process' => 'Data do processo de transação',
'column_date-transaction' => 'Data',
+ 'column_date-due' => 'Transaction due date',
+ 'column_date-payment' => 'Transaction payment date',
+ 'column_date-invoice' => 'Transaction invoice date',
'column_description' => 'Descrição',
'column_opposing-iban' => 'Conta contrária (IBAN)',
+ 'column_opposing-bic' => 'Opposing account (BIC)',
'column_opposing-id' => 'ID da Conta Cotrária (correspondente FF3)',
'column_external-id' => 'ID Externo',
'column_opposing-name' => 'Conta contrária (nome)',
'column_rabo-debit-credit' => 'Indicador de débito/crédito específico do Rabobank',
'column_ing-debit-credit' => 'Indicador de débito/crédito específico do ING',
- 'column_sepa-ct-id' => 'ID da Transferência de Crédito fim-a-fim SEPA',
- 'column_sepa-ct-op' => 'Transferência de Crédito SEPA conta contrária',
- 'column_sepa-db' => 'Débito direto SEPA',
+ 'column_sepa-ct-id' => 'SEPA end-to-end Identifier',
+ 'column_sepa-ct-op' => 'SEPA Opposing Account Identifier',
+ 'column_sepa-db' => 'SEPA Mandate Identifier',
+ 'column_sepa-cc' => 'SEPA Clearing Code',
+ 'column_sepa-ci' => 'SEPA Creditor Identifier',
+ 'column_sepa-ep' => 'SEPA External Purpose',
+ 'column_sepa-country' => 'SEPA Country Code',
'column_tags-comma' => 'Tags (separadas por vírgula)',
'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)',
'column_note' => 'Nota(s)',
+ 'column_internal-reference' => 'Internal reference',
// prerequisites
'prerequisites' => 'Pré-requisitos',
// bunq
'bunq_prerequisites_title' => 'Pré-requisitos para uma importação de bunq',
- 'bunq_prerequisites_text' => 'Para importar a partir de bunq, você precisa obter uma chave API. Você pode fazer isso através do aplicativo.',
+ 'bunq_prerequisites_text' => 'In order to import from bunq, you need to obtain an API key. You can do this through the app. Please note that the import function for bunq is in BETA. It has only been tested against the sandbox API.',
+ 'bunq_do_import' => 'Yes, import from this account',
+ 'bunq_accounts_title' => 'Bunq accounts',
+ 'bunq_accounts_text' => 'These are the accounts associated with your bunq account. Please select the accounts from which you want to import, and in which account the transactions must be imported.',
// Spectre
'spectre_title' => 'Importar usando Spectre',
@@ -187,4 +201,3 @@ return [
// various other strings:
'imported_from_account' => 'Importado de ":account"',
];
-
diff --git a/resources/lang/pt_BR/intro.php b/resources/lang/pt_BR/intro.php
index 262f0a8015..bc5d9f09b5 100644
--- a/resources/lang/pt_BR/intro.php
+++ b/resources/lang/pt_BR/intro.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// index
diff --git a/resources/lang/pt_BR/list.php b/resources/lang/pt_BR/list.php
index 4b70560e18..4a31b17fe2 100644
--- a/resources/lang/pt_BR/list.php
+++ b/resources/lang/pt_BR/list.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
'buttons' => 'Botões',
@@ -102,4 +103,12 @@ return [
'reconcile' => 'Pago',
'account_on_spectre' => 'Conta (Spectre)',
'do_import' => 'Importar desta conta',
+ 'sepa-ct-id' => 'SEPA End to End Identifier',
+ 'sepa-ct-op' => 'SEPA Opposing Account Identifier',
+ 'sepa-db' => 'SEPA Mandate Identifier',
+ 'sepa-country' => 'SEPA Country',
+ 'sepa-cc' => 'SEPA Clearing Code',
+ 'sepa-ep' => 'SEPA External Purpose',
+ 'sepa-ci' => 'SEPA Creditor Identifier',
+ 'account_at_bunq' => 'Account with bunq',
];
diff --git a/resources/lang/pt_BR/pagination.php b/resources/lang/pt_BR/pagination.php
index 11723a2a66..5f01cc91c3 100644
--- a/resources/lang/pt_BR/pagination.php
+++ b/resources/lang/pt_BR/pagination.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'previous' => '« Anterior',
diff --git a/resources/lang/pt_BR/passwords.php b/resources/lang/pt_BR/passwords.php
index dc8fbf3837..d23ff73da6 100644
--- a/resources/lang/pt_BR/passwords.php
+++ b/resources/lang/pt_BR/passwords.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'password' => 'A senha precisa ter no mínimo seis caracteres e tem que ser igual à confirmação de senha.',
diff --git a/resources/lang/pt_BR/validation.php b/resources/lang/pt_BR/validation.php
index 3ebba5c6aa..3f0b31a444 100644
--- a/resources/lang/pt_BR/validation.php
+++ b/resources/lang/pt_BR/validation.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'iban' => 'Este não é um válido IBAN.',
+ 'source_equals_destination' => 'The source account equals the destination account',
'unique_account_number_for_user' => 'Parece que este número de conta já está em uso.',
'unique_iban_for_user' => 'It looks like this IBAN is already in use.',
'deleted_user' => 'Devido a restrições de segurança, você não pode registrar usando este endereço de e-mail.',
diff --git a/resources/lang/ru_RU/auth.php b/resources/lang/ru_RU/auth.php
index 7b2cd9bab2..29af8ba18d 100644
--- a/resources/lang/ru_RU/auth.php
+++ b/resources/lang/ru_RU/auth.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
/*
diff --git a/resources/lang/ru_RU/bank.php b/resources/lang/ru_RU/bank.php
index ef0d636f91..b6a86faa4b 100644
--- a/resources/lang/ru_RU/bank.php
+++ b/resources/lang/ru_RU/bank.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
];
diff --git a/resources/lang/ru_RU/breadcrumbs.php b/resources/lang/ru_RU/breadcrumbs.php
index 92d5f21e5a..6059a0bc1d 100644
--- a/resources/lang/ru_RU/breadcrumbs.php
+++ b/resources/lang/ru_RU/breadcrumbs.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'home' => 'Главная',
diff --git a/resources/lang/ru_RU/components.php b/resources/lang/ru_RU/components.php
index f59d3bdff6..a7a8c11c02 100644
--- a/resources/lang/ru_RU/components.php
+++ b/resources/lang/ru_RU/components.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// profile
diff --git a/resources/lang/ru_RU/config.php b/resources/lang/ru_RU/config.php
index a562e16b26..202174d1ba 100644
--- a/resources/lang/ru_RU/config.php
+++ b/resources/lang/ru_RU/config.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'html_language' => 'ru',
diff --git a/resources/lang/ru_RU/csv.php b/resources/lang/ru_RU/csv.php
index d61316b632..892c8beac4 100644
--- a/resources/lang/ru_RU/csv.php
+++ b/resources/lang/ru_RU/csv.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
];
diff --git a/resources/lang/ru_RU/demo.php b/resources/lang/ru_RU/demo.php
index 3cfe83b970..743993acb8 100644
--- a/resources/lang/ru_RU/demo.php
+++ b/resources/lang/ru_RU/demo.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
- 'no_demo_text' => 'Извините, но для этой страницы нет дополнительного пояснения.',
- 'see_help_icon' => 'Воспользуйтесь значком в правом верхнем углу, чтобы узнать больше.',
- 'index' => 'Добро пожаловать в Firefly III! На этой странице вы видите вашу финансовую ситуацию в общих чертах. Более подробная информация доступна на страницах → Активные счета Бюджет и Отчёты. Или просто внимательно оглядитесь и изучите всё вокруг.',
- 'accounts-index' => 'Основные счета - это ваши личные банковские счета или другие денежные активы. Счёта расходов - это счета, на которые вы тратите деньги, например, магазины и друзья. Счета доходов - это счета, с которых вы получаете деньги, например, ваша работа, правительство или другие источники дохода. На этой странице вы можете редактировать или удалять их.',
- 'budgets-index' => 'На этой странице вы видите все свои бюджеты. На верхней панели показана сумма, доступная в рамках бюджета. Бюджет можно настроить на любой период, щёлкнув сумму справа. Сумма, которую вы фактически потратили, показана на диаграмме внизу. Ещё ниже показаны в сравнении ваши фактически расходы и запланированный бюджет.',
- 'reports-index-start' => 'Firefly III поддерживает несколько типов отчетов. Вы можете узнать про них, нажав на значок в правом верхнем углу.',
- 'reports-index-examples' => 'Обязательно ознакомьтесь с этими примерами: a ежемесячный финансовый обзор, a годовой финансовый обзор и a обзор бюджета.',
- 'currencies-index' => 'Firefly III поддерживает несколько валют. Хотя по умолчанию используется Евро, вы можете сделать основной валютой доллары США или любую другую валюту. Как вы видите, несколько валют уже есть в списке, но вы можете добавить любую другую, если это требуется. Обратите внимание, что выбор новой валюты по умолчанию не повлияет на уже существующие транзакции: Firefly III поддерживает одновременное использование нескольких валют.',
- 'transactions-index' => 'Эти расходы, доходы и переводы не очень интересны. Они были созданы автоматически.',
- 'piggy-banks-index' => 'Как вы можете видеть, здесь есть три копилки. Используйте кнопки «плюс» и «минус», чтобы влиять на количество денег в каждой копилке. Нажмите название копилки, чтобы увидеть её настройки.',
- 'import-index' => 'Конечно, любой CSV-файл может быть импортирован в Firefly III',
+ 'no_demo_text' => 'Извините, но для этой страницы нет дополнительного пояснения.',
+ 'see_help_icon' => 'Воспользуйтесь значком в правом верхнем углу, чтобы узнать больше.',
+ 'index' => 'Добро пожаловать в Firefly III! На этой странице вы видите вашу финансовую ситуацию в общих чертах. Более подробная информация доступна на страницах → Активные счета Бюджет и Отчёты. Или просто внимательно оглядитесь и изучите всё вокруг.',
+ 'accounts-index' => 'Основные счета - это ваши личные банковские счета или другие денежные активы. Счёта расходов - это счета, на которые вы тратите деньги, например, магазины и друзья. Счета доходов - это счета, с которых вы получаете деньги, например, ваша работа, правительство или другие источники дохода. На этой странице вы можете редактировать или удалять их.',
+ 'budgets-index' => 'На этой странице вы видите все свои бюджеты. На верхней панели показана сумма, доступная в рамках бюджета. Бюджет можно настроить на любой период, щёлкнув сумму справа. Сумма, которую вы фактически потратили, показана на диаграмме внизу. Ещё ниже показаны в сравнении ваши фактически расходы и запланированный бюджет.',
+ 'reports-index-start' => 'Firefly III поддерживает несколько типов отчетов. Вы можете узнать про них, нажав на значок в правом верхнем углу.',
+ 'reports-index-examples' => 'Обязательно ознакомьтесь с этими примерами: a ежемесячный финансовый обзор, a годовой финансовый обзор и a обзор бюджета.',
+ 'currencies-index' => 'Firefly III поддерживает несколько валют. Хотя по умолчанию используется Евро, вы можете сделать основной валютой доллары США или любую другую валюту. Как вы видите, несколько валют уже есть в списке, но вы можете добавить любую другую, если это требуется. Обратите внимание, что выбор новой валюты по умолчанию не повлияет на уже существующие транзакции: Firefly III поддерживает одновременное использование нескольких валют.',
+ 'transactions-index' => 'Эти расходы, доходы и переводы не очень интересны. Они были созданы автоматически.',
+ 'piggy-banks-index' => 'Как вы можете видеть, здесь есть три копилки. Используйте кнопки «плюс» и «минус», чтобы влиять на количество денег в каждой копилке. Нажмите название копилки, чтобы увидеть её настройки.',
+ 'import-index' => 'Конечно, любой CSV-файл может быть импортирован в Firefly III',
];
diff --git a/resources/lang/ru_RU/firefly.php b/resources/lang/ru_RU/firefly.php
index 070c69a63c..f8d510ae6f 100644
--- a/resources/lang/ru_RU/firefly.php
+++ b/resources/lang/ru_RU/firefly.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
// general stuff:
@@ -170,7 +171,9 @@ return [
'want_to_login' => 'Я хочу войти',
'button_register' => 'Регистрация',
'authorization' => 'Авторизация',
-
+ 'active_bills_only' => 'только активные счета',
+ 'average_per_bill' => 'в среднем на счёт',
+ 'expected_total' => 'ожидаемый итог',
// API access
'authorization_request' => 'Запрос авторизации Firefly III v:version',
'authorization_request_intro' => ':client запрашивает доступ к управлению вашими финансами. Вы хотите разрешить :client доступ к этой информации?',
@@ -403,590 +406,589 @@ return [
'rule_action_set_notes_choice' => 'Назначить примечания...',
'rule_action_set_notes' => 'Назначить примечания ":action_value"',
- 'rules_have_read_warning' => 'Вы прочитали предупреждение?',
- 'apply_rule_warning' => 'Предупреждение: запуск правила (группы) при большом числе выбранных транзакций может занять много времени, и это может привести к тайм-ауту. Если это произойдёт, правило (группа) будут применены к неизвестной части ваших транзакций. Это может серьёзно повредить вашему управлению финансами. Пожалуйста, будьте осторожны.',
+ 'rules_have_read_warning' => 'Вы прочитали предупреждение?',
+ 'apply_rule_warning' => 'Предупреждение: запуск правила (группы) при большом числе выбранных транзакций может занять много времени, и это может привести к тайм-ауту. Если это произойдёт, правило (группа) будут применены к неизвестной части ваших транзакций. Это может серьёзно повредить вашему управлению финансами. Пожалуйста, будьте осторожны.',
// tags
- 'store_new_tag' => 'Сохранить новую метку',
- 'update_tag' => 'Обновить метку',
- 'no_location_set' => 'Местоположение не указано.',
- 'meta_data' => 'Расширенные данные',
- 'location' => 'Размещение',
- 'without_date' => 'Без даты',
- 'result' => 'Результат',
- 'sums_apply_to_range' => 'Все суммы относятся к выбранному диапазону',
- 'mapbox_api_key' => 'Чтобы использовать карту, получите ключ API от сервиса Mapbox. Откройте файл .env и введите этот код в строке MAPBOX_API_KEY = .',
- 'press_tag_location' => 'Щёлкните правой кнопкой мыши или надолго нажмите на сенсорный экран, чтобы установить метку местоположения.',
- 'clear_location' => 'Очистить местоположение',
+ 'store_new_tag' => 'Сохранить новую метку',
+ 'update_tag' => 'Обновить метку',
+ 'no_location_set' => 'Местоположение не указано.',
+ 'meta_data' => 'Расширенные данные',
+ 'location' => 'Размещение',
+ 'without_date' => 'Без даты',
+ 'result' => 'Результат',
+ 'sums_apply_to_range' => 'Все суммы относятся к выбранному диапазону',
+ 'mapbox_api_key' => 'Чтобы использовать карту, получите ключ API от сервиса Mapbox. Откройте файл .env и введите этот код в строке MAPBOX_API_KEY = .',
+ 'press_tag_location' => 'Щёлкните правой кнопкой мыши или надолго нажмите на сенсорный экран, чтобы установить метку местоположения.',
+ 'clear_location' => 'Очистить местоположение',
// preferences
- 'pref_home_screen_accounts' => 'Счета, отображаемые в сводке',
- 'pref_home_screen_accounts_help' => 'Какие счета нужно отображать в сводке на главной странице?',
- 'pref_view_range' => 'Диапазон просмотра',
- 'pref_view_range_help' => 'Некоторые диаграммы автоматически группируются по периодам. Какой период вы предпочитаете?',
- 'pref_1D' => 'Один день',
- 'pref_1W' => 'Одна неделя',
- 'pref_1M' => 'Один месяц',
- 'pref_3M' => 'Три месяца (квартал)',
- 'pref_6M' => 'Шесть месяцев',
- 'pref_1Y' => 'Один год',
- 'pref_languages' => 'Языки',
- 'pref_languages_help' => 'Firefly III поддерживает несколько языков. Какой язык вы предпочитаете?',
- 'pref_custom_fiscal_year' => 'Параметры финансового года',
- 'pref_custom_fiscal_year_label' => 'Включить',
- 'pref_custom_fiscal_year_help' => 'Для стран, в которых финансовый год начинается не 1 января, а заканчивается не 31 декабря, вы должны указать даты начала и окончания финансового года',
- 'pref_fiscal_year_start_label' => 'Дата начала финансового года',
- 'pref_two_factor_auth' => 'Двухэтапная аутентификация',
- 'pref_two_factor_auth_help' => 'Когда вы включаете двухэтапную аутентификацию (также известную как двухфакторная аутентификация), вы добавляете дополнительный уровень безопасности в свою учётную запись. Вы входите в систему со своим паролем и ещё чем-то, что есть только у вас (код подтверждения). Коды подтверждения генерируются приложением на вашем телефоне, например, Authy или Google Authenticator.',
- 'pref_enable_two_factor_auth' => 'Включить двухэтапную аутентификацию',
- 'pref_two_factor_auth_disabled' => 'Двухэтапную код подтверждения удалён и отключен',
- 'pref_two_factor_auth_remove_it' => 'Не забудьте удалить учётную запись из своего приложения для аутентификации!',
- 'pref_two_factor_auth_code' => 'Проверить код',
- 'pref_two_factor_auth_code_help' => 'Отсканируйте QR-код с помощью приложения на телефоне, например Authy или Google Authenticator, и введите сгенерированный код.',
- 'pref_two_factor_auth_reset_code' => 'Сбросить код верификации',
- 'pref_two_factor_auth_remove_code' => 'Удалить код подтверждения',
- 'pref_two_factor_auth_remove_will_disable' => '(это также отключит двухфакторную аутентификацию)',
- 'pref_save_settings' => 'Сохранить настройки',
- 'saved_preferences' => 'Настройки сохранены!',
- 'preferences_general' => 'Основные',
- 'preferences_frontpage' => 'Сводка',
- 'preferences_security' => 'Безопасность',
- 'preferences_layout' => 'Отображение',
- 'pref_home_show_deposits' => 'Показывать доходы на главной странице',
- 'pref_home_show_deposits_info' => 'В сводке уже отображаются ваши счета расходов. Нужно ли показывать там также ваши счета доходов?',
- 'pref_home_do_show_deposits' => 'Да, показать их',
- 'successful_count' => 'из которых :count успешно',
- 'list_page_size_title' => 'Размер страницы',
- 'list_page_size_help' => 'Все списки в программе (счета, транзакции и т. п.) будут отображаться с указанным количеством на одну страницу.',
- 'list_page_size_label' => 'Размер страницы',
- 'between_dates' => '(:start и :end)',
- 'pref_optional_fields_transaction' => 'Дополнительные поля для транзакций',
- 'pref_optional_fields_transaction_help' => 'По умолчанию при создании новой транзакции включены не все поля (чтобы не создавать беспорядок). Но вы можете включить эти поля, если лично вам они могут быть полезны. Любое поле, которое в последствии будет отключено, будет по-прежнему отображаться, если оно уже заполнено (независимо от данный настроек).',
- 'optional_tj_date_fields' => 'Поля с датами',
- 'optional_tj_business_fields' => 'Бизнес-поля',
- 'optional_tj_attachment_fields' => 'Поля вложений',
- 'pref_optional_tj_interest_date' => 'Дата начисления процентов',
- 'pref_optional_tj_book_date' => 'Дата внесения записи',
- 'pref_optional_tj_process_date' => 'Дата обработки',
- 'pref_optional_tj_due_date' => 'Срок',
- 'pref_optional_tj_payment_date' => 'Дата платежа',
- 'pref_optional_tj_invoice_date' => 'Дата выставления счёта',
- 'pref_optional_tj_internal_reference' => 'Внутренняя ссылка',
- 'pref_optional_tj_notes' => 'Заметки',
- 'pref_optional_tj_attachments' => 'Вложения',
- 'optional_field_meta_dates' => 'Даты',
- 'optional_field_meta_business' => 'Бизнес',
- 'optional_field_attachments' => 'Вложения',
- 'optional_field_meta_data' => 'Расширенные данные',
+ 'pref_home_screen_accounts' => 'Счета, отображаемые в сводке',
+ 'pref_home_screen_accounts_help' => 'Какие счета нужно отображать в сводке на главной странице?',
+ 'pref_view_range' => 'Диапазон просмотра',
+ 'pref_view_range_help' => 'Некоторые диаграммы автоматически группируются по периодам. Какой период вы предпочитаете?',
+ 'pref_1D' => 'Один день',
+ 'pref_1W' => 'Одна неделя',
+ 'pref_1M' => 'Один месяц',
+ 'pref_3M' => 'Три месяца (квартал)',
+ 'pref_6M' => 'Шесть месяцев',
+ 'pref_1Y' => 'Один год',
+ 'pref_languages' => 'Языки',
+ 'pref_languages_help' => 'Firefly III поддерживает несколько языков. Какой язык вы предпочитаете?',
+ 'pref_custom_fiscal_year' => 'Параметры финансового года',
+ 'pref_custom_fiscal_year_label' => 'Включить',
+ 'pref_custom_fiscal_year_help' => 'Для стран, в которых финансовый год начинается не 1 января, а заканчивается не 31 декабря, вы должны указать даты начала и окончания финансового года',
+ 'pref_fiscal_year_start_label' => 'Дата начала финансового года',
+ 'pref_two_factor_auth' => 'Двухэтапная аутентификация',
+ 'pref_two_factor_auth_help' => 'Когда вы включаете двухэтапную аутентификацию (также известную как двухфакторная аутентификация), вы добавляете дополнительный уровень безопасности в свою учётную запись. Вы входите в систему со своим паролем и ещё чем-то, что есть только у вас (код подтверждения). Коды подтверждения генерируются приложением на вашем телефоне, например, Authy или Google Authenticator.',
+ 'pref_enable_two_factor_auth' => 'Включить двухэтапную аутентификацию',
+ 'pref_two_factor_auth_disabled' => 'Двухэтапную код подтверждения удалён и отключен',
+ 'pref_two_factor_auth_remove_it' => 'Не забудьте удалить учётную запись из своего приложения для аутентификации!',
+ 'pref_two_factor_auth_code' => 'Проверить код',
+ 'pref_two_factor_auth_code_help' => 'Отсканируйте QR-код с помощью приложения на телефоне, например Authy или Google Authenticator, и введите сгенерированный код.',
+ 'pref_two_factor_auth_reset_code' => 'Сбросить код верификации',
+ 'pref_two_factor_auth_disable_2fa' => 'Выключить 2FA',
+ 'pref_save_settings' => 'Сохранить настройки',
+ 'saved_preferences' => 'Настройки сохранены!',
+ 'preferences_general' => 'Основные',
+ 'preferences_frontpage' => 'Сводка',
+ 'preferences_security' => 'Безопасность',
+ 'preferences_layout' => 'Отображение',
+ 'pref_home_show_deposits' => 'Показывать доходы на главной странице',
+ 'pref_home_show_deposits_info' => 'В сводке уже отображаются ваши счета расходов. Нужно ли показывать там также ваши счета доходов?',
+ 'pref_home_do_show_deposits' => 'Да, показать их',
+ 'successful_count' => 'из которых :count успешно',
+ 'list_page_size_title' => 'Размер страницы',
+ 'list_page_size_help' => 'Все списки в программе (счета, транзакции и т. п.) будут отображаться с указанным количеством на одну страницу.',
+ 'list_page_size_label' => 'Размер страницы',
+ 'between_dates' => '(:start и :end)',
+ 'pref_optional_fields_transaction' => 'Дополнительные поля для транзакций',
+ 'pref_optional_fields_transaction_help' => 'По умолчанию при создании новой транзакции включены не все поля (чтобы не создавать беспорядок). Но вы можете включить эти поля, если лично вам они могут быть полезны. Любое поле, которое в последствии будет отключено, будет по-прежнему отображаться, если оно уже заполнено (независимо от данный настроек).',
+ 'optional_tj_date_fields' => 'Поля с датами',
+ 'optional_tj_business_fields' => 'Бизнес-поля',
+ 'optional_tj_attachment_fields' => 'Поля вложений',
+ 'pref_optional_tj_interest_date' => 'Дата начисления процентов',
+ 'pref_optional_tj_book_date' => 'Дата внесения записи',
+ 'pref_optional_tj_process_date' => 'Дата обработки',
+ 'pref_optional_tj_due_date' => 'Срок',
+ 'pref_optional_tj_payment_date' => 'Дата платежа',
+ 'pref_optional_tj_invoice_date' => 'Дата выставления счёта',
+ 'pref_optional_tj_internal_reference' => 'Внутренняя ссылка',
+ 'pref_optional_tj_notes' => 'Заметки',
+ 'pref_optional_tj_attachments' => 'Вложения',
+ 'optional_field_meta_dates' => 'Даты',
+ 'optional_field_meta_business' => 'Бизнес',
+ 'optional_field_attachments' => 'Вложения',
+ 'optional_field_meta_data' => 'Расширенные данные',
// profile:
- 'change_your_password' => 'Изменить ваш пароль',
- 'delete_account' => 'Удалить профиль',
- 'current_password' => 'Текущий пароль',
- 'new_password' => 'Новый пароль',
- 'new_password_again' => 'Новый пароль (ещё раз)',
- 'delete_your_account' => 'Удалить ваш профиль',
- 'delete_your_account_help' => 'При удалении вашего профиля также будут удалены все счета, транзакции. Не будет сохранено ничего, что вы хранили в Firefly III. Всё будет УТЕРЯНО!',
- 'delete_your_account_password' => 'Для продолжения введите свой пароль.',
- 'password' => 'Пароль',
- 'are_you_sure' => 'Вы уверены? Эту операцию нельзя будет отменить.',
- 'delete_account_button' => 'УДАЛИТЬ ваш профиль',
- 'invalid_current_password' => 'Неправильный пароль!',
- 'password_changed' => 'Пароль изменён!',
- 'should_change' => 'Кажется, нужно изменить пароль.',
- 'invalid_password' => 'Неверный пароль!',
- 'what_is_pw_security' => 'Что такое «проверка безопасности паролей»?',
- 'secure_pw_title' => 'Как выбрать безопасный пароль',
- 'secure_pw_history' => 'В августе 2017 года известный исследователь безопасности Трой Хант опубликовал список из 306 миллионов украденных паролей. Эти пароли были украдены во время взломов в таких компаниях, как LinkedIn, Adobe и NeoPets (и многих других).',
- 'secure_pw_check_box' => 'Если вы установите данный флажок, Firefly III отправит SHA1-хэш вашего пароля на сайт Troy Hunt, чтобы узнать, есть ли он в списке. Согласно рекомендациям по данному вопросу, опубликованным недавно в NIST Special Publication, такая проверка защитит вас от использования небезопасных паролей.',
- 'secure_pw_sha1' => 'Но я думал, что SHA1 был взломан?',
- 'secure_pw_hash_speed' => 'Да, но не в этом контексте. На сайте https://shattered.io вы можете подробно узнать о том, как именно был взломан SHA1. На самом деле, теперь просто немного проще найти «коллизию», т.е. другую строку с таким же точно хэшем SHA1. Теперь на поиск потребуется всего около 10 000 лет расчётов на компьютере с одним GPU.',
- 'secure_pw_hash_security' => 'Причём, эта строка-"коллизия" точно не будет совпадать с вашим паролем, а значит будет бесполезна на сайтах (в т.ч. и на Firefly III). К тому же Firefly III использует SHA1 не для верификации пароля, а только для проверки его безопасности через упомянутый выше сайт. Причём перед отправкой ваш пароль хэшируется, а передаётся через HTTPS.',
- 'secure_pw_should' => 'Должен ли я установить флажок?',
- 'secure_pw_long_password' => 'Если вы только что создали длинный одноразовый пароль для Firefly III с использованием какого-либо генератора паролей: нет.',
- 'secure_pw_short' => 'Если вы только что ввели пароль, который вы используете на нескольких сайтах: пожалуйста, да.',
- 'command_line_token' => 'Токен командной строки',
- 'explain_command_line_token' => 'Этот токен необходим для выполнения операций из командной строки (таких как импорт или экспорт данных). Без него такие чувствительные команды не будут работать. Не показывайте никому свой токен. Никто не попросит у вас эту информацию, даже я. Если вы боитесь, что потеряли этот токен, или у вас паранойя, вы можете сгенерировать новый токен с помощью этой кнопки.',
- 'regenerate_command_line_token' => 'Сгенерировать новый токен командной строки',
- 'token_regenerated' => 'Новый токен командной строки сгенерирован',
- 'change_your_email' => 'Изменить ваш адрес электронной почты',
- 'email_verification' => 'Письмо будет отправлено на ваши адреса электронной почты: старый и новый. В целях безопасности, вы не сможете войти в систему, пока не подтвердите новый адрес электронной почты. Если вы не уверены, что ваша установка Firefly III может отправлять электронную почту, не используйте эту функцию. Если вы являетесь администратором, вы можете проверить это на странице Администрирование.',
- 'email_changed_logout' => 'Пока вы не подтвердите свой адрес электронной почты, вы не сможете войти в систему.',
- 'login_with_new_email' => 'Теперь вы можете войти с новым адресом электронной почты.',
- 'login_with_old_email' => 'Теперь вы можете снова войти со своим старым адресом электронной почты.',
+ 'change_your_password' => 'Изменить ваш пароль',
+ 'delete_account' => 'Удалить профиль',
+ 'current_password' => 'Текущий пароль',
+ 'new_password' => 'Новый пароль',
+ 'new_password_again' => 'Новый пароль (ещё раз)',
+ 'delete_your_account' => 'Удалить ваш профиль',
+ 'delete_your_account_help' => 'При удалении вашего профиля также будут удалены все счета, транзакции. Не будет сохранено ничего, что вы хранили в Firefly III. Всё будет УТЕРЯНО!',
+ 'delete_your_account_password' => 'Для продолжения введите свой пароль.',
+ 'password' => 'Пароль',
+ 'are_you_sure' => 'Вы уверены? Эту операцию нельзя будет отменить.',
+ 'delete_account_button' => 'УДАЛИТЬ ваш профиль',
+ 'invalid_current_password' => 'Неправильный пароль!',
+ 'password_changed' => 'Пароль изменён!',
+ 'should_change' => 'Кажется, нужно изменить пароль.',
+ 'invalid_password' => 'Неверный пароль!',
+ 'what_is_pw_security' => 'Что такое «проверка безопасности паролей»?',
+ 'secure_pw_title' => 'Как выбрать безопасный пароль',
+ 'secure_pw_history' => 'В августе 2017 года известный исследователь безопасности Трой Хант опубликовал список из 306 миллионов украденных паролей. Эти пароли были украдены во время взломов в таких компаниях, как LinkedIn, Adobe и NeoPets (и многих других).',
+ 'secure_pw_check_box' => 'Если вы установите данный флажок, Firefly III отправит первые 5 символов SHA1-хэша вашего пароля на сайт Troy Hunt, чтобы узнать, есть ли он в списке. Согласно рекомендациям по данному вопросу, опубликованным недавно в NIST Special Publication, такая проверка защитит вас от использования небезопасных паролей.',
+ 'secure_pw_sha1' => 'Но я думал, что SHA1 был взломан?',
+ 'secure_pw_hash_speed' => 'Да, но не в этом контексте. На сайте https://shattered.io вы можете подробно узнать о том, как именно был взломан SHA1. На самом деле, теперь просто немного проще найти «коллизию», т.е. другую строку с таким же точно хэшем SHA1. Теперь на поиск потребуется всего около 10 000 лет расчётов на компьютере с одним GPU.',
+ 'secure_pw_hash_security' => 'Причём, эта строка-"коллизия" точно не будет совпадать с вашим паролем, а значит будет бесполезна на сайтах (в т. ч. и на Firefly III). К тому же Firefly III использует SHA1 не для верификации пароля, а только для проверки его безопасности через упомянутый выше сайт. Причём перед отправкой ваш пароль хэшируется, а на проверку через HTTPS передаются только первые 5 символов хэша.',
+ 'secure_pw_should' => 'Должен ли я установить флажок?',
+ 'secure_pw_long_password' => 'Если вы только что создали длинный одноразовый пароль для Firefly III с использованием какого-либо генератора паролей: нет.',
+ 'secure_pw_short' => 'Если вы только что ввели пароль, который вы используете на нескольких сайтах: пожалуйста, да.',
+ 'command_line_token' => 'Токен командной строки',
+ 'explain_command_line_token' => 'Этот токен необходим для выполнения операций из командной строки (таких как импорт или экспорт данных). Без него такие чувствительные команды не будут работать. Не показывайте никому свой токен. Никто не попросит у вас эту информацию, даже я. Если вы боитесь, что потеряли этот токен, или у вас паранойя, вы можете сгенерировать новый токен с помощью этой кнопки.',
+ 'regenerate_command_line_token' => 'Сгенерировать новый токен командной строки',
+ 'token_regenerated' => 'Новый токен командной строки сгенерирован',
+ 'change_your_email' => 'Изменить ваш адрес электронной почты',
+ 'email_verification' => 'Письмо будет отправлено на ваши адреса электронной почты: старый и новый. В целях безопасности, вы не сможете войти в систему, пока не подтвердите новый адрес электронной почты. Если вы не уверены, что ваша установка Firefly III может отправлять электронную почту, не используйте эту функцию. Если вы являетесь администратором, вы можете проверить это на странице Администрирование.',
+ 'email_changed_logout' => 'Пока вы не подтвердите свой адрес электронной почты, вы не сможете войти в систему.',
+ 'login_with_new_email' => 'Теперь вы можете войти с новым адресом электронной почты.',
+ 'login_with_old_email' => 'Теперь вы можете снова войти со своим старым адресом электронной почты.',
// attachments
- 'nr_of_attachments' => 'Одно вложение |:count вложений',
- 'attachments' => 'Вложения',
- 'edit_attachment' => 'Изменить вложение ":name"',
- 'update_attachment' => 'Обновить вложение',
- 'delete_attachment' => 'Удалить вложение ":name"',
- 'attachment_deleted' => 'Вложение ":name" удалено',
- 'attachment_updated' => 'Вложение ":name" обновлено',
- 'upload_max_file_size' => 'Максимальный размер файла: :size',
+ 'nr_of_attachments' => 'Одно вложение |:count вложений',
+ 'attachments' => 'Вложения',
+ 'edit_attachment' => 'Изменить вложение ":name"',
+ 'update_attachment' => 'Обновить вложение',
+ 'delete_attachment' => 'Удалить вложение ":name"',
+ 'attachment_deleted' => 'Вложение ":name" удалено',
+ 'attachment_updated' => 'Вложение ":name" обновлено',
+ 'upload_max_file_size' => 'Максимальный размер файла: :size',
// transaction index
- 'title_expenses' => 'Расходы',
- 'title_withdrawal' => 'Расходы',
- 'title_revenue' => 'Доход',
- 'title_deposit' => 'Доход',
- 'title_transfer' => 'Переводы',
- 'title_transfers' => 'Переводы',
+ 'title_expenses' => 'Расходы',
+ 'title_withdrawal' => 'Расходы',
+ 'title_revenue' => 'Доход',
+ 'title_deposit' => 'Доход',
+ 'title_transfer' => 'Переводы',
+ 'title_transfers' => 'Переводы',
// convert stuff:
- 'convert_is_already_type_Withdrawal' => 'Эта транзакция уже является расходом',
- 'convert_is_already_type_Deposit' => 'Эта транзакция уже является доходом',
- 'convert_is_already_type_Transfer' => 'Эта транзакция уже является переводом',
- 'convert_to_Withdrawal' => 'Преобразовать ":description" в расход',
- 'convert_to_Deposit' => 'Преобразовать ":description" в доход',
- 'convert_to_Transfer' => 'Преобразовать ":description" в перевод',
- 'convert_options_WithdrawalDeposit' => 'Преобразовать расход в доход',
- 'convert_options_WithdrawalTransfer' => 'Преобразовать расход в перевод',
- 'convert_options_DepositTransfer' => 'Преобразовать доход в перевод',
- 'convert_options_DepositWithdrawal' => 'Преобразовать доход в расход',
- 'convert_options_TransferWithdrawal' => 'Преобразовать перевод в расход',
- 'convert_options_TransferDeposit' => 'Преобразовать перевод в доход',
- 'convert_Withdrawal_to_deposit' => 'Преобразовать этот расход в доход',
- 'convert_Withdrawal_to_transfer' => 'Преобразовать этот расход в перевод',
- 'convert_Deposit_to_withdrawal' => 'Преобразовать этот доход в расход',
- 'convert_Deposit_to_transfer' => 'Преобразовать этот доход в перевод',
- 'convert_Transfer_to_deposit' => 'Преобразовать этот перевод в доход',
- 'convert_Transfer_to_withdrawal' => 'Преобразовать этот перевод в расход',
- 'convert_please_set_revenue_source' => 'Пожалуйста, выберите счёт доходов, с которого поступят деньги.',
- 'convert_please_set_asset_destination' => 'Пожалуйста, выберите основной счёт, на который будут переведены деньги.',
- 'convert_please_set_expense_destination' => 'Пожалуйста, выберите счёт расходов, на который будут направлены деньги.',
- 'convert_please_set_asset_source' => 'Пожалуйста, выберите основной счёт, с которого поступят деньги.',
- 'convert_explanation_withdrawal_deposit' => 'Если вы преобразуете этот расход в доход, то сумма :amount будет зачислена на счёт :sourceName, а не изъята с него.',
- 'convert_explanation_withdrawal_transfer' => 'Если вы преобразуете этот расход в перевод, то сумма :amount будет перемещена со счёта :sourceName на новый основной счёт, а не на счёт :destinationName.',
- 'convert_explanation_deposit_withdrawal' => 'Если вы преобразуете этот доход в расход, то сумма :amount будет удалена со счёта :destinationName, а не добавлена на него.',
- 'convert_explanation_deposit_transfer' => 'Если вы преобразуете этот доход в перевод, то сумма :amount будет перемещена на выбранный вами счёт :destinationName.',
- 'convert_explanation_transfer_withdrawal' => 'Если вы преобразуете этот перевод в расход, сумма :amount будет списана со счёта :sourceName в качестве расхода, а не перемещена на счёт :destinationName.',
- 'convert_explanation_transfer_deposit' => 'Если вы преобразуете этот перевод в доход, сумма :amount будет зачислена на счёт :destinationName, а не переведена на него.',
- 'converted_to_Withdrawal' => 'Транзакция была преобразована в расход',
- 'converted_to_Deposit' => 'Транзакция была преобразована в доход',
- 'converted_to_Transfer' => 'Транзакция была преобразована в перевод',
- 'invalid_convert_selection' => 'Выбранный вами счёт уже используется в этой транзакции или не существует.',
+ 'convert_is_already_type_Withdrawal' => 'Эта транзакция уже является расходом',
+ 'convert_is_already_type_Deposit' => 'Эта транзакция уже является доходом',
+ 'convert_is_already_type_Transfer' => 'Эта транзакция уже является переводом',
+ 'convert_to_Withdrawal' => 'Преобразовать ":description" в расход',
+ 'convert_to_Deposit' => 'Преобразовать ":description" в доход',
+ 'convert_to_Transfer' => 'Преобразовать ":description" в перевод',
+ 'convert_options_WithdrawalDeposit' => 'Преобразовать расход в доход',
+ 'convert_options_WithdrawalTransfer' => 'Преобразовать расход в перевод',
+ 'convert_options_DepositTransfer' => 'Преобразовать доход в перевод',
+ 'convert_options_DepositWithdrawal' => 'Преобразовать доход в расход',
+ 'convert_options_TransferWithdrawal' => 'Преобразовать перевод в расход',
+ 'convert_options_TransferDeposit' => 'Преобразовать перевод в доход',
+ 'convert_Withdrawal_to_deposit' => 'Преобразовать этот расход в доход',
+ 'convert_Withdrawal_to_transfer' => 'Преобразовать этот расход в перевод',
+ 'convert_Deposit_to_withdrawal' => 'Преобразовать этот доход в расход',
+ 'convert_Deposit_to_transfer' => 'Преобразовать этот доход в перевод',
+ 'convert_Transfer_to_deposit' => 'Преобразовать этот перевод в доход',
+ 'convert_Transfer_to_withdrawal' => 'Преобразовать этот перевод в расход',
+ 'convert_please_set_revenue_source' => 'Пожалуйста, выберите счёт доходов, с которого поступят деньги.',
+ 'convert_please_set_asset_destination' => 'Пожалуйста, выберите основной счёт, на который будут переведены деньги.',
+ 'convert_please_set_expense_destination' => 'Пожалуйста, выберите счёт расходов, на который будут направлены деньги.',
+ 'convert_please_set_asset_source' => 'Пожалуйста, выберите основной счёт, с которого поступят деньги.',
+ 'convert_explanation_withdrawal_deposit' => 'Если вы преобразуете этот расход в доход, то сумма :amount будет зачислена на счёт :sourceName, а не изъята с него.',
+ 'convert_explanation_withdrawal_transfer' => 'Если вы преобразуете этот расход в перевод, то сумма :amount будет перемещена со счёта :sourceName на новый основной счёт, а не на счёт :destinationName.',
+ 'convert_explanation_deposit_withdrawal' => 'Если вы преобразуете этот доход в расход, то сумма :amount будет удалена со счёта :destinationName, а не добавлена на него.',
+ 'convert_explanation_deposit_transfer' => 'Если вы преобразуете этот доход в перевод, то сумма :amount будет перемещена на выбранный вами счёт :destinationName.',
+ 'convert_explanation_transfer_withdrawal' => 'Если вы преобразуете этот перевод в расход, сумма :amount будет списана со счёта :sourceName в качестве расхода, а не перемещена на счёт :destinationName.',
+ 'convert_explanation_transfer_deposit' => 'Если вы преобразуете этот перевод в доход, сумма :amount будет зачислена на счёт :destinationName, а не переведена на него.',
+ 'converted_to_Withdrawal' => 'Транзакция была преобразована в расход',
+ 'converted_to_Deposit' => 'Транзакция была преобразована в доход',
+ 'converted_to_Transfer' => 'Транзакция была преобразована в перевод',
+ 'invalid_convert_selection' => 'Выбранный вами счёт уже используется в этой транзакции или не существует.',
// create new stuff:
- 'create_new_withdrawal' => 'Создать новый расход',
- 'create_new_deposit' => 'Создать новый доход',
- 'create_new_transfer' => 'Создать новый перевод',
- 'create_new_asset' => 'Создать новый активный счёт',
- 'create_new_expense' => 'Создать новый счёт расхода',
- 'create_new_revenue' => 'Создать новый счёт дохода',
- 'create_new_piggy_bank' => 'Создать новую копилку',
- 'create_new_bill' => 'Создать новый счёт к оплате',
+ 'create_new_withdrawal' => 'Создать новый расход',
+ 'create_new_deposit' => 'Создать новый доход',
+ 'create_new_transfer' => 'Создать новый перевод',
+ 'create_new_asset' => 'Создать новый активный счёт',
+ 'create_new_expense' => 'Создать новый счёт расхода',
+ 'create_new_revenue' => 'Создать новый счёт дохода',
+ 'create_new_piggy_bank' => 'Создать новую копилку',
+ 'create_new_bill' => 'Создать новый счёт к оплате',
// currencies:
- 'create_currency' => 'Создать новую валюту',
- 'store_currency' => 'Сохранить новую валюту',
- 'update_currency' => 'Обновить валюту',
- 'new_default_currency' => ':name теперь является вашей основной валютой.',
- 'cannot_delete_currency' => 'Невозможно удалить валюту :name, поскольку она используется.',
- 'deleted_currency' => 'Валюта :name удалена',
- 'created_currency' => 'Валюта :name создана',
- 'updated_currency' => 'Валюта :name обновлена',
- 'ask_site_owner' => 'Пожалуйста, обратитесь к :owner для добавления, удаления или изменения валюты.',
- 'currencies_intro' => 'Firefly III может работать с несколькими валютами. Вы можете управлять ими здесь.',
- 'make_default_currency' => 'сделать основной',
- 'default_currency' => 'основная',
+ 'create_currency' => 'Создать новую валюту',
+ 'store_currency' => 'Сохранить новую валюту',
+ 'update_currency' => 'Обновить валюту',
+ 'new_default_currency' => ':name теперь является вашей основной валютой.',
+ 'cannot_delete_currency' => 'Невозможно удалить валюту :name, поскольку она используется.',
+ 'deleted_currency' => 'Валюта :name удалена',
+ 'created_currency' => 'Валюта :name создана',
+ 'updated_currency' => 'Валюта :name обновлена',
+ 'ask_site_owner' => 'Пожалуйста, обратитесь к :owner для добавления, удаления или изменения валюты.',
+ 'currencies_intro' => 'Firefly III может работать с несколькими валютами. Вы можете управлять ими здесь.',
+ 'make_default_currency' => 'сделать основной',
+ 'default_currency' => 'основная',
// forms:
- 'mandatoryFields' => 'Обязательные поля',
- 'optionalFields' => 'Дополнительные поля',
- 'options' => 'Параметры',
+ 'mandatoryFields' => 'Обязательные поля',
+ 'optionalFields' => 'Дополнительные поля',
+ 'options' => 'Параметры',
// budgets:
- 'create_new_budget' => 'Создать новый бюджет',
- 'store_new_budget' => 'Сохранить новый бюджет',
- 'stored_new_budget' => 'Новый бюджет ":name" сохранён',
- 'available_between' => 'Доступно между :start и :end',
- 'transactionsWithoutBudget' => 'Расходы вне бюджета',
- 'transactions_no_budget' => 'Расходы вне бюджета между :start и :end',
- 'spent_between' => 'Расходы между :start и :end',
- 'createBudget' => 'Новый бюджет',
- 'inactiveBudgets' => 'Неактивные бюджеты',
- 'without_budget_between' => 'Транзакции вне бюджета между :start и :end',
- 'delete_budget' => 'Удалить бюджет ":name"',
- 'deleted_budget' => 'Бюджет ":name" удалён',
- 'edit_budget' => 'Редактировать бюджет ":name"',
- 'updated_budget' => 'Бюджет ":name" обновлён',
- 'update_amount' => 'Обновить сумму',
- 'update_budget' => 'Обновить бюджет',
- 'update_budget_amount_range' => 'Обновить (ожидаемые) доступные средства между :start и :end',
- 'budget_period_navigator' => 'Навигация по периодам',
- 'info_on_available_amount' => 'Сколько средств у меня есть?',
- 'available_amount_indication' => 'Используйте эти суммы, чтобы узнать, каким может быть ваш суммарный бюджет.',
- 'suggested' => 'Рекомендуемые',
- 'average_between' => 'В среднем между :start и :end',
+ 'create_new_budget' => 'Создать новый бюджет',
+ 'store_new_budget' => 'Сохранить новый бюджет',
+ 'stored_new_budget' => 'Новый бюджет ":name" сохранён',
+ 'available_between' => 'Доступно между :start и :end',
+ 'transactionsWithoutBudget' => 'Расходы вне бюджета',
+ 'transactions_no_budget' => 'Расходы вне бюджета между :start и :end',
+ 'spent_between' => 'Расходы между :start и :end',
+ 'createBudget' => 'Новый бюджет',
+ 'inactiveBudgets' => 'Неактивные бюджеты',
+ 'without_budget_between' => 'Транзакции вне бюджета между :start и :end',
+ 'delete_budget' => 'Удалить бюджет ":name"',
+ 'deleted_budget' => 'Бюджет ":name" удалён',
+ 'edit_budget' => 'Редактировать бюджет ":name"',
+ 'updated_budget' => 'Бюджет ":name" обновлён',
+ 'update_amount' => 'Обновить сумму',
+ 'update_budget' => 'Обновить бюджет',
+ 'update_budget_amount_range' => 'Обновить (ожидаемые) доступные средства между :start и :end',
+ 'budget_period_navigator' => 'Навигация по периодам',
+ 'info_on_available_amount' => 'Сколько средств у меня есть?',
+ 'available_amount_indication' => 'Используйте эти суммы, чтобы узнать, каким может быть ваш суммарный бюджет.',
+ 'suggested' => 'Рекомендуемые',
+ 'average_between' => 'В среднем между :start и :end',
+ 'over_budget_warn' => ' Обычно ваш бюджет - около :amount в день. Это :over_amount в день.',
// bills:
- 'matching_on' => 'Совпадает с',
- 'between_amounts' => 'между :low и :high.',
- 'repeats' => 'Повторы',
- 'connected_journals' => 'Связанные транзакции',
- 'auto_match_on' => 'Автоматически сверено Firefly III',
- 'auto_match_off' => 'Не сверено автоматически Firefly III',
- 'next_expected_match' => 'Следующая сверка ожидается',
- 'delete_bill' => 'Удалить счёт к оплате ":name"',
- 'deleted_bill' => 'Удаленный счёт к оплате ":name"',
- 'edit_bill' => 'Отредактировать счёт к оплате ":name"',
- 'more' => 'Больше',
- 'rescan_old' => 'Перепроверить старые транзакции',
- 'update_bill' => 'Обновить счёт на оплату',
- 'updated_bill' => 'Счёт на оплату ":name" обновлён',
- 'store_new_bill' => 'Сохранить новый счёт к оплате',
- 'stored_new_bill' => 'Новый счёт к оплате ":name" сохранён',
- 'cannot_scan_inactive_bill' => 'Неактивные счета не могут быть перепроверены.',
- 'rescanned_bill' => 'Все счеты были перепроверены.',
- 'average_bill_amount_year' => 'Средняя сумма счёта на оплату (:year)',
- 'average_bill_amount_overall' => 'Средняя сумма счёта на оплату (за всё время)',
- 'bill_is_active' => 'Счёт на оплату активен',
- 'bill_expected_between' => 'Ожидается между :start и :end',
- 'bill_will_automatch' => 'Счёт будет автоматически связан с подходящими транзакциями',
- 'skips_over' => 'пропустить',
-
+ 'matching_on' => 'Совпадает с',
+ 'between_amounts' => 'между :low и :high.',
+ 'repeats' => 'Повторы',
+ 'connected_journals' => 'Связанные транзакции',
+ 'auto_match_on' => 'Автоматически сверено Firefly III',
+ 'auto_match_off' => 'Не сверено автоматически Firefly III',
+ 'next_expected_match' => 'Следующая сверка ожидается',
+ 'delete_bill' => 'Удалить счёт к оплате ":name"',
+ 'deleted_bill' => 'Удаленный счёт к оплате ":name"',
+ 'edit_bill' => 'Отредактировать счёт к оплате ":name"',
+ 'more' => 'Больше',
+ 'rescan_old' => 'Перепроверить старые транзакции',
+ 'update_bill' => 'Обновить счёт на оплату',
+ 'updated_bill' => 'Счёт на оплату ":name" обновлён',
+ 'store_new_bill' => 'Сохранить новый счёт к оплате',
+ 'stored_new_bill' => 'Новый счёт к оплате ":name" сохранён',
+ 'cannot_scan_inactive_bill' => 'Неактивные счета не могут быть перепроверены.',
+ 'rescanned_bill' => 'Все счеты были перепроверены.',
+ 'average_bill_amount_year' => 'Средняя сумма счёта на оплату (:year)',
+ 'average_bill_amount_overall' => 'Средняя сумма счёта на оплату (за всё время)',
+ 'bill_is_active' => 'Счёт на оплату активен',
+ 'bill_expected_between' => 'Ожидается между :start и :end',
+ 'bill_will_automatch' => 'Счёт будет автоматически связан с подходящими транзакциями',
+ 'skips_over' => 'пропустить',
// accounts:
- 'details_for_asset' => 'Детали по основному счёту ":name"',
- 'details_for_expense' => 'Детали по счёту расходов ":name"',
- 'details_for_revenue' => 'Детали по счёту доходов ":name"',
- 'details_for_cash' => 'Детали по наличному счёту ":name"',
- 'store_new_asset_account' => 'Сохранить новый основной счёт',
- 'store_new_expense_account' => 'Сохранить новый счёт расхода',
- 'store_new_revenue_account' => 'Сохранить новый счёт дохода',
- 'edit_asset_account' => 'Изменить основной счёт ":name"',
- 'edit_expense_account' => 'Изменить счёт расходов ":name"',
- 'edit_revenue_account' => 'Изменить счёт доходов ":name"',
- 'delete_asset_account' => 'Удалить основной счёт ":name"',
- 'delete_expense_account' => 'Удалить счёт расходов ":name"',
- 'delete_revenue_account' => 'Удалить счёт доходов ":name"',
- 'asset_deleted' => 'Основной счёт ":name" успешно удалён',
- 'expense_deleted' => 'Счёт расхода ":name" успешно удалён',
- 'revenue_deleted' => 'Счёт дохода ":name" успешно удалён',
- 'update_asset_account' => 'Обновить основной счёт',
- 'update_expense_account' => 'Обновить счёт расхода',
- 'update_revenue_account' => 'Обновить счёт дохода',
- 'make_new_asset_account' => 'Создать новый основной счёт',
- 'make_new_expense_account' => 'Создать новый счёт расхода',
- 'make_new_revenue_account' => 'Создать новый счёт дохода',
- 'asset_accounts' => 'Основные счета',
- 'expense_accounts' => 'Счета расходов',
- 'revenue_accounts' => 'Счета доходов',
- 'cash_accounts' => 'Наличные деньги',
- 'Cash account' => 'Наличные деньги',
- 'reconcile_account' => 'Сверка счёта ":account"',
- 'delete_reconciliation' => 'Удалить сверку',
- 'update_reconciliation' => 'Обновить сверку',
- 'amount_cannot_be_zero' => 'Сумма не может быть равна нулю',
- 'end_of_reconcile_period' => 'Конец периода сверки: :period',
- 'start_of_reconcile_period' => 'Начало периода сверки: :period',
- 'start_balance' => 'Начальный баланс',
- 'end_balance' => 'Конечный баланс',
- 'update_balance_dates_instruction' => 'Сверьте суммы и даты, указанные выше, со своей банковской выпиской и нажмите «Начать сверку»',
- 'select_transactions_instruction' => 'Выберите транзакции, которые отражены в выписке с вашего банковского счёта.',
- 'select_range_and_balance' => 'Сначала проверьте диапазон дат и балансы. Затем нажмите «Начать сверку»',
- 'date_change_instruction' => 'Если вы измените диапазон дат сейчас, текущий прогресс будет потерян.',
- 'update_selection' => 'Обновить выбранное',
- 'store_reconcile' => 'Сохранить сверку',
- 'reconciliation_transaction' => 'Сверка транзакции',
- 'Reconciliation' => 'Сверка',
- 'reconciliation' => 'Сверка',
- 'reconcile_options' => 'Параметры сверки',
- 'reconcile_range' => 'Диапазон сверки',
- 'start_reconcile' => 'Начать сверку',
- 'cash' => 'наличные',
- 'account_type' => 'Тип счёта',
- 'save_transactions_by_moving' => 'Сохраните эти транзакции, переместив их на другой счёт:',
- 'stored_new_account' => 'Новый счёт ":name" сохранён!',
- 'updated_account' => 'Обновить счёт ":name"',
- 'credit_card_options' => 'Параметры кредитной карты',
- 'no_transactions_account' => 'Для основного счёта ":name" нет транзакций (в этом периоде).',
- 'no_data_for_chart' => 'Недостаточно информации (пока) для построения этой диаграммы.',
- 'select_more_than_one_account' => 'Пожалуйста, выберите больше одного счёта',
- 'select_more_than_one_category' => 'Пожалуйста, выберите больше одной категории',
- 'select_more_than_one_budget' => 'Пожалуйста, выберите больше одного бюджета',
- 'select_more_than_one_tag' => 'Пожалуйста, выберите больше одной метки',
- 'account_default_currency' => 'Если вы выберете другую валюту, новые транзакции по данному счёту будут по умолчанию использовать именно её.',
- 'reconcile_has_more' => 'В вашей бухгалтерской книге Firefly III учтено больше денег, чем должно быть, согласно выписке из банка. Существует несколько вариантов. Пожалуйста, выберите, что делать, а затем нажмите «Подтвердить сверку».',
- 'reconcile_has_less' => 'В вашей бухгалтерской книге Firefly III учтено меньше денег, чем должно быть, согласно выписке из банка. Существует несколько вариантов. Пожалуйста, выберите, что делать, а затем нажмите «Подтвердить сверку».',
- 'reconcile_is_equal' => 'Ваша бухгалтерская книга Firefly III и ваши банковские выписки совпадают. Ничего делать не нужно. Пожалуйста, нажмите «Подтвердить сверку» для ввода данных.',
- 'create_pos_reconcile_transaction' => 'Удалить выбранные транзакции и создать корректировку, добавляющую сумму :amount к этому основному счёту.',
- 'create_neg_reconcile_transaction' => 'Удалить выбранные транзакции и создать корректировку, удаляющую сумму :amount с этого основного счёта.',
- 'reconcile_do_nothing' => 'Удалить выбранные транзакции, но не производить корректировку.',
- 'reconcile_go_back' => 'Вы сможете изменить или удалить корректировку позже.',
- 'must_be_asset_account' => 'Вы можете производить сверку только для основных счётов',
- 'reconciliation_stored' => 'Сверка сохранена',
- 'reconcilliation_transaction_title' => 'Сверка (с :from по :to)',
- 'reconcile_this_account' => 'Произвести сверку данного счёта',
- 'confirm_reconciliation' => 'Подтвердить сверку',
- 'submitted_start_balance' => 'Подтверждённый начальный баланс',
- 'selected_transactions' => 'Выбранный транзакции (:count)',
- 'already_cleared_transactions' => 'Уже удалённые транзакции (:count)',
- 'submitted_end_balance' => 'Подтверждённый конечный баланс',
- 'initial_balance_description' => 'Начальный баланс для ":account"',
+ 'details_for_asset' => 'Детали по основному счёту ":name"',
+ 'details_for_expense' => 'Детали по счёту расходов ":name"',
+ 'details_for_revenue' => 'Детали по счёту доходов ":name"',
+ 'details_for_cash' => 'Детали по наличному счёту ":name"',
+ 'store_new_asset_account' => 'Сохранить новый основной счёт',
+ 'store_new_expense_account' => 'Сохранить новый счёт расхода',
+ 'store_new_revenue_account' => 'Сохранить новый счёт дохода',
+ 'edit_asset_account' => 'Изменить основной счёт ":name"',
+ 'edit_expense_account' => 'Изменить счёт расходов ":name"',
+ 'edit_revenue_account' => 'Изменить счёт доходов ":name"',
+ 'delete_asset_account' => 'Удалить основной счёт ":name"',
+ 'delete_expense_account' => 'Удалить счёт расходов ":name"',
+ 'delete_revenue_account' => 'Удалить счёт доходов ":name"',
+ 'asset_deleted' => 'Основной счёт ":name" успешно удалён',
+ 'expense_deleted' => 'Счёт расхода ":name" успешно удалён',
+ 'revenue_deleted' => 'Счёт дохода ":name" успешно удалён',
+ 'update_asset_account' => 'Обновить основной счёт',
+ 'update_expense_account' => 'Обновить счёт расхода',
+ 'update_revenue_account' => 'Обновить счёт дохода',
+ 'make_new_asset_account' => 'Создать новый основной счёт',
+ 'make_new_expense_account' => 'Создать новый счёт расхода',
+ 'make_new_revenue_account' => 'Создать новый счёт дохода',
+ 'asset_accounts' => 'Основные счета',
+ 'expense_accounts' => 'Счета расходов',
+ 'revenue_accounts' => 'Счета доходов',
+ 'cash_accounts' => 'Наличные деньги',
+ 'Cash account' => 'Наличные деньги',
+ 'reconcile_account' => 'Сверка счёта ":account"',
+ 'delete_reconciliation' => 'Удалить сверку',
+ 'update_reconciliation' => 'Обновить сверку',
+ 'amount_cannot_be_zero' => 'Сумма не может быть равна нулю',
+ 'end_of_reconcile_period' => 'Конец периода сверки: :period',
+ 'start_of_reconcile_period' => 'Начало периода сверки: :period',
+ 'start_balance' => 'Начальный баланс',
+ 'end_balance' => 'Конечный баланс',
+ 'update_balance_dates_instruction' => 'Сверьте суммы и даты, указанные выше, со своей банковской выпиской и нажмите «Начать сверку»',
+ 'select_transactions_instruction' => 'Выберите транзакции, которые отражены в выписке с вашего банковского счёта.',
+ 'select_range_and_balance' => 'Сначала проверьте диапазон дат и балансы. Затем нажмите «Начать сверку»',
+ 'date_change_instruction' => 'Если вы измените диапазон дат сейчас, текущий прогресс будет потерян.',
+ 'update_selection' => 'Обновить выбранное',
+ 'store_reconcile' => 'Сохранить сверку',
+ 'reconciliation_transaction' => 'Сверка транзакции',
+ 'Reconciliation' => 'Сверка',
+ 'reconciliation' => 'Сверка',
+ 'reconcile_options' => 'Параметры сверки',
+ 'reconcile_range' => 'Диапазон сверки',
+ 'start_reconcile' => 'Начать сверку',
+ 'cash' => 'наличные',
+ 'account_type' => 'Тип счёта',
+ 'save_transactions_by_moving' => 'Сохраните эти транзакции, переместив их на другой счёт:',
+ 'stored_new_account' => 'Новый счёт ":name" сохранён!',
+ 'updated_account' => 'Обновить счёт ":name"',
+ 'credit_card_options' => 'Параметры кредитной карты',
+ 'no_transactions_account' => 'Для основного счёта ":name" нет транзакций (в этом периоде).',
+ 'no_data_for_chart' => 'Недостаточно информации (пока) для построения этой диаграммы.',
+ 'select_more_than_one_account' => 'Пожалуйста, выберите больше одного счёта',
+ 'select_more_than_one_category' => 'Пожалуйста, выберите больше одной категории',
+ 'select_more_than_one_budget' => 'Пожалуйста, выберите больше одного бюджета',
+ 'select_more_than_one_tag' => 'Пожалуйста, выберите больше одной метки',
+ 'account_default_currency' => 'Если вы выберете другую валюту, новые транзакции по данному счёту будут по умолчанию использовать именно её.',
+ 'reconcile_has_more' => 'В вашей бухгалтерской книге Firefly III учтено больше денег, чем должно быть, согласно выписке из банка. Существует несколько вариантов. Пожалуйста, выберите, что делать, а затем нажмите «Подтвердить сверку».',
+ 'reconcile_has_less' => 'В вашей бухгалтерской книге Firefly III учтено меньше денег, чем должно быть, согласно выписке из банка. Существует несколько вариантов. Пожалуйста, выберите, что делать, а затем нажмите «Подтвердить сверку».',
+ 'reconcile_is_equal' => 'Ваша бухгалтерская книга Firefly III и ваши банковские выписки совпадают. Ничего делать не нужно. Пожалуйста, нажмите «Подтвердить сверку» для ввода данных.',
+ 'create_pos_reconcile_transaction' => 'Удалить выбранные транзакции и создать корректировку, добавляющую сумму :amount к этому основному счёту.',
+ 'create_neg_reconcile_transaction' => 'Удалить выбранные транзакции и создать корректировку, удаляющую сумму :amount с этого основного счёта.',
+ 'reconcile_do_nothing' => 'Удалить выбранные транзакции, но не производить корректировку.',
+ 'reconcile_go_back' => 'Вы сможете изменить или удалить корректировку позже.',
+ 'must_be_asset_account' => 'Вы можете производить сверку только для основных счётов',
+ 'reconciliation_stored' => 'Сверка сохранена',
+ 'reconcilliation_transaction_title' => 'Сверка (с :from по :to)',
+ 'reconcile_this_account' => 'Произвести сверку данного счёта',
+ 'confirm_reconciliation' => 'Подтвердить сверку',
+ 'submitted_start_balance' => 'Подтверждённый начальный баланс',
+ 'selected_transactions' => 'Выбранный транзакции (:count)',
+ 'already_cleared_transactions' => 'Уже удалённые транзакции (:count)',
+ 'submitted_end_balance' => 'Подтверждённый конечный баланс',
+ 'initial_balance_description' => 'Начальный баланс для ":account"',
// categories:
- 'new_category' => 'Новая категория',
- 'create_new_category' => 'Создать новую категорию',
- 'without_category' => 'Без категории',
- 'update_category' => 'Обновить категорию',
- 'updated_category' => 'Обновить категорию ":name"',
- 'categories' => 'Категории',
- 'edit_category' => 'Изменить категорию ":name"',
- 'no_category' => '(без категории)',
- 'category' => 'Категория',
- 'delete_category' => 'Удалить категорию ":name"',
- 'deleted_category' => 'Удалить категорию ":name"',
- 'store_category' => 'Сохранить новую категорию',
- 'stored_category' => 'Новая категория ":name" успешно сохранена!',
- 'without_category_between' => 'Без категории между :start и :end',
+ 'new_category' => 'Новая категория',
+ 'create_new_category' => 'Создать новую категорию',
+ 'without_category' => 'Без категории',
+ 'update_category' => 'Обновить категорию',
+ 'updated_category' => 'Обновить категорию ":name"',
+ 'categories' => 'Категории',
+ 'edit_category' => 'Изменить категорию ":name"',
+ 'no_category' => '(без категории)',
+ 'category' => 'Категория',
+ 'delete_category' => 'Удалить категорию ":name"',
+ 'deleted_category' => 'Удалить категорию ":name"',
+ 'store_category' => 'Сохранить новую категорию',
+ 'stored_category' => 'Новая категория ":name" успешно сохранена!',
+ 'without_category_between' => 'Без категории между :start и :end',
// transactions:
- 'update_withdrawal' => 'Обновить расход',
- 'update_deposit' => 'Обновить доход',
- 'update_transfer' => 'Обновить перевод',
- 'updated_withdrawal' => 'Расход ":description" обновлён',
- 'updated_deposit' => 'Доход ":description" обновлён',
- 'updated_transfer' => 'Перевод ":description" обновлён',
- 'delete_withdrawal' => 'Удалить расход ":description"',
- 'delete_deposit' => 'Удалить доход ":description"',
- 'delete_transfer' => 'Удалить перевод ":description"',
- 'deleted_withdrawal' => 'Расход ":description" успешно удалён',
- 'deleted_deposit' => 'Доход ":description" успешно удалён',
- 'deleted_transfer' => 'Перевод ":description" успешно удалён',
- 'stored_journal' => 'Новая транзакция ":description" успешно создана',
- 'select_transactions' => 'Выбрать транзакции',
- 'rule_group_select_transactions' => 'Применить ":title" к транзакциям',
- 'rule_select_transactions' => 'Применить ":title" к транзакциям',
- 'stop_selection' => 'Завершить выбор транзакций',
- 'reconcile_selected' => 'Сверить',
- 'mass_delete_journals' => 'Удалить несколько транзакций',
- 'mass_edit_journals' => 'Изменить несколько транзакций',
- 'mass_bulk_journals' => 'Массовое изменение нескольких транзакций',
- 'mass_bulk_journals_explain' => 'Если вы не хотите изменять транзакции по одной, вы можете использовать функцию массового редактирования, чтобы обновить из все разом. Просто выберите нужную категорию, метки или бюджет в полях ниже, и все транзакции в таблице будут обновлены.',
- 'bulk_set_new_values' => 'Используйте эти поля для ввода новых значений. Если вы оставите их пустыми, они будут очищены у всех записей. Также обратите внимание, что бюджет будет сопоставлен только с расходами.',
- 'no_bulk_category' => 'Не обновлять категорию',
- 'no_bulk_budget' => 'Не обновлять бюджет',
- 'no_bulk_tags' => 'Не обновлять метки',
- 'bulk_edit' => 'Массовое изменение',
- 'cannot_edit_other_fields' => 'Вы не можете массово редактировать другие поля, кроме тех, которые видите здесь, поскольку для их отображения недостаточно места. Пожалуйста, перейдите по ссылке и отредактируйте их по одной, если вам нужно изменить такие поля.',
- 'no_budget' => '(no budget)',
- 'no_budget_squared' => '(вне бюджета)',
- 'perm-delete-many' => 'Удаление большого числа записей за один раз может вызывать проблемы. Пожалуйста, будьте осторожны.',
- 'mass_deleted_transactions_success' => 'Удалено :amount транзакций.',
- 'mass_edited_transactions_success' => 'Обновлено :amount транзакций',
- 'opt_group_no_account_type' => '(нет типа счёта)',
- 'opt_group_defaultAsset' => 'Основные счета по умолчанию',
- 'opt_group_savingAsset' => 'Сберегательные счета',
- 'opt_group_sharedAsset' => 'Общие основные счета',
- 'opt_group_ccAsset' => 'Кредитные карты',
- 'notes' => 'Заметки',
+ 'update_withdrawal' => 'Обновить расход',
+ 'update_deposit' => 'Обновить доход',
+ 'update_transfer' => 'Обновить перевод',
+ 'updated_withdrawal' => 'Расход ":description" обновлён',
+ 'updated_deposit' => 'Доход ":description" обновлён',
+ 'updated_transfer' => 'Перевод ":description" обновлён',
+ 'delete_withdrawal' => 'Удалить расход ":description"',
+ 'delete_deposit' => 'Удалить доход ":description"',
+ 'delete_transfer' => 'Удалить перевод ":description"',
+ 'deleted_withdrawal' => 'Расход ":description" успешно удалён',
+ 'deleted_deposit' => 'Доход ":description" успешно удалён',
+ 'deleted_transfer' => 'Перевод ":description" успешно удалён',
+ 'stored_journal' => 'Новая транзакция ":description" успешно создана',
+ 'select_transactions' => 'Выбрать транзакции',
+ 'rule_group_select_transactions' => 'Применить ":title" к транзакциям',
+ 'rule_select_transactions' => 'Применить ":title" к транзакциям',
+ 'stop_selection' => 'Завершить выбор транзакций',
+ 'reconcile_selected' => 'Сверить',
+ 'mass_delete_journals' => 'Удалить несколько транзакций',
+ 'mass_edit_journals' => 'Изменить несколько транзакций',
+ 'mass_bulk_journals' => 'Массовое изменение нескольких транзакций',
+ 'mass_bulk_journals_explain' => 'Если вы не хотите изменять транзакции по одной, вы можете использовать функцию массового редактирования, чтобы обновить из все разом. Просто выберите нужную категорию, метки или бюджет в полях ниже, и все транзакции в таблице будут обновлены.',
+ 'bulk_set_new_values' => 'Используйте эти поля для ввода новых значений. Если вы оставите их пустыми, они будут очищены у всех записей. Также обратите внимание, что бюджет будет сопоставлен только с расходами.',
+ 'no_bulk_category' => 'Не обновлять категорию',
+ 'no_bulk_budget' => 'Не обновлять бюджет',
+ 'no_bulk_tags' => 'Не обновлять метки',
+ 'bulk_edit' => 'Массовое изменение',
+ 'cannot_edit_other_fields' => 'Вы не можете массово редактировать другие поля, кроме тех, которые видите здесь, поскольку для их отображения недостаточно места. Пожалуйста, перейдите по ссылке и отредактируйте их по одной, если вам нужно изменить такие поля.',
+ 'no_budget' => '(no budget)',
+ 'no_budget_squared' => '(вне бюджета)',
+ 'perm-delete-many' => 'Удаление большого числа записей за один раз может вызывать проблемы. Пожалуйста, будьте осторожны.',
+ 'mass_deleted_transactions_success' => 'Удалено :amount транзакций.',
+ 'mass_edited_transactions_success' => 'Обновлено :amount транзакций',
+ 'opt_group_no_account_type' => '(нет типа счёта)',
+ 'opt_group_defaultAsset' => 'Основные счета по умолчанию',
+ 'opt_group_savingAsset' => 'Сберегательные счета',
+ 'opt_group_sharedAsset' => 'Общие основные счета',
+ 'opt_group_ccAsset' => 'Кредитные карты',
+ 'notes' => 'Заметки',
// new user:
- 'welcome' => 'Добро пожаловать в Firefly III!',
- 'submit' => 'Подтвердить',
- 'getting_started' => 'Начало работы',
- 'to_get_started' => 'Приятно видеть, что вы успешно установили Firefly III. Чтобы начать работу, введите, пожалуйста, название своего банка и баланс вашего основного банковского счёта. Если вы планируете использовать несколько счетов, не волнуйтесь, вы сможете добавить их позже. Сейчас Firefly III просто нужны какие-нибудь первоначальные данные.',
- 'savings_balance_text' => 'Firefly III автоматически создаст сберегательный счёт для вас. По умолчанию на вашем сберегательном счёте не будет денег, но если вы укажете начальный баланс, он будет сохранен.',
- 'finish_up_new_user' => 'Это всё! Вы можете продолжить, нажав Подтвердить. Вы попадете на главную страницу Firefly III.',
- 'stored_new_accounts_new_user' => 'Ура! Ваши новые учётные записи сохранены.',
+ 'welcome' => 'Добро пожаловать в Firefly III!',
+ 'submit' => 'Подтвердить',
+ 'getting_started' => 'Начало работы',
+ 'to_get_started' => 'Приятно видеть, что вы успешно установили Firefly III. Чтобы начать работу, введите, пожалуйста, название своего банка и баланс вашего основного банковского счёта. Если вы планируете использовать несколько счетов, не волнуйтесь, вы сможете добавить их позже. Сейчас Firefly III просто нужны какие-нибудь первоначальные данные.',
+ 'savings_balance_text' => 'Firefly III автоматически создаст сберегательный счёт для вас. По умолчанию на вашем сберегательном счёте не будет денег, но если вы укажете начальный баланс, он будет сохранен.',
+ 'finish_up_new_user' => 'Это всё! Вы можете продолжить, нажав Подтвердить. Вы попадете на главную страницу Firefly III.',
+ 'stored_new_accounts_new_user' => 'Ура! Ваши новые учётные записи сохранены.',
// home page:
- 'yourAccounts' => 'Ваши счета',
- 'budgetsAndSpending' => 'Бюджеты и расходы',
- 'savings' => 'Экономия',
- 'newWithdrawal' => 'Новый расход',
- 'newDeposit' => 'Новый доход',
- 'newTransfer' => 'Новый перевод',
- 'bills_to_pay' => 'Счета к оплате',
- 'per_day' => 'В день',
- 'left_to_spend_per_day' => 'Можно тратить в день',
- 'bills_paid' => 'Оплаченные счета',
+ 'yourAccounts' => 'Ваши счета',
+ 'budgetsAndSpending' => 'Бюджеты и расходы',
+ 'savings' => 'Экономия',
+ 'newWithdrawal' => 'Новый расход',
+ 'newDeposit' => 'Новый доход',
+ 'newTransfer' => 'Новый перевод',
+ 'bills_to_pay' => 'Счета к оплате',
+ 'per_day' => 'В день',
+ 'left_to_spend_per_day' => 'Можно тратить в день',
+ 'bills_paid' => 'Оплаченные счета',
// menu and titles, should be recycled as often as possible:
- 'currency' => 'Валюта',
- 'preferences' => 'Настройки',
- 'logout' => 'Выход',
- 'toggleNavigation' => 'Переключить навигацию',
- 'searchPlaceholder' => 'Поиск...',
- 'version' => 'Версия',
- 'dashboard' => 'Сводка',
- 'currencies' => 'Валюты',
- 'accounts' => 'Счета',
- 'Asset account' => 'Активный счёт',
- 'Default account' => 'Основной счёт',
- 'Expense account' => 'Счета расходов',
- 'Revenue account' => 'Счета доходов',
- 'Initial balance account' => 'Начальный баланс для счёта',
- 'budgets' => 'Бюджет',
- 'tags' => 'Метки',
- 'reports' => 'Отчёты',
- 'transactions' => 'Транзакции',
- 'expenses' => 'Мои расходы',
- 'income' => 'Мои доходы',
- 'transfers' => 'Переводы',
- 'moneyManagement' => 'Управление финансами',
- 'piggyBanks' => 'Копилки',
- 'bills' => 'Счета к оплате',
- 'withdrawal' => 'Расход',
- 'opening_balance' => 'Начальный баланс',
- 'deposit' => 'Доход',
- 'account' => 'Счёт',
- 'transfer' => 'Перевод',
- 'Withdrawal' => 'Расход',
- 'Deposit' => 'Доход',
- 'Transfer' => 'Перевод',
- 'bill' => 'Счёт к оплате',
- 'yes' => 'Да',
- 'no' => 'Нет',
- 'amount' => 'Сумма',
- 'overview' => 'Обзор',
- 'saveOnAccount' => 'Сохранить на счёте',
- 'unknown' => 'Неизвестно',
- 'daily' => 'Ежедневно',
- 'monthly' => 'Ежемесячно',
- 'profile' => 'Профиль',
- 'errors' => 'Ошибки',
+ 'currency' => 'Валюта',
+ 'preferences' => 'Настройки',
+ 'logout' => 'Выход',
+ 'toggleNavigation' => 'Переключить навигацию',
+ 'searchPlaceholder' => 'Поиск...',
+ 'version' => 'Версия',
+ 'dashboard' => 'Сводка',
+ 'currencies' => 'Валюты',
+ 'accounts' => 'Счета',
+ 'Asset account' => 'Активный счёт',
+ 'Default account' => 'Основной счёт',
+ 'Expense account' => 'Счета расходов',
+ 'Revenue account' => 'Счета доходов',
+ 'Initial balance account' => 'Начальный баланс для счёта',
+ 'budgets' => 'Бюджет',
+ 'tags' => 'Метки',
+ 'reports' => 'Отчёты',
+ 'transactions' => 'Транзакции',
+ 'expenses' => 'Мои расходы',
+ 'income' => 'Мои доходы',
+ 'transfers' => 'Переводы',
+ 'moneyManagement' => 'Управление финансами',
+ 'piggyBanks' => 'Копилки',
+ 'bills' => 'Счета к оплате',
+ 'withdrawal' => 'Расход',
+ 'opening_balance' => 'Начальный баланс',
+ 'deposit' => 'Доход',
+ 'account' => 'Счёт',
+ 'transfer' => 'Перевод',
+ 'Withdrawal' => 'Расход',
+ 'Deposit' => 'Доход',
+ 'Transfer' => 'Перевод',
+ 'bill' => 'Счёт к оплате',
+ 'yes' => 'Да',
+ 'no' => 'Нет',
+ 'amount' => 'Сумма',
+ 'overview' => 'Обзор',
+ 'saveOnAccount' => 'Сохранить на счёте',
+ 'unknown' => 'Неизвестно',
+ 'daily' => 'Ежедневно',
+ 'monthly' => 'Ежемесячно',
+ 'profile' => 'Профиль',
+ 'errors' => 'Ошибки',
// reports:
- 'report_default' => 'Стандартный финансовый отчёт за период с :start по :end',
- 'report_audit' => 'Обзор транзакций за период с :start по :end',
- 'report_category' => 'Отчёт по категории между :start и :end',
- 'report_account' => 'Отчёт по счёту доходов или расходов за период с :start по :end',
- 'report_budget' => 'Отчет по бюджету между :start и :end',
- 'report_tag' => 'Отчет по метке между :start и :end',
- 'quick_link_reports' => 'Быстрые ссылки',
- 'quick_link_default_report' => 'Стандартный финансовый отчёт',
- 'quick_link_audit_report' => 'Обзор транзакций',
- 'report_this_month_quick' => 'Текущий месяц, все счета',
- 'report_this_year_quick' => 'Текущий год, все счета',
- 'report_this_fiscal_year_quick' => 'Текущий финансовый год, всё счета',
- 'report_all_time_quick' => 'Всё время, все счета',
- 'reports_can_bookmark' => 'Помните, что отчеты можно добавить в закладки.',
- 'incomeVsExpenses' => 'Сравнение расходов и доходов',
- 'accountBalances' => 'Остатки на счетах',
- 'balanceStart' => 'Остаток на начало периода',
- 'balanceEnd' => 'Остаток на конец периода',
- 'splitByAccount' => 'Разделить по разным счетам',
- 'coveredWithTags' => 'Присвоены метки',
- 'leftUnbalanced' => 'Осталось вне баланса',
- 'leftInBudget' => 'Осталось в бюджете',
- 'sumOfSums' => 'Сумма сумм',
- 'noCategory' => '(без категории)',
- 'notCharged' => 'Не взимается (пока)',
- 'inactive' => 'Неактивный',
- 'active' => 'Активный',
- 'difference' => 'Разница',
- 'money_flowing_in' => 'В',
- 'money_flowing_out' => 'Из',
- 'topX' => 'макс. :number',
- 'show_full_list' => 'Показать весь список',
- 'show_only_top' => 'Показывать только первые :number',
- 'report_type' => 'Тип отчета',
- 'report_type_default' => 'Стандартный финансовый отчёт',
- 'report_type_audit' => 'Обзор истории транзакций (аудит)',
- 'report_type_category' => 'Отчёт по категории',
- 'report_type_budget' => 'Отчёт по бюджету',
- 'report_type_tag' => 'Отчёт по метке',
- 'report_type_account' => 'Отчёт о расходах и доходах',
- 'more_info_help' => 'Более подробную информацию об этих типах отчётов вы можете найти на странице справки. Нажмите значок (?) в правом верхнем углу.',
- 'report_included_accounts' => 'Счета, включаемые в отчёт',
- 'report_date_range' => 'Диапазон дат',
- 'report_preset_ranges' => 'Предустановленные диапазоны',
- 'shared' => 'Общие',
- 'fiscal_year' => 'Фискальный год',
- 'income_entry' => 'Поступления со счёта ":name" между :start и :end',
- 'expense_entry' => 'Расходы на счёт ":name" между :start и :end',
- 'category_entry' => 'Расходы по категории ":name" между :start и :end',
- 'budget_spent_amount' => 'Расходы по статье бюджета ":budget" между :start и :end',
- 'balance_amount' => 'Расходы по статmt бюджета ":budget", оплаченные со счёта ":account" между :start и :end',
- 'no_audit_activity' => 'Для счёта :account_name не было зафиксировано никакой активности между :start и :end.',
- 'audit_end_balance' => 'Баланс на счёте :account_name на конец :end составляет: :balance',
- 'reports_extra_options' => 'Дополнительные опции',
- 'report_has_no_extra_options' => 'У этого отчёта нет дополнительных опций',
- 'reports_submit' => 'Просмотреть отчет',
- 'end_after_start_date' => 'Конечная дата отчёта должна быть позже, чем начальная дата.',
- 'select_category' => 'Выберите категории',
- 'select_budget' => 'Выберите бюджет(ы).',
- 'select_tag' => 'Выберите метки.',
- 'income_per_category' => 'Доход по категориям',
- 'expense_per_category' => 'Расход по категориям',
- 'expense_per_budget' => 'Расход по бюджетам',
- 'income_per_account' => 'Доход по счетам',
- 'expense_per_account' => 'Расход по счетам',
- 'expense_per_tag' => 'Расход по меткам',
- 'income_per_tag' => 'Доход по меткам',
- 'include_expense_not_in_budget' => 'Включены расходы, не входящие в выбранный бюджет',
- 'include_expense_not_in_account' => 'Включены расходы, не относящиеся к выбранному счёту',
- 'include_expense_not_in_category' => 'Включены расходы, не относящиеся к выбранной категории',
- 'include_income_not_in_category' => 'Включены доходы, не относящиеся к выбранной категории',
- 'include_income_not_in_account' => 'Включены доходы, не относящиеся к выбранному счёту',
- 'include_income_not_in_tags' => 'Включены доходы, не отмеченные выбранной меткой',
- 'include_expense_not_in_tags' => 'Включены расходы, не отмеченные выбранной меткой',
- 'everything_else' => 'Всё остальное',
- 'income_and_expenses' => 'Доходы и расходы',
- 'spent_average' => 'Расход (средний)',
- 'income_average' => 'Доход (средний)',
- 'transaction_count' => 'Количество транзакций',
- 'average_spending_per_account' => 'Средний расход по счёту',
- 'average_income_per_account' => 'Средний доход на счету',
- 'total' => 'Итого',
- 'description' => 'Описание',
- 'sum_of_period' => 'Сумма за период',
- 'average_in_period' => 'В среднем за период',
- 'account_role_defaultAsset' => 'Счёт по умолчанию',
- 'account_role_sharedAsset' => 'Общий основной счёт',
- 'account_role_savingAsset' => 'Сберегательный счет',
- 'account_role_ccAsset' => 'Кредитная карта',
- 'budget_chart_click' => 'Щёлкните по названию бюджета в таблице выше, чтобы увидеть диаграмму.',
- 'category_chart_click' => 'Щёлкните по названию категории в таблице выше, чтобы увидеть диаграмму.',
- 'in_out_accounts' => 'Заработано и потрачено в сумме',
- 'in_out_per_category' => 'Заработано и потрачено по каждой из категорий',
- 'out_per_budget' => 'Расходы по бюджету',
- 'select_expense_revenue' => 'Выберите счёт расходов или доходов',
+ 'report_default' => 'Стандартный финансовый отчёт за период с :start по :end',
+ 'report_audit' => 'Обзор транзакций за период с :start по :end',
+ 'report_category' => 'Отчёт по категории между :start и :end',
+ 'report_account' => 'Отчёт по счёту доходов или расходов за период с :start по :end',
+ 'report_budget' => 'Отчет по бюджету между :start и :end',
+ 'report_tag' => 'Отчет по метке между :start и :end',
+ 'quick_link_reports' => 'Быстрые ссылки',
+ 'quick_link_default_report' => 'Стандартный финансовый отчёт',
+ 'quick_link_audit_report' => 'Обзор транзакций',
+ 'report_this_month_quick' => 'Текущий месяц, все счета',
+ 'report_this_year_quick' => 'Текущий год, все счета',
+ 'report_this_fiscal_year_quick' => 'Текущий финансовый год, всё счета',
+ 'report_all_time_quick' => 'Всё время, все счета',
+ 'reports_can_bookmark' => 'Помните, что отчеты можно добавить в закладки.',
+ 'incomeVsExpenses' => 'Сравнение расходов и доходов',
+ 'accountBalances' => 'Остатки на счетах',
+ 'balanceStart' => 'Остаток на начало периода',
+ 'balanceEnd' => 'Остаток на конец периода',
+ 'splitByAccount' => 'Разделить по разным счетам',
+ 'coveredWithTags' => 'Присвоены метки',
+ 'leftUnbalanced' => 'Осталось вне баланса',
+ 'leftInBudget' => 'Осталось в бюджете',
+ 'sumOfSums' => 'Сумма сумм',
+ 'noCategory' => '(без категории)',
+ 'notCharged' => 'Не взимается (пока)',
+ 'inactive' => 'Неактивный',
+ 'active' => 'Активный',
+ 'difference' => 'Разница',
+ 'money_flowing_in' => 'В',
+ 'money_flowing_out' => 'Из',
+ 'topX' => 'макс. :number',
+ 'show_full_list' => 'Показать весь список',
+ 'show_only_top' => 'Показывать только первые :number',
+ 'report_type' => 'Тип отчета',
+ 'report_type_default' => 'Стандартный финансовый отчёт',
+ 'report_type_audit' => 'Обзор истории транзакций (аудит)',
+ 'report_type_category' => 'Отчёт по категории',
+ 'report_type_budget' => 'Отчёт по бюджету',
+ 'report_type_tag' => 'Отчёт по метке',
+ 'report_type_account' => 'Отчёт о расходах и доходах',
+ 'more_info_help' => 'Более подробную информацию об этих типах отчётов вы можете найти на странице справки. Нажмите значок (?) в правом верхнем углу.',
+ 'report_included_accounts' => 'Счета, включаемые в отчёт',
+ 'report_date_range' => 'Диапазон дат',
+ 'report_preset_ranges' => 'Предустановленные диапазоны',
+ 'shared' => 'Общие',
+ 'fiscal_year' => 'Фискальный год',
+ 'income_entry' => 'Поступления со счёта ":name" между :start и :end',
+ 'expense_entry' => 'Расходы на счёт ":name" между :start и :end',
+ 'category_entry' => 'Расходы по категории ":name" между :start и :end',
+ 'budget_spent_amount' => 'Расходы по статье бюджета ":budget" между :start и :end',
+ 'balance_amount' => 'Расходы по статmt бюджета ":budget", оплаченные со счёта ":account" между :start и :end',
+ 'no_audit_activity' => 'Для счёта :account_name не было зафиксировано никакой активности между :start и :end.',
+ 'audit_end_balance' => 'Баланс на счёте :account_name на конец :end составляет: :balance',
+ 'reports_extra_options' => 'Дополнительные опции',
+ 'report_has_no_extra_options' => 'У этого отчёта нет дополнительных опций',
+ 'reports_submit' => 'Просмотреть отчет',
+ 'end_after_start_date' => 'Конечная дата отчёта должна быть позже, чем начальная дата.',
+ 'select_category' => 'Выберите категории',
+ 'select_budget' => 'Выберите бюджет(ы).',
+ 'select_tag' => 'Выберите метки.',
+ 'income_per_category' => 'Доход по категориям',
+ 'expense_per_category' => 'Расход по категориям',
+ 'expense_per_budget' => 'Расход по бюджетам',
+ 'income_per_account' => 'Доход по счетам',
+ 'expense_per_account' => 'Расход по счетам',
+ 'expense_per_tag' => 'Расход по меткам',
+ 'income_per_tag' => 'Доход по меткам',
+ 'include_expense_not_in_budget' => 'Включены расходы, не входящие в выбранный бюджет',
+ 'include_expense_not_in_account' => 'Включены расходы, не относящиеся к выбранному счёту',
+ 'include_expense_not_in_category' => 'Включены расходы, не относящиеся к выбранной категории',
+ 'include_income_not_in_category' => 'Включены доходы, не относящиеся к выбранной категории',
+ 'include_income_not_in_account' => 'Включены доходы, не относящиеся к выбранному счёту',
+ 'include_income_not_in_tags' => 'Включены доходы, не отмеченные выбранной меткой',
+ 'include_expense_not_in_tags' => 'Включены расходы, не отмеченные выбранной меткой',
+ 'everything_else' => 'Всё остальное',
+ 'income_and_expenses' => 'Доходы и расходы',
+ 'spent_average' => 'Расход (средний)',
+ 'income_average' => 'Доход (средний)',
+ 'transaction_count' => 'Количество транзакций',
+ 'average_spending_per_account' => 'Средний расход по счёту',
+ 'average_income_per_account' => 'Средний доход на счету',
+ 'total' => 'Итого',
+ 'description' => 'Описание',
+ 'sum_of_period' => 'Сумма за период',
+ 'average_in_period' => 'В среднем за период',
+ 'account_role_defaultAsset' => 'Счёт по умолчанию',
+ 'account_role_sharedAsset' => 'Общий основной счёт',
+ 'account_role_savingAsset' => 'Сберегательный счет',
+ 'account_role_ccAsset' => 'Кредитная карта',
+ 'budget_chart_click' => 'Щёлкните по названию бюджета в таблице выше, чтобы увидеть диаграмму.',
+ 'category_chart_click' => 'Щёлкните по названию категории в таблице выше, чтобы увидеть диаграмму.',
+ 'in_out_accounts' => 'Заработано и потрачено в сумме',
+ 'in_out_per_category' => 'Заработано и потрачено по каждой из категорий',
+ 'out_per_budget' => 'Расходы по бюджету',
+ 'select_expense_revenue' => 'Выберите счёт расходов или доходов',
// charts:
- 'chart' => 'Диаграмма',
- 'month' => 'Месяц',
- 'budget' => 'Бюджет',
- 'spent' => 'Расход',
- 'spent_in_budget' => 'Расходы по бюджету',
- 'left_to_spend' => 'Осталось потратить',
- 'earned' => 'Заработано',
- 'overspent' => 'Перерасход',
- 'left' => 'Осталось',
- 'max-amount' => 'Максимальная сумма',
- 'min-amount' => 'Минимальная сумма',
- 'journal-amount' => 'Запись текущего счёта на оплату',
- 'name' => 'Название',
- 'date' => 'Дата',
- 'paid' => 'Оплачено',
- 'unpaid' => 'Не оплачено',
- 'day' => 'День',
- 'budgeted' => 'Запланировано в бюджете',
- 'period' => 'Период',
- 'balance' => 'Бaлaнc',
- 'sum' => 'Сумма',
- 'average' => 'Среднее значение',
- 'balanceFor' => 'Баланс для :name',
+ 'chart' => 'Диаграмма',
+ 'month' => 'Месяц',
+ 'budget' => 'Бюджет',
+ 'spent' => 'Расход',
+ 'spent_in_budget' => 'Расходы по бюджету',
+ 'left_to_spend' => 'Осталось потратить',
+ 'earned' => 'Заработано',
+ 'overspent' => 'Перерасход',
+ 'left' => 'Осталось',
+ 'max-amount' => 'Максимальная сумма',
+ 'min-amount' => 'Минимальная сумма',
+ 'journal-amount' => 'Запись текущего счёта на оплату',
+ 'name' => 'Название',
+ 'date' => 'Дата',
+ 'paid' => 'Оплачено',
+ 'unpaid' => 'Не оплачено',
+ 'day' => 'День',
+ 'budgeted' => 'Запланировано в бюджете',
+ 'period' => 'Период',
+ 'balance' => 'Бaлaнc',
+ 'sum' => 'Сумма',
+ 'average' => 'Среднее значение',
+ 'balanceFor' => 'Баланс для :name',
// piggy banks:
- 'add_money_to_piggy' => 'Добавить деньги в копилку ":name"',
- 'piggy_bank' => 'Копилка',
- 'new_piggy_bank' => 'Новая копилка',
- 'store_piggy_bank' => 'Сохранить новую копилку',
- 'stored_piggy_bank' => 'Сохранить новую копилку ":name"',
- 'account_status' => 'Состояние счета',
- 'left_for_piggy_banks' => 'Остаток для всех копилок',
- 'sum_of_piggy_banks' => 'Сумма по всем копилкам',
- 'saved_so_far' => 'Сохранено на данный момент',
- 'left_to_save' => 'Осталось накопить',
- 'suggested_amount' => 'Рекомендуемая месячная сумма для перевода в копилку',
- 'add_money_to_piggy_title' => 'Добавить деньги в копилку ":name"',
- 'remove_money_from_piggy_title' => 'Удалить деньги из копилки ":name"',
- 'add' => 'Добавить',
- 'no_money_for_piggy' => 'У вас нет денег, чтобы положить в этот копилку.',
+ 'add_money_to_piggy' => 'Добавить деньги в копилку ":name"',
+ 'piggy_bank' => 'Копилка',
+ 'new_piggy_bank' => 'Новая копилка',
+ 'store_piggy_bank' => 'Сохранить новую копилку',
+ 'stored_piggy_bank' => 'Сохранить новую копилку ":name"',
+ 'account_status' => 'Состояние счета',
+ 'left_for_piggy_banks' => 'Остаток для всех копилок',
+ 'sum_of_piggy_banks' => 'Сумма по всем копилкам',
+ 'saved_so_far' => 'Сохранено на данный момент',
+ 'left_to_save' => 'Осталось накопить',
+ 'suggested_amount' => 'Рекомендуемая месячная сумма для перевода в копилку',
+ 'add_money_to_piggy_title' => 'Добавить деньги в копилку ":name"',
+ 'remove_money_from_piggy_title' => 'Удалить деньги из копилки ":name"',
+ 'add' => 'Добавить',
+ 'no_money_for_piggy' => 'У вас нет денег, чтобы положить в этот копилку.',
'remove' => 'Удалить',
'max_amount_add' => 'Максимальная сумма, которую вы можете добавить:',
@@ -1084,6 +1086,7 @@ return [
'invalid_link_selection' => 'Невозможно связать эти транзакции',
'journals_linked' => 'Транзакции были связаны.',
'journals_error_linked' => 'Эти транзакции уже связаны.',
+ 'journals_link_to_self' => 'Вы не можете связать транзакцию с самой собой',
'journal_links' => 'Связи транзакции',
'this_withdrawal' => 'Этот расход',
'this_deposit' => 'Этот доход',
diff --git a/resources/lang/ru_RU/form.php b/resources/lang/ru_RU/form.php
index 062a6dce69..c3e18229f0 100644
--- a/resources/lang/ru_RU/form.php
+++ b/resources/lang/ru_RU/form.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// new user:
diff --git a/resources/lang/ru_RU/import.php b/resources/lang/ru_RU/import.php
index 18f1624e24..752551951a 100644
--- a/resources/lang/ru_RU/import.php
+++ b/resources/lang/ru_RU/import.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
// status of import:
@@ -97,6 +98,7 @@ return [
// not csv, but normal warning
'roles_warning' => 'Пожалуйста, отметьте хотя бы один столбец как столбец с суммой. Также целесообразно выбрать столбец для описания, даты и спонсорского счёта.',
'foreign_amount_warning' => 'Если вы пометите этот столбец, как содержащий сумму в иностранной валюте, вы также должны указать столбец, который указывает, какая именно это валюта.',
+
// file, map data
'file_map_title' => 'Настройки импорта (4/4) - Сопоставление данных импорта с данными Firefly III',
'file_map_text' => 'В следующих таблицах значение слева отображает информацию, найденную в загруженном файле. Ваша задача - сопоставить это значение (если это возможно) со значением, уже имеющимся в вашей базе данных. Firefly будет придерживаться этого сопоставления. Если для сопоставления нет значения или вы не хотите отображать определённое значение, ничего не выбирайте.',
@@ -131,28 +133,40 @@ return [
'column_date-book' => 'Дата записи транзакции',
'column_date-process' => 'Дата обработки транзакции',
'column_date-transaction' => 'Дата',
+ 'column_date-due' => 'Дата транзакции',
+ 'column_date-payment' => 'Дата оплаты',
+ 'column_date-invoice' => 'Дата выставления счёта',
'column_description' => 'Описание',
'column_opposing-iban' => 'Спонсорский счёт (IBAN)',
+ 'column_opposing-bic' => 'Спонсорский счёт (BIC)',
'column_opposing-id' => 'ID спонсорского счёта (соответствующий FF3)',
'column_external-id' => 'Внешний ID',
'column_opposing-name' => 'Спонсорский счёт (название)',
'column_rabo-debit-credit' => 'Индикатор дебита/кредита, специфичный для Rabobank',
'column_ing-debit-credit' => 'Индикатор дебита/кредита, специфичный для ING',
- 'column_sepa-ct-id' => 'Идентификационный номер SEPA Credit Transfer',
- 'column_sepa-ct-op' => 'Спонсорский счет SEPA Credit Transfer',
- 'column_sepa-db' => 'Прямой дебет SEPA',
+ 'column_sepa-ct-id' => 'Идентификатор SEPA end-to-end',
+ 'column_sepa-ct-op' => 'Идентификатор учетной записи SEPA',
+ 'column_sepa-db' => 'Идентификатор SEPA Mandate',
+ 'column_sepa-cc' => 'Код очистки SEPA',
+ 'column_sepa-ci' => 'Идентификатор кредитора SEPA',
+ 'column_sepa-ep' => 'Внешняя цель SEPA',
+ 'column_sepa-country' => 'Код страны SEPA',
'column_tags-comma' => 'Метки (разделены запятыми)',
'column_tags-space' => 'Метки (разделены пробелами)',
'column_account-number' => 'Основной счёт (номер счёта)',
'column_opposing-number' => 'Спонсорский счёт (номер счёта)',
'column_note' => 'Примечания',
+ 'column_internal-reference' => 'Внутренняя ссылка',
// prerequisites
'prerequisites' => 'Требования',
// bunq
'bunq_prerequisites_title' => 'Требования для импорта из bunq',
- 'bunq_prerequisites_text' => 'Чтобы импортировать из bunq, вам нужно получить ключ API. Вы можете сделать это через приложение.',
+ 'bunq_prerequisites_text' => 'Чтобы импортировать из bunq, вам нужно получить ключ API. Вы можете сделать это через приложение. Обратите внимание, что функция импорта для bunq находится в бета-тестирования. Было протестировано только API песочницы (sandbox).',
+ 'bunq_do_import' => 'Да, импортировать с этого счёта',
+ 'bunq_accounts_title' => 'Счета Bunq',
+ 'bunq_accounts_text' => 'Эти счета связаны с вашей учётной записью bunq. Выберите счета, данные о о которых вы хотите импортировать, и счёт, на который будут импортированы транзакции.',
// Spectre
'spectre_title' => 'Импорт с использованием Spectre',
@@ -187,4 +201,3 @@ return [
// various other strings:
'imported_from_account' => 'Импортировано со счёта ":account"',
];
-
diff --git a/resources/lang/ru_RU/intro.php b/resources/lang/ru_RU/intro.php
index bd2b105106..103d0efb13 100644
--- a/resources/lang/ru_RU/intro.php
+++ b/resources/lang/ru_RU/intro.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// index
diff --git a/resources/lang/ru_RU/list.php b/resources/lang/ru_RU/list.php
index 9b7878b2d9..705f58bde8 100644
--- a/resources/lang/ru_RU/list.php
+++ b/resources/lang/ru_RU/list.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
'buttons' => 'Кнопки',
@@ -102,4 +103,12 @@ return [
'reconcile' => 'Сверка',
'account_on_spectre' => 'Счёт (Spectre)',
'do_import' => 'Импортировать с этого счёта',
+ 'sepa-ct-id' => 'Идентификатор SEPA end-to-end',
+ 'sepa-ct-op' => 'Идентификатор учетной записи SEPA',
+ 'sepa-db' => 'Идентификатор SEPA Mandate',
+ 'sepa-country' => 'Страна SEPA',
+ 'sepa-cc' => 'Код очистки SEPA',
+ 'sepa-ep' => 'Внешняя цель SEPA',
+ 'sepa-ci' => 'Идентификатор кредитора SEPA',
+ 'account_at_bunq' => 'Счёт с bunq',
];
diff --git a/resources/lang/ru_RU/pagination.php b/resources/lang/ru_RU/pagination.php
index cf5abe6621..19c345e3b9 100644
--- a/resources/lang/ru_RU/pagination.php
+++ b/resources/lang/ru_RU/pagination.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'previous' => '« Предыдущие',
diff --git a/resources/lang/ru_RU/passwords.php b/resources/lang/ru_RU/passwords.php
index 5b97d32fc8..22d7c085a9 100644
--- a/resources/lang/ru_RU/passwords.php
+++ b/resources/lang/ru_RU/passwords.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'password' => 'Пароль должен содержать не менее 6 символов. Пароль и его подтверждение должны совпадать.',
diff --git a/resources/lang/ru_RU/validation.php b/resources/lang/ru_RU/validation.php
index dc625fb7da..1eadf53196 100644
--- a/resources/lang/ru_RU/validation.php
+++ b/resources/lang/ru_RU/validation.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'iban' => 'Это некорректный IBAN.',
+ 'source_equals_destination' => 'Счёт источник и счёт назначения совпадают',
'unique_account_number_for_user' => 'Этот номер счёта уже используется.',
'unique_iban_for_user' => 'Этот IBAN уже используется.',
'deleted_user' => 'По соображениям безопасности, вы не можете зарегистрироваться, используя этот адрес электронной почты.',
diff --git a/resources/lang/tr_TR/auth.php b/resources/lang/tr_TR/auth.php
index f33b5ad7cb..ad1e292e28 100644
--- a/resources/lang/tr_TR/auth.php
+++ b/resources/lang/tr_TR/auth.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
/*
diff --git a/resources/lang/tr_TR/bank.php b/resources/lang/tr_TR/bank.php
index ef0d636f91..b6a86faa4b 100644
--- a/resources/lang/tr_TR/bank.php
+++ b/resources/lang/tr_TR/bank.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
];
diff --git a/resources/lang/tr_TR/breadcrumbs.php b/resources/lang/tr_TR/breadcrumbs.php
index cd43056d5b..946499c647 100644
--- a/resources/lang/tr_TR/breadcrumbs.php
+++ b/resources/lang/tr_TR/breadcrumbs.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'home' => 'Anasayfa',
diff --git a/resources/lang/tr_TR/components.php b/resources/lang/tr_TR/components.php
index 125c74b2f0..1e9fce7f61 100644
--- a/resources/lang/tr_TR/components.php
+++ b/resources/lang/tr_TR/components.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// profile
diff --git a/resources/lang/tr_TR/config.php b/resources/lang/tr_TR/config.php
index e58412cc0f..cb3e8a2595 100644
--- a/resources/lang/tr_TR/config.php
+++ b/resources/lang/tr_TR/config.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'html_language' => 'tr',
diff --git a/resources/lang/tr_TR/csv.php b/resources/lang/tr_TR/csv.php
index d61316b632..892c8beac4 100644
--- a/resources/lang/tr_TR/csv.php
+++ b/resources/lang/tr_TR/csv.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
];
diff --git a/resources/lang/tr_TR/demo.php b/resources/lang/tr_TR/demo.php
index f4c344440f..6df4adc31f 100644
--- a/resources/lang/tr_TR/demo.php
+++ b/resources/lang/tr_TR/demo.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
- 'no_demo_text' => 'Maalesef, bu sayfa için daha fazla demo açıklama metni yok.',
- 'see_help_icon' => 'Ancak, sağ üst köşedeki simge size daha fazla bilgi verebilir.',
- 'index' => 'Firefly III\'e hoş geldiniz! Bu sayfada, finansal durumunuzun özetini görebilirsiniz. Daha fazla bilgi için Hesapları → Varlık Hesaplarını ve tabii ki deBütçe ve Rapor sayfalarına göz atın. Ya da sadece bir göz gezdirin ve ne durumda olduğunuzu görün.',
- 'accounts-index' => 'Varlık hesapları kişisel banka hesaplarınızdır. Gider hesaplar, mağazalar ve arkadaşlar gibi para harcadığınız hesaplardır. Gelir hesapları, işiniz veya diğer gelir kaynakları gibi para aldığınız hesaplardır. Bu sayfada bunları düzenleyebilir veya silebilirsiniz.',
- 'budgets-index' => 'Bu sayfa bütçelerinize genel bir bakış sunmaktadır. Üstteki çubuk bütçelenebilecek miktarı gösterir. Bu sağdaki tutara tıklayarak herhangi bir dönem için özelleştirilebilir. Gerçekte harcadığınız tutar aşağıdaki barda gösterilir. Aşağıda, bütçe başına harcamalar ve bütçeniz için ne kadar para ayırdığınız gösterilir.',
- 'reports-index-start' => 'Firefly III supports a number of types of reports. Read about them by clicking on the -icon in the top right corner.',
- 'reports-index-examples' => 'Şu örnekleri incelediğinizden emin olun: a aylık finansal genel bakış, a yıllık finansal genel bakış ve a bütçe genel bakışı.',
- 'currencies-index' => 'Firefly III, birden fazla para birimini destekliyor. Euro varsayılan olmasına rağmen, ABD Doları ve diğer birçok para birimine ayarlanabilir. Gördüğünüz gibi küçük bir para birimi seçeneği dedahil edilmiştir ancak isterseniz kendi para biriminizi ekleyebilirsiniz. Varsayılan para birimi değiştirilebilir ancak mevcut işlemlerin para birimi değiştirilemez: Firefly III, aynı anda birden çok para biriminin kullanılmasını destekler.',
- 'transactions-index' => 'Bu masraflar, mevduatlar ve transferler için özellikle yaratıcı değildir. Bunlar otomatik olarak oluşturuldu.',
- 'piggy-banks-index' => 'Gördüğünüz gibi, üç tane banka var. Her domuzcuk bankasındaki para miktarını değiştirmek için artı ve eksi düğmelerini kullanın. Her domuzcuk bankasının yönetimini görmek için domuzcuk\'un üzerine tıklayın.',
- 'import-index' => 'Elbette, herhangi bir CVS dosyası Firefly III\'e aktarılabilir',
+ 'no_demo_text' => 'Maalesef, bu sayfa için daha fazla demo açıklama metni yok.',
+ 'see_help_icon' => 'Ancak, sağ üst köşedeki simge size daha fazla bilgi verebilir.',
+ 'index' => 'Firefly III\'e hoş geldiniz! Bu sayfada, finansal durumunuzun özetini görebilirsiniz. Daha fazla bilgi için Hesapları → Varlık Hesaplarını ve tabii ki deBütçe ve Rapor sayfalarına göz atın. Ya da sadece bir göz gezdirin ve ne durumda olduğunuzu görün.',
+ 'accounts-index' => 'Varlık hesapları kişisel banka hesaplarınızdır. Gider hesaplar, mağazalar ve arkadaşlar gibi para harcadığınız hesaplardır. Gelir hesapları, işiniz veya diğer gelir kaynakları gibi para aldığınız hesaplardır. Bu sayfada bunları düzenleyebilir veya silebilirsiniz.',
+ 'budgets-index' => 'Bu sayfa bütçelerinize genel bir bakış sunmaktadır. Üstteki çubuk bütçelenebilecek miktarı gösterir. Bu sağdaki tutara tıklayarak herhangi bir dönem için özelleştirilebilir. Gerçekte harcadığınız tutar aşağıdaki barda gösterilir. Aşağıda, bütçe başına harcamalar ve bütçeniz için ne kadar para ayırdığınız gösterilir.',
+ 'reports-index-start' => 'Firefly III supports a number of types of reports. Read about them by clicking on the -icon in the top right corner.',
+ 'reports-index-examples' => 'Şu örnekleri incelediğinizden emin olun: a aylık finansal genel bakış, a yıllık finansal genel bakış ve a bütçe genel bakışı.',
+ 'currencies-index' => 'Firefly III, birden fazla para birimini destekliyor. Euro varsayılan olmasına rağmen, ABD Doları ve diğer birçok para birimine ayarlanabilir. Gördüğünüz gibi küçük bir para birimi seçeneği dedahil edilmiştir ancak isterseniz kendi para biriminizi ekleyebilirsiniz. Varsayılan para birimi değiştirilebilir ancak mevcut işlemlerin para birimi değiştirilemez: Firefly III, aynı anda birden çok para biriminin kullanılmasını destekler.',
+ 'transactions-index' => 'Bu masraflar, mevduatlar ve transferler için özellikle yaratıcı değildir. Bunlar otomatik olarak oluşturuldu.',
+ 'piggy-banks-index' => 'Gördüğünüz gibi, üç tane banka var. Her domuzcuk bankasındaki para miktarını değiştirmek için artı ve eksi düğmelerini kullanın. Her domuzcuk bankasının yönetimini görmek için domuzcuk\'un üzerine tıklayın.',
+ 'import-index' => 'Elbette, herhangi bir CVS dosyası Firefly III\'e aktarılabilir',
];
diff --git a/resources/lang/tr_TR/firefly.php b/resources/lang/tr_TR/firefly.php
index da06325297..9840b4ce6a 100644
--- a/resources/lang/tr_TR/firefly.php
+++ b/resources/lang/tr_TR/firefly.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
// general stuff:
@@ -170,7 +171,9 @@ return [
'want_to_login' => 'I want to login',
'button_register' => 'Register',
'authorization' => 'Authorization',
-
+ 'active_bills_only' => 'active bills only',
+ 'average_per_bill' => 'average per bill',
+ 'expected_total' => 'expected total',
// API access
'authorization_request' => 'Firefly III v:version Authorization Request',
'authorization_request_intro' => ':client is requesting permission to access your financial administration. Would you like to authorize :client to access these records?',
@@ -404,590 +407,589 @@ işlemlerin kontrol edildiğini lütfen unutmayın.',
'rule_action_set_notes_choice' => 'Notları şuna ayarla..',
'rule_action_set_notes' => 'Notları ":action_value" olarak ayarla',
- 'rules_have_read_warning' => 'Uyarıyı okudun mu?',
- 'apply_rule_warning' => 'Uyarı: çok sayıda işleme bir kuralı(grubu) uygulamak çok zaman alabilir ve zaman aşımına uğrayabilir. Eğer öyle olursa kural(grup) işlemlerin belli olmayan bir kısmına uygulanacaktır. Bu mali yönetiminizi lime lime edebilir. Lütfen dikkatli olun.',
+ 'rules_have_read_warning' => 'Uyarıyı okudun mu?',
+ 'apply_rule_warning' => 'Uyarı: çok sayıda işleme bir kuralı(grubu) uygulamak çok zaman alabilir ve zaman aşımına uğrayabilir. Eğer öyle olursa kural(grup) işlemlerin belli olmayan bir kısmına uygulanacaktır. Bu mali yönetiminizi lime lime edebilir. Lütfen dikkatli olun.',
// tags
- 'store_new_tag' => 'Yeni etiket kaydet',
- 'update_tag' => 'Etiketi Güncelle',
- 'no_location_set' => 'Konum ayarlanamadı.',
- 'meta_data' => 'Meta veri',
- 'location' => 'Konum',
- 'without_date' => 'Tarihsiz',
- 'result' => 'Sonuç',
- 'sums_apply_to_range' => 'Tüm toplamlar seçili aralıkta geçerlidir',
- 'mapbox_api_key' => 'Haritayı kullanmak için Mapbox\'dan bir API anahtarı alın. .env dosyanızı açın ve sonrasında bu kodu girin MAPBOX_API_KEY=.',
- 'press_tag_location' => 'Etiketin konumunun ayarlamak için sağ tıklayın yada basılı tutun.',
- 'clear_location' => 'Konumu temizle',
+ 'store_new_tag' => 'Yeni etiket kaydet',
+ 'update_tag' => 'Etiketi Güncelle',
+ 'no_location_set' => 'Konum ayarlanamadı.',
+ 'meta_data' => 'Meta veri',
+ 'location' => 'Konum',
+ 'without_date' => 'Tarihsiz',
+ 'result' => 'Sonuç',
+ 'sums_apply_to_range' => 'Tüm toplamlar seçili aralıkta geçerlidir',
+ 'mapbox_api_key' => 'Haritayı kullanmak için Mapbox\'dan bir API anahtarı alın. .env dosyanızı açın ve sonrasında bu kodu girin MAPBOX_API_KEY=.',
+ 'press_tag_location' => 'Etiketin konumunun ayarlamak için sağ tıklayın yada basılı tutun.',
+ 'clear_location' => 'Konumu temizle',
// preferences
- 'pref_home_screen_accounts' => 'Ana ekran hesapları',
- 'pref_home_screen_accounts_help' => 'Giriş sayfasında hangi hesaplar görüntülensin?',
- 'pref_view_range' => 'Görüş Mesafesi',
- 'pref_view_range_help' => 'Bazı dönemlerde grafikler otomatik olarak gruplandırılır. Hangi dönemi tercih etmek istersiniz?',
- 'pref_1D' => 'Bir gün',
- 'pref_1W' => 'Bir hafta',
- 'pref_1M' => 'Bir ay',
- 'pref_3M' => 'Üç ay (çeyrek)',
- 'pref_6M' => 'Altı ay',
- 'pref_1Y' => 'Bir yıl',
- 'pref_languages' => 'Diller',
- 'pref_languages_help' => 'Firefly III birçok dili destekliyor. Hangisini tercih edersiniz?',
- 'pref_custom_fiscal_year' => 'Mali yıl ayarları',
- 'pref_custom_fiscal_year_label' => 'Etkin',
- 'pref_custom_fiscal_year_help' => '1 Ocak - 31 Aralık arasındaki bir mali yılı kullanan ülkelerde bu ayarı açabilir ve mali yılın başlangıç / bitiş günlerini belirleyebilirsiniz',
- 'pref_fiscal_year_start_label' => 'Mali yıl başlangıç tarihi',
- 'pref_two_factor_auth' => '2 adımlı doğrulama',
- 'pref_two_factor_auth_help' => '2 adımlı doğrulamayı etkinleştirdiğinizde (iki faktörlü kimlik doğrulama olarak da bilinir) hesabınıza fazladan bir güvenlik katmanı eklersiniz. Bildiğiniz bir şeyle (şifreniz) ve sahip olduğunuz bir şeyle(doğrulama kodu) ile giriş yaparsınız. Doğrulama kodları telefonunuzda Authy ya da Google Authenticator gibi bir uygulama tarafından oluşturulur.',
- 'pref_enable_two_factor_auth' => '2 adımlı doğrulamayı etkinleştir',
- 'pref_two_factor_auth_disabled' => '2 adımlı doğrulama kodu kaldırıldı ve devre dışı bırakıldı',
- 'pref_two_factor_auth_remove_it' => 'Kimlik hesabı doğrulama uygulaması için çıkış yapmayı unutmayın!',
- 'pref_two_factor_auth_code' => 'Doğrulama kodu',
- 'pref_two_factor_auth_code_help' => 'QR kodunu, telefonunuzda Authy veya Authenticator uygulamalarında bulun ve oluşturulan kodu girin.',
- 'pref_two_factor_auth_reset_code' => 'Doğrulama kodunu sıfırla',
- 'pref_two_factor_auth_remove_code' => 'Doğrulama kodunu kaldır',
- 'pref_two_factor_auth_remove_will_disable' => '(iki faktörlü kimlik doğrulamayı da devre dışı bırakır)',
- 'pref_save_settings' => 'Ayarları kaydet',
- 'saved_preferences' => 'Tercihler kaydedildi!',
- 'preferences_general' => 'Genel',
- 'preferences_frontpage' => 'Ana ekran',
- 'preferences_security' => 'Güvenlik',
- 'preferences_layout' => 'Düzen',
- 'pref_home_show_deposits' => 'Ana ekranda mevduat göster',
- 'pref_home_show_deposits_info' => 'Ana ekranınızda hesaplarınız zaten görüntülenir. Gelir hesaplarınız da görüntülensin mi?',
- 'pref_home_do_show_deposits' => 'Evet, onlara göster',
- 'successful_count' => ':count bunlar başarılı oldu',
- 'list_page_size_title' => 'Sayfa boyutu',
- 'list_page_size_help' => 'Herhangi bir şeyin listesi (hesaplar, işlemler, vb) sayfa başına en fazla bu kadar gösterebilir.',
- 'list_page_size_label' => 'Sayfa boyutu',
- 'between_dates' => '(:start ve :end)',
- 'pref_optional_fields_transaction' => 'İşlemler için bağlı alanlar',
- 'pref_optional_fields_transaction_help' => 'Yeni bir işlem oluşturulurken (dağınıklık nedeniyle) varsayılan olarak tüm alanlar ektinleştirilmez. Aşağıdan, eğer işinize yarayacağını düşünüyorsanız bu alanları ektinleştirebilirsiniz. Tabii ki, devre dışı bırakılmış ama zaten doldurulmuş alanlar ayarlar ne olursa olsun görünecektir.',
- 'optional_tj_date_fields' => 'Tarih alanları',
- 'optional_tj_business_fields' => 'İş alanları',
- 'optional_tj_attachment_fields' => 'Ek alanları',
- 'pref_optional_tj_interest_date' => 'Faiz tarihi',
- 'pref_optional_tj_book_date' => 'Kitap tarihi',
- 'pref_optional_tj_process_date' => 'İşlem tarihi',
- 'pref_optional_tj_due_date' => 'Bitiş tarihi',
- 'pref_optional_tj_payment_date' => 'Ödeme tarihi',
- 'pref_optional_tj_invoice_date' => 'Fatura tarihi',
- 'pref_optional_tj_internal_reference' => 'Dahili referans',
- 'pref_optional_tj_notes' => 'Notlar',
- 'pref_optional_tj_attachments' => 'Ekler',
- 'optional_field_meta_dates' => 'Tarih',
- 'optional_field_meta_business' => 'İş',
- 'optional_field_attachments' => 'Ekler',
- 'optional_field_meta_data' => 'İsteğe bağlı meta veriler',
+ 'pref_home_screen_accounts' => 'Ana ekran hesapları',
+ 'pref_home_screen_accounts_help' => 'Giriş sayfasında hangi hesaplar görüntülensin?',
+ 'pref_view_range' => 'Görüş Mesafesi',
+ 'pref_view_range_help' => 'Bazı dönemlerde grafikler otomatik olarak gruplandırılır. Hangi dönemi tercih etmek istersiniz?',
+ 'pref_1D' => 'Bir gün',
+ 'pref_1W' => 'Bir hafta',
+ 'pref_1M' => 'Bir ay',
+ 'pref_3M' => 'Üç ay (çeyrek)',
+ 'pref_6M' => 'Altı ay',
+ 'pref_1Y' => 'Bir yıl',
+ 'pref_languages' => 'Diller',
+ 'pref_languages_help' => 'Firefly III birçok dili destekliyor. Hangisini tercih edersiniz?',
+ 'pref_custom_fiscal_year' => 'Mali yıl ayarları',
+ 'pref_custom_fiscal_year_label' => 'Etkin',
+ 'pref_custom_fiscal_year_help' => '1 Ocak - 31 Aralık arasındaki bir mali yılı kullanan ülkelerde bu ayarı açabilir ve mali yılın başlangıç / bitiş günlerini belirleyebilirsiniz',
+ 'pref_fiscal_year_start_label' => 'Mali yıl başlangıç tarihi',
+ 'pref_two_factor_auth' => '2 adımlı doğrulama',
+ 'pref_two_factor_auth_help' => '2 adımlı doğrulamayı etkinleştirdiğinizde (iki faktörlü kimlik doğrulama olarak da bilinir) hesabınıza fazladan bir güvenlik katmanı eklersiniz. Bildiğiniz bir şeyle (şifreniz) ve sahip olduğunuz bir şeyle(doğrulama kodu) ile giriş yaparsınız. Doğrulama kodları telefonunuzda Authy ya da Google Authenticator gibi bir uygulama tarafından oluşturulur.',
+ 'pref_enable_two_factor_auth' => '2 adımlı doğrulamayı etkinleştir',
+ 'pref_two_factor_auth_disabled' => '2 adımlı doğrulama kodu kaldırıldı ve devre dışı bırakıldı',
+ 'pref_two_factor_auth_remove_it' => 'Kimlik hesabı doğrulama uygulaması için çıkış yapmayı unutmayın!',
+ 'pref_two_factor_auth_code' => 'Doğrulama kodu',
+ 'pref_two_factor_auth_code_help' => 'QR kodunu, telefonunuzda Authy veya Authenticator uygulamalarında bulun ve oluşturulan kodu girin.',
+ 'pref_two_factor_auth_reset_code' => 'Doğrulama kodunu sıfırla',
+ 'pref_two_factor_auth_disable_2fa' => 'Disable 2FA',
+ 'pref_save_settings' => 'Ayarları kaydet',
+ 'saved_preferences' => 'Tercihler kaydedildi!',
+ 'preferences_general' => 'Genel',
+ 'preferences_frontpage' => 'Ana ekran',
+ 'preferences_security' => 'Güvenlik',
+ 'preferences_layout' => 'Düzen',
+ 'pref_home_show_deposits' => 'Ana ekranda mevduat göster',
+ 'pref_home_show_deposits_info' => 'Ana ekranınızda hesaplarınız zaten görüntülenir. Gelir hesaplarınız da görüntülensin mi?',
+ 'pref_home_do_show_deposits' => 'Evet, onlara göster',
+ 'successful_count' => ':count bunlar başarılı oldu',
+ 'list_page_size_title' => 'Sayfa boyutu',
+ 'list_page_size_help' => 'Herhangi bir şeyin listesi (hesaplar, işlemler, vb) sayfa başına en fazla bu kadar gösterebilir.',
+ 'list_page_size_label' => 'Sayfa boyutu',
+ 'between_dates' => '(:start ve :end)',
+ 'pref_optional_fields_transaction' => 'İşlemler için bağlı alanlar',
+ 'pref_optional_fields_transaction_help' => 'Yeni bir işlem oluşturulurken (dağınıklık nedeniyle) varsayılan olarak tüm alanlar ektinleştirilmez. Aşağıdan, eğer işinize yarayacağını düşünüyorsanız bu alanları ektinleştirebilirsiniz. Tabii ki, devre dışı bırakılmış ama zaten doldurulmuş alanlar ayarlar ne olursa olsun görünecektir.',
+ 'optional_tj_date_fields' => 'Tarih alanları',
+ 'optional_tj_business_fields' => 'İş alanları',
+ 'optional_tj_attachment_fields' => 'Ek alanları',
+ 'pref_optional_tj_interest_date' => 'Faiz tarihi',
+ 'pref_optional_tj_book_date' => 'Kitap tarihi',
+ 'pref_optional_tj_process_date' => 'İşlem tarihi',
+ 'pref_optional_tj_due_date' => 'Bitiş tarihi',
+ 'pref_optional_tj_payment_date' => 'Ödeme tarihi',
+ 'pref_optional_tj_invoice_date' => 'Fatura tarihi',
+ 'pref_optional_tj_internal_reference' => 'Dahili referans',
+ 'pref_optional_tj_notes' => 'Notlar',
+ 'pref_optional_tj_attachments' => 'Ekler',
+ 'optional_field_meta_dates' => 'Tarih',
+ 'optional_field_meta_business' => 'İş',
+ 'optional_field_attachments' => 'Ekler',
+ 'optional_field_meta_data' => 'İsteğe bağlı meta veriler',
// profile:
- 'change_your_password' => 'Şifrenizi değiştirin',
- 'delete_account' => 'Hesabı Sil',
- 'current_password' => 'Güncel Şifre',
- 'new_password' => 'Yeni Şifre',
- 'new_password_again' => 'Yeni Şifre (Tekrar)',
- 'delete_your_account' => 'Hesabını Sil',
- 'delete_your_account_help' => 'Hesabınızı silmeniz aynı zamanda Firefly III\'e kaydetmiş olabileceğiniz hesapları, işlemleri, her şeyi de silecektir. YOK OLACAK.',
- 'delete_your_account_password' => 'Devam etmek için şifrenizi girin.',
- 'password' => 'Şifre',
- 'are_you_sure' => 'Emin misiniz? Bunu geri alamazsınız.',
- 'delete_account_button' => 'Hesabını Sil',
- 'invalid_current_password' => 'Geçersiz Şifre!',
- 'password_changed' => 'Şifre değiştirildi!',
- 'should_change' => 'Amaç, şifrenizi değiştirmenizdir.',
- 'invalid_password' => 'Geçersiz şifre!',
- 'what_is_pw_security' => '\'\'Doğrulama şifresi güvenliği\'\' nedir?',
- 'secure_pw_title' => 'Güvenli şifre nasıl seçilir?',
- 'secure_pw_history' => 'Ağustos 2017\'de ünlü güvenlik araştırmacısı Troy Hunt, 306 milyon çalınan parolanın bir listesini yayınladı. Bu şifreler, LinkedIn, Adobe ve NeoPets gibi şirketlerde (ve daha pek çok yerde) sistem çökmesi sırasında çalındı.',
- 'secure_pw_check_box' => 'Kutuyu işaretlerseniz, listede olup olmadığını görmek için Firefly III şifrenizin SHA1 hash\'ini Troy Hunt web sitesine gönderecektir. Bu NIST Özel Yayınında önerilen güvenli olmayan şifreleri kullanmanızı önleyecektir.',
- 'secure_pw_sha1' => 'SHA1\'in çözüdüğünü sanıyordum',
- 'secure_pw_hash_speed' => 'Doğru, ama bu bağlamda değil. SHA1\'in nasıl çözüleceğini anlatan web sitesinde de okuyabileceğin gibi artık bir "kesişim(aynı SHA1 hash\'i ile sonuçlanan başka bir dizin)" bulmak daha kolay. Şimdilik tek GPU\'lu bir makine ile sadece 10,000 yıl sürmektedir.',
- 'secure_pw_hash_security' => 'Bu kesişim şifrenizin eşiti olamaz ve Firefly III (gibi sitelerde) de işe yaramaz. Bu uygulama şifre doğrulaması için SHA 1 kullanmaz. Bu nedenle bu kutuyu işaretlemek güvenlidir. Şifreniz karıştırıldı ve HTTPS üzerinden gönderildi.',
- 'secure_pw_should' => 'Kutuyu kontrol etmeli miyim?',
- 'secure_pw_long_password' => 'Firefly III için bir çeşit şifre üreticisi kullanarak uzun, tek kullanımlık bir şifre oluşturduysanız: hayır.',
- 'secure_pw_short' => 'Her zaman kullandığınız şifreyi kullandıysanız: Evet lütfen.',
- 'command_line_token' => 'Command line token',
- 'explain_command_line_token' => 'You need this token to perform command line options, such as importing or exporting data. Without it, such sensitive commands will not work. Do not share your command line token. Nobody will ask you for this token, not even me. If you fear you lost this, or when you\'re paranoid, regenerate this token using the button.',
- 'regenerate_command_line_token' => 'Regenerate command line token',
- 'token_regenerated' => 'A new command line token was generated',
- 'change_your_email' => 'E-posta adresini değiştir',
- 'email_verification' => 'ESKİ ve yeni e-posta adreslerinize bir e-posta gönderilecektir. Güvenlik nedenlerinden ötürü email adreslerinizi onaylayana kadar giriş yapamayacaksınız. Eğer Fİrefly III yüklemenizin e-posta gönderebileceğinden emin değilseniz lütfen bu özelliği kullanmayınız. Eğer bir yöneticiyseniz bunu Yönetim de test edebilirsiniz.',
- 'email_changed_logout' => 'E-posta adresinizi doğrulayana kadar giriş yapamazsınız.',
- 'login_with_new_email' => 'Artık yeni e-posta adresinizle giriş yapabilirsiniz.',
- 'login_with_old_email' => 'Artık eski e-posta adresinizle yeniden giriş yapabilirsiniz.',
+ 'change_your_password' => 'Şifrenizi değiştirin',
+ 'delete_account' => 'Hesabı Sil',
+ 'current_password' => 'Güncel Şifre',
+ 'new_password' => 'Yeni Şifre',
+ 'new_password_again' => 'Yeni Şifre (Tekrar)',
+ 'delete_your_account' => 'Hesabını Sil',
+ 'delete_your_account_help' => 'Hesabınızı silmeniz aynı zamanda Firefly III\'e kaydetmiş olabileceğiniz hesapları, işlemleri, her şeyi de silecektir. YOK OLACAK.',
+ 'delete_your_account_password' => 'Devam etmek için şifrenizi girin.',
+ 'password' => 'Şifre',
+ 'are_you_sure' => 'Emin misiniz? Bunu geri alamazsınız.',
+ 'delete_account_button' => 'Hesabını Sil',
+ 'invalid_current_password' => 'Geçersiz Şifre!',
+ 'password_changed' => 'Şifre değiştirildi!',
+ 'should_change' => 'Amaç, şifrenizi değiştirmenizdir.',
+ 'invalid_password' => 'Geçersiz şifre!',
+ 'what_is_pw_security' => '\'\'Doğrulama şifresi güvenliği\'\' nedir?',
+ 'secure_pw_title' => 'Güvenli şifre nasıl seçilir?',
+ 'secure_pw_history' => 'Ağustos 2017\'de ünlü güvenlik araştırmacısı Troy Hunt, 306 milyon çalınan parolanın bir listesini yayınladı. Bu şifreler, LinkedIn, Adobe ve NeoPets gibi şirketlerde (ve daha pek çok yerde) sistem çökmesi sırasında çalındı.',
+ 'secure_pw_check_box' => 'By checking the box, Firefly III will send the first five characters of 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' => 'SHA1\'in çözüdüğünü sanıyordum',
+ 'secure_pw_hash_speed' => 'Doğru, ama bu bağlamda değil. SHA1\'in nasıl çözüleceğini anlatan web sitesinde de okuyabileceğin gibi artık bir "kesişim(aynı SHA1 hash\'i ile sonuçlanan başka bir dizin)" bulmak daha kolay. Şimdilik tek GPU\'lu bir makine ile sadece 10,000 yıl sürmektedir.',
+ '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 only the first five characters of this hash are sent over HTTPS.',
+ 'secure_pw_should' => 'Kutuyu kontrol etmeli miyim?',
+ 'secure_pw_long_password' => 'Firefly III için bir çeşit şifre üreticisi kullanarak uzun, tek kullanımlık bir şifre oluşturduysanız: hayır.',
+ 'secure_pw_short' => 'Her zaman kullandığınız şifreyi kullandıysanız: Evet lütfen.',
+ 'command_line_token' => 'Command line token',
+ 'explain_command_line_token' => 'You need this token to perform command line options, such as importing or exporting data. Without it, such sensitive commands will not work. Do not share your command line token. Nobody will ask you for this token, not even me. If you fear you lost this, or when you\'re paranoid, regenerate this token using the button.',
+ 'regenerate_command_line_token' => 'Regenerate command line token',
+ 'token_regenerated' => 'A new command line token was generated',
+ 'change_your_email' => 'E-posta adresini değiştir',
+ 'email_verification' => 'ESKİ ve yeni e-posta adreslerinize bir e-posta gönderilecektir. Güvenlik nedenlerinden ötürü email adreslerinizi onaylayana kadar giriş yapamayacaksınız. Eğer Fİrefly III yüklemenizin e-posta gönderebileceğinden emin değilseniz lütfen bu özelliği kullanmayınız. Eğer bir yöneticiyseniz bunu Yönetim de test edebilirsiniz.',
+ 'email_changed_logout' => 'E-posta adresinizi doğrulayana kadar giriş yapamazsınız.',
+ 'login_with_new_email' => 'Artık yeni e-posta adresinizle giriş yapabilirsiniz.',
+ 'login_with_old_email' => 'Artık eski e-posta adresinizle yeniden giriş yapabilirsiniz.',
// attachments
- 'nr_of_attachments' => 'Bir eklenti |:count eklenti',
- 'attachments' => 'Ekler',
- 'edit_attachment' => 'Ek ":name" düzenle',
- 'update_attachment' => 'Eki güncelle',
- 'delete_attachment' => '":name" Eki sil',
- 'attachment_deleted' => '":name" eki silindi',
- 'attachment_updated' => '":name" Ek güncellendi',
- 'upload_max_file_size' => 'Maksimum dosya boyutu: :size',
+ 'nr_of_attachments' => 'Bir eklenti |:count eklenti',
+ 'attachments' => 'Ekler',
+ 'edit_attachment' => 'Ek ":name" düzenle',
+ 'update_attachment' => 'Eki güncelle',
+ 'delete_attachment' => '":name" Eki sil',
+ 'attachment_deleted' => '":name" eki silindi',
+ 'attachment_updated' => '":name" Ek güncellendi',
+ 'upload_max_file_size' => 'Maksimum dosya boyutu: :size',
// transaction index
- 'title_expenses' => 'Giderler',
- 'title_withdrawal' => 'Giderler',
- 'title_revenue' => 'Gelir / Gelir',
- 'title_deposit' => 'Gelir / Gelir',
- 'title_transfer' => 'Transferler',
- 'title_transfers' => 'Transferler',
+ 'title_expenses' => 'Giderler',
+ 'title_withdrawal' => 'Giderler',
+ 'title_revenue' => 'Gelir / Gelir',
+ 'title_deposit' => 'Gelir / Gelir',
+ 'title_transfer' => 'Transferler',
+ 'title_transfers' => 'Transferler',
// convert stuff:
- 'convert_is_already_type_Withdrawal' => 'Bu işlem zaten bir para çekme işlemidir',
- 'convert_is_already_type_Deposit' => 'Bu işlem zaten bir para çekme işlemidir',
- 'convert_is_already_type_Transfer' => 'Bu işlem zaten bir transfer işlemidir',
- 'convert_to_Withdrawal' => '":description" yı bir para çekme işlemine dönüştür',
- 'convert_to_Deposit' => '":description" yı mevduata dönüştür',
- 'convert_to_Transfer' => '":description" yı bir aktarıma dönüştür',
- 'convert_options_WithdrawalDeposit' => 'Para çekme işlemini çekime dönüştür',
- 'convert_options_WithdrawalTransfer' => 'Para çekim işlemini aktarmaya dönüştür',
- 'convert_options_DepositTransfer' => 'Para yatırma işlemini bir aktarmaya dönüştür',
- 'convert_options_DepositWithdrawal' => 'Para yatırma işlemini çekime dönüştür',
- 'convert_options_TransferWithdrawal' => 'Bir transferi çekime dönüştür',
- 'convert_options_TransferDeposit' => 'Bir transferi çekime dönüştür',
- 'convert_Withdrawal_to_deposit' => 'Bu para çekme işlemini para yatırma işlemine çevir',
- 'convert_Withdrawal_to_transfer' => 'Bu para çekim işlemini havaleye çevir',
- 'convert_Deposit_to_withdrawal' => 'Bu para yatırma işlemini para çekme işlemine dönüştür',
- 'convert_Deposit_to_transfer' => 'Bu yatırımı bir havale olarak değiştir',
- 'convert_Transfer_to_deposit' => 'Bu havaleyi birikime dönüştürün',
- 'convert_Transfer_to_withdrawal' => 'Bu transferi bir para çekme işlemine dönüştür',
- 'convert_please_set_revenue_source' => 'Lütfen paranın geleceği bir gelir hesabı seçiniz.',
- 'convert_please_set_asset_destination' => 'Lütfen paranın gideceği varlık hesabını seçin.',
- 'convert_please_set_expense_destination' => 'Lütfen paranın gideceği masraf hesaplarını seçin.',
- 'convert_please_set_asset_source' => 'Lütfen paranın geleceği bir varlık hesabı seçiniz.',
- 'convert_explanation_withdrawal_deposit' => 'Eğer bu para çekme işlemini para yatırma işlemine çevirirseniz, :amount :sourceName den çekilmek yerine oraya yatırılacaktır.',
- 'convert_explanation_withdrawal_transfer' => 'Eğer bu para çekme işlemini transfer işlemine dönüştürürseniz, :amount :destinationName\'e ödenmek yerine :sourceName den yeni bir varlık hesabına transfer edilecektir.',
- 'convert_explanation_deposit_withdrawal' => 'Eğer bu para yatırma işlemini para çekim işlemine dönüştürürseniz :amount :destinationName\'e eklenmek yerine ondan düşecektir.',
- 'convert_explanation_deposit_transfer' => 'Eğer bu para yatırım işlemini transfer işlemine dönüştürürseniz, :amount sizin seçeceğiniz bir varlık hesabından destinationName\'e transfer edilecektir.',
- 'convert_explanation_transfer_withdrawal' => 'Eğer bu transfer işlemini para çekme işlemine dönüştürürseniz, :amount destinationName\'e transfer olmak yerine sourceName\'e yeni bir gider olarak işlenecektir.',
- 'convert_explanation_transfer_deposit' => 'Eğer bu transfer işlemini para yatırma işlemine dönüştürürseniz, :amount destinationName\'e aktarılmak yerine oraya yatırılacaktır.',
- 'converted_to_Withdrawal' => 'İşlem çekime dönüştürüldü',
- 'converted_to_Deposit' => 'İşlem depozitoya dönüştürüldü',
- 'converted_to_Transfer' => 'İşlem aktarıma dönüştürüldü',
- 'invalid_convert_selection' => 'Seçtiğiniz hesap zaten bu işlemde kullanılmış veya mevcut değil.',
+ 'convert_is_already_type_Withdrawal' => 'Bu işlem zaten bir para çekme işlemidir',
+ 'convert_is_already_type_Deposit' => 'Bu işlem zaten bir para çekme işlemidir',
+ 'convert_is_already_type_Transfer' => 'Bu işlem zaten bir transfer işlemidir',
+ 'convert_to_Withdrawal' => '":description" yı bir para çekme işlemine dönüştür',
+ 'convert_to_Deposit' => '":description" yı mevduata dönüştür',
+ 'convert_to_Transfer' => '":description" yı bir aktarıma dönüştür',
+ 'convert_options_WithdrawalDeposit' => 'Para çekme işlemini çekime dönüştür',
+ 'convert_options_WithdrawalTransfer' => 'Para çekim işlemini aktarmaya dönüştür',
+ 'convert_options_DepositTransfer' => 'Para yatırma işlemini bir aktarmaya dönüştür',
+ 'convert_options_DepositWithdrawal' => 'Para yatırma işlemini çekime dönüştür',
+ 'convert_options_TransferWithdrawal' => 'Bir transferi çekime dönüştür',
+ 'convert_options_TransferDeposit' => 'Bir transferi çekime dönüştür',
+ 'convert_Withdrawal_to_deposit' => 'Bu para çekme işlemini para yatırma işlemine çevir',
+ 'convert_Withdrawal_to_transfer' => 'Bu para çekim işlemini havaleye çevir',
+ 'convert_Deposit_to_withdrawal' => 'Bu para yatırma işlemini para çekme işlemine dönüştür',
+ 'convert_Deposit_to_transfer' => 'Bu yatırımı bir havale olarak değiştir',
+ 'convert_Transfer_to_deposit' => 'Bu havaleyi birikime dönüştürün',
+ 'convert_Transfer_to_withdrawal' => 'Bu transferi bir para çekme işlemine dönüştür',
+ 'convert_please_set_revenue_source' => 'Lütfen paranın geleceği bir gelir hesabı seçiniz.',
+ 'convert_please_set_asset_destination' => 'Lütfen paranın gideceği varlık hesabını seçin.',
+ 'convert_please_set_expense_destination' => 'Lütfen paranın gideceği masraf hesaplarını seçin.',
+ 'convert_please_set_asset_source' => 'Lütfen paranın geleceği bir varlık hesabı seçiniz.',
+ 'convert_explanation_withdrawal_deposit' => 'Eğer bu para çekme işlemini para yatırma işlemine çevirirseniz, :amount :sourceName den çekilmek yerine oraya yatırılacaktır.',
+ 'convert_explanation_withdrawal_transfer' => 'Eğer bu para çekme işlemini transfer işlemine dönüştürürseniz, :amount :destinationName\'e ödenmek yerine :sourceName den yeni bir varlık hesabına transfer edilecektir.',
+ 'convert_explanation_deposit_withdrawal' => 'Eğer bu para yatırma işlemini para çekim işlemine dönüştürürseniz :amount :destinationName\'e eklenmek yerine ondan düşecektir.',
+ 'convert_explanation_deposit_transfer' => 'Eğer bu para yatırım işlemini transfer işlemine dönüştürürseniz, :amount sizin seçeceğiniz bir varlık hesabından destinationName\'e transfer edilecektir.',
+ 'convert_explanation_transfer_withdrawal' => 'Eğer bu transfer işlemini para çekme işlemine dönüştürürseniz, :amount destinationName\'e transfer olmak yerine sourceName\'e yeni bir gider olarak işlenecektir.',
+ 'convert_explanation_transfer_deposit' => 'Eğer bu transfer işlemini para yatırma işlemine dönüştürürseniz, :amount destinationName\'e aktarılmak yerine oraya yatırılacaktır.',
+ 'converted_to_Withdrawal' => 'İşlem çekime dönüştürüldü',
+ 'converted_to_Deposit' => 'İşlem depozitoya dönüştürüldü',
+ 'converted_to_Transfer' => 'İşlem aktarıma dönüştürüldü',
+ 'invalid_convert_selection' => 'Seçtiğiniz hesap zaten bu işlemde kullanılmış veya mevcut değil.',
// create new stuff:
- 'create_new_withdrawal' => 'Yeni çekim oluştur',
- 'create_new_deposit' => 'Yeni mevduat oluştur',
- 'create_new_transfer' => 'Yeni transfer oluştur',
- 'create_new_asset' => 'Yeni varlık hesabı oluştur',
- 'create_new_expense' => 'Yeni gider hesabı oluştur',
- 'create_new_revenue' => 'Yeni gelir hesabı oluştur',
- 'create_new_piggy_bank' => 'Yeni bir kumbara oluştur',
- 'create_new_bill' => 'Yeni fatura oluştur',
+ 'create_new_withdrawal' => 'Yeni çekim oluştur',
+ 'create_new_deposit' => 'Yeni mevduat oluştur',
+ 'create_new_transfer' => 'Yeni transfer oluştur',
+ 'create_new_asset' => 'Yeni varlık hesabı oluştur',
+ 'create_new_expense' => 'Yeni gider hesabı oluştur',
+ 'create_new_revenue' => 'Yeni gelir hesabı oluştur',
+ 'create_new_piggy_bank' => 'Yeni bir kumbara oluştur',
+ 'create_new_bill' => 'Yeni fatura oluştur',
// currencies:
- 'create_currency' => 'Yeni para birimi oluştur',
- 'store_currency' => 'Yeni para birimini sakla',
- 'update_currency' => 'Para birimini güncelle',
- 'new_default_currency' => ':name artık varsayılan para birimi.',
- 'cannot_delete_currency' => ':name hala kullanıldığı için silinemiyor.',
- 'deleted_currency' => 'Para birimi :name silindi',
- 'created_currency' => 'Para birimi :name oluşturuldu',
- 'updated_currency' => 'Para birimi :name güncellendi',
- 'ask_site_owner' => 'Lütfen para birimleri eklemek, kaldırmak veya düzenlemek için :owner\'a danışın.',
- 'currencies_intro' => 'Firefly III, burada ayarlayabileceğiniz ve etkinleştirebileceğiniz çeşitli para birimlerini destekliyor.',
- 'make_default_currency' => 'varsayılanı ayarla',
- 'default_currency' => 'varsayılan',
+ 'create_currency' => 'Yeni para birimi oluştur',
+ 'store_currency' => 'Yeni para birimini sakla',
+ 'update_currency' => 'Para birimini güncelle',
+ 'new_default_currency' => ':name artık varsayılan para birimi.',
+ 'cannot_delete_currency' => ':name hala kullanıldığı için silinemiyor.',
+ 'deleted_currency' => 'Para birimi :name silindi',
+ 'created_currency' => 'Para birimi :name oluşturuldu',
+ 'updated_currency' => 'Para birimi :name güncellendi',
+ 'ask_site_owner' => 'Lütfen para birimleri eklemek, kaldırmak veya düzenlemek için :owner\'a danışın.',
+ 'currencies_intro' => 'Firefly III, burada ayarlayabileceğiniz ve etkinleştirebileceğiniz çeşitli para birimlerini destekliyor.',
+ 'make_default_currency' => 'varsayılanı ayarla',
+ 'default_currency' => 'varsayılan',
// forms:
- 'mandatoryFields' => 'Zorunlu alanlar',
- 'optionalFields' => 'İsteğe bağlı alanlar',
- 'options' => 'Seçenekler',
+ 'mandatoryFields' => 'Zorunlu alanlar',
+ 'optionalFields' => 'İsteğe bağlı alanlar',
+ 'options' => 'Seçenekler',
// budgets:
- 'create_new_budget' => 'Yeni bir bütçe oluştur',
- 'store_new_budget' => 'Yeni bütçeyi sakla',
- 'stored_new_budget' => 'Yeni bütçe ":name" kaydedildi',
- 'available_between' => ':start ve :end arasında kullanılabilir',
- 'transactionsWithoutBudget' => 'Bütçesiz Giderler',
- 'transactions_no_budget' => ':start ve :end arasındaki bütçe dışı harcamalar',
- 'spent_between' => ':start ve :end arasında harca',
- 'createBudget' => 'Yeni bütçe',
- 'inactiveBudgets' => 'Etkin olmayan bütçeler',
- 'without_budget_between' => ':start ve :end arasında bütçesiz işlemler',
- 'delete_budget' => '":name" bütçesini sil',
- 'deleted_budget' => 'Silinen bütçe ":name"',
- 'edit_budget' => '":name" bütçesini düzenle',
- 'updated_budget' => 'Güncellenmiş bütçe ":name"',
- 'update_amount' => 'Güncelleme miktarı',
- 'update_budget' => 'Bütçeyi güncelle',
- 'update_budget_amount_range' => ':start ve :end arasında (beklenen) mevcut miktarı güncelleyiniz',
- 'budget_period_navigator' => 'Devreden sayacı',
- 'info_on_available_amount' => 'Elimde ne var?',
- 'available_amount_indication' => 'Toplam bütçenizin ne olabileceğinin bir göstergesi olarak bu tutarı kullanın.',
- 'suggested' => 'Önerilen',
- 'average_between' => ':start ve :end arasında Averaj',
+ 'create_new_budget' => 'Yeni bir bütçe oluştur',
+ 'store_new_budget' => 'Yeni bütçeyi sakla',
+ 'stored_new_budget' => 'Yeni bütçe ":name" kaydedildi',
+ 'available_between' => ':start ve :end arasında kullanılabilir',
+ 'transactionsWithoutBudget' => 'Bütçesiz Giderler',
+ 'transactions_no_budget' => ':start ve :end arasındaki bütçe dışı harcamalar',
+ 'spent_between' => ':start ve :end arasında harca',
+ 'createBudget' => 'Yeni bütçe',
+ 'inactiveBudgets' => 'Etkin olmayan bütçeler',
+ 'without_budget_between' => ':start ve :end arasında bütçesiz işlemler',
+ 'delete_budget' => '":name" bütçesini sil',
+ 'deleted_budget' => 'Silinen bütçe ":name"',
+ 'edit_budget' => '":name" bütçesini düzenle',
+ 'updated_budget' => 'Güncellenmiş bütçe ":name"',
+ 'update_amount' => 'Güncelleme miktarı',
+ 'update_budget' => 'Bütçeyi güncelle',
+ 'update_budget_amount_range' => ':start ve :end arasında (beklenen) mevcut miktarı güncelleyiniz',
+ 'budget_period_navigator' => 'Devreden sayacı',
+ 'info_on_available_amount' => 'Elimde ne var?',
+ 'available_amount_indication' => 'Toplam bütçenizin ne olabileceğinin bir göstergesi olarak bu tutarı kullanın.',
+ 'suggested' => 'Önerilen',
+ 'average_between' => ':start ve :end arasında Averaj',
+ 'over_budget_warn' => ' Normally you budget about :amount per day. This is :over_amount per day.',
// bills:
- 'matching_on' => 'Eşleşti',
- 'between_amounts' => ':low ve :high arasında.',
- 'repeats' => 'Tekrarlar',
- 'connected_journals' => 'İlişkili işlemler',
- 'auto_match_on' => 'Automatically matched by Firefly III',
- 'auto_match_off' => 'Not automatically matched by Firefly III',
- 'next_expected_match' => 'Beklenen sonraki eşleşme',
- 'delete_bill' => 'Faturayı sil ":name"',
- 'deleted_bill' => 'Silinmiş fatura ":name"',
- 'edit_bill' => 'Fatura düzenle ":name"',
- 'more' => 'Daha',
- 'rescan_old' => 'Eski işlemleri yeniden tara',
- 'update_bill' => 'Faturayı güncelle',
- 'updated_bill' => 'Güncellenmiş fatura ":name"',
- 'store_new_bill' => 'Yeni fatura kaydet',
- 'stored_new_bill' => 'Yeni fatura ":name" kaydedildi',
- 'cannot_scan_inactive_bill' => 'Etkin olmayan faturalar taranamaz.',
- 'rescanned_bill' => 'Her şeyi yeniden araştırdım.',
- 'average_bill_amount_year' => 'Ortalama fatura tutarı (:year)',
- 'average_bill_amount_overall' => 'Ortalama fatura tutarı (genel)',
- 'bill_is_active' => 'Fatura aktif',
- 'bill_expected_between' => ':start ve :end arasında beklenen',
- 'bill_will_automatch' => 'Fatura uygun işlemlere otomatik olarak bağlandı',
- 'skips_over' => 'atla',
-
+ 'matching_on' => 'Eşleşti',
+ 'between_amounts' => ':low ve :high arasında.',
+ 'repeats' => 'Tekrarlar',
+ 'connected_journals' => 'İlişkili işlemler',
+ 'auto_match_on' => 'Automatically matched by Firefly III',
+ 'auto_match_off' => 'Not automatically matched by Firefly III',
+ 'next_expected_match' => 'Beklenen sonraki eşleşme',
+ 'delete_bill' => 'Faturayı sil ":name"',
+ 'deleted_bill' => 'Silinmiş fatura ":name"',
+ 'edit_bill' => 'Fatura düzenle ":name"',
+ 'more' => 'Daha',
+ 'rescan_old' => 'Eski işlemleri yeniden tara',
+ 'update_bill' => 'Faturayı güncelle',
+ 'updated_bill' => 'Güncellenmiş fatura ":name"',
+ 'store_new_bill' => 'Yeni fatura kaydet',
+ 'stored_new_bill' => 'Yeni fatura ":name" kaydedildi',
+ 'cannot_scan_inactive_bill' => 'Etkin olmayan faturalar taranamaz.',
+ 'rescanned_bill' => 'Her şeyi yeniden araştırdım.',
+ 'average_bill_amount_year' => 'Ortalama fatura tutarı (:year)',
+ 'average_bill_amount_overall' => 'Ortalama fatura tutarı (genel)',
+ 'bill_is_active' => 'Fatura aktif',
+ 'bill_expected_between' => ':start ve :end arasında beklenen',
+ 'bill_will_automatch' => 'Fatura uygun işlemlere otomatik olarak bağlandı',
+ 'skips_over' => 'atla',
// accounts:
- 'details_for_asset' => '":name" Varlık hesabı ayrıntıları',
- 'details_for_expense' => '":name" Harcama hesabı ayrıntıları',
- 'details_for_revenue' => '":name" Gelir hesabı ayrıntıları',
- 'details_for_cash' => '":name" Nakit hesabı ayrıntıları',
- 'store_new_asset_account' => 'Yeni varlık hesabını kaydet',
- 'store_new_expense_account' => 'Yeni gider hesabını sakla',
- 'store_new_revenue_account' => 'Yeni gelir hesabını kaydet',
- 'edit_asset_account' => '":name" Öğe hesabını düzenle',
- 'edit_expense_account' => '":name" Harcama hesabını düzenle',
- 'edit_revenue_account' => '":name" Gelir hesabını düzenle',
- 'delete_asset_account' => '":name" Öğe hesabını sil',
- 'delete_expense_account' => '":name" Masraf hesaplarını sil',
- 'delete_revenue_account' => '":name" Gelir hesabını sil',
- 'asset_deleted' => '":name" Adlı varlık hesabı başarıyla silindi',
- 'expense_deleted' => '":name" gider hesabı başarıyla silindi',
- 'revenue_deleted' => '":name" gelir hesabı başarıyla silindi',
- 'update_asset_account' => 'Varlık hesabını güncelle',
- 'update_expense_account' => 'Gider hesabını güncelle',
- 'update_revenue_account' => 'Gelir hesabı güncelleme',
- 'make_new_asset_account' => 'Yeni varlık hesabı oluştur',
- 'make_new_expense_account' => 'Yeni gider hesabı oluştur',
- 'make_new_revenue_account' => 'Yeni gelir hesabı oluştur',
- 'asset_accounts' => 'Varlık hesapları',
- 'expense_accounts' => 'Gider hesapları',
- 'revenue_accounts' => 'Gelir hesapları',
- 'cash_accounts' => 'Nakit Hesabı',
- 'Cash account' => 'Nakit Hesabı',
- 'reconcile_account' => 'Hesabı ":account" dengeleyin',
- 'delete_reconciliation' => 'Mutabakatı sil',
- 'update_reconciliation' => 'Mutabakatı güncelle',
- 'amount_cannot_be_zero' => 'Miktar sıfır olamaz',
- 'end_of_reconcile_period' => 'Uzlaştırma dönemi sonu: :period',
- 'start_of_reconcile_period' => 'Uzlaştırma dönemi başlangıcı: :period',
- 'start_balance' => 'Başlangıç bakiyesi',
- 'end_balance' => 'Son bakiye',
- 'update_balance_dates_instruction' => 'Yukarıdaki tutarlar ve tarihleri banka ekstrenizle esşleştirin ve "Mutabakatı başlat" düğmesine basın',
- 'select_transactions_instruction' => 'Banka ekstrenizde görünen işlemleri seçin.',
- 'select_range_and_balance' => 'Önce tarih aralığını ve bakiyeleri doğrulayın. Daha sonra "Mutabakatı başlat" tuşuna basın',
- 'date_change_instruction' => 'Tarih aralığını şim değiştirdiniz, ilerleme kaydedilemez.',
- 'update_selection' => 'Güncelleme seç',
- 'store_reconcile' => 'Mutabakatı sakla',
- 'reconciliation_transaction' => 'Mutabakat işlemi',
- 'Reconciliation' => 'Mutabakat',
- 'reconciliation' => 'Mutabakat',
- 'reconcile_options' => 'Mutabakat Seçenekleri',
- 'reconcile_range' => 'Mutabakat aralığı',
- 'start_reconcile' => 'Mutabakatı başlat',
- 'cash' => 'nakit',
- 'account_type' => 'Hesap Türü',
- 'save_transactions_by_moving' => 'Bu işlemleri başka bir hesaba taşıyarak kaydet:',
- 'stored_new_account' => 'Yeni hesap ":name" kaydedildi!',
- 'updated_account' => 'Güncellenmiş hesap ismi ":name"',
- 'credit_card_options' => 'Kredi kart seçenekleri',
- 'no_transactions_account' => 'Aktif hesapta herhangi bir işlem yok (bu dönem için) ":name".',
- 'no_data_for_chart' => 'Bu grafiği oluşturmak için yeterli bilgi (henüz) yok.',
- 'select_more_than_one_account' => 'Lütfen birden fazla hesap seçin',
- 'select_more_than_one_category' => 'Lütfen birden fazla kategori seçin',
- 'select_more_than_one_budget' => 'Lütfen birden fazla bütçe seçin',
- 'select_more_than_one_tag' => 'Lütfen birden fazla etiket seçin',
- 'account_default_currency' => 'Eğer başka bir para birimi seçerseniz, bu hesaptan yapılacak yeni işlemler için o para birimi kullanılacaktır.',
- 'reconcile_has_more' => 'Firefly III hesabınızda bankanızın iddia ettiğinden daha fazla para var. Birkaç seçenek var. Lütfen ne yapılacağını seçin. Daha sonra "Uzlaşmayı onayla" ya basın.',
- 'reconcile_has_less' => 'Firefly III\'de bankanızın iddia ettiğinden daha az para var. Birkaç seçenek var. Lütfen ne yapılacağını seçin. Daha sonra "Uzlaşmayı onayla"\'ya basın.',
- 'reconcile_is_equal' => 'Firefly III hesabınızdaki para ile banka ekstreniz eşleşiyor. Yapılacak bir şey yok. Lütfen girdinizi onaylamak için "Uzlaşmayı onayla"\'ya basın.',
- 'create_pos_reconcile_transaction' => 'Seçilen işlemleri temizleyiniz ve varlık hesabına :amount ekleyerek bir düzeltme oluşturun.',
- 'create_neg_reconcile_transaction' => 'Seçilen işlemleri temizleyiniz ve varlık hesabından :amount kaldırarak bir düzeltme oluşturun.',
- 'reconcile_do_nothing' => 'Seçilen işlemleri temizleyin, ama düzeltmeyiniz.',
- 'reconcile_go_back' => 'Bir düzeltmeyi daha sonra her zaman düzenleyebilir ya da silebilirsiniz.',
- 'must_be_asset_account' => 'Sadece varlık hesapları bağdaştırabilirsiniz',
- 'reconciliation_stored' => 'Depolanmış Mutabakat',
- 'reconcilliation_transaction_title' => 'Bağdaştırma (:from to :to)',
- 'reconcile_this_account' => 'Bu hesabı bağdaştırınız',
- 'confirm_reconciliation' => 'Mutabakatı onayla',
- 'submitted_start_balance' => 'Gönderilen başlangıç bakiyesi',
- 'selected_transactions' => 'Seçilen İşlemler (:count)',
- 'already_cleared_transactions' => 'Halihazırda temizlenmiş işlemler (:count)',
- 'submitted_end_balance' => 'Gönderilen bitiş bakiyesi',
- 'initial_balance_description' => 'Initial balance for ":account"',
+ 'details_for_asset' => '":name" Varlık hesabı ayrıntıları',
+ 'details_for_expense' => '":name" Harcama hesabı ayrıntıları',
+ 'details_for_revenue' => '":name" Gelir hesabı ayrıntıları',
+ 'details_for_cash' => '":name" Nakit hesabı ayrıntıları',
+ 'store_new_asset_account' => 'Yeni varlık hesabını kaydet',
+ 'store_new_expense_account' => 'Yeni gider hesabını sakla',
+ 'store_new_revenue_account' => 'Yeni gelir hesabını kaydet',
+ 'edit_asset_account' => '":name" Öğe hesabını düzenle',
+ 'edit_expense_account' => '":name" Harcama hesabını düzenle',
+ 'edit_revenue_account' => '":name" Gelir hesabını düzenle',
+ 'delete_asset_account' => '":name" Öğe hesabını sil',
+ 'delete_expense_account' => '":name" Masraf hesaplarını sil',
+ 'delete_revenue_account' => '":name" Gelir hesabını sil',
+ 'asset_deleted' => '":name" Adlı varlık hesabı başarıyla silindi',
+ 'expense_deleted' => '":name" gider hesabı başarıyla silindi',
+ 'revenue_deleted' => '":name" gelir hesabı başarıyla silindi',
+ 'update_asset_account' => 'Varlık hesabını güncelle',
+ 'update_expense_account' => 'Gider hesabını güncelle',
+ 'update_revenue_account' => 'Gelir hesabı güncelleme',
+ 'make_new_asset_account' => 'Yeni varlık hesabı oluştur',
+ 'make_new_expense_account' => 'Yeni gider hesabı oluştur',
+ 'make_new_revenue_account' => 'Yeni gelir hesabı oluştur',
+ 'asset_accounts' => 'Varlık hesapları',
+ 'expense_accounts' => 'Gider hesapları',
+ 'revenue_accounts' => 'Gelir hesapları',
+ 'cash_accounts' => 'Nakit Hesabı',
+ 'Cash account' => 'Nakit Hesabı',
+ 'reconcile_account' => 'Hesabı ":account" dengeleyin',
+ 'delete_reconciliation' => 'Mutabakatı sil',
+ 'update_reconciliation' => 'Mutabakatı güncelle',
+ 'amount_cannot_be_zero' => 'Miktar sıfır olamaz',
+ 'end_of_reconcile_period' => 'Uzlaştırma dönemi sonu: :period',
+ 'start_of_reconcile_period' => 'Uzlaştırma dönemi başlangıcı: :period',
+ 'start_balance' => 'Başlangıç bakiyesi',
+ 'end_balance' => 'Son bakiye',
+ 'update_balance_dates_instruction' => 'Yukarıdaki tutarlar ve tarihleri banka ekstrenizle esşleştirin ve "Mutabakatı başlat" düğmesine basın',
+ 'select_transactions_instruction' => 'Banka ekstrenizde görünen işlemleri seçin.',
+ 'select_range_and_balance' => 'Önce tarih aralığını ve bakiyeleri doğrulayın. Daha sonra "Mutabakatı başlat" tuşuna basın',
+ 'date_change_instruction' => 'Tarih aralığını şim değiştirdiniz, ilerleme kaydedilemez.',
+ 'update_selection' => 'Güncelleme seç',
+ 'store_reconcile' => 'Mutabakatı sakla',
+ 'reconciliation_transaction' => 'Mutabakat işlemi',
+ 'Reconciliation' => 'Mutabakat',
+ 'reconciliation' => 'Mutabakat',
+ 'reconcile_options' => 'Mutabakat Seçenekleri',
+ 'reconcile_range' => 'Mutabakat aralığı',
+ 'start_reconcile' => 'Mutabakatı başlat',
+ 'cash' => 'nakit',
+ 'account_type' => 'Hesap Türü',
+ 'save_transactions_by_moving' => 'Bu işlemleri başka bir hesaba taşıyarak kaydet:',
+ 'stored_new_account' => 'Yeni hesap ":name" kaydedildi!',
+ 'updated_account' => 'Güncellenmiş hesap ismi ":name"',
+ 'credit_card_options' => 'Kredi kart seçenekleri',
+ 'no_transactions_account' => 'Aktif hesapta herhangi bir işlem yok (bu dönem için) ":name".',
+ 'no_data_for_chart' => 'Bu grafiği oluşturmak için yeterli bilgi (henüz) yok.',
+ 'select_more_than_one_account' => 'Lütfen birden fazla hesap seçin',
+ 'select_more_than_one_category' => 'Lütfen birden fazla kategori seçin',
+ 'select_more_than_one_budget' => 'Lütfen birden fazla bütçe seçin',
+ 'select_more_than_one_tag' => 'Lütfen birden fazla etiket seçin',
+ 'account_default_currency' => 'Eğer başka bir para birimi seçerseniz, bu hesaptan yapılacak yeni işlemler için o para birimi kullanılacaktır.',
+ 'reconcile_has_more' => 'Firefly III hesabınızda bankanızın iddia ettiğinden daha fazla para var. Birkaç seçenek var. Lütfen ne yapılacağını seçin. Daha sonra "Uzlaşmayı onayla" ya basın.',
+ 'reconcile_has_less' => 'Firefly III\'de bankanızın iddia ettiğinden daha az para var. Birkaç seçenek var. Lütfen ne yapılacağını seçin. Daha sonra "Uzlaşmayı onayla"\'ya basın.',
+ 'reconcile_is_equal' => 'Firefly III hesabınızdaki para ile banka ekstreniz eşleşiyor. Yapılacak bir şey yok. Lütfen girdinizi onaylamak için "Uzlaşmayı onayla"\'ya basın.',
+ 'create_pos_reconcile_transaction' => 'Seçilen işlemleri temizleyiniz ve varlık hesabına :amount ekleyerek bir düzeltme oluşturun.',
+ 'create_neg_reconcile_transaction' => 'Seçilen işlemleri temizleyiniz ve varlık hesabından :amount kaldırarak bir düzeltme oluşturun.',
+ 'reconcile_do_nothing' => 'Seçilen işlemleri temizleyin, ama düzeltmeyiniz.',
+ 'reconcile_go_back' => 'Bir düzeltmeyi daha sonra her zaman düzenleyebilir ya da silebilirsiniz.',
+ 'must_be_asset_account' => 'Sadece varlık hesapları bağdaştırabilirsiniz',
+ 'reconciliation_stored' => 'Depolanmış Mutabakat',
+ 'reconcilliation_transaction_title' => 'Bağdaştırma (:from to :to)',
+ 'reconcile_this_account' => 'Bu hesabı bağdaştırınız',
+ 'confirm_reconciliation' => 'Mutabakatı onayla',
+ 'submitted_start_balance' => 'Gönderilen başlangıç bakiyesi',
+ 'selected_transactions' => 'Seçilen İşlemler (:count)',
+ 'already_cleared_transactions' => 'Halihazırda temizlenmiş işlemler (:count)',
+ 'submitted_end_balance' => 'Gönderilen bitiş bakiyesi',
+ 'initial_balance_description' => 'Initial balance for ":account"',
// categories:
- 'new_category' => 'Yeni Kategori',
- 'create_new_category' => 'Yeni bir kategori oluştur',
- 'without_category' => 'Kategori olmaksızın',
- 'update_category' => 'Kategoriyi güncelle',
- 'updated_category' => '":name" kategorisi güncellendi',
- 'categories' => 'Kategoriler',
- 'edit_category' => '":name" kategorisini düzenle',
- 'no_category' => '(Kategori yok)',
- 'category' => 'Kategori',
- 'delete_category' => '":name" kategorisini sil',
- 'deleted_category' => ' kategorisi silindi',
- 'store_category' => 'Yeni kategoriyi kaydet',
- 'stored_category' => 'Kaydedilen yeni kategori ":name"',
- 'without_category_between' => ':start ve :end arasında kategorisiz',
+ 'new_category' => 'Yeni Kategori',
+ 'create_new_category' => 'Yeni bir kategori oluştur',
+ 'without_category' => 'Kategori olmaksızın',
+ 'update_category' => 'Kategoriyi güncelle',
+ 'updated_category' => '":name" kategorisi güncellendi',
+ 'categories' => 'Kategoriler',
+ 'edit_category' => '":name" kategorisini düzenle',
+ 'no_category' => '(Kategori yok)',
+ 'category' => 'Kategori',
+ 'delete_category' => '":name" kategorisini sil',
+ 'deleted_category' => ' kategorisi silindi',
+ 'store_category' => 'Yeni kategoriyi kaydet',
+ 'stored_category' => 'Kaydedilen yeni kategori ":name"',
+ 'without_category_between' => ':start ve :end arasında kategorisiz',
// transactions:
- 'update_withdrawal' => 'Geri çekmeyi güncelle',
- 'update_deposit' => 'Depozitoyu güncelle',
- 'update_transfer' => 'Aktarımı güncelle',
- 'updated_withdrawal' => 'Para çekme güncellendi ":description"',
- 'updated_deposit' => 'Güncellenmiş depozito ":description"',
- 'updated_transfer' => 'Güncellenmiş ":description"',
- 'delete_withdrawal' => 'Çekimi sil ":description"',
- 'delete_deposit' => 'Mevduat sil ":description"',
- 'delete_transfer' => 'Aktarımı sil ":description"',
- 'deleted_withdrawal' => 'Çekilme başarıyla silindi ":description"',
- 'deleted_deposit' => '":description" Para yatırma başarıyla silindi',
- 'deleted_transfer' => '":description" Aktarım başarıyla silindi',
- 'stored_journal' => '":description" Yeni işlem başarıyla oluşturuldu',
- 'select_transactions' => 'İşlemleri Seç',
- 'rule_group_select_transactions' => 'İşlemlere "başlık" uygula',
- 'rule_select_transactions' => 'İşlemlere "başlık" uygula',
- 'stop_selection' => 'İşlemleri seçmeyi durdur',
- 'reconcile_selected' => 'Onaylanmış',
- 'mass_delete_journals' => 'Bir dizi işlemi sil',
- 'mass_edit_journals' => 'Bir dizi işlem düzenle',
- 'mass_bulk_journals' => 'Bulk edit a number of transactions',
- 'mass_bulk_journals_explain' => 'If you do not want to change your transactions one-by-one using the mass-edit function, you can update them in one go. Simply select the preferred category, tag(s) or budget in the fields below, and all the transactions in the table will be updated.',
- 'bulk_set_new_values' => 'Use the inputs below to set new values. If you leave them empty, they will be made empty for all. Also, note that only withdrawals will be given a budget.',
- 'no_bulk_category' => 'Don\'t update category',
- 'no_bulk_budget' => 'Don\'t update budget',
- 'no_bulk_tags' => 'Don\'t update tag(s)',
- 'bulk_edit' => 'Bulk edit',
- 'cannot_edit_other_fields' => 'Gösterecek yer olmadığı için, bu dosya dışındaki dosyaları toplu olarak düzenleyemezsiniz. Eğer o alanları düzenlemeniz gerekliyse lütfen linki takip edin ve onları teker teker düzenleyin.',
- 'no_budget' => 'hiçbiri',
- 'no_budget_squared' => '(Bütçe yok)',
- 'perm-delete-many' => 'Birden fazla öğeyi tek seferde silmek sıkıntı olabilir. Lütfen temkinli olun.',
- 'mass_deleted_transactions_success' => 'Silinen :amount işlem(ler).',
- 'mass_edited_transactions_success' => 'Güncellenen :amount işlem(ler)',
- 'opt_group_no_account_type' => '(hesap türü yok)',
- 'opt_group_defaultAsset' => 'Varsayılan varlık hesapları',
- 'opt_group_savingAsset' => 'Tasarruf Hesapları',
- 'opt_group_sharedAsset' => 'Paylaşılan varlık hesapları',
- 'opt_group_ccAsset' => 'Kredi Kartı',
- 'notes' => 'Notes',
+ 'update_withdrawal' => 'Geri çekmeyi güncelle',
+ 'update_deposit' => 'Depozitoyu güncelle',
+ 'update_transfer' => 'Aktarımı güncelle',
+ 'updated_withdrawal' => 'Para çekme güncellendi ":description"',
+ 'updated_deposit' => 'Güncellenmiş depozito ":description"',
+ 'updated_transfer' => 'Güncellenmiş ":description"',
+ 'delete_withdrawal' => 'Çekimi sil ":description"',
+ 'delete_deposit' => 'Mevduat sil ":description"',
+ 'delete_transfer' => 'Aktarımı sil ":description"',
+ 'deleted_withdrawal' => 'Çekilme başarıyla silindi ":description"',
+ 'deleted_deposit' => '":description" Para yatırma başarıyla silindi',
+ 'deleted_transfer' => '":description" Aktarım başarıyla silindi',
+ 'stored_journal' => '":description" Yeni işlem başarıyla oluşturuldu',
+ 'select_transactions' => 'İşlemleri Seç',
+ 'rule_group_select_transactions' => 'İşlemlere "başlık" uygula',
+ 'rule_select_transactions' => 'İşlemlere "başlık" uygula',
+ 'stop_selection' => 'İşlemleri seçmeyi durdur',
+ 'reconcile_selected' => 'Onaylanmış',
+ 'mass_delete_journals' => 'Bir dizi işlemi sil',
+ 'mass_edit_journals' => 'Bir dizi işlem düzenle',
+ 'mass_bulk_journals' => 'Bulk edit a number of transactions',
+ 'mass_bulk_journals_explain' => 'If you do not want to change your transactions one-by-one using the mass-edit function, you can update them in one go. Simply select the preferred category, tag(s) or budget in the fields below, and all the transactions in the table will be updated.',
+ 'bulk_set_new_values' => 'Use the inputs below to set new values. If you leave them empty, they will be made empty for all. Also, note that only withdrawals will be given a budget.',
+ 'no_bulk_category' => 'Don\'t update category',
+ 'no_bulk_budget' => 'Don\'t update budget',
+ 'no_bulk_tags' => 'Don\'t update tag(s)',
+ 'bulk_edit' => 'Bulk edit',
+ 'cannot_edit_other_fields' => 'Gösterecek yer olmadığı için, bu dosya dışındaki dosyaları toplu olarak düzenleyemezsiniz. Eğer o alanları düzenlemeniz gerekliyse lütfen linki takip edin ve onları teker teker düzenleyin.',
+ 'no_budget' => 'hiçbiri',
+ 'no_budget_squared' => '(Bütçe yok)',
+ 'perm-delete-many' => 'Birden fazla öğeyi tek seferde silmek sıkıntı olabilir. Lütfen temkinli olun.',
+ 'mass_deleted_transactions_success' => 'Silinen :amount işlem(ler).',
+ 'mass_edited_transactions_success' => 'Güncellenen :amount işlem(ler)',
+ 'opt_group_no_account_type' => '(hesap türü yok)',
+ 'opt_group_defaultAsset' => 'Varsayılan varlık hesapları',
+ 'opt_group_savingAsset' => 'Tasarruf Hesapları',
+ 'opt_group_sharedAsset' => 'Paylaşılan varlık hesapları',
+ 'opt_group_ccAsset' => 'Kredi Kartı',
+ 'notes' => 'Notes',
// new user:
- 'welcome' => 'Welcome to Firefly III!',
- 'submit' => 'Gönder',
- 'getting_started' => 'Başla',
- 'to_get_started' => 'Firefly III\'ü başarılı şekilde yüklediğinizi görmek güzel. Bu aracı kullanmak için lütfen banka adınızı ve ana hesabınızın bakiyesini girin. Birden fazla hesabınız varsa endişelenmeyin. Onları daha sonra ekleyebilirsiniz. Bu adım sadece Firefly III\'ün bir yerden başlaması gerektiği içindir.',
- 'savings_balance_text' => 'Firefly III sizin için otomatik olarak bir birikim hesabı oluşturacaktır. Varsayılan olarak birikim hesabınızda hiç para olmayacaktır ama Firefly III\'e dengelemesini söylerseniz o şekilde saklayacaktır.',
- 'finish_up_new_user' => 'İşte bu! Submit tıklayarak devam edebilirsiniz. Firefly III Anasayfasına yönlendirileceksiniz.',
- 'stored_new_accounts_new_user' => 'Yuppi! Yeni hesabınız kaydedildi.',
+ 'welcome' => 'Welcome to Firefly III!',
+ 'submit' => 'Gönder',
+ 'getting_started' => 'Başla',
+ 'to_get_started' => 'Firefly III\'ü başarılı şekilde yüklediğinizi görmek güzel. Bu aracı kullanmak için lütfen banka adınızı ve ana hesabınızın bakiyesini girin. Birden fazla hesabınız varsa endişelenmeyin. Onları daha sonra ekleyebilirsiniz. Bu adım sadece Firefly III\'ün bir yerden başlaması gerektiği içindir.',
+ 'savings_balance_text' => 'Firefly III sizin için otomatik olarak bir birikim hesabı oluşturacaktır. Varsayılan olarak birikim hesabınızda hiç para olmayacaktır ama Firefly III\'e dengelemesini söylerseniz o şekilde saklayacaktır.',
+ 'finish_up_new_user' => 'İşte bu! Submit tıklayarak devam edebilirsiniz. Firefly III Anasayfasına yönlendirileceksiniz.',
+ 'stored_new_accounts_new_user' => 'Yuppi! Yeni hesabınız kaydedildi.',
// home page:
- 'yourAccounts' => 'Hesaplarınız',
- 'budgetsAndSpending' => 'Bütçe ve Harcama',
- 'savings' => 'Birikim',
- 'newWithdrawal' => 'Yeni gider',
- 'newDeposit' => 'Yeni mevduat',
- 'newTransfer' => 'Yeni Transfer',
- 'bills_to_pay' => 'Ödenecek fatura',
- 'per_day' => 'Hergün',
- 'left_to_spend_per_day' => 'Günlük harcama için bırakıldı',
- 'bills_paid' => 'Ödenen Faturalar',
+ 'yourAccounts' => 'Hesaplarınız',
+ 'budgetsAndSpending' => 'Bütçe ve Harcama',
+ 'savings' => 'Birikim',
+ 'newWithdrawal' => 'Yeni gider',
+ 'newDeposit' => 'Yeni mevduat',
+ 'newTransfer' => 'Yeni Transfer',
+ 'bills_to_pay' => 'Ödenecek fatura',
+ 'per_day' => 'Hergün',
+ 'left_to_spend_per_day' => 'Günlük harcama için bırakıldı',
+ 'bills_paid' => 'Ödenen Faturalar',
// menu and titles, should be recycled as often as possible:
- 'currency' => 'Para birimi',
- 'preferences' => 'Tercihler',
- 'logout' => 'Çıkış Yap',
- 'toggleNavigation' => 'Navigasyonu aç / kapat',
- 'searchPlaceholder' => 'Aranıyor...',
- 'version' => 'Versiyon',
- 'dashboard' => 'Gösterge paneli',
- 'currencies' => 'Kurlar',
- 'accounts' => 'Hesaplar',
- 'Asset account' => 'Varlık hesabı',
- 'Default account' => 'Varlık hesabı',
- 'Expense account' => 'Gider hesabı',
- 'Revenue account' => 'Gelir hesabı',
- 'Initial balance account' => 'Başlangıç bakiye hesabı',
- 'budgets' => 'Bütçeler',
- 'tags' => 'Etiketler',
- 'reports' => 'Raporlar',
- 'transactions' => 'İşlemler',
- 'expenses' => 'Giderler',
- 'income' => 'Gelir / gelir',
- 'transfers' => 'Transferler',
- 'moneyManagement' => 'Para Yönetimi',
- 'piggyBanks' => 'Kumbara',
- 'bills' => 'Fatura',
- 'withdrawal' => 'Para Çekme',
- 'opening_balance' => 'Açılış bakiyesi',
- 'deposit' => 'Mevduat',
- 'account' => 'Hesap',
- 'transfer' => 'Havale',
- 'Withdrawal' => 'Para Çekme',
- 'Deposit' => 'Mevduat',
- 'Transfer' => 'Havale',
- 'bill' => 'Fatura',
- 'yes' => 'Evet',
- 'no' => 'Hayır',
- 'amount' => 'Miktar',
- 'overview' => 'Genel Bakış',
- 'saveOnAccount' => 'Hesabı Kaydet',
- 'unknown' => 'Bilinmeyen',
- 'daily' => 'Günlük',
- 'monthly' => 'Aylık',
- 'profile' => 'Profil',
- 'errors' => 'Hatalar',
+ 'currency' => 'Para birimi',
+ 'preferences' => 'Tercihler',
+ 'logout' => 'Çıkış Yap',
+ 'toggleNavigation' => 'Navigasyonu aç / kapat',
+ 'searchPlaceholder' => 'Aranıyor...',
+ 'version' => 'Versiyon',
+ 'dashboard' => 'Gösterge paneli',
+ 'currencies' => 'Kurlar',
+ 'accounts' => 'Hesaplar',
+ 'Asset account' => 'Varlık hesabı',
+ 'Default account' => 'Varlık hesabı',
+ 'Expense account' => 'Gider hesabı',
+ 'Revenue account' => 'Gelir hesabı',
+ 'Initial balance account' => 'Başlangıç bakiye hesabı',
+ 'budgets' => 'Bütçeler',
+ 'tags' => 'Etiketler',
+ 'reports' => 'Raporlar',
+ 'transactions' => 'İşlemler',
+ 'expenses' => 'Giderler',
+ 'income' => 'Gelir / gelir',
+ 'transfers' => 'Transferler',
+ 'moneyManagement' => 'Para Yönetimi',
+ 'piggyBanks' => 'Kumbara',
+ 'bills' => 'Fatura',
+ 'withdrawal' => 'Para Çekme',
+ 'opening_balance' => 'Açılış bakiyesi',
+ 'deposit' => 'Mevduat',
+ 'account' => 'Hesap',
+ 'transfer' => 'Havale',
+ 'Withdrawal' => 'Para Çekme',
+ 'Deposit' => 'Mevduat',
+ 'Transfer' => 'Havale',
+ 'bill' => 'Fatura',
+ 'yes' => 'Evet',
+ 'no' => 'Hayır',
+ 'amount' => 'Miktar',
+ 'overview' => 'Genel Bakış',
+ 'saveOnAccount' => 'Hesabı Kaydet',
+ 'unknown' => 'Bilinmeyen',
+ 'daily' => 'Günlük',
+ 'monthly' => 'Aylık',
+ 'profile' => 'Profil',
+ 'errors' => 'Hatalar',
// reports:
- 'report_default' => ':start ve :end arasında varsayılan finans raporu',
- 'report_audit' => ':start ve :end arasında işlem geçmişine genel bakış',
- 'report_category' => ':start ve :end arasında kategori raporu',
- 'report_account' => ':start ve :end arasında gelir/gider hesap raporu',
- 'report_budget' => ':start ve :end arasında bütçe raporu',
- 'report_tag' => ':start ve :end arasında etiket raporu',
- 'quick_link_reports' => 'Hızlı Erişim',
- 'quick_link_default_report' => 'Varsayılan finansal rapor',
- 'quick_link_audit_report' => 'İşlem geçmişine genel bakış',
- 'report_this_month_quick' => 'Cari ay, tüm hesaplar',
- 'report_this_year_quick' => 'Cari yıl, tüm hesaplar',
- 'report_this_fiscal_year_quick' => 'Cari mali yıl, bütün hesaplar',
- 'report_all_time_quick' => 'Bütün zaman, bütün hesaplar',
- 'reports_can_bookmark' => 'Raporların yer imlerine eklenebileceğini unutmayın.',
- 'incomeVsExpenses' => 'Gelir ve giderler',
- 'accountBalances' => 'Hesap bakiyeleri',
- 'balanceStart' => 'Dönem Başında Bakiye',
- 'balanceEnd' => 'Dönem Sonunda Bakiye',
- 'splitByAccount' => 'Hesaplara göre bölünmüş',
- 'coveredWithTags' => 'Etiketler kapatılmıştır',
- 'leftUnbalanced' => 'Sol dengesiz',
- 'leftInBudget' => 'Bütçede bırakıldı',
- 'sumOfSums' => 'Hesap toplamı',
- 'noCategory' => '(Kategori yok)',
- 'notCharged' => 'Ücret alınmadı (henüz)',
- 'inactive' => 'Etkisiz',
- 'active' => 'Aktif',
- 'difference' => 'Fark',
- 'money_flowing_in' => 'İçeri',
- 'money_flowing_out' => 'Dışarı',
- 'topX' => 'üst :number',
- 'show_full_list' => 'Tüm listeyi göster',
- 'show_only_top' => 'Sadece üst :number göster',
- 'report_type' => 'Rapor Türü',
- 'report_type_default' => 'Varsayılan finansal rapor',
- 'report_type_audit' => 'İşlem geçmişine genel bakış (denetim)',
- 'report_type_category' => 'Kategori raporu',
- 'report_type_budget' => 'Bütçe raporu',
- 'report_type_tag' => 'Etiket raporu',
- 'report_type_account' => 'Gider / Gelir hesap raporu',
- 'more_info_help' => 'Bu tür raporlar hakkında daha fazla bilgi yardım sayfalarında bulunabilir. Sağ üst köşedeki (?) simgesine basın.',
- 'report_included_accounts' => 'Dahil edilen hesaplar',
- 'report_date_range' => 'Tarih aralığı',
- 'report_preset_ranges' => 'Önceden ayarlanmış aralıklar',
- 'shared' => 'Paylaşılan',
- 'fiscal_year' => 'Mali yıl',
- 'income_entry' => ':start ve :end arasında ":name" hesabının geliri',
- 'expense_entry' => ':start ve :end arasında ":name" hesabının giderleri',
- 'category_entry' => ':start ve :end arasında ":name" kategorisinde giderler',
- 'budget_spent_amount' => '":budget" bütçesindeki :start ve :end arası harcamalar',
- 'balance_amount' => '":budget" bütçesindeki, ":account" hesabından :start ve :end arası ödenen giderler',
- 'no_audit_activity' => ':account_name hesabında :start ve :end arasında hiç bir hareket kaydedilmedi.',
- 'audit_end_balance' => ':end sonunda :account_name hesabının bakiyesi: :balance',
- 'reports_extra_options' => 'Ekstra Seçenekler',
- 'report_has_no_extra_options' => 'Bu raporda ekstra bir seçenek yok',
- 'reports_submit' => 'Raporu görüntüle',
- 'end_after_start_date' => 'Raporun bitiş tarihi, başlangıç tarihinden sonra olmalıdır.',
- 'select_category' => 'Kategori (ler) seçin',
- 'select_budget' => 'Bütçe (ler) seçin.',
- 'select_tag' => 'Etiket (ler) seçin.',
- 'income_per_category' => 'Kategori başına gelir',
- 'expense_per_category' => 'Kategori başına harcama',
- 'expense_per_budget' => 'Bütçe başına harcama',
- 'income_per_account' => 'Hesap başına gelir',
- 'expense_per_account' => 'Hesap başına gider',
- 'expense_per_tag' => 'Etiket başına harcama',
- 'income_per_tag' => 'Etiket başına gelir',
- 'include_expense_not_in_budget' => 'Dahil edilen masraflar seçili bütçe(ler) içinde değil',
- 'include_expense_not_in_account' => 'Dahil edilen masraflar seçili hesaplar(lar) içinde değil',
- 'include_expense_not_in_category' => 'Dahil edilen masraflar seçili kategori(ler) içinde değil',
- 'include_income_not_in_category' => 'Dahil edilen gelirler seçili kategori(ler) içinde değil',
- 'include_income_not_in_account' => 'Dahil edilen gelirler seçili hesap(lar) içinde değil',
- 'include_income_not_in_tags' => 'Dahil edilen gelirler seçili etiket(ler) içinde değil',
- 'include_expense_not_in_tags' => 'Dahil edilen giderler seçili etiket(ler) içinde değil',
- 'everything_else' => 'Geri kalan her şey',
- 'income_and_expenses' => 'Gelir ve gider',
- 'spent_average' => 'Harcanan (ortalama)',
- 'income_average' => 'Gelir (ortalama)',
- 'transaction_count' => 'İşlem sayısı',
- 'average_spending_per_account' => 'Hesap başına ortalama harcama',
- 'average_income_per_account' => 'Hesap başına ortalama gelir',
- 'total' => 'Genel Toplam',
- 'description' => 'Açıklama',
- 'sum_of_period' => 'Dönemin toplamı',
- 'average_in_period' => 'Dönem içinde ortalama',
- 'account_role_defaultAsset' => 'Varsayılan varlık hesabı',
- 'account_role_sharedAsset' => 'Paylaşılan varlık hesabı',
- 'account_role_savingAsset' => 'Birikim hesabı',
- 'account_role_ccAsset' => 'Kredi Kartı',
- 'budget_chart_click' => 'Bir grafik görmek için lütfen yukarıdaki tabloda bir bütçe adına tıklayın.',
- 'category_chart_click' => 'Bir grafik görmek için lütfen yukarıdaki tabloda bir kategori adına tıklayın.',
- 'in_out_accounts' => 'Kazanılan ve kombinasyon başına harcanan',
- 'in_out_per_category' => 'Kazanılan ve kategori başına harcanan',
- 'out_per_budget' => 'Bütçe başına harcama',
- 'select_expense_revenue' => 'Harcama / gelir hesabı seçin',
+ 'report_default' => ':start ve :end arasında varsayılan finans raporu',
+ 'report_audit' => ':start ve :end arasında işlem geçmişine genel bakış',
+ 'report_category' => ':start ve :end arasında kategori raporu',
+ 'report_account' => ':start ve :end arasında gelir/gider hesap raporu',
+ 'report_budget' => ':start ve :end arasında bütçe raporu',
+ 'report_tag' => ':start ve :end arasında etiket raporu',
+ 'quick_link_reports' => 'Hızlı Erişim',
+ 'quick_link_default_report' => 'Varsayılan finansal rapor',
+ 'quick_link_audit_report' => 'İşlem geçmişine genel bakış',
+ 'report_this_month_quick' => 'Cari ay, tüm hesaplar',
+ 'report_this_year_quick' => 'Cari yıl, tüm hesaplar',
+ 'report_this_fiscal_year_quick' => 'Cari mali yıl, bütün hesaplar',
+ 'report_all_time_quick' => 'Bütün zaman, bütün hesaplar',
+ 'reports_can_bookmark' => 'Raporların yer imlerine eklenebileceğini unutmayın.',
+ 'incomeVsExpenses' => 'Gelir ve giderler',
+ 'accountBalances' => 'Hesap bakiyeleri',
+ 'balanceStart' => 'Dönem Başında Bakiye',
+ 'balanceEnd' => 'Dönem Sonunda Bakiye',
+ 'splitByAccount' => 'Hesaplara göre bölünmüş',
+ 'coveredWithTags' => 'Etiketler kapatılmıştır',
+ 'leftUnbalanced' => 'Sol dengesiz',
+ 'leftInBudget' => 'Bütçede bırakıldı',
+ 'sumOfSums' => 'Hesap toplamı',
+ 'noCategory' => '(Kategori yok)',
+ 'notCharged' => 'Ücret alınmadı (henüz)',
+ 'inactive' => 'Etkisiz',
+ 'active' => 'Aktif',
+ 'difference' => 'Fark',
+ 'money_flowing_in' => 'İçeri',
+ 'money_flowing_out' => 'Dışarı',
+ 'topX' => 'üst :number',
+ 'show_full_list' => 'Tüm listeyi göster',
+ 'show_only_top' => 'Sadece üst :number göster',
+ 'report_type' => 'Rapor Türü',
+ 'report_type_default' => 'Varsayılan finansal rapor',
+ 'report_type_audit' => 'İşlem geçmişine genel bakış (denetim)',
+ 'report_type_category' => 'Kategori raporu',
+ 'report_type_budget' => 'Bütçe raporu',
+ 'report_type_tag' => 'Etiket raporu',
+ 'report_type_account' => 'Gider / Gelir hesap raporu',
+ 'more_info_help' => 'Bu tür raporlar hakkında daha fazla bilgi yardım sayfalarında bulunabilir. Sağ üst köşedeki (?) simgesine basın.',
+ 'report_included_accounts' => 'Dahil edilen hesaplar',
+ 'report_date_range' => 'Tarih aralığı',
+ 'report_preset_ranges' => 'Önceden ayarlanmış aralıklar',
+ 'shared' => 'Paylaşılan',
+ 'fiscal_year' => 'Mali yıl',
+ 'income_entry' => ':start ve :end arasında ":name" hesabının geliri',
+ 'expense_entry' => ':start ve :end arasında ":name" hesabının giderleri',
+ 'category_entry' => ':start ve :end arasında ":name" kategorisinde giderler',
+ 'budget_spent_amount' => '":budget" bütçesindeki :start ve :end arası harcamalar',
+ 'balance_amount' => '":budget" bütçesindeki, ":account" hesabından :start ve :end arası ödenen giderler',
+ 'no_audit_activity' => ':account_name hesabında :start ve :end arasında hiç bir hareket kaydedilmedi.',
+ 'audit_end_balance' => ':end sonunda :account_name hesabının bakiyesi: :balance',
+ 'reports_extra_options' => 'Ekstra Seçenekler',
+ 'report_has_no_extra_options' => 'Bu raporda ekstra bir seçenek yok',
+ 'reports_submit' => 'Raporu görüntüle',
+ 'end_after_start_date' => 'Raporun bitiş tarihi, başlangıç tarihinden sonra olmalıdır.',
+ 'select_category' => 'Kategori (ler) seçin',
+ 'select_budget' => 'Bütçe (ler) seçin.',
+ 'select_tag' => 'Etiket (ler) seçin.',
+ 'income_per_category' => 'Kategori başına gelir',
+ 'expense_per_category' => 'Kategori başına harcama',
+ 'expense_per_budget' => 'Bütçe başına harcama',
+ 'income_per_account' => 'Hesap başına gelir',
+ 'expense_per_account' => 'Hesap başına gider',
+ 'expense_per_tag' => 'Etiket başına harcama',
+ 'income_per_tag' => 'Etiket başına gelir',
+ 'include_expense_not_in_budget' => 'Dahil edilen masraflar seçili bütçe(ler) içinde değil',
+ 'include_expense_not_in_account' => 'Dahil edilen masraflar seçili hesaplar(lar) içinde değil',
+ 'include_expense_not_in_category' => 'Dahil edilen masraflar seçili kategori(ler) içinde değil',
+ 'include_income_not_in_category' => 'Dahil edilen gelirler seçili kategori(ler) içinde değil',
+ 'include_income_not_in_account' => 'Dahil edilen gelirler seçili hesap(lar) içinde değil',
+ 'include_income_not_in_tags' => 'Dahil edilen gelirler seçili etiket(ler) içinde değil',
+ 'include_expense_not_in_tags' => 'Dahil edilen giderler seçili etiket(ler) içinde değil',
+ 'everything_else' => 'Geri kalan her şey',
+ 'income_and_expenses' => 'Gelir ve gider',
+ 'spent_average' => 'Harcanan (ortalama)',
+ 'income_average' => 'Gelir (ortalama)',
+ 'transaction_count' => 'İşlem sayısı',
+ 'average_spending_per_account' => 'Hesap başına ortalama harcama',
+ 'average_income_per_account' => 'Hesap başına ortalama gelir',
+ 'total' => 'Genel Toplam',
+ 'description' => 'Açıklama',
+ 'sum_of_period' => 'Dönemin toplamı',
+ 'average_in_period' => 'Dönem içinde ortalama',
+ 'account_role_defaultAsset' => 'Varsayılan varlık hesabı',
+ 'account_role_sharedAsset' => 'Paylaşılan varlık hesabı',
+ 'account_role_savingAsset' => 'Birikim hesabı',
+ 'account_role_ccAsset' => 'Kredi Kartı',
+ 'budget_chart_click' => 'Bir grafik görmek için lütfen yukarıdaki tabloda bir bütçe adına tıklayın.',
+ 'category_chart_click' => 'Bir grafik görmek için lütfen yukarıdaki tabloda bir kategori adına tıklayın.',
+ 'in_out_accounts' => 'Kazanılan ve kombinasyon başına harcanan',
+ 'in_out_per_category' => 'Kazanılan ve kategori başına harcanan',
+ 'out_per_budget' => 'Bütçe başına harcama',
+ 'select_expense_revenue' => 'Harcama / gelir hesabı seçin',
// charts:
- 'chart' => 'Grafik',
- 'month' => 'Ay',
- 'budget' => 'Bütçe',
- 'spent' => 'Harcanan',
- 'spent_in_budget' => 'Bütçede harcama',
- 'left_to_spend' => 'Harcama için bırakıldı',
- 'earned' => 'Kazanılan',
- 'overspent' => 'Fazladan',
- 'left' => 'Ayrıldı',
- 'max-amount' => 'En yüksek miktar',
- 'min-amount' => 'Minimum miktar',
- 'journal-amount' => 'Geçerli fatura girişi',
- 'name' => 'İsim',
- 'date' => 'Tarih',
- 'paid' => 'Ödendi',
- 'unpaid' => 'Ödenmedi',
- 'day' => 'Gün',
- 'budgeted' => 'Bütçelenen',
- 'period' => 'Dönem',
- 'balance' => 'Denge',
- 'sum' => 'Toplam',
- 'average' => 'Ortalama',
- 'balanceFor' => ':name için bakiye',
+ 'chart' => 'Grafik',
+ 'month' => 'Ay',
+ 'budget' => 'Bütçe',
+ 'spent' => 'Harcanan',
+ 'spent_in_budget' => 'Bütçede harcama',
+ 'left_to_spend' => 'Harcama için bırakıldı',
+ 'earned' => 'Kazanılan',
+ 'overspent' => 'Fazladan',
+ 'left' => 'Ayrıldı',
+ 'max-amount' => 'En yüksek miktar',
+ 'min-amount' => 'Minimum miktar',
+ 'journal-amount' => 'Geçerli fatura girişi',
+ 'name' => 'İsim',
+ 'date' => 'Tarih',
+ 'paid' => 'Ödendi',
+ 'unpaid' => 'Ödenmedi',
+ 'day' => 'Gün',
+ 'budgeted' => 'Bütçelenen',
+ 'period' => 'Dönem',
+ 'balance' => 'Denge',
+ 'sum' => 'Toplam',
+ 'average' => 'Ortalama',
+ 'balanceFor' => ':name için bakiye',
// piggy banks:
- 'add_money_to_piggy' => '":name" kumbarasına paraa ekle',
- 'piggy_bank' => 'Kumbara',
- 'new_piggy_bank' => 'Yeni kumbara',
- 'store_piggy_bank' => 'Yeni bir kumbara kaydet',
- 'stored_piggy_bank' => '":name" isimli yeni bir kumbara kaydet',
- 'account_status' => 'Hesap Durumu',
- 'left_for_piggy_banks' => 'Kumbara için sola',
- 'sum_of_piggy_banks' => 'Kumbaranın toplamı',
- 'saved_so_far' => 'Şimdiye kadar biriktirilmiş',
- 'left_to_save' => 'Kaydetmek için sola',
- 'suggested_amount' => 'Birikim için önerilen aylık tutar',
- 'add_money_to_piggy_title' => '":name" kumbarasına para ekle',
- 'remove_money_from_piggy_title' => '":name" kumbarasından para çek',
- 'add' => 'Ekle',
- 'no_money_for_piggy' => 'Bu kumbaraya koyacak paran yok.',
+ 'add_money_to_piggy' => '":name" kumbarasına paraa ekle',
+ 'piggy_bank' => 'Kumbara',
+ 'new_piggy_bank' => 'Yeni kumbara',
+ 'store_piggy_bank' => 'Yeni bir kumbara kaydet',
+ 'stored_piggy_bank' => '":name" isimli yeni bir kumbara kaydet',
+ 'account_status' => 'Hesap Durumu',
+ 'left_for_piggy_banks' => 'Kumbara için sola',
+ 'sum_of_piggy_banks' => 'Kumbaranın toplamı',
+ 'saved_so_far' => 'Şimdiye kadar biriktirilmiş',
+ 'left_to_save' => 'Kaydetmek için sola',
+ 'suggested_amount' => 'Birikim için önerilen aylık tutar',
+ 'add_money_to_piggy_title' => '":name" kumbarasına para ekle',
+ 'remove_money_from_piggy_title' => '":name" kumbarasından para çek',
+ 'add' => 'Ekle',
+ 'no_money_for_piggy' => 'Bu kumbaraya koyacak paran yok.',
'remove' => 'Kaldır',
'max_amount_add' => 'Ekleyebileceğiniz azami tutar',
@@ -1085,6 +1087,7 @@ işlemlerin kontrol edildiğini lütfen unutmayın.',
'invalid_link_selection' => 'Bu işlemler bağlantılanamıyor',
'journals_linked' => 'İşlemler bağlantıları oluşturuldu.',
'journals_error_linked' => 'Bu işlemler zaten bağlantılı.',
+ 'journals_link_to_self' => 'You cannot link a transaction to itself',
'journal_links' => 'İşlem bağlantıları',
'this_withdrawal' => 'Bu çekim',
'this_deposit' => 'Bu depozito',
diff --git a/resources/lang/tr_TR/form.php b/resources/lang/tr_TR/form.php
index 105fa170c7..d5f0d7c58f 100644
--- a/resources/lang/tr_TR/form.php
+++ b/resources/lang/tr_TR/form.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// new user:
diff --git a/resources/lang/tr_TR/import.php b/resources/lang/tr_TR/import.php
index 45997407f5..d4a9f22d4b 100644
--- a/resources/lang/tr_TR/import.php
+++ b/resources/lang/tr_TR/import.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
// status of import:
@@ -97,6 +98,7 @@ return [
// not csv, but normal warning
'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.',
'foreign_amount_warning' => 'If you mark a column as containing an amount in a foreign currency, you must also set the column that contains which currency it is.',
+
// file, map data
'file_map_title' => 'Ayarları aktar (4/4) - İçe aktarım verilerini Firefly III verilerine bağlayın',
'file_map_text' => 'Takip eden tabloda, sol değer yüklediğiniz dosyada bulunan bilgileri gösterir. Bu değeri eşlemek sizin göreviniz, eğer mümkünse veritabanınızda bulunan bir değerle. Firefly bu eşlemeye bağlı kalacak. Eğer eşleştirilecek değer yoksa ya da belirli bir değer ile eşleştirmek istemiyorsanız hiçbir şey seçmeyin.',
@@ -131,28 +133,40 @@ return [
'column_date-book' => 'İşlem rezervasyon tarihi',
'column_date-process' => 'İşlem tarihi',
'column_date-transaction' => 'Tarih',
+ 'column_date-due' => 'Transaction due date',
+ 'column_date-payment' => 'Transaction payment date',
+ 'column_date-invoice' => 'Transaction invoice date',
'column_description' => 'Açıklama',
'column_opposing-iban' => 'Karşı hesap (IBAN)',
+ 'column_opposing-bic' => 'Opposing account (BIC)',
'column_opposing-id' => 'Opposing account ID (matching FF3)',
'column_external-id' => 'Harici Kimlik',
'column_opposing-name' => 'Karşı hesap (isim)',
'column_rabo-debit-credit' => 'Rabobank\'a özel borç / kredi göstergesi',
'column_ing-debit-credit' => 'ING\'ye özel borç/kredi göstergesi',
- 'column_sepa-ct-id' => 'SEPA Kredi Transferinin uçtan uca kimliği',
- 'column_sepa-ct-op' => 'SEPA Kredi Transferinin karşı hesabı',
- 'column_sepa-db' => 'SEPA Direkt Borç',
+ 'column_sepa-ct-id' => 'SEPA end-to-end Identifier',
+ 'column_sepa-ct-op' => 'SEPA Opposing Account Identifier',
+ 'column_sepa-db' => 'SEPA Mandate Identifier',
+ 'column_sepa-cc' => 'SEPA Clearing Code',
+ 'column_sepa-ci' => 'SEPA Creditor Identifier',
+ 'column_sepa-ep' => 'SEPA External Purpose',
+ 'column_sepa-country' => 'SEPA Country Code',
'column_tags-comma' => 'Etiketler (virgülle ayrılmış)',
'column_tags-space' => 'Etiketler (boşlukla ayrılmış)',
'column_account-number' => 'Varlık hesabı (hesap numarası)',
'column_opposing-number' => 'Karşı hesap (hesap numarası)',
'column_note' => 'Not(lar)',
+ 'column_internal-reference' => 'Internal reference',
// prerequisites
'prerequisites' => 'Prerequisites',
// bunq
'bunq_prerequisites_title' => 'Bunq\'dan içeri aktarım için şartlar',
- 'bunq_prerequisites_text' => 'Bunq\'dan içe aktarabilmek için bir API anahtarı almalısınız. Bunu uygulamadan yapabilirsiniz.',
+ 'bunq_prerequisites_text' => 'In order to import from bunq, you need to obtain an API key. You can do this through the app. Please note that the import function for bunq is in BETA. It has only been tested against the sandbox API.',
+ 'bunq_do_import' => 'Yes, import from this account',
+ 'bunq_accounts_title' => 'Bunq accounts',
+ 'bunq_accounts_text' => 'These are the accounts associated with your bunq account. Please select the accounts from which you want to import, and in which account the transactions must be imported.',
// Spectre
'spectre_title' => 'Spectre kullanarak içe aktar',
@@ -187,4 +201,3 @@ return [
// various other strings:
'imported_from_account' => 'Imported from ":account"',
];
-
diff --git a/resources/lang/tr_TR/intro.php b/resources/lang/tr_TR/intro.php
index 99d26d551f..e014c745c0 100644
--- a/resources/lang/tr_TR/intro.php
+++ b/resources/lang/tr_TR/intro.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
// index
diff --git a/resources/lang/tr_TR/list.php b/resources/lang/tr_TR/list.php
index a853cf23ae..2fb18e1762 100644
--- a/resources/lang/tr_TR/list.php
+++ b/resources/lang/tr_TR/list.php
@@ -1,4 +1,6 @@
.
*/
-declare(strict_types=1);
return [
'buttons' => 'Tuşlar',
@@ -102,4 +103,12 @@ return [
'reconcile' => 'Onaylanmış',
'account_on_spectre' => 'Account (Spectre)',
'do_import' => 'Import from this account',
+ 'sepa-ct-id' => 'SEPA End to End Identifier',
+ 'sepa-ct-op' => 'SEPA Opposing Account Identifier',
+ 'sepa-db' => 'SEPA Mandate Identifier',
+ 'sepa-country' => 'SEPA Country',
+ 'sepa-cc' => 'SEPA Clearing Code',
+ 'sepa-ep' => 'SEPA External Purpose',
+ 'sepa-ci' => 'SEPA Creditor Identifier',
+ 'account_at_bunq' => 'Account with bunq',
];
diff --git a/resources/lang/tr_TR/pagination.php b/resources/lang/tr_TR/pagination.php
index d3268e7a07..31dc2a4e22 100644
--- a/resources/lang/tr_TR/pagination.php
+++ b/resources/lang/tr_TR/pagination.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'previous' => '« Önceki',
diff --git a/resources/lang/tr_TR/passwords.php b/resources/lang/tr_TR/passwords.php
index 150281848b..7d2d4224a6 100644
--- a/resources/lang/tr_TR/passwords.php
+++ b/resources/lang/tr_TR/passwords.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'password' => 'Şifreniz en az altı karakter olmalıdır ve onayla eşleşmelidir.',
diff --git a/resources/lang/tr_TR/validation.php b/resources/lang/tr_TR/validation.php
index 0f6bee5597..fce9e2f3ed 100644
--- a/resources/lang/tr_TR/validation.php
+++ b/resources/lang/tr_TR/validation.php
@@ -1,4 +1,5 @@
.
*/
-declare(strict_types=1);
return [
'iban' => 'Bu IBAN geçerli değilrdir.',
+ 'source_equals_destination' => 'The source account equals the destination account',
'unique_account_number_for_user' => 'Bu hesap numarası zaten kullanılmaktadır.',
'unique_iban_for_user' => 'It looks like this IBAN is already in use.',
'deleted_user' => 'Güvenlik kısıtlamaları nedeniyle, bu e-posta adresini kullanarak kayıt yapamazsınız.',
diff --git a/resources/views/accounts/show.twig b/resources/views/accounts/show.twig
index c137e6e45f..b702c942e1 100644
--- a/resources/views/accounts/show.twig
+++ b/resources/views/accounts/show.twig
@@ -5,75 +5,80 @@
{% endblock %}
{% block content %}
- - - {{ 'show_the_current_period_and_overview'|_ }} - + {% if periods.count > 0 %} + + {{ 'show_all_no_filter'|_ }} + + {% else %} + + {{ 'show_the_current_period_and_overview'|_ }} + + {% endif %}
{{ 'pref_languages_help'|_ }}
- {% for key, lang in Config.get('firefly.languages') %} -
@@ -114,70 +115,6 @@
{{ 'pref_home_show_deposits_info'|_ }}
-{{ 'pref_two_factor_auth_help'|_ }}
-{{ 'pref_two_factor_auth_help'|_ }}
+ {% if enabled2FA == true %} + + + {% else %} ++
- {{ 'show_all_no_filter'|_ }} + {{ 'show_all_no_filter'|_ }}
{% else %}@@ -56,10 +56,9 @@ {% for period in periods %} {% if period.sum != 0 %} - -
| {{ trans('list.source_account') }} | - -{{ trans('list.destination_account') }} | - -{{ trans('list.amount') }} | - - -
|---|
| - {% if transaction.source_account_type == 'Cash account' %} - ({{ 'cash'|_ }}) - {% else %} - {{ transaction.source_account_name }} - {% endif %} - - | - -- {% if transaction.destination_account_type == 'Cash account' %} - ({{ 'cash'|_ }}) - {% else %} - {{ transaction.destination_account_name }} - {% endif %} - - | - -- {{ transaction|transactionArrayAmount }} - | - - + +{{ trans('list.source_account') }} | +{{ trans('list.destination_account') }} | +{{ trans('list.amount') }} | + +
|---|