diff --git a/.codeclimate.yml b/.codeclimate.yml new file mode 100644 index 0000000000..ce3bc33e17 --- /dev/null +++ b/.codeclimate.yml @@ -0,0 +1,12 @@ +--- +exclude_patterns: + - public/lib/ + - public/js/lib/ + - public/fonts/ + - public/css/jquery-ui/ + - public/css/bootstrap-multiselect.css + - public/css/bootstrap-sortable.css + - public/css/bootstrap-tagsinput.css + - public/css/daterangepicker.css + - public/css/google-fonts.css + - .sandstorm/ diff --git a/.env.docker b/.env.docker index 026d291ec8..6da4c14359 100644 --- a/.env.docker +++ b/.env.docker @@ -1,12 +1,24 @@ +# 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=${FF_APP_ENV} -APP_DEBUG=false -APP_NAME=FireflyIII -APP_KEY=${FF_APP_KEY} -APP_LOG=daily -APP_LOG_LEVEL=warning -APP_URL=http://localhost -TRUSTED_PROXIES= +# Set to true if you want to see debug information in error screens. +APP_DEBUG=false + +# This should be your email address +SITE_OWNER=mail@example.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=${FF_APP_KEY} + +# APP_URL and TRUSTED_PROXIES are useful when using Docker and/or a reverse proxy. +APP_URL=${APP_URL} +TRUSTED_PROXIES=${TRUSTED_PROXIES} + +# 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 @@ -14,19 +26,27 @@ DB_DATABASE=${FF_DB_NAME} DB_USERNAME=${FF_DB_USER} DB_PASSWORD=${FF_DB_PASSWORD} -BROADCAST_DRIVER=log +# '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=warning + +# 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=smtp MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 @@ -35,26 +55,36 @@ MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null +# Firefly III can send you the following messages SEND_REGISTRATION_MAIL=true SEND_ERROR_MESSAGE=true -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= + +# If you wish to track your own behavior over Firefly III, set a valid analytics tracker ID here. ANALYTICS_ID= -SITE_OWNER=mail@example.com + +# 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=true +# 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 +SEARCH_RESULT_LIMIT=50 +EXCHANGE_RATE_SERVICE=fixerio PUSHER_KEY= PUSHER_SECRET= PUSHER_ID= - DEMO_USERNAME= DEMO_PASSWORD= - IS_DOCKER=true IS_SANDSTORM=false IS_HEROKU=false diff --git a/.env.example b/.env.example index 159b802948..2d156589fa 100644 --- a/.env.example +++ b/.env.example @@ -1,12 +1,24 @@ +# 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=local + +# Set to true if you want to see debug information in error screens. APP_DEBUG=false -APP_NAME=FireflyIII + +# This should be your email address +SITE_OWNER=mail@example.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=SomeRandomStringOf32CharsExactly -APP_LOG=daily -APP_LOG_LEVEL=notice + +# APP_URL and TRUSTED_PROXIES are useful when using Docker and/or a reverse proxy. APP_URL=http://localhost TRUSTED_PROXIES= +# 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=127.0.0.1 DB_PORT=3306 @@ -14,19 +26,27 @@ DB_DATABASE=homestead DB_USERNAME=homestead DB_PASSWORD=secret -BROADCAST_DRIVER=log +# '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=notice + +# 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=smtp MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 @@ -35,26 +55,36 @@ MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null +# Firefly III can send you the following messages SEND_REGISTRATION_MAIL=true SEND_ERROR_MESSAGE=true -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= + +# If you wish to track your own behavior over Firefly III, set a valid analytics tracker ID here. ANALYTICS_ID= -SITE_OWNER=mail@example.com + +# 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=true +# 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 +SEARCH_RESULT_LIMIT=50 +EXCHANGE_RATE_SERVICE=fixerio PUSHER_KEY= PUSHER_SECRET= PUSHER_ID= - DEMO_USERNAME= DEMO_PASSWORD= - IS_DOCKER=false IS_SANDSTORM=false IS_HEROKU=false diff --git a/.env.heroku b/.env.heroku index 21ab4f3587..f4b16694c3 100644 --- a/.env.heroku +++ b/.env.heroku @@ -1,12 +1,24 @@ +# 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=heroku -APP_DEBUG=true -APP_NAME=FireflyIII -APP_KEY=7ahyYVPVsmxjdhsweWCauGeJfwc92NP2 -APP_LOG=errorlog -APP_LOG_LEVEL=debug -APP_URL=http://localhost -TRUSTED_PROXIES=* +# Set to true if you want to see debug information in error screens. +APP_DEBUG=false + +# This should be your email address +SITE_OWNER=heroku@example.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=7ahyYVPVsmxjdhsweWCauGeJfwc92NP2 + +# APP_URL and TRUSTED_PROXIES are useful when using Docker and/or a reverse proxy. +APP_URL=http://localhost +TRUSTED_PROXIES= + +# 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 @@ -14,19 +26,27 @@ DB_CONNECTION=pgsql -BROADCAST_DRIVER=log +# '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=errorlog + +# 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=smtp MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 @@ -35,26 +55,36 @@ MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null +# Firefly III can send you the following messages SEND_REGISTRATION_MAIL=true SEND_ERROR_MESSAGE=true -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= + +# If you wish to track your own behavior over Firefly III, set a valid analytics tracker ID here. ANALYTICS_ID= -SITE_OWNER=heroku@example.com + +# 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=true +# 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 +SEARCH_RESULT_LIMIT=50 +EXCHANGE_RATE_SERVICE=fixerio PUSHER_KEY= PUSHER_SECRET= PUSHER_ID= - DEMO_USERNAME= DEMO_PASSWORD= - IS_DOCKER=false IS_SANDSTORM=false IS_HEROKU=true diff --git a/.env.sandstorm b/.env.sandstorm index d446820dc7..4504105a92 100755 --- a/.env.sandstorm +++ b/.env.sandstorm @@ -1,12 +1,24 @@ +# 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=local + +# Set to true if you want to see debug information in error screens. APP_DEBUG=false -APP_NAME=FireflyIII + +# This should be your email address +SITE_OWNER=sandstorm@example.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=SomeRandomStringOf32CharsExactly -APP_LOG=syslog -APP_LOG_LEVEL=info + +# APP_URL and TRUSTED_PROXIES are useful when using Docker and/or a reverse proxy. APP_URL=http://localhost TRUSTED_PROXIES= +# 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=127.0.0.1 DB_PORT=3306 @@ -14,19 +26,27 @@ DB_DATABASE=firefly DB_USERNAME=firefly DB_PASSWORD=firefly -BROADCAST_DRIVER=log +# '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=syslog + +# 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=info + +# 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=smtp MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 @@ -35,26 +55,36 @@ MAIL_USERNAME=null MAIL_PASSWORD=null MAIL_ENCRYPTION=null +# Firefly III can send you the following messages SEND_REGISTRATION_MAIL=true SEND_ERROR_MESSAGE=true -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= + +# If you wish to track your own behavior over Firefly III, set a valid analytics tracker ID here. ANALYTICS_ID= -SITE_OWNER=mail@example.com + +# 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=true +# 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 +SEARCH_RESULT_LIMIT=50 +EXCHANGE_RATE_SERVICE=fixerio PUSHER_KEY= PUSHER_SECRET= PUSHER_ID= - DEMO_USERNAME= DEMO_PASSWORD= - IS_DOCKER=false IS_SANDSTORM=true IS_HEROKU=false diff --git a/CODE_OF_CONDUCT.md b/.github/code_of_conduct.md similarity index 100% rename from CODE_OF_CONDUCT.md rename to .github/code_of_conduct.md diff --git a/.github/CONTRIBUTING.md b/.github/contributing.md similarity index 84% rename from .github/CONTRIBUTING.md rename to .github/contributing.md index 3e3a8de51c..86cdf14950 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/contributing.md @@ -4,7 +4,7 @@ ## Feature requests -I am always interested in expanding Firefly III's many features. If you are requesting a new feature, please check out the list of [often requested features](https://firefly-iii.org/requested-features/). +I am always interested in expanding Firefly III's many features. Just open a ticket or [drop me a line](mailto:thegrumpydictator@gmail.com). ## Pull requests diff --git a/.github/ISSUE_TEMPLATE.md b/.github/issue_template.md similarity index 100% rename from .github/ISSUE_TEMPLATE.md rename to .github/issue_template.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/pull_request_template.md similarity index 100% rename from .github/PULL_REQUEST_TEMPLATE.md rename to .github/pull_request_template.md diff --git a/.github/SUPPORT.md b/.github/support.md similarity index 100% rename from .github/SUPPORT.md rename to .github/support.md diff --git a/.sandstorm/build.sh b/.sandstorm/build.sh index 93daf1ba86..eadb2023bf 100755 --- a/.sandstorm/build.sh +++ b/.sandstorm/build.sh @@ -3,10 +3,9 @@ # This script only runs once, when the app connects to sandstorm. set -euo pipefail - +echo "In build.sh" cd /opt/app - cp .env.sandstorm .env if [ -f /opt/app/composer.json ] ; then diff --git a/.sandstorm/changelog.md b/.sandstorm/changelog.md index 0e4e976f9a..ff618d2761 100644 --- a/.sandstorm/changelog.md +++ b/.sandstorm/changelog.md @@ -1,3 +1,32 @@ +# 4.7.0 +- Support for Russian and Portuguese (Brazil) +- Support for the Spectre API (Salt Edge) +- Many strings now translatable thanks to [Nik-vr](https://github.com/Nik-vr) ([issue 1118](https://github.com/firefly-iii/firefly-iii/issues/1118), [issue 1116](https://github.com/firefly-iii/firefly-iii/issues/1116), [issue 1109](https://github.com/firefly-iii/firefly-iii/issues/1109), ) +- Many buttons to quickly create stuff +- Sum of tables in reports, requested by [MacPaille](https://github.com/MacPaille) ([issue 1106](https://github.com/firefly-iii/firefly-iii/issues/1106)) +- Future versions of Firefly III will notify you there is a new version, as suggested by [8bitgentleman](https://github.com/8bitgentleman) in [issue 1050](https://github.com/firefly-iii/firefly-iii/issues/1050) +- Improved net worth box [issue 1101](https://github.com/firefly-iii/firefly-iii/issues/1101) ([Nik-vr](https://github.com/Nik-vr)) +- Nice dropdown in transaction list [issue 1082](https://github.com/firefly-iii/firefly-iii/issues/1082) +- Better support for local fonts thanks to [devlearner](https://github.com/devlearner) ([issue 1145](https://github.com/firefly-iii/firefly-iii/issues/1145)) +- Improve attachment support and view capabilities (suggested by [trinhit](https://github.com/trinhit) in [issue 1146](https://github.com/firefly-iii/firefly-iii/issues/1146)) +- Whole new [read me file](https://github.com/firefly-iii/firefly-iii/blob/master/readme.md), [new end user documentation](https://firefly-iii.readthedocs.io/en/latest/) and an [updated website](https://www.firefly-iii.org/)! +- Many charts and info-blocks now scale property ([issue 989](https://github.com/firefly-iii/firefly-iii/issues/989) and [issue 1040](https://github.com/firefly-iii/firefly-iii/issues/1040)) +- Charts work in IE thanks to [devlearner](https://github.com/devlearner) ([issue 1107](https://github.com/firefly-iii/firefly-iii/issues/1107)) +- Various fixes in import routine +- Bug that left charts empty ([issue 1088](https://github.com/firefly-iii/firefly-iii/issues/1088)), reported by various users amongst which [jinformatique](https://github.com/jinformatique) +- [Issue 1124](https://github.com/firefly-iii/firefly-iii/issues/1124), as reported by [gavu](https://github.com/gavu) +- [Issue 1125](https://github.com/firefly-iii/firefly-iii/issues/1125), as reported by [gavu](https://github.com/gavu) +- [Issue 1126](https://github.com/firefly-iii/firefly-iii/issues/1126), as reported by [gavu](https://github.com/gavu) +- [Issue 1131](https://github.com/firefly-iii/firefly-iii/issues/1131), as reported by [dp87](https://github.com/dp87) +- [Issue 1129](https://github.com/firefly-iii/firefly-iii/issues/1129), as reported by [gavu](https://github.com/gavu) +- [Issue 1132](https://github.com/firefly-iii/firefly-iii/issues/1132), as reported by [gavu](https://github.com/gavu) +- Issue with cache in Sandstorm ([issue 1130](https://github.com/firefly-iii/firefly-iii/issues/1130)) +- [Issue 1134](https://github.com/firefly-iii/firefly-iii/issues/1134) +- [Issue 1140](https://github.com/firefly-iii/firefly-iii/issues/1140) +- [Issue 1141](https://github.com/firefly-iii/firefly-iii/issues/1141), reported by [ErikFontanel](https://github.com/ErikFontanel) +- [Issue 1142](https://github.com/firefly-iii/firefly-iii/issues/1142) +- Removed many access rights from the demo user + # 4.6.13 - [Issue 1074](https://github.com/firefly-iii/firefly-iii/issues/1074), suggested by [MacPaille](https://github.com/MacPaille) - [Issue 1077](https://github.com/firefly-iii/firefly-iii/issues/1077), suggested by [wtercato](https://github.com/wtercato) diff --git a/.sandstorm/launcher.sh b/.sandstorm/launcher.sh index 537385c74a..cb7281917a 100755 --- a/.sandstorm/launcher.sh +++ b/.sandstorm/launcher.sh @@ -1,6 +1,7 @@ #!/bin/bash # Runs every time we create a new grain! +echo "Now in launcher.sh" # Create a bunch of folders under the clean /var that php, nginx, and mysql expect to exist mkdir -p /var/lib/mysql @@ -30,7 +31,6 @@ mkdir -p /var/storage/framework/views mkdir -p /var/storage/logs mkdir -p /var/storage/upload - # Ensure mysql tables created HOME=/etc/mysql /usr/bin/mysql_install_db --force @@ -58,5 +58,9 @@ echo "Migrating..." php /opt/app/artisan migrate --seed --force echo "Done!" +echo "Clear cache.." +php /opt/app/artisan cache:clear +echo "Done" + # Start nginx. /usr/sbin/nginx -c /opt/app/.sandstorm/service-config/nginx.conf -g "daemon off;" diff --git a/.sandstorm/sandstorm-files.list b/.sandstorm/sandstorm-files.list index 36bb69887a..5b20a43693 100644 --- a/.sandstorm/sandstorm-files.list +++ b/.sandstorm/sandstorm-files.list @@ -200,6 +200,7 @@ lib/x86_64-linux-gnu/libwrap.so.0.7.6 lib/x86_64-linux-gnu/libz.so.1 lib/x86_64-linux-gnu/libz.so.1.2.8 lib64/ld-linux-x86-64.so.2 +opt/app/.codeclimate.yml opt/app/.env opt/app/.env.docker opt/app/.env.example @@ -237,10 +238,7 @@ opt/app/.sandstorm/service-config/mime.types opt/app/.sandstorm/service-config/nginx.conf opt/app/.sandstorm/setup.sh opt/app/.sandstorm/stack -opt/app/CHANGELOG.md -opt/app/CODE_OF_CONDUCT.md opt/app/LICENSE -opt/app/README.md opt/app/app.json opt/app/app/Console/Commands/CreateExport.php opt/app/app/Console/Commands/CreateImport.php @@ -644,6 +642,7 @@ opt/app/app/Services/Spectre/Object/Login.php opt/app/app/Services/Spectre/Object/SpectreObject.php opt/app/app/Services/Spectre/Object/Token.php opt/app/app/Services/Spectre/Object/Transaction.php +opt/app/app/Services/Spectre/Object/TransactionExtra.php opt/app/app/Services/Spectre/Request/CreateTokenRequest.php opt/app/app/Services/Spectre/Request/ListAccountsRequest.php opt/app/app/Services/Spectre/Request/ListCustomersRequest.php @@ -687,7 +686,6 @@ opt/app/app/Support/Preferences.php opt/app/app/Support/Search/Modifier.php opt/app/app/Support/Search/Search.php opt/app/app/Support/Search/SearchInterface.php -opt/app/app/Support/SingleCacheProperties.php opt/app/app/Support/Steam.php opt/app/app/Support/Twig/AmountFormat.php opt/app/app/Support/Twig/Extension/Transaction.php @@ -762,6 +760,7 @@ opt/app/artisan opt/app/bootstrap/app.php opt/app/bootstrap/cache/packages.php opt/app/bootstrap/cache/services.php +opt/app/changelog.md opt/app/composer.json opt/app/composer.lock opt/app/composer.phar @@ -829,56 +828,121 @@ opt/app/public/css/jquery-ui/jquery-ui.theme.min.css opt/app/public/favicon-16x16.png opt/app/public/favicon-32x32.png opt/app/public/favicon.ico +opt/app/public/fonts/SourceSansPro-Bold-cyrillic-ext.woff opt/app/public/fonts/SourceSansPro-Bold-cyrillic-ext.woff2 +opt/app/public/fonts/SourceSansPro-Bold-cyrillic.woff opt/app/public/fonts/SourceSansPro-Bold-cyrillic.woff2 +opt/app/public/fonts/SourceSansPro-Bold-greek-ext.woff opt/app/public/fonts/SourceSansPro-Bold-greek-ext.woff2 +opt/app/public/fonts/SourceSansPro-Bold-greek.woff opt/app/public/fonts/SourceSansPro-Bold-greek.woff2 +opt/app/public/fonts/SourceSansPro-Bold-latin-ext.woff opt/app/public/fonts/SourceSansPro-Bold-latin-ext.woff2 +opt/app/public/fonts/SourceSansPro-Bold-latin.woff opt/app/public/fonts/SourceSansPro-Bold-latin.woff2 +opt/app/public/fonts/SourceSansPro-Bold-vietnamese.woff opt/app/public/fonts/SourceSansPro-Bold-vietnamese.woff2 +opt/app/public/fonts/SourceSansPro-BoldItalic-cyrillic-ext.woff +opt/app/public/fonts/SourceSansPro-BoldItalic-cyrillic-ext.woff2 +opt/app/public/fonts/SourceSansPro-BoldItalic-cyrillic.woff +opt/app/public/fonts/SourceSansPro-BoldItalic-cyrillic.woff2 +opt/app/public/fonts/SourceSansPro-BoldItalic-greek-ext.woff +opt/app/public/fonts/SourceSansPro-BoldItalic-greek-ext.woff2 +opt/app/public/fonts/SourceSansPro-BoldItalic-greek.woff +opt/app/public/fonts/SourceSansPro-BoldItalic-greek.woff2 +opt/app/public/fonts/SourceSansPro-BoldItalic-latin-ext.woff +opt/app/public/fonts/SourceSansPro-BoldItalic-latin-ext.woff2 +opt/app/public/fonts/SourceSansPro-BoldItalic-latin.woff +opt/app/public/fonts/SourceSansPro-BoldItalic-latin.woff2 +opt/app/public/fonts/SourceSansPro-BoldItalic-vietnamese.woff +opt/app/public/fonts/SourceSansPro-BoldItalic-vietnamese.woff2 +opt/app/public/fonts/SourceSansPro-Italic-cyrillic-ext.woff opt/app/public/fonts/SourceSansPro-Italic-cyrillic-ext.woff2 +opt/app/public/fonts/SourceSansPro-Italic-cyrillic.woff opt/app/public/fonts/SourceSansPro-Italic-cyrillic.woff2 +opt/app/public/fonts/SourceSansPro-Italic-greek-ext.woff opt/app/public/fonts/SourceSansPro-Italic-greek-ext.woff2 +opt/app/public/fonts/SourceSansPro-Italic-greek.woff opt/app/public/fonts/SourceSansPro-Italic-greek.woff2 +opt/app/public/fonts/SourceSansPro-Italic-latin-ext.woff opt/app/public/fonts/SourceSansPro-Italic-latin-ext.woff2 +opt/app/public/fonts/SourceSansPro-Italic-latin.woff opt/app/public/fonts/SourceSansPro-Italic-latin.woff2 +opt/app/public/fonts/SourceSansPro-Italic-vietnamese.woff opt/app/public/fonts/SourceSansPro-Italic-vietnamese.woff2 +opt/app/public/fonts/SourceSansPro-Light-cyrillic-ext.woff opt/app/public/fonts/SourceSansPro-Light-cyrillic-ext.woff2 +opt/app/public/fonts/SourceSansPro-Light-cyrillic.woff opt/app/public/fonts/SourceSansPro-Light-cyrillic.woff2 +opt/app/public/fonts/SourceSansPro-Light-greek-ext.woff opt/app/public/fonts/SourceSansPro-Light-greek-ext.woff2 +opt/app/public/fonts/SourceSansPro-Light-greek.woff opt/app/public/fonts/SourceSansPro-Light-greek.woff2 +opt/app/public/fonts/SourceSansPro-Light-latin-ext.woff opt/app/public/fonts/SourceSansPro-Light-latin-ext.woff2 +opt/app/public/fonts/SourceSansPro-Light-latin.woff opt/app/public/fonts/SourceSansPro-Light-latin.woff2 +opt/app/public/fonts/SourceSansPro-Light-vietnamese.woff opt/app/public/fonts/SourceSansPro-Light-vietnamese.woff2 +opt/app/public/fonts/SourceSansPro-LightItalic-cyrillic-ext.woff opt/app/public/fonts/SourceSansPro-LightItalic-cyrillic-ext.woff2 +opt/app/public/fonts/SourceSansPro-LightItalic-cyrillic.woff opt/app/public/fonts/SourceSansPro-LightItalic-cyrillic.woff2 +opt/app/public/fonts/SourceSansPro-LightItalic-greek-ext.woff opt/app/public/fonts/SourceSansPro-LightItalic-greek-ext.woff2 +opt/app/public/fonts/SourceSansPro-LightItalic-greek.woff opt/app/public/fonts/SourceSansPro-LightItalic-greek.woff2 +opt/app/public/fonts/SourceSansPro-LightItalic-latin-ext.woff opt/app/public/fonts/SourceSansPro-LightItalic-latin-ext.woff2 +opt/app/public/fonts/SourceSansPro-LightItalic-latin.woff opt/app/public/fonts/SourceSansPro-LightItalic-latin.woff2 +opt/app/public/fonts/SourceSansPro-LightItalic-vietnamese.woff opt/app/public/fonts/SourceSansPro-LightItalic-vietnamese.woff2 +opt/app/public/fonts/SourceSansPro-Regular-cyrillic-ext.woff opt/app/public/fonts/SourceSansPro-Regular-cyrillic-ext.woff2 +opt/app/public/fonts/SourceSansPro-Regular-cyrillic.woff opt/app/public/fonts/SourceSansPro-Regular-cyrillic.woff2 +opt/app/public/fonts/SourceSansPro-Regular-greek-ext.woff opt/app/public/fonts/SourceSansPro-Regular-greek-ext.woff2 +opt/app/public/fonts/SourceSansPro-Regular-greek.woff opt/app/public/fonts/SourceSansPro-Regular-greek.woff2 +opt/app/public/fonts/SourceSansPro-Regular-latin-ext.woff opt/app/public/fonts/SourceSansPro-Regular-latin-ext.woff2 +opt/app/public/fonts/SourceSansPro-Regular-latin.woff opt/app/public/fonts/SourceSansPro-Regular-latin.woff2 +opt/app/public/fonts/SourceSansPro-Regular-vietnamese.woff opt/app/public/fonts/SourceSansPro-Regular-vietnamese.woff2 +opt/app/public/fonts/SourceSansPro-SemiBold-cyrillic-ext.woff opt/app/public/fonts/SourceSansPro-SemiBold-cyrillic-ext.woff2 +opt/app/public/fonts/SourceSansPro-SemiBold-cyrillic.woff opt/app/public/fonts/SourceSansPro-SemiBold-cyrillic.woff2 +opt/app/public/fonts/SourceSansPro-SemiBold-greek-ext.woff opt/app/public/fonts/SourceSansPro-SemiBold-greek-ext.woff2 +opt/app/public/fonts/SourceSansPro-SemiBold-greek.woff opt/app/public/fonts/SourceSansPro-SemiBold-greek.woff2 +opt/app/public/fonts/SourceSansPro-SemiBold-latin-ext.woff opt/app/public/fonts/SourceSansPro-SemiBold-latin-ext.woff2 +opt/app/public/fonts/SourceSansPro-SemiBold-latin.woff opt/app/public/fonts/SourceSansPro-SemiBold-latin.woff2 +opt/app/public/fonts/SourceSansPro-SemiBold-vietnamese.woff opt/app/public/fonts/SourceSansPro-SemiBold-vietnamese.woff2 +opt/app/public/fonts/SourceSansPro-SemiBoldItalic-cyrillic-ext.woff opt/app/public/fonts/SourceSansPro-SemiBoldItalic-cyrillic-ext.woff2 +opt/app/public/fonts/SourceSansPro-SemiBoldItalic-cyrillic.woff opt/app/public/fonts/SourceSansPro-SemiBoldItalic-cyrillic.woff2 +opt/app/public/fonts/SourceSansPro-SemiBoldItalic-greek-ext.woff opt/app/public/fonts/SourceSansPro-SemiBoldItalic-greek-ext.woff2 +opt/app/public/fonts/SourceSansPro-SemiBoldItalic-greek.woff opt/app/public/fonts/SourceSansPro-SemiBoldItalic-greek.woff2 +opt/app/public/fonts/SourceSansPro-SemiBoldItalic-latin-ext.woff opt/app/public/fonts/SourceSansPro-SemiBoldItalic-latin-ext.woff2 +opt/app/public/fonts/SourceSansPro-SemiBoldItalic-latin.woff opt/app/public/fonts/SourceSansPro-SemiBoldItalic-latin.woff2 +opt/app/public/fonts/SourceSansPro-SemiBoldItalic-vietnamese.woff opt/app/public/fonts/SourceSansPro-SemiBoldItalic-vietnamese.woff2 +opt/app/public/fonts/lato-100.woff opt/app/public/fonts/lato-100.woff2 +opt/app/public/fonts/roboto-light-300.woff opt/app/public/fonts/roboto-light-300.woff2 opt/app/public/images/error.png opt/app/public/images/image.png @@ -1004,6 +1068,7 @@ opt/app/public/report.html opt/app/public/robots.txt opt/app/public/safari-pinned-tab.svg opt/app/public/web.config +opt/app/readme.md opt/app/resources/lang/de_DE/auth.php opt/app/resources/lang/de_DE/bank.php opt/app/resources/lang/de_DE/breadcrumbs.php @@ -1092,6 +1157,34 @@ opt/app/resources/lang/pl_PL/list.php opt/app/resources/lang/pl_PL/pagination.php opt/app/resources/lang/pl_PL/passwords.php opt/app/resources/lang/pl_PL/validation.php +opt/app/resources/lang/pt_BR/auth.php +opt/app/resources/lang/pt_BR/bank.php +opt/app/resources/lang/pt_BR/breadcrumbs.php +opt/app/resources/lang/pt_BR/config.php +opt/app/resources/lang/pt_BR/csv.php +opt/app/resources/lang/pt_BR/demo.php +opt/app/resources/lang/pt_BR/firefly.php +opt/app/resources/lang/pt_BR/form.php +opt/app/resources/lang/pt_BR/import.php +opt/app/resources/lang/pt_BR/intro.php +opt/app/resources/lang/pt_BR/list.php +opt/app/resources/lang/pt_BR/pagination.php +opt/app/resources/lang/pt_BR/passwords.php +opt/app/resources/lang/pt_BR/validation.php +opt/app/resources/lang/ru_RU/auth.php +opt/app/resources/lang/ru_RU/bank.php +opt/app/resources/lang/ru_RU/breadcrumbs.php +opt/app/resources/lang/ru_RU/config.php +opt/app/resources/lang/ru_RU/csv.php +opt/app/resources/lang/ru_RU/demo.php +opt/app/resources/lang/ru_RU/firefly.php +opt/app/resources/lang/ru_RU/form.php +opt/app/resources/lang/ru_RU/import.php +opt/app/resources/lang/ru_RU/intro.php +opt/app/resources/lang/ru_RU/list.php +opt/app/resources/lang/ru_RU/pagination.php +opt/app/resources/lang/ru_RU/passwords.php +opt/app/resources/lang/ru_RU/validation.php opt/app/resources/lang/tr_TR/auth.php opt/app/resources/lang/tr_TR/bank.php opt/app/resources/lang/tr_TR/breadcrumbs.php @@ -1169,7 +1262,6 @@ opt/app/resources/views/demo/accounts/index.twig opt/app/resources/views/demo/budgets/index.twig opt/app/resources/views/demo/currencies/index.twig opt/app/resources/views/demo/home.twig -opt/app/resources/views/demo/import/configure.twig opt/app/resources/views/demo/import/index.twig opt/app/resources/views/demo/index.twig opt/app/resources/views/demo/no-demo-text.twig @@ -2962,6 +3054,7 @@ opt/app/vendor/league/flysystem/docs/adapter/aws-s3-v2.md opt/app/vendor/league/flysystem/docs/adapter/aws-s3-v3.md opt/app/vendor/league/flysystem/docs/adapter/azure.md opt/app/vendor/league/flysystem/docs/adapter/copy.md +opt/app/vendor/league/flysystem/docs/adapter/digitalocean-spaces.md opt/app/vendor/league/flysystem/docs/adapter/dropbox.md opt/app/vendor/league/flysystem/docs/adapter/ftp.md opt/app/vendor/league/flysystem/docs/adapter/gridfs.md @@ -2981,10 +3074,15 @@ opt/app/vendor/league/flysystem/docs/creating-an-adapter.md opt/app/vendor/league/flysystem/docs/index.md opt/app/vendor/league/flysystem/docs/installation.md opt/app/vendor/league/flysystem/docs/integrations.md +opt/app/vendor/league/flysystem/docs/logo/become_a_patron_button.png +opt/app/vendor/league/flysystem/docs/logo/become_a_patron_button@2x.png +opt/app/vendor/league/flysystem/docs/logo/become_a_patron_button@3x.png +opt/app/vendor/league/flysystem/docs/logo/laravel.svg opt/app/vendor/league/flysystem/docs/mount-manager.md opt/app/vendor/league/flysystem/docs/performance.md opt/app/vendor/league/flysystem/docs/plugins.md opt/app/vendor/league/flysystem/docs/recipes.md +opt/app/vendor/league/flysystem/docs/sponsors.md opt/app/vendor/league/flysystem/docs/upgrade-to-1.0.0.md opt/app/vendor/league/flysystem/src/Adapter/AbstractAdapter.php opt/app/vendor/league/flysystem/src/Adapter/AbstractFtpAdapter.php @@ -3032,6 +3130,7 @@ opt/app/vendor/league/flysystem/src/Util.php opt/app/vendor/league/flysystem/src/Util/ContentListingFormatter.php opt/app/vendor/league/flysystem/src/Util/MimeType.php opt/app/vendor/league/flysystem/src/Util/StreamHasher.php +opt/app/vendor/league/flysystem/wait_for_ftp_service.php opt/app/vendor/monolog/monolog/.php_cs opt/app/vendor/monolog/monolog/CHANGELOG.md opt/app/vendor/monolog/monolog/LICENSE @@ -3413,6 +3512,9 @@ opt/app/vendor/ramsey/uuid/CONTRIBUTING.md opt/app/vendor/ramsey/uuid/LICENSE opt/app/vendor/ramsey/uuid/README.md opt/app/vendor/ramsey/uuid/composer.json +opt/app/vendor/ramsey/uuid/docs/Makefile +opt/app/vendor/ramsey/uuid/docs/conf.py +opt/app/vendor/ramsey/uuid/docs/index.rst opt/app/vendor/ramsey/uuid/src/BinaryUtils.php opt/app/vendor/ramsey/uuid/src/Builder/DefaultUuidBuilder.php opt/app/vendor/ramsey/uuid/src/Builder/DegradedUuidBuilder.php @@ -4369,6 +4471,7 @@ opt/app/vendor/symfony/debug/Tests/Fixtures2/RequiredTwice.php opt/app/vendor/symfony/debug/Tests/HeaderMock.php opt/app/vendor/symfony/debug/Tests/MockExceptionHandler.php opt/app/vendor/symfony/debug/Tests/phpt/debug_class_loader.phpt +opt/app/vendor/symfony/debug/Tests/phpt/decorate_exception_hander.phpt opt/app/vendor/symfony/debug/Tests/phpt/exception_rethrown.phpt opt/app/vendor/symfony/debug/Tests/phpt/fatal_with_nested_handlers.phpt opt/app/vendor/symfony/debug/composer.json @@ -4786,6 +4889,7 @@ opt/app/vendor/symfony/http-kernel/Tests/EventListener/ProfilerListenerTest.php opt/app/vendor/symfony/http-kernel/Tests/EventListener/ResponseListenerTest.php opt/app/vendor/symfony/http-kernel/Tests/EventListener/RouterListenerTest.php opt/app/vendor/symfony/http-kernel/Tests/EventListener/SaveSessionListenerTest.php +opt/app/vendor/symfony/http-kernel/Tests/EventListener/SessionListenerTest.php opt/app/vendor/symfony/http-kernel/Tests/EventListener/SurrogateListenerTest.php opt/app/vendor/symfony/http-kernel/Tests/EventListener/TestSessionListenerTest.php opt/app/vendor/symfony/http-kernel/Tests/EventListener/TranslatorListenerTest.php @@ -4997,6 +5101,7 @@ opt/app/vendor/symfony/routing/Tests/Fixtures/AnnotatedClasses/FooTrait.php opt/app/vendor/symfony/routing/Tests/Fixtures/CustomCompiledRoute.php opt/app/vendor/symfony/routing/Tests/Fixtures/CustomRouteCompiler.php opt/app/vendor/symfony/routing/Tests/Fixtures/CustomXmlFileLoader.php +opt/app/vendor/symfony/routing/Tests/Fixtures/OtherAnnotatedClasses/AnonymousClassInTrait.php opt/app/vendor/symfony/routing/Tests/Fixtures/OtherAnnotatedClasses/NoStartTagClass.php opt/app/vendor/symfony/routing/Tests/Fixtures/OtherAnnotatedClasses/VariadicClass.php opt/app/vendor/symfony/routing/Tests/Fixtures/RedirectableUrlMatcher.php diff --git a/.sandstorm/sandstorm-pkgdef.capnp b/.sandstorm/sandstorm-pkgdef.capnp index 2def36f84d..10848c2abd 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 = 7, - appMarketingVersion = (defaultText = "4.6.13"), + appVersion = 8, + appMarketingVersion = (defaultText = "4.7.0"), actions = [ # Define your "new document" handlers here. diff --git a/.sandstorm/service-config/nginx.conf b/.sandstorm/service-config/nginx.conf index a05561a463..2d91cb5721 100644 --- a/.sandstorm/service-config/nginx.conf +++ b/.sandstorm/service-config/nginx.conf @@ -57,6 +57,7 @@ http { fastcgi_index index.php; fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; + fastcgi_read_timeout 900; fastcgi_param QUERY_STRING $query_string; diff --git a/.sandstorm/setup.sh b/.sandstorm/setup.sh index 4e71d71bd1..35aca44868 100755 --- a/.sandstorm/setup.sh +++ b/.sandstorm/setup.sh @@ -2,6 +2,7 @@ # When you change this file, you must take manual action. Read this doc: # - https://docs.sandstorm.io/en/latest/vagrant-spk/customizing/#setupsh +echo "Now in setup.sh" set -euo pipefail @@ -14,8 +15,11 @@ apt-get install -y python-software-properties software-properties-common # install all languages sed -i 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/g' /etc/locale.gen sed -i 's/# fr_FR.UTF-8 UTF-8/fr_FR.UTF-8 UTF-8/g' /etc/locale.gen +sed -i 's/# id_ID.UTF-8 UTF-8/id_ID.UTF-8 UTF-8/g' /etc/locale.gen sed -i 's/# nl_NL.UTF-8 UTF-8/nl_NL.UTF-8 UTF-8/g' /etc/locale.gen sed -i 's/# pl_PL.UTF-8 UTF-8/pl_PL.UTF-8 UTF-8/g' /etc/locale.gen +sed -i 's/# ru_RU.UTF-8 UTF-8/ru_RU.UTF-8 UTF-8/g' /etc/locale.gen +sed -i 's/# tr_TR.UTF-8 UTF-8/tr_TR.UTF-8 UTF-8/g' /etc/locale.gen dpkg-reconfigure --frontend=noninteractive locales diff --git a/.scrutinizer.yml b/.scrutinizer.yml index ac754cc957..526295eea6 100644 --- a/.scrutinizer.yml +++ b/.scrutinizer.yml @@ -1,51 +1,58 @@ -# .scrutinizer.yml -tools: - external_code_coverage: false -filter: - paths: +--- +build: + nodes: + analysis: + project_setup: + override: true + tests: + override: + - php-scrutinizer-run +checks: + javascript: true + php: + align_assignments: true + avoid_fixme_comments: true + avoid_multiple_statements_on_same_line: true + avoid_perl_style_comments: true + avoid_todo_comments: true + duplication: false + encourage_single_quotes: true + newline_at_end_of_file: true + no_goto: true + no_long_variable_names: + maximum: "20" + no_short_method_names: + minimum: "3" + no_short_variable_names: + minimum: "3" + optional_parameters_at_the_end: true + parameter_doc_comments: true + remove_extra_empty_lines: true + return_doc_comment_if_not_inferrable: true + return_doc_comments: true + uppercase_constants: true + use_self_instead_of_fqcn: true +coding_style: + php: + spaces: + around_operators: + concatenation: true + other: + after_type_cast: false +filter: + excluded_paths: + - database/migrations/* + - bootstrap/* + - config/* + - docker/* + - public/js/lib/* + - public/lib/adminlte/js/* + - public/lib/bootstrap/js/* + - resources/* + - routes/* + - storage/* + paths: - app/* - public/js/ff/* - excluded_paths: - - "database/migrations/*" - - "bootstrap/*" - - "config/*" - - "docker/*" - - "public/js/lib/*" - - "public/lib/adminlte/js/*" - - "public/lib/bootstrap/js/*" - - "resources/*" - - "routes/*" - - "storage/*" -checks: - php: - use_self_instead_of_fqcn: true - uppercase_constants: true - return_doc_comments: true - return_doc_comment_if_not_inferrable: true - remove_extra_empty_lines: true - parameter_doc_comments: true - optional_parameters_at_the_end: true - no_short_variable_names: - minimum: '3' - no_short_method_names: - minimum: '3' - no_long_variable_names: - maximum: '20' - no_goto: true - newline_at_end_of_file: true - encourage_single_quotes: true - avoid_todo_comments: true - avoid_perl_style_comments: true - avoid_fixme_comments: true - avoid_multiple_statements_on_same_line: true - align_assignments: true - duplication: false - javascript: true - -coding_style: - php: - spaces: - around_operators: - concatenation: true - other: - after_type_cast: false \ No newline at end of file +tools: + external_code_coverage: false diff --git a/.travis.yml b/.travis.yml index 3c97ce087a..d2a3ff064d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,6 +24,7 @@ script: 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: diff --git a/README.md b/README.md deleted file mode 100644 index 54a593d0f0..0000000000 --- a/README.md +++ /dev/null @@ -1,89 +0,0 @@ -# Firefly III: A personal finances manager - -[![Requires PHP7.1](https://img.shields.io/badge/php-7.1-red.svg)](https://secure.php.net/downloads.php) [![Latest Stable Version](https://poser.pugx.org/grumpydictator/firefly-iii/v/stable)](https://packagist.org/packages/grumpydictator/firefly-iii) [![License](https://img.shields.io/badge/license-GPL-lightgrey.svg)](https://www.gnu.org/licenses/gpl.html) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=44UKUT455HUFA) - -[![The index of Firefly III](https://firefly-iii.org/static/screenshots/4.6.12/tiny/index.png)](https://firefly-iii.org/static/screenshots/4.6.12/index.png) [![The account overview of Firefly III](https://firefly-iii.org/static/screenshots/4.6.12/tiny/account.png)](https://firefly-iii.org/static/screenshots/4.6.12/account.png) - -[![Overview of all budgets](https://firefly-iii.org/static/screenshots/4.6.12/tiny/budget.png)](https://firefly-iii.org/static/screenshots/4.6.12/budget.png) [![Overview of a category](https://firefly-iii.org/static/screenshots/4.6.12/tiny/category.png)](https://firefly-iii.org/static/screenshots/4.6.12/category.png) - -[![View of a report](https://firefly-iii.org/static/screenshots/4.6.12/tiny/report1.png)](https://firefly-iii.org/static/screenshots/4.6.12/report1.png) [![View of another report](https://firefly-iii.org/static/screenshots/4.6.12/tiny/report2.png)](https://firefly-iii.org/static/screenshots/4.6.12/report2.png) - -"Firefly III" is a financial manager for your personal finances. It can help you keep track of your expenses and income. -Firefly III supports the use of budgets. You can categorize and tag your transactions. -It also supports credit cards, shared household accounts and savings accounts. -There are many financial reports available. - -## Want to try Firefly III? - -There is a **[demo site](https://demo.firefly-iii.org)** with an example financial administration already present. You can use Docker, Heroku or Sandstorm.io (see below) to quickly setup your own instance. - -## Install Firefly III - -### Using docker - -You can use docker-compose to [set up your personal secure](https://firefly-iii.org/using-docker.html) Firefly III environment. Advanced users can use the Dockerfile directly. - -### Using vagrant (or other VMs) - -You can install Firefly III on any Linux or Windows machine. You'll need a web server (preferrably on Linux) and access to the command line. Please read the [installation guide](https://firefly-iii.org/using-installing.html). - -### Using Heroku - -[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/firefly-iii/firefly-iii/tree/master) - -Register for a free Heroku account and instantly run Firefly III on your very own cloud instance. - -### Using Sandstorm.io - -You can find Firefly III in [the Sandstorm.io marketplace](https://apps.sandstorm.io/app/uws252ya9mep4t77tevn85333xzsgrpgth8q4y1rhknn1hammw70). You can run it on your own installation or on Oasis. - -### Other options - -Firefly III is also available as a package on [https://softaculous.com/](Softaculous) and [AMPPS](https://www.ampps.com/). - -## More about Firefly III - -Personal financial management is pretty difficult, and everybody has their own approach to it. -Some people make budgets, other people limit their cashflow by throwing away their credit cards, -others try to increase their current cashflow. There are tons of ways to save and earn money. - -Firefly works on the principle that if you know where you're money is going, you can stop it from going there. - -### Some advantages of using Firefly - -- Firefly can import any CSV file, so migrating from other systems is easy. -- Firefly runs on your own server, so you are fully in control of your data. Remember, there is no such thing as "the cloud", it’s just somebody else’s computer! -- Firefly has lots of features without being fancy or bloated. -- If you feel you're missing something you can just ask me and I'll add it! - -Firefly III has become pretty awesome over the years! (but please excuse me for bragging, it's just that I'm proud of it). -[You can read more about Firefly III, and its features, on the website](https://firefly-iii.org/). - -### Contributing - -Please read [CONTRIBUTING.md](https://github.com/firefly-iii/firefly-iii/blob/master/.github/CONTRIBUTING.md) for details on contributing, and the process for submitting pull requests. Please check out the [code of conduct](https://github.com/firefly-iii/firefly-iii/blob/master/CODE_OF_CONDUCT.md) as well. - -### Versioning - -We use [SemVer](http://semver.org/) for versioning. For the versions available, see [the tags](https://github.com/firefly-iii/firefly-iii/tags) on this repository. - -### Authors - -* James Cole -* Over time, [many people have contributed to Firefly III](https://github.com/firefly-iii/firefly-iii/graphs/contributors). - -### License - -This work [is licensed](https://github.com/firefly-iii/firefly-iii/blob/master/LICENSE) under the [GPL v3](https://www.gnu.org/licenses/gpl.html). - -### Other stuff - -If you like Firefly III and if it helps you save lots of money, why not send me [a dime for every dollar saved](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=44UKUT455HUFA) (this is a joke, although the Paypal form works just fine, try it!) - -If you want to contact me, please open an issue or [email me](mailto:thegrumpydictator@gmail.com). - -### Alternatives - -If you are looking for alternatives, check out [Kickball's Awesome-Selfhosted list](https://github.com/Kickball/awesome-selfhosted) which features not only Firefly III but also noteworthy alternatives such as [Silverstrike](https://github.com/agstrike/silverstrike). - -[![Build Status](https://travis-ci.org/firefly-iii/firefly-iii.svg?branch=master)](https://travis-ci.org/firefly-iii/firefly-iii) [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/firefly-iii/firefly-iii/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/firefly-iii/firefly-iii/?branch=master) [![Coverage Status](https://coveralls.io/repos/github/firefly-iii/firefly-iii/badge.svg?branch=master)](https://coveralls.io/github/firefly-iii/firefly-iii?branch=master) diff --git a/app/Console/Commands/CreateImport.php b/app/Console/Commands/CreateImport.php index bfb52735e2..07fe3d734d 100644 --- a/app/Console/Commands/CreateImport.php +++ b/app/Console/Commands/CreateImport.php @@ -178,7 +178,7 @@ class CreateImport extends Command $cwd = getcwd(); $validTypes = config('import.options.file.import_formats'); $type = strtolower($this->option('type')); - if (null === $user->id) { + if (null === $user) { $this->error(sprintf('There is no user with ID %d.', $this->option('user'))); return false; diff --git a/app/Console/Commands/UpgradeDatabase.php b/app/Console/Commands/UpgradeDatabase.php index ee66cebb58..d0c7b10028 100644 --- a/app/Console/Commands/UpgradeDatabase.php +++ b/app/Console/Commands/UpgradeDatabase.php @@ -220,7 +220,7 @@ class UpgradeDatabase extends Command // when mismatch in transaction: if (!(intval($transaction->transaction_currency_id) === intval($currency->id))) { - $transaction->foreign_currency_id = $transaction->transaction_currency_id; + $transaction->foreign_currency_id = intval($transaction->transaction_currency_id); $transaction->foreign_amount = $transaction->amount; $transaction->transaction_currency_id = $currency->id; $transaction->save(); @@ -412,12 +412,10 @@ class UpgradeDatabase extends Command if (!(intval($transaction->transaction_currency_id) === intval($currency->id)) && null === $transaction->foreign_amount) { Log::debug( sprintf( - 'Transaction #%d has a currency setting (#%d) (%s) that should be #%d (%s). Amount remains %s, currency is changed.', + 'Transaction #%d has a currency setting #%d that should be #%d. Amount remains %s, currency is changed.', $transaction->id, $transaction->transaction_currency_id, - $this->var_dump_ret(intval($transaction->transaction_currency_id)), $currency->id, - $this->var_dump_ret(intval($currency->id)), $transaction->amount ) ); @@ -504,19 +502,4 @@ class UpgradeDatabase extends Command return; } - /** - * @param null $mixed - * - * @return string - */ - private function var_dump_ret($mixed = null): string - { - ob_start(); - var_dump($mixed); - $content = ob_get_contents(); - ob_end_clean(); - - return trim($content); - } - } diff --git a/app/Console/Commands/VerifiesAccessToken.php b/app/Console/Commands/VerifiesAccessToken.php index 864c6f784c..f2bd65a49c 100644 --- a/app/Console/Commands/VerifiesAccessToken.php +++ b/app/Console/Commands/VerifiesAccessToken.php @@ -36,7 +36,7 @@ trait VerifiesAccessToken /** * Abstract method to make sure trait knows about method "option". * - * @param null $key + * @param string|null $key * * @return mixed */ @@ -55,7 +55,7 @@ trait VerifiesAccessToken $repository = app(UserRepositoryInterface::class); $user = $repository->find($userId); - if (null === $user->id) { + if (null === $user) { Log::error(sprintf('verifyAccessToken(): no such user for input "%d"', $userId)); return false; diff --git a/app/Export/Collector/AttachmentCollector.php b/app/Export/Collector/AttachmentCollector.php index 785adfbd51..c4c52cbf29 100644 --- a/app/Export/Collector/AttachmentCollector.php +++ b/app/Export/Collector/AttachmentCollector.php @@ -52,7 +52,7 @@ class AttachmentCollector extends BasicCollector implements CollectorInterface */ public function __construct() { - // @var AttachmentRepositoryInterface repository + /** @var AttachmentRepositoryInterface repository */ $this->repository = app(AttachmentRepositoryInterface::class); // make storage: $this->uploadDisk = Storage::disk('upload'); diff --git a/app/Generator/Report/Audit/MonthReportGenerator.php b/app/Generator/Report/Audit/MonthReportGenerator.php index d46c872d58..9bdf1b28be 100644 --- a/app/Generator/Report/Audit/MonthReportGenerator.php +++ b/app/Generator/Report/Audit/MonthReportGenerator.php @@ -26,6 +26,7 @@ use Carbon\Carbon; use FireflyIII\Generator\Report\ReportGeneratorInterface; use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Models\Account; +use FireflyIII\Models\Transaction; use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use Illuminate\Support\Collection; use Steam; @@ -173,7 +174,7 @@ class MonthReportGenerator implements ReportGeneratorInterface $startBalance = $dayBeforeBalance; $currency = $currencyRepos->find(intval($account->getMeta('currency_id'))); - // @var Transaction $journal + /** @var Transaction $transaction */ foreach ($journals as $transaction) { $transaction->before = $startBalance; $transactionAmount = $transaction->transaction_amount; diff --git a/app/Generator/Report/Budget/MonthReportGenerator.php b/app/Generator/Report/Budget/MonthReportGenerator.php index 1ac4532632..adf6639de0 100644 --- a/app/Generator/Report/Budget/MonthReportGenerator.php +++ b/app/Generator/Report/Budget/MonthReportGenerator.php @@ -194,7 +194,9 @@ class MonthReportGenerator extends Support implements ReportGeneratorInterface */ private function summarizeByBudget(Collection $collection): array { - $result = []; + $result = [ + 'sum' => '0', + ]; /** @var Transaction $transaction */ foreach ($collection as $transaction) { $jrnlBudId = intval($transaction->transaction_journal_budget_id); @@ -202,6 +204,7 @@ class MonthReportGenerator extends Support implements ReportGeneratorInterface $budgetId = max($jrnlBudId, $transBudId); $result[$budgetId] = $result[$budgetId] ?? '0'; $result[$budgetId] = bcadd($transaction->transaction_amount, $result[$budgetId]); + $result['sum'] = bcadd($result['sum'], $transaction->transaction_amount); } return $result; diff --git a/app/Generator/Report/Support.php b/app/Generator/Report/Support.php index 328d0addd8..aca9c005ba 100644 --- a/app/Generator/Report/Support.php +++ b/app/Generator/Report/Support.php @@ -102,7 +102,12 @@ class Support */ protected function getObjectSummary(array $spent, array $earned): array { - $return = []; + $return = [ + 'sum' => [ + 'spent' => '0', + 'earned' => '0', + ], + ]; /** * @var int @@ -110,10 +115,11 @@ class Support */ foreach ($spent as $objectId => $entry) { if (!isset($return[$objectId])) { - $return[$objectId] = ['spent' => 0, 'earned' => 0]; + $return[$objectId] = ['spent' => '0', 'earned' => '0']; } $return[$objectId]['spent'] = $entry; + $return['sum']['spent'] = bcadd($return['sum']['spent'], $entry); } unset($entry); @@ -123,10 +129,11 @@ class Support */ foreach ($earned as $objectId => $entry) { if (!isset($return[$objectId])) { - $return[$objectId] = ['spent' => 0, 'earned' => 0]; + $return[$objectId] = ['spent' => '0', 'earned' => '0']; } $return[$objectId]['earned'] = $entry; + $return['sum']['earned'] = bcadd($return['sum']['earned'], $entry); } return $return; @@ -139,12 +146,15 @@ class Support */ protected function summarizeByAccount(Collection $collection): array { - $result = []; + $result = [ + 'sum' => '0', + ]; /** @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/UserEventHandler.php b/app/Handlers/Events/UserEventHandler.php index 23f09fbfeb..e89d04aa57 100644 --- a/app/Handlers/Events/UserEventHandler.php +++ b/app/Handlers/Events/UserEventHandler.php @@ -25,11 +25,11 @@ namespace FireflyIII\Handlers\Events; use FireflyIII\Events\RegisteredUser; use FireflyIII\Events\RequestedNewPassword; use FireflyIII\Events\UserChangedEmail; +use FireflyIII\Factories\RoleFactory; use FireflyIII\Mail\ConfirmEmailChangeMail; use FireflyIII\Mail\RegisteredUser as RegisteredUserMail; use FireflyIII\Mail\RequestedNewPassword as RequestedNewPasswordMail; use FireflyIII\Mail\UndoEmailChangeMail; -use FireflyIII\Models\Role; use FireflyIII\Repositories\User\UserRepositoryInterface; use FireflyIII\User; use Illuminate\Auth\Events\Login; @@ -74,11 +74,12 @@ class UserEventHandler */ public function checkSingleUserIsAdmin(Login $event): bool { - Log::debug('In checkSingleUserIsAdmin'); + /** @var UserRepositoryInterface $repository */ + $repository = app(UserRepositoryInterface::class); /** @var User $user */ $user = $event->user; - $count = User::count(); + $count = $repository->count(); if ($count > 1) { // if more than one user, do nothing. @@ -93,17 +94,16 @@ class UserEventHandler return true; } // user is the only user but does not have role "owner". - $role = Role::where('name', 'owner')->first(); + $role = $repository->getRole('owner'); if (is_null($role)) { // create role, does not exist. Very strange situation so let's raise a big fuss about it. - $role = Role::create(['name' => 'owner', 'display_name' => 'Site Owner', 'description' => 'User runs this instance of FF3']); + $role = $repository->createRole('owner', 'Site Owner', 'User runs this instance of FF3'); Log::error('Could not find role "owner". This is weird.'); } Log::info(sprintf('Gave user #%d role #%d ("%s")', $user->id, $role->id, $role->name)); // give user the role - $user->attachRole($role); - $user->save(); + $repository->attachRole($user, 'owner'); return true; } diff --git a/app/Handlers/Events/VersionCheckEventHandler.php b/app/Handlers/Events/VersionCheckEventHandler.php index 6753f1d9a6..8f2e188393 100644 --- a/app/Handlers/Events/VersionCheckEventHandler.php +++ b/app/Handlers/Events/VersionCheckEventHandler.php @@ -25,6 +25,9 @@ namespace FireflyIII\Handlers\Events; use FireflyConfig; use FireflyIII\Events\RequestedVersionCheckStatus; +use FireflyIII\Exceptions\FireflyException; +use FireflyIII\Services\Github\Object\Release; +use FireflyIII\Services\Github\Request\UpdateRequest; use FireflyIII\User; use Log; @@ -45,6 +48,7 @@ class VersionCheckEventHandler return; } + /** @var User $user */ $user = $event->user; if (!$user->hasRole('owner')) { @@ -55,7 +59,7 @@ class VersionCheckEventHandler $lastCheckTime = FireflyConfig::get('last_update_check', time()); $now = time(); if ($now - $lastCheckTime->data < 604800) { - Log::debug('Checked for updates less than a week ago.'); + Log::debug(sprintf('Checked for updates less than a week ago (on %s).', date('Y-m-d H:i:s', $lastCheckTime->data))); return; @@ -71,8 +75,42 @@ class VersionCheckEventHandler return; } - // actually check for update and inform the user. + $current = config('firefly.version'); + /** @var UpdateRequest $request */ + $request = app(UpdateRequest::class); + $check = -2; + $first = new Release(['id' => '0', 'title' => '0', 'updated' => '2017-01-01', 'content' => '']); + try { + $request->call(); + $releases = $request->getReleases(); + // first entry should be the latest entry: + /** @var Release $first */ + $first = reset($releases); + $check = version_compare($current, $first->getTitle()); + FireflyConfig::set('last_update_check', time()); + } catch (FireflyException $e) { + Log::error(sprintf('Could not check for updates: %s', $e->getMessage())); + } + $string = 'no result: ' . $check; + if ($check === -2) { + $string = strval(trans('firefly.update_check_error')); + } + 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)] + ) + ); + } + if ($check !== 0) { + // flash info + session()->flash('info', $string); + } + return; } } \ No newline at end of file diff --git a/app/Helpers/Collector/JournalCollector.php b/app/Helpers/Collector/JournalCollector.php index 7c67975c24..3e04a2217d 100644 --- a/app/Helpers/Collector/JournalCollector.php +++ b/app/Helpers/Collector/JournalCollector.php @@ -37,6 +37,7 @@ use FireflyIII\Models\Category; use FireflyIII\Models\Tag; use FireflyIII\Models\Transaction; use FireflyIII\Repositories\Account\AccountRepositoryInterface; +use FireflyIII\Support\CacheProperties; use FireflyIII\User; use Illuminate\Database\Eloquent\Builder as EloquentBuilder; use Illuminate\Database\Query\JoinClause; @@ -232,7 +233,7 @@ class JournalCollector implements JournalCollectorInterface $countQuery->getQuery()->groups = null; $countQuery->getQuery()->orders = null; $countQuery->groupBy('accounts.user_id'); - $this->count = $countQuery->count(); + $this->count = intval($countQuery->count()); return $this->count; } @@ -243,6 +244,17 @@ class JournalCollector implements JournalCollectorInterface public function getJournals(): Collection { $this->run = true; + + // find query set in cache. + $hash = hash('sha256', $this->query->toSql() . serialize($this->query->getBindings())); + $key = 'query-' . substr($hash, -8); + $cache = new CacheProperties; + $cache->addProperty($key); + if ($cache->has()) { + Log::debug(sprintf('Return cache of query with ID "%s".', $key)); + return $cache->get(); // @codeCoverageIgnore + } + /** @var Collection $set */ $set = $this->query->get(array_values($this->fields)); @@ -263,6 +275,8 @@ class JournalCollector implements JournalCollectorInterface $transaction->opposing_account_iban = app('steam')->tryDecrypt($transaction->opposing_account_iban); } ); + Log::debug(sprintf('Cached query with ID "%s".', $key)); + $cache->store($set); return $set; } diff --git a/app/Helpers/Collector/JournalCollectorInterface.php b/app/Helpers/Collector/JournalCollectorInterface.php index ce0def29a7..30243ac6db 100644 --- a/app/Helpers/Collector/JournalCollectorInterface.php +++ b/app/Helpers/Collector/JournalCollectorInterface.php @@ -27,6 +27,7 @@ use FireflyIII\Models\Budget; use FireflyIII\Models\Category; use FireflyIII\Models\Tag; use FireflyIII\User; +use Illuminate\Database\Eloquent\Builder as EloquentBuilder; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Collection; diff --git a/app/Helpers/Report/PopupReport.php b/app/Helpers/Report/PopupReport.php index c03f1482d1..40f9be6dc7 100644 --- a/app/Helpers/Report/PopupReport.php +++ b/app/Helpers/Report/PopupReport.php @@ -136,7 +136,7 @@ class PopupReport implements PopupReportInterface /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); $collector->setAccounts($attributes['accounts'])->setTypes([TransactionType::WITHDRAWAL, TransactionType::TRANSFER]) - ->setRange($attributes['startDate'], $attributes['endDate']) + ->setRange($attributes['startDate'], $attributes['endDate'])->withOpposingAccount() ->setCategory($category); $journals = $collector->getJournals(); diff --git a/app/Http/Controllers/AccountController.php b/app/Http/Controllers/AccountController.php index 8005640860..49e40a182e 100644 --- a/app/Http/Controllers/AccountController.php +++ b/app/Http/Controllers/AccountController.php @@ -39,7 +39,6 @@ use FireflyIII\Support\CacheProperties; use Illuminate\Http\Request; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Collection; -use Log; use Preferences; use Steam; use View; @@ -51,6 +50,13 @@ use View; */ class AccountController extends Controller { + /** @var CurrencyRepositoryInterface */ + private $currencyRepos; + /** @var JournalRepositoryInterface */ + private $journalRepos; + /** @var AccountRepositoryInterface */ + private $repository; + /** * */ @@ -64,6 +70,10 @@ class AccountController extends Controller app('view')->share('mainTitleIcon', 'fa-credit-card'); app('view')->share('title', trans('firefly.accounts')); + $this->repository = app(AccountRepositoryInterface::class); + $this->currencyRepos = app(CurrencyRepositoryInterface::class); + $this->journalRepos = app(JournalRepositoryInterface::class); + return $next($request); } ); @@ -77,9 +87,7 @@ class AccountController extends Controller */ public function create(Request $request, string $what = 'asset') { - /** @var CurrencyRepositoryInterface $repository */ - $repository = app(CurrencyRepositoryInterface::class); - $allCurrencies = $repository->get(); + $allCurrencies = $this->currencyRepos->get(); $currencySelectList = ExpandedForm::makeSelectList($allCurrencies); $defaultCurrency = app('amount')->getDefaultCurrency(); $subTitleIcon = config('firefly.subIconsByIdentifier.' . $what); @@ -102,16 +110,15 @@ class AccountController extends Controller } /** - * @param AccountRepositoryInterface $repository - * @param Account $account + * @param Account $account * * @return View */ - public function delete(AccountRepositoryInterface $repository, Account $account) + public function delete(Account $account) { $typeName = config('firefly.shortNamesByFullName.' . $account->accountType->type); $subTitle = trans('firefly.delete_' . $typeName . '_account', ['name' => $account->name]); - $accountList = ExpandedForm::makeSelectListWithEmpty($repository->getAccountsByType([$account->accountType->type])); + $accountList = ExpandedForm::makeSelectListWithEmpty($this->repository->getAccountsByType([$account->accountType->type])); unset($accountList[$account->id]); // put previous url in session @@ -127,14 +134,14 @@ class AccountController extends Controller * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector */ - public function destroy(Request $request, AccountRepositoryInterface $repository, Account $account) + public function destroy(Request $request, Account $account) { $type = $account->accountType->type; $typeName = config('firefly.shortNamesByFullName.' . $type); $name = $account->name; - $moveTo = $repository->find(intval($request->get('move_account_before_delete'))); + $moveTo = $this->repository->find(intval($request->get('move_account_before_delete'))); - $repository->destroy($account, $moveTo); + $this->repository->destroy($account, $moveTo); $request->session()->flash('success', strval(trans('firefly.' . $typeName . '_deleted', ['name' => $name]))); Preferences::mark(); @@ -154,17 +161,13 @@ class AccountController extends Controller * @return View * * @throws FireflyException - * @throws FireflyException - * @throws FireflyException */ - public function edit(Request $request, Account $account, AccountRepositoryInterface $repository) + public function edit(Request $request, Account $account) { - /** @var CurrencyRepositoryInterface $currencyRepos */ - $currencyRepos = app(CurrencyRepositoryInterface::class); $what = config('firefly.shortNamesByFullName')[$account->accountType->type]; $subTitle = trans('firefly.edit_' . $what . '_account', ['name' => $account->name]); $subTitleIcon = config('firefly.subIconsByIdentifier.' . $what); - $allCurrencies = $currencyRepos->get(); + $allCurrencies = $this->currencyRepos->get(); $currencySelectList = ExpandedForm::makeSelectList($allCurrencies); $roles = []; foreach (config('firefly.accountRoles') as $role) { @@ -184,7 +187,7 @@ class AccountController extends Controller $openingBalanceAmount = '0' === $account->getOpeningBalanceAmount() ? '' : $openingBalanceAmount; $openingBalanceDate = $account->getOpeningBalanceDate(); $openingBalanceDate = 1900 === $openingBalanceDate->year ? null : $openingBalanceDate->format('Y-m-d'); - $currency = $currencyRepos->find(intval($account->getMeta('currency_id'))); + $currency = $this->currencyRepos->find(intval($account->getMeta('currency_id'))); $preFilled = [ 'accountNumber' => $account->getMeta('accountNumber'), @@ -199,7 +202,7 @@ class AccountController extends Controller 'notes' => '', ]; /** @var Note $note */ - $note = $repository->getNote($account); + $note = $this->repository->getNote($account); if (null !== $note) { $preFilled['notes'] = $note->text; } @@ -224,19 +227,18 @@ class AccountController extends Controller } /** - * @param Request $request - * @param AccountRepositoryInterface $repository - * @param string $what + * @param Request $request + * @param string $what * * @return View */ - public function index(Request $request, AccountRepositoryInterface $repository, string $what) + public function index(Request $request, string $what) { $what = $what ?? 'asset'; $subTitle = trans('firefly.' . $what . '_accounts'); $subTitleIcon = config('firefly.subIconsByIdentifier.' . $what); $types = config('firefly.accountTypesByIdentifier.' . $what); - $collection = $repository->getAccountsByType($types); + $collection = $this->repository->getAccountsByType($types); $total = $collection->count(); $page = 0 === intval($request->get('page')) ? 1 : intval($request->get('page')); $pageSize = intval(Preferences::get('listPageSize', 50)->data); @@ -272,10 +274,9 @@ class AccountController extends Controller /** * Show an account. * - * @param Request $request - * @param JournalRepositoryInterface $repository - * @param Account $account - * @param string $moment + * @param Request $request + * @param Account $account + * @param string $moment * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|View * @@ -284,23 +285,21 @@ class AccountController extends Controller * * @throws FireflyException */ - public function show(Request $request, JournalRepositoryInterface $repository, Account $account, string $moment = '') + public function show(Request $request, Account $account, string $moment = '') { if (AccountType::INITIAL_BALANCE === $account->accountType->type) { return $this->redirectToOriginalAccount($account); } - /** @var CurrencyRepositoryInterface $currencyRepos */ - $currencyRepos = app(CurrencyRepositoryInterface::class); - $range = Preferences::get('viewRange', '1M')->data; - $subTitleIcon = config('firefly.subIconsByIdentifier.' . $account->accountType->type); - $page = intval($request->get('page')); - $pageSize = intval(Preferences::get('listPageSize', 50)->data); - $chartUri = route('chart.account.single', [$account->id]); - $start = null; - $end = null; - $periods = new Collection; - $currencyId = intval($account->getMeta('currency_id')); - $currency = $currencyRepos->find($currencyId); + $range = Preferences::get('viewRange', '1M')->data; + $subTitleIcon = config('firefly.subIconsByIdentifier.' . $account->accountType->type); + $page = intval($request->get('page')); + $pageSize = intval(Preferences::get('listPageSize', 50)->data); + $chartUri = route('chart.account.single', [$account->id]); + $start = null; + $end = null; + $periods = new Collection; + $currencyId = intval($account->getMeta('currency_id')); + $currency = $this->currencyRepos->find($currencyId); if (0 === $currencyId) { $currency = app('amount')->getDefaultCurrency(); // @codeCoverageIgnore } @@ -309,7 +308,7 @@ class AccountController extends Controller if ('all' === $moment) { $subTitle = trans('firefly.all_journals_for_account', ['name' => $account->name]); $chartUri = route('chart.account.all', [$account->id]); - $first = $repository->first(); + $first = $this->journalRepos->first(); $start = $first->date ?? new Carbon; $end = new Carbon; } @@ -317,12 +316,13 @@ class AccountController extends Controller // prep for "specific date" view. if (strlen($moment) > 0 && 'all' !== $moment) { $start = new Carbon($moment); + $start = app('navigation')->startOfPeriod($start, $range); $end = app('navigation')->endOfPeriod($start, $range); $fStart = $start->formatLocalized($this->monthAndDayFormat); $fEnd = $end->formatLocalized($this->monthAndDayFormat); $subTitle = trans('firefly.journals_in_period_for_account', ['name' => $account->name, 'start' => $fStart, 'end' => $fEnd]); $chartUri = route('chart.account.period', [$account->id, $start->format('Y-m-d')]); - $periods = $this->getPeriodOverview($account); + $periods = $this->getPeriodOverview($account, $start); } // prep for current period view @@ -332,7 +332,7 @@ class AccountController extends Controller $fStart = $start->formatLocalized($this->monthAndDayFormat); $fEnd = $end->formatLocalized($this->monthAndDayFormat); $subTitle = trans('firefly.journals_in_period_for_account', ['name' => $account->name, 'start' => $fStart, 'end' => $fEnd]); - $periods = $this->getPeriodOverview($account); + $periods = $this->getPeriodOverview($account, null); } // grab journals: @@ -351,15 +351,14 @@ class AccountController extends Controller } /** - * @param AccountFormRequest $request - * @param AccountRepositoryInterface $repository + * @param AccountFormRequest $request * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector */ - public function store(AccountFormRequest $request, AccountRepositoryInterface $repository) + public function store(AccountFormRequest $request) { $data = $request->getAccountData(); - $account = $repository->store($data); + $account = $this->repository->store($data); $request->session()->flash('success', strval(trans('firefly.stored_new_account', ['name' => $account->name]))); Preferences::mark(); @@ -390,10 +389,10 @@ class AccountController extends Controller * * @return $this|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector */ - public function update(AccountFormRequest $request, AccountRepositoryInterface $repository, Account $account) + public function update(AccountFormRequest $request, Account $account) { $data = $request->getAccountData(); - $repository->update($account, $data); + $this->repository->update($account, $data); $request->session()->flash('success', strval(trans('firefly.updated_account', ['name' => $account->name]))); Preferences::mark(); @@ -435,56 +434,55 @@ class AccountController extends Controller * * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ - private function getPeriodOverview(Account $account): Collection + private function getPeriodOverview(Account $account, ?Carbon $date): Collection { - /** @var AccountRepositoryInterface $repository */ - $repository = app(AccountRepositoryInterface::class); - $start = $repository->oldestJournalDate($account); - $range = Preferences::get('viewRange', '1M')->data; - $start = app('navigation')->startOfPeriod($start, $range); - $end = app('navigation')->endOfX(new Carbon, $range, null); - $entries = new Collection; - $count = 0; + $range = Preferences::get('viewRange', '1M')->data; + $start = $this->repository->oldestJournalDate($account); + $end = $date ?? new Carbon; + // properties for cache $cache = new CacheProperties; $cache->addProperty($start); $cache->addProperty($end); $cache->addProperty('account-show-period-entries'); $cache->addProperty($account->id); - if ($cache->has()) { return $cache->get(); // @codeCoverageIgnore } - Log::debug('Going to get period expenses and incomes.'); - while ($end >= $start && $count < 90) { - $end = app('navigation')->startOfPeriod($end, $range); - $currentEnd = app('navigation')->endOfPeriod($end, $range); + + $dates = app('navigation')->blockPeriods($start, $end, $range); + $entries = new Collection; + + // loop dates + foreach ($dates as $date) { // try a collector for income: /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); - $collector->setAccounts(new Collection([$account]))->setRange($end, $currentEnd)->setTypes([TransactionType::DEPOSIT])->withOpposingAccount(); + $collector->setAccounts(new Collection([$account]))->setRange($date['start'], $date['end'])->setTypes([TransactionType::DEPOSIT]) + ->withOpposingAccount(); $earned = strval($collector->getJournals()->sum('transaction_amount')); // try a collector for expenses: /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); - $collector->setAccounts(new Collection([$account]))->setRange($end, $currentEnd)->setTypes([TransactionType::WITHDRAWAL])->withOpposingAccount(); - $spent = strval($collector->getJournals()->sum('transaction_amount')); - $dateStr = $end->format('Y-m-d'); - $dateName = app('navigation')->periodShow($end, $range); + $collector->setAccounts(new Collection([$account]))->setRange($date['start'], $date['end'])->setTypes([TransactionType::WITHDRAWAL]) + ->withOpposingAccount(); + $spent = strval($collector->getJournals()->sum('transaction_amount')); + + $dateStr = $date['end']->format('Y-m-d'); + $dateName = app('navigation')->periodShow($date['start'], $date['period']); $entries->push( [ 'string' => $dateStr, 'name' => $dateName, 'spent' => $spent, 'earned' => $earned, - 'date' => clone $end,] + 'date' => clone $date['end'],] ); - $end = app('navigation')->subtractPeriod($end, $range, 1); - ++$count; } + $cache->store($entries); return $entries; diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index 043761a3fd..f4fa02a18b 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -125,7 +125,7 @@ class UserController extends Controller $list = ['twoFactorAuthEnabled', 'twoFactorAuthSecret']; $preferences = Preferences::getArrayForUser($user, $list); $user->isAdmin = $user->hasRole('owner'); - $is2faEnabled = true === $preferences['twoFactorAuthEnabled']; + $is2faEnabled = 1 === $preferences['twoFactorAuthEnabled']; $has2faSecret = null !== $preferences['twoFactorAuthSecret']; $user->has2FA = ($is2faEnabled && $has2faSecret) ? true : false; $user->prefs = $preferences; diff --git a/app/Http/Controllers/AttachmentController.php b/app/Http/Controllers/AttachmentController.php index 8937027dfd..098559ac27 100644 --- a/app/Http/Controllers/AttachmentController.php +++ b/app/Http/Controllers/AttachmentController.php @@ -22,7 +22,6 @@ declare(strict_types=1); namespace FireflyIII\Http\Controllers; -use File; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Http\Requests\AttachmentFormRequest; use FireflyIII\Models\Attachment; @@ -40,6 +39,9 @@ use View; */ class AttachmentController extends Controller { + /** @var AttachmentRepositoryInterface */ + private $repository; + /** * */ @@ -52,6 +54,7 @@ class AttachmentController extends Controller function ($request, $next) { app('view')->share('mainTitleIcon', 'fa-paperclip'); app('view')->share('title', trans('firefly.attachments')); + $this->repository = app(AttachmentRepositoryInterface::class); return $next($request); } @@ -74,17 +77,16 @@ class AttachmentController extends Controller } /** - * @param Request $request - * @param AttachmentRepositoryInterface $repository - * @param Attachment $attachment + * @param Request $request + * @param Attachment $attachment * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector */ - public function destroy(Request $request, AttachmentRepositoryInterface $repository, Attachment $attachment) + public function destroy(Request $request, Attachment $attachment) { $name = $attachment->filename; - $repository->destroy($attachment); + $this->repository->destroy($attachment); $request->session()->flash('success', strval(trans('firefly.attachment_deleted', ['name' => $name]))); Preferences::mark(); @@ -93,17 +95,16 @@ class AttachmentController extends Controller } /** - * @param AttachmentRepositoryInterface $repository - * @param Attachment $attachment + * @param Attachment $attachment * * @return mixed * * @throws FireflyException */ - public function download(AttachmentRepositoryInterface $repository, Attachment $attachment) + public function download(Attachment $attachment) { - if ($repository->exists($attachment)) { - $content = $repository->getContent($attachment); + if ($this->repository->exists($attachment)) { + $content = $this->repository->getContent($attachment); $quoted = sprintf('"%s"', addcslashes(basename($attachment->filename), '"\\')); /** @var LaravelResponse $response */ @@ -145,37 +146,15 @@ class AttachmentController extends Controller } /** - * @param Attachment $attachment - * - * @return \Illuminate\Http\Response - * - * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException - */ - public function preview(Attachment $attachment) - { - $image = 'images/page_green.png'; - - if ('application/pdf' === $attachment->mime) { - $image = 'images/page_white_acrobat.png'; - } - $file = public_path($image); - $response = Response::make(File::get($file)); - $response->header('Content-Type', 'image/png'); - - return $response; - } - - /** - * @param AttachmentFormRequest $request - * @param AttachmentRepositoryInterface $repository - * @param Attachment $attachment + * @param AttachmentFormRequest $request + * @param Attachment $attachment * * @return \Illuminate\Http\RedirectResponse */ - public function update(AttachmentFormRequest $request, AttachmentRepositoryInterface $repository, Attachment $attachment) + public function update(AttachmentFormRequest $request, Attachment $attachment) { $data = $request->getAttachmentData(); - $repository->update($attachment, $data); + $this->repository->update($attachment, $data); $request->session()->flash('success', strval(trans('firefly.attachment_updated', ['name' => $attachment->filename]))); Preferences::mark(); @@ -191,4 +170,25 @@ class AttachmentController extends Controller // redirect to previous URL. return redirect($this->getPreviousUri('attachments.edit.uri')); } + + /** + * @param Attachment $attachment + * + * @return \Illuminate\Http\Response + * @throws FireflyException + */ + public function view(Attachment $attachment) + { + if ($this->repository->exists($attachment)) { + $content = $this->repository->getContent($attachment); + + return Response::make( + $content, 200, [ + 'Content-Type' => $attachment->mime, + 'Content-Disposition' => 'inline; filename="' . $attachment->filename . '"', + ] + ); + } + throw new FireflyException('Could not find the indicated attachment. The file is no longer there.'); + } } diff --git a/app/Http/Controllers/BillController.php b/app/Http/Controllers/BillController.php index 391749489a..4591ebead3 100644 --- a/app/Http/Controllers/BillController.php +++ b/app/Http/Controllers/BillController.php @@ -262,7 +262,7 @@ class BillController extends Controller } $bill->nextExpectedMatch = $repository->nextExpectedMatch($bill, $lastPaidDate); $hideBill = true; - $subTitle = e($bill->name); + $subTitle = $bill->name; return view('bills.show', compact('transactions', 'yearAverage', 'overallAverage', 'year', 'hideBill', 'bill', 'subTitle')); } diff --git a/app/Http/Controllers/BudgetController.php b/app/Http/Controllers/BudgetController.php index cf5a41bc6f..71f11a9630 100644 --- a/app/Http/Controllers/BudgetController.php +++ b/app/Http/Controllers/BudgetController.php @@ -611,21 +611,19 @@ class BudgetController extends Controller if ($cache->has()) { return $cache->get(); // @codeCoverageIgnore } - - Log::debug('Going to get period expenses and incomes.'); - while ($end >= $start) { - $end = app('navigation')->startOfPeriod($end, $range); - $currentEnd = app('navigation')->endOfPeriod($end, $range); + $dates = app('navigation')->blockPeriods($start, $end, $range); + foreach ($dates as $date) { /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); - $collector->setAllAssetAccounts()->setRange($end, $currentEnd)->withoutBudget()->withOpposingAccount()->setTypes([TransactionType::WITHDRAWAL]); + $collector->setAllAssetAccounts()->setRange($date['start'], $date['end'])->withoutBudget()->withOpposingAccount()->setTypes( + [TransactionType::WITHDRAWAL] + ); $set = $collector->getJournals(); $sum = strval($set->sum('transaction_amount') ?? '0'); $journals = $set->count(); - $dateStr = $end->format('Y-m-d'); - $dateName = app('navigation')->periodShow($end, $range); - $entries->push(['string' => $dateStr, 'name' => $dateName, 'count' => $journals, 'sum' => $sum, 'date' => clone $end]); - $end = app('navigation')->subtractPeriod($end, $range, 1); + $dateStr = $date['end']->format('Y-m-d'); + $dateName = app('navigation')->periodShow($date['end'], $date['period']); + $entries->push(['string' => $dateStr, 'name' => $dateName, 'count' => $journals, 'sum' => $sum, 'date' => clone $date['end']]); } $cache->store($entries); diff --git a/app/Http/Controllers/CategoryController.php b/app/Http/Controllers/CategoryController.php index 0e3013f88a..ea797583f2 100644 --- a/app/Http/Controllers/CategoryController.php +++ b/app/Http/Controllers/CategoryController.php @@ -46,6 +46,13 @@ use View; */ class CategoryController extends Controller { + /** @var AccountRepositoryInterface */ + private $accountRepos; + /** @var JournalRepositoryInterface */ + private $journalRepos; + /** @var CategoryRepositoryInterface */ + private $repository; + /** * */ @@ -57,6 +64,9 @@ class CategoryController extends Controller function ($request, $next) { app('view')->share('title', trans('firefly.categories')); app('view')->share('mainTitleIcon', 'fa-bar-chart'); + $this->journalRepos = app(JournalRepositoryInterface::class); + $this->repository = app(CategoryRepositoryInterface::class); + $this->accountRepos = app(AccountRepositoryInterface::class); return $next($request); } @@ -95,16 +105,15 @@ class CategoryController extends Controller } /** - * @param Request $request - * @param CategoryRepositoryInterface $repository - * @param Category $category + * @param Request $request + * @param Category $category * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector */ - public function destroy(Request $request, CategoryRepositoryInterface $repository, Category $category) + public function destroy(Request $request, Category $category) { $name = $category->name; - $repository->destroy($category); + $this->repository->destroy($category); $request->session()->flash('success', strval(trans('firefly.deleted_category', ['name' => $name]))); Preferences::mark(); @@ -132,21 +141,21 @@ class CategoryController extends Controller } /** - * @param CategoryRepositoryInterface $repository + * @param Request $request * - * @return View + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ - public function index(Request $request, CategoryRepositoryInterface $repository) + public function index(Request $request) { $page = 0 === intval($request->get('page')) ? 1 : intval($request->get('page')); $pageSize = intval(Preferences::get('listPageSize', 50)->data); - $collection = $repository->getCategories(); + $collection = $this->repository->getCategories(); $total = $collection->count(); $collection = $collection->slice(($page - 1) * $pageSize, $pageSize); $collection->each( - function (Category $category) use ($repository) { - $category->lastActivity = $repository->lastUseDate($category, new Collection); + function (Category $category) { + $category->lastActivity = $this->repository->lastUseDate($category, new Collection); } ); @@ -158,13 +167,12 @@ class CategoryController extends Controller } /** - * @param Request $request - * @param JournalRepositoryInterface $repository - * @param string $moment + * @param Request $request + * @param string $moment * * @return View */ - public function noCategory(Request $request, JournalRepositoryInterface $repository, string $moment = '') + public function noCategory(Request $request, string $moment = '') { // default values: $range = Preferences::get('viewRange', '1M')->data; @@ -177,27 +185,27 @@ class CategoryController extends Controller // prep for "all" view. if ('all' === $moment) { $subTitle = trans('firefly.all_journals_without_category'); - $first = $repository->first(); + $first = $this->journalRepos->first(); $start = $first->date ?? new Carbon; $end = new Carbon; } // prep for "specific date" view. if (strlen($moment) > 0 && 'all' !== $moment) { - $start = new Carbon($moment); + $start = app('navigation')->startOfPeriod(new Carbon($moment), $range); $end = app('navigation')->endOfPeriod($start, $range); $subTitle = trans( 'firefly.without_category_between', ['start' => $start->formatLocalized($this->monthAndDayFormat), 'end' => $end->formatLocalized($this->monthAndDayFormat)] ); - $periods = $this->getNoCategoryPeriodOverview(); + $periods = $this->getNoCategoryPeriodOverview($start); } // 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->getNoCategoryPeriodOverview(); + $periods = $this->getNoCategoryPeriodOverview($start); $subTitle = trans( 'firefly.without_category_between', ['start' => $start->formatLocalized($this->monthAndDayFormat), 'end' => $end->formatLocalized($this->monthAndDayFormat)] @@ -248,14 +256,14 @@ class CategoryController extends Controller // prep for "specific date" view. if (strlen($moment) > 0 && 'all' !== $moment) { - $start = new Carbon($moment); + $start = app('navigation')->startOfPeriod(new Carbon($moment), $range); $end = app('navigation')->endOfPeriod($start, $range); $subTitle = trans( 'firefly.journals_in_period_for_category', ['name' => $category->name, 'start' => $start->formatLocalized($this->monthAndDayFormat), 'end' => $end->formatLocalized($this->monthAndDayFormat),] ); - $periods = $this->getPeriodOverview($category); + $periods = $this->getPeriodOverview($category, $start); $path = route('categories.show', [$category->id, $moment]); } @@ -265,7 +273,7 @@ class CategoryController extends Controller $start = clone session('start', app('navigation')->startOfPeriod(new Carbon, $range)); /** @var Carbon $end */ $end = clone session('end', app('navigation')->endOfPeriod(new Carbon, $range)); - $periods = $this->getPeriodOverview($category); + $periods = $this->getPeriodOverview($category, $start); $subTitle = trans( 'firefly.journals_in_period_for_category', ['name' => $category->name, 'start' => $start->formatLocalized($this->monthAndDayFormat), @@ -336,38 +344,36 @@ class CategoryController extends Controller } /** + * @param Carbon $theDate + * * @return Collection */ - private function getNoCategoryPeriodOverview(): Collection + private function getNoCategoryPeriodOverview(Carbon $theDate): 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; + $range = Preferences::get('viewRange', '1M')->data; + $first = $this->journalRepos->first(); + $start = $first->date ?? new Carbon; + $end = $theDate ?? new Carbon; // properties for cache $cache = new CacheProperties; $cache->addProperty($start); $cache->addProperty($end); - $cache->addProperty('no-budget-period-entries'); + $cache->addProperty('no-category-period-entries'); if ($cache->has()) { return $cache->get(); // @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!'); - $end = app('navigation')->startOfPeriod($end, $range); - $currentEnd = app('navigation')->endOfPeriod($end, $range); + $dates = app('navigation')->blockPeriods($start, $end, $range); + $entries = new Collection; + + foreach ($dates as $date) { // count journals without category in this period: /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); - $collector->setAllAssetAccounts()->setRange($end, $currentEnd)->withoutCategory() + $collector->setAllAssetAccounts()->setRange($date['start'], $date['end'])->withoutCategory() ->withOpposingAccount()->setTypes([TransactionType::WITHDRAWAL, TransactionType::DEPOSIT, TransactionType::TRANSFER]); $collector->removeFilter(InternalTransferFilter::class); $count = $collector->getJournals()->count(); @@ -375,7 +381,7 @@ class CategoryController extends Controller // amount transferred /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); - $collector->setAllAssetAccounts()->setRange($end, $currentEnd)->withoutCategory() + $collector->setAllAssetAccounts()->setRange($date['start'], $date['end'])->withoutCategory() ->withOpposingAccount()->setTypes([TransactionType::TRANSFER]); $collector->removeFilter(InternalTransferFilter::class); $transferred = Steam::positive($collector->getJournals()->sum('transaction_amount')); @@ -383,17 +389,20 @@ class CategoryController extends Controller // amount spent /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); - $collector->setAllAssetAccounts()->setRange($end, $currentEnd)->withoutCategory()->withOpposingAccount()->setTypes([TransactionType::WITHDRAWAL]); + $collector->setAllAssetAccounts()->setRange($date['start'], $date['end'])->withoutCategory()->withOpposingAccount()->setTypes( + [TransactionType::WITHDRAWAL] + ); $spent = $collector->getJournals()->sum('transaction_amount'); // amount earned /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); - $collector->setAllAssetAccounts()->setRange($end, $currentEnd)->withoutCategory()->withOpposingAccount()->setTypes([TransactionType::DEPOSIT]); - $earned = $collector->getJournals()->sum('transaction_amount'); - - $dateStr = $end->format('Y-m-d'); - $dateName = app('navigation')->periodShow($end, $range); + $collector->setAllAssetAccounts()->setRange($date['start'], $date['end'])->withoutCategory()->withOpposingAccount()->setTypes( + [TransactionType::DEPOSIT] + ); + $earned = $collector->getJournals()->sum('transaction_amount'); + $dateStr = $date['end']->format('Y-m-d'); + $dateName = app('navigation')->periodShow($date['end'], $date['period']); $entries->push( [ 'string' => $dateStr, @@ -402,10 +411,9 @@ class CategoryController extends Controller 'spent' => $spent, 'earned' => $earned, 'transferred' => $transferred, - 'date' => clone $end, + 'date' => clone $date['end'], ] ); - $end = app('navigation')->subtractPeriod($end, $range, 1); } Log::debug('End of loops'); $cache->store($entries); @@ -418,45 +426,39 @@ class CategoryController extends Controller * * @return Collection */ - private function getPeriodOverview(Category $category): Collection + private function getPeriodOverview(Category $category, Carbon $date): Collection { - /** @var CategoryRepositoryInterface $repository */ - $repository = app(CategoryRepositoryInterface::class); - /** @var AccountRepositoryInterface $accountRepository */ - $accountRepository = app(AccountRepositoryInterface::class); - $accounts = $accountRepository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); - $first = $repository->firstUseDate($category); - if (null === $first) { - $first = new Carbon; // @codeCoverageIgnore - } - $range = Preferences::get('viewRange', '1M')->data; - $first = app('navigation')->startOfPeriod($first, $range); - $end = app('navigation')->endOfX(new Carbon, $range, null); - $entries = new Collection; - $count = 0; + $range = Preferences::get('viewRange', '1M')->data; + $first = $this->journalRepos->first(); + $start = $first->date ?? new Carbon; + $end = $date ?? new Carbon; + $accounts = $this->accountRepos->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); // properties for entries with their amounts. $cache = new CacheProperties(); - $cache->addProperty($first); + $cache->addProperty($start); $cache->addProperty($end); + $cache->addProperty($range); $cache->addProperty('categories.entries'); $cache->addProperty($category->id); if ($cache->has()) { return $cache->get(); // @codeCoverageIgnore } - while ($end >= $first && $count < 90) { - $end = app('navigation')->startOfPeriod($end, $range); - $currentEnd = app('navigation')->endOfPeriod($end, $range); - $spent = $repository->spentInPeriod(new Collection([$category]), $accounts, $end, $currentEnd); - $earned = $repository->earnedInPeriod(new Collection([$category]), $accounts, $end, $currentEnd); - $dateStr = $end->format('Y-m-d'); - $dateName = app('navigation')->periodShow($end, $range); + + $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']); // amount transferred /** @var JournalCollectorInterface $collector */ $collector = app(JournalCollectorInterface::class); - $collector->setAllAssetAccounts()->setRange($end, $currentEnd)->setCategory($category) + $collector->setAllAssetAccounts()->setRange($date['start'], $date['end'])->setCategory($category) ->withOpposingAccount()->setTypes([TransactionType::TRANSFER]); $collector->removeFilter(InternalTransferFilter::class); $transferred = Steam::positive($collector->getJournals()->sum('transaction_amount')); @@ -469,11 +471,9 @@ class CategoryController extends Controller 'earned' => $earned, 'sum' => bcadd($earned, $spent), 'transferred' => $transferred, - 'date' => clone $end, + 'date' => clone $date['end'], ] ); - $end = app('navigation')->subtractPeriod($end, $range, 1); - ++$count; } $cache->store($entries); diff --git a/app/Http/Controllers/Chart/AccountController.php b/app/Http/Controllers/Chart/AccountController.php index 81402b25d9..d559947d87 100644 --- a/app/Http/Controllers/Chart/AccountController.php +++ b/app/Http/Controllers/Chart/AccountController.php @@ -76,21 +76,46 @@ class AccountController extends Controller $repository = app(AccountRepositoryInterface::class); $start = $repository->oldestJournalDate($account); $end = new Carbon; - $format = (string)trans('config.month_and_day'); - $range = Steam::balanceInRange($account, $start, $end); - $current = clone $start; - $previous = array_values($range)[0]; - $chartData = []; - while ($end >= $current) { - $theDate = $current->format('Y-m-d'); - $balance = $range[$theDate] ?? $previous; - $label = $current->formatLocalized($format); - $chartData[$label] = $balance; - $previous = $balance; - $current->addDay(); + // depending on diff, do something with range of chart. + $step = '1D'; + $months = $start->diffInMonths($end); + if ($months > 3) { + $step = '1W'; + } + if ($months > 24) { + $step = '1M'; // @codeCoverageIgnore + } + if ($months > 100) { + $step = '1Y'; // @codeCoverageIgnore + } + $chartData = []; + $current = clone $start; + switch ($step) { + case '1D': + $format = (string)trans('config.month_and_day'); + $range = Steam::balanceInRange($account, $start, $end); + $previous = array_values($range)[0]; + while ($end >= $current) { + $theDate = $current->format('Y-m-d'); + $balance = $range[$theDate] ?? $previous; + $label = $current->formatLocalized($format); + $chartData[$label] = floatval($balance); + $previous = $balance; + $current->addDay(); + } + break; + case '1W': + case '1M': // @codeCoverageIgnore + case '1Y': // @codeCoverageIgnore + while ($end >= $current) { + $balance = floatval(Steam::balance($account, $current)); + $label = app('navigation')->periodShow($current, $step); + $chartData[$label] = $balance; + $current = app('navigation')->addPeriod($current, $step, 1); + } + break; } - $data = $this->generator->singleSet($account->name, $chartData); $cache->store($data); diff --git a/app/Http/Controllers/Chart/BudgetController.php b/app/Http/Controllers/Chart/BudgetController.php index 932e30d797..cbff5e05e9 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 Preferences; use Response; use Steam; @@ -78,37 +77,47 @@ class BudgetController extends Controller */ public function budget(Budget $budget) { - $first = $this->repository->firstUseDate($budget); - $range = Preferences::get('viewRange', '1M')->data; - $currentStart = app('navigation')->startOfPeriod($first, $range); - $last = session('end', new Carbon); - $cache = new CacheProperties(); - $cache->addProperty($first); - $cache->addProperty($last); + $start = $this->repository->firstUseDate($budget); + $end = session('end', new Carbon); + $cache = new CacheProperties(); + $cache->addProperty($start); + $cache->addProperty($end); $cache->addProperty('chart.budget.budget'); if ($cache->has()) { return Response::json($cache->get()); // @codeCoverageIgnore } - $final = clone $last; - $final->addYears(2); + // depending on diff, do something with range of chart. + $step = '1D'; + $months = $start->diffInMonths($end); + if ($months > 3) { + $step = '1W'; + } + if ($months > 24) { + $step = '1M'; + } + if ($months > 60) { + $step = '1Y'; // @codeCoverageIgnore + } $budgetCollection = new Collection([$budget]); - $last = app('navigation')->endOfX($last, $range, $final); // not to overshoot. - $entries = []; - while ($currentStart < $last) { - // periodspecific dates: - $currentEnd = app('navigation')->endOfPeriod($currentStart, $range); - // sub another day because reasons. - $currentEnd->subDay(); - $spent = $this->repository->spentInPeriod($budgetCollection, new Collection, $currentStart, $currentEnd); - $format = app('navigation')->periodShow($currentStart, $range); - $entries[$format] = bcmul($spent, '-1'); - $currentStart = clone $currentEnd; - $currentStart->addDays(2); + $chartData = []; + $current = clone $start; + $current = app('navigation')->startOfPeriod($current, $step); + + while ($end >= $current) { + $currentEnd = app('navigation')->endOfPeriod($current, $step); + if ($step === '1Y') { + $currentEnd->subDay(); // @codeCoverageIgnore + } + $spent = $this->repository->spentInPeriod($budgetCollection, new Collection, $current, $currentEnd); + $label = app('navigation')->periodShow($current, $step); + $chartData[$label] = floatval(bcmul($spent, '-1')); + $current = clone $currentEnd; + $current->addDay(); } - $data = $this->generator->singleSet(strval(trans('firefly.spent')), $entries); + $data = $this->generator->singleSet(strval(trans('firefly.spent')), $chartData); $cache->store($data); diff --git a/app/Http/Controllers/DebugController.php b/app/Http/Controllers/DebugController.php index a412ebd2f3..4e725e9552 100644 --- a/app/Http/Controllers/DebugController.php +++ b/app/Http/Controllers/DebugController.php @@ -25,6 +25,8 @@ namespace FireflyIII\Http\Controllers; use Carbon\Carbon; use DB; +use Exception; +use FireflyIII\Http\Middleware\IsDemoUser; use Illuminate\Http\Request; use Log; use Monolog\Handler\RotatingFileHandler; @@ -34,6 +36,15 @@ use Monolog\Handler\RotatingFileHandler; */ class DebugController extends Controller { + /** + * HomeController constructor. + */ + public function __construct() + { + parent::__construct(); + $this->middleware(IsDemoUser::class); + } + /** * @param Request $request @@ -74,7 +85,11 @@ class DebugController extends Controller if ($handler instanceof RotatingFileHandler) { $logFile = $handler->getUrl(); if (null !== $logFile) { - $logContent = file_get_contents($logFile); + try { + $logContent = file_get_contents($logFile); + } catch (Exception $e) { + // don't care + } } } } diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 8ca66dbc80..d1587d0824 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -200,20 +200,25 @@ class HomeController extends Controller 'login', 'logout', 'password.reset', 'profile.confirm-email-change', 'profile.undo-email-change', 'register', 'report.options', 'routes', 'rule-groups.down', 'rule-groups.up', 'rules.up', 'rules.down', 'rules.select', 'search.search', 'test-flash', 'transactions.link.delete', 'transactions.link.switch', - 'two-factor.lost', 'report.options', + 'two-factor.lost', 'reports.options', 'debug', 'import.create-job', 'import.download', 'import.start', 'import.status.json', + 'preferences.delete-code', 'rules.test-triggers', 'piggy-banks.remove-money', 'piggy-banks.add-money', + 'accounts.reconcile.transactions', 'accounts.reconcile.overview', 'export.download', + 'transactions.clone', 'two-factor.index', ]; $return = ' '; /** @var Route $route */ foreach ($set as $route) { $name = $route->getName(); if (null !== $name && in_array('GET', $route->methods()) && strlen($name) > 0) { + $found = false; foreach ($ignore as $string) { - if (false !== strpos($name, $string)) { + if (!(false === stripos($name, $string))) { $found = true; + break; } } - if (!$found) { + if ($found === false) { $return .= 'touch ' . $route->getName() . '.md;'; } } diff --git a/app/Http/Controllers/Import/ConfigurationController.php b/app/Http/Controllers/Import/ConfigurationController.php index a86bd382bf..8450c26aab 100644 --- a/app/Http/Controllers/Import/ConfigurationController.php +++ b/app/Http/Controllers/Import/ConfigurationController.php @@ -55,7 +55,7 @@ class ConfigurationController extends Controller return $next($request); } ); - $this->middleware(IsDemoUser::class)->except(['index']); + $this->middleware(IsDemoUser::class); } /** diff --git a/app/Http/Controllers/Import/IndexController.php b/app/Http/Controllers/Import/IndexController.php index b6617e189e..4cb9e094cb 100644 --- a/app/Http/Controllers/Import/IndexController.php +++ b/app/Http/Controllers/Import/IndexController.php @@ -33,6 +33,7 @@ use Log; use Response; use View; + /** * Class FileController. */ @@ -57,8 +58,7 @@ class IndexController extends Controller return $next($request); } ); - - $this->middleware(IsDemoUser::class)->except(['create', 'index']); + $this->middleware(IsDemoUser::class)->except(['index']); } /** diff --git a/app/Http/Controllers/Import/StatusController.php b/app/Http/Controllers/Import/StatusController.php index fd54229a95..d5eb0a0165 100644 --- a/app/Http/Controllers/Import/StatusController.php +++ b/app/Http/Controllers/Import/StatusController.php @@ -23,6 +23,7 @@ declare(strict_types=1); namespace FireflyIII\Http\Controllers\Import; use FireflyIII\Http\Controllers\Controller; +use FireflyIII\Http\Middleware\IsDemoUser; use FireflyIII\Models\ImportJob; use FireflyIII\Repositories\Tag\TagRepositoryInterface; use Response; @@ -47,6 +48,7 @@ class StatusController extends Controller return $next($request); } ); + $this->middleware(IsDemoUser::class); } /** @@ -93,20 +95,29 @@ class StatusController extends Controller $result['percentage'] = round(($job->extended_status['done'] / $job->extended_status['steps']) * 100, 0); $result['show_percentage'] = true; } - if ('finished' === $job->status) { - $tagId = $job->extended_status['tag']; - /** @var TagRepositoryInterface $repository */ - $repository = app(TagRepositoryInterface::class); - $tag = $repository->find($tagId); - $result['finished'] = true; - $result['finishedText'] = trans('import.status_finished_job', ['link' => route('tags.show', [$tag->id, 'all']), 'tag' => $tag->tag]); + $result['finished'] = true; + $tagId = intval($job->extended_status['tag']); + if ($tagId !== 0) { + /** @var TagRepositoryInterface $repository */ + $repository = app(TagRepositoryInterface::class); + $tag = $repository->find($tagId); + $count = $tag->transactionJournals()->count(); + $result['finishedText'] = trans( + 'import.status_finished_job', ['count' => $count, 'link' => route('tags.show', [$tag->id, 'all']), 'tag' => $tag->tag] + ); + } + + if ($tagId === 0) { + $result['finishedText'] = trans('import.status_finished_no_tag'); // @codeCoverageIgnore + } } if ('running' === $job->status) { $result['started'] = true; $result['running'] = true; } + $result['percentage'] = $result['percentage'] > 100 ? 100 : $result['percentage']; return Response::json($result); } diff --git a/app/Http/Controllers/Json/BoxController.php b/app/Http/Controllers/Json/BoxController.php index 7c6810613e..c3f3485677 100644 --- a/app/Http/Controllers/Json/BoxController.php +++ b/app/Http/Controllers/Json/BoxController.php @@ -25,11 +25,13 @@ namespace FireflyIII\Http\Controllers\Json; use Carbon\Carbon; use FireflyIII\Helpers\Collector\JournalCollectorInterface; use FireflyIII\Http\Controllers\Controller; +use FireflyIII\Models\Account; use FireflyIII\Models\AccountType; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Account\AccountRepositoryInterface; use FireflyIII\Repositories\Bill\BillRepositoryInterface; use FireflyIII\Repositories\Budget\BudgetRepositoryInterface; +use FireflyIII\Repositories\Currency\CurrencyRepositoryInterface; use FireflyIII\Support\CacheProperties; use Response; @@ -170,7 +172,7 @@ class BoxController extends Controller * * @return \Illuminate\Http\JsonResponse */ - public function netWorth(AccountRepositoryInterface $repository) + public function netWorth(AccountRepositoryInterface $repository, CurrencyRepositoryInterface $currencyRepos) { $date = new Carbon(date('Y-m-d')); // needed so its per day. /** @var Carbon $start */ @@ -193,16 +195,32 @@ class BoxController extends Controller if ($cache->has()) { return Response::json($cache->get()); // @codeCoverageIgnore } + $netWorth = []; $accounts = $repository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); $currency = app('amount')->getDefaultCurrency(); $balances = app('steam')->balancesByAccounts($accounts, $date); - $sum = '0'; - foreach ($balances as $entry) { - $sum = bcadd($sum, $entry); + + /** @var Account $account */ + foreach ($accounts as $account) { + $accountCurrency = $currency; + $balance = $balances[$account->id] ?? '0'; + $currencyId = intval($account->getMeta('currency_id')); + if ($currencyId !== 0) { + $accountCurrency = $currencyRepos->find($currencyId); + } + if (!isset($netWorth[$accountCurrency->id])) { + $netWorth[$accountCurrency->id]['currency'] = $accountCurrency; + $netWorth[$accountCurrency->id]['sum'] = '0'; + } + $netWorth[$accountCurrency->id]['sum'] = bcadd($netWorth[$accountCurrency->id]['sum'], $balance); } + $return = []; + foreach ($netWorth as $currencyId => $data) { + $return[$currencyId] = app('amount')->formatAnything($data['currency'], $data['sum'], false); + } $return = [ - 'net_worth' => app('amount')->formatAnything($currency, $sum, false), + 'net_worths' => array_values($return), ]; $cache->store($return); diff --git a/app/Http/Controllers/PiggyBankController.php b/app/Http/Controllers/PiggyBankController.php index 75ecd6284e..1c88fc6dc5 100644 --- a/app/Http/Controllers/PiggyBankController.php +++ b/app/Http/Controllers/PiggyBankController.php @@ -383,7 +383,7 @@ class PiggyBankController extends Controller { $note = $piggyBank->notes()->first(); $events = $repository->getEvents($piggyBank); - $subTitle = e($piggyBank->name); + $subTitle = $piggyBank->name; return view('piggy-banks.show', compact('piggyBank', 'events', 'subTitle', 'note')); } diff --git a/app/Http/Controllers/Popup/ReportController.php b/app/Http/Controllers/Popup/ReportController.php index b7d3fc7654..4d5b8a852a 100644 --- a/app/Http/Controllers/Popup/ReportController.php +++ b/app/Http/Controllers/Popup/ReportController.php @@ -59,16 +59,16 @@ class ReportController extends Controller parent::__construct(); $this->middleware( function ($request, $next) { - // @var AccountRepositoryInterface $repository + /** @var AccountRepositoryInterface accountRepository */ $this->accountRepository = app(AccountRepositoryInterface::class); - // @var BudgetRepositoryInterface $repository + /** @var BudgetRepositoryInterface budgetRepository */ $this->budgetRepository = app(BudgetRepositoryInterface::class); - // @var CategoryRepositoryInterface categoryRepository + /** @var CategoryRepositoryInterface categoryRepository */ $this->categoryRepository = app(CategoryRepositoryInterface::class); - // @var PopupReportInterface popupHelper + /** @var PopupReportInterface popupHelper */ $this->popupHelper = app(PopupReportInterface::class); return $next($request); diff --git a/app/Http/Controllers/PreferencesController.php b/app/Http/Controllers/PreferencesController.php index 75e3a70a50..7f68c9875d 100644 --- a/app/Http/Controllers/PreferencesController.php +++ b/app/Http/Controllers/PreferencesController.php @@ -128,7 +128,7 @@ class PreferencesController extends Controller * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector * @SuppressWarnings(PHPMD.UnusedFormalParameter) // it's unused but the class does some validation. */ - public function postCode(TokenFormRequest $request) + public function postCode(/** @scrutinizer ignore-unused */ TokenFormRequest $request) { Preferences::set('twoFactorAuthEnabled', 1); Preferences::set('twoFactorAuthSecret', Session::get('two-factor-secret')); diff --git a/app/Http/Controllers/Report/CategoryController.php b/app/Http/Controllers/Report/CategoryController.php index de3f0f57dc..7491bd34a2 100644 --- a/app/Http/Controllers/Report/CategoryController.php +++ b/app/Http/Controllers/Report/CategoryController.php @@ -129,12 +129,12 @@ class CategoryController extends Controller $report = []; /** @var Category $category */ foreach ($categories as $category) { - $spent = $repository->spentInPeriod(new Collection([$category]), $accounts, $start, $end); - if (0 !== bccomp($spent, '0')) { - $report[$category->id] = ['name' => $category->name, 'spent' => $spent, 'id' => $category->id]; + $spent = $repository->spentInPeriod(new Collection([$category]), $accounts, $start, $end); + $earned = $repository->earnedInPeriod(new Collection([$category]), $accounts, $start, $end); + if (0 !== bccomp($spent, '0') || 0 !== bccomp($earned, '0')) { + $report[$category->id] = ['name' => $category->name, 'spent' => $spent, 'earned' => $earned, 'id' => $category->id]; } } - // sort the result // Obtain a list of columns $sum = []; diff --git a/app/Http/Controllers/Report/ExpenseController.php b/app/Http/Controllers/Report/ExpenseController.php index 90dc90a2ea..ecd36ada6a 100644 --- a/app/Http/Controllers/Report/ExpenseController.php +++ b/app/Http/Controllers/Report/ExpenseController.php @@ -568,7 +568,7 @@ class ExpenseController extends Controller ]; // loop to support multi currency foreach ($set as $transaction) { - $currencyId = $transaction->transaction_currency_id; + $currencyId = intval($transaction->transaction_currency_id); // if not set, set to zero: if (!isset($sum['per_currency'][$currencyId])) { diff --git a/app/Http/Controllers/ReportController.php b/app/Http/Controllers/ReportController.php index cd27a709ec..61902a57b9 100644 --- a/app/Http/Controllers/ReportController.php +++ b/app/Http/Controllers/ReportController.php @@ -48,6 +48,9 @@ class ReportController extends Controller /** @var ReportHelperInterface */ protected $helper; + /** @var BudgetRepositoryInterface */ + private $repository; + /** * */ @@ -55,13 +58,13 @@ class ReportController extends Controller { parent::__construct(); - $this->helper = app(ReportHelperInterface::class); - $this->middleware( function ($request, $next) { app('view')->share('title', trans('firefly.reports')); app('view')->share('mainTitleIcon', 'fa-line-chart'); View::share('subTitleIcon', 'fa-calendar'); + $this->helper = app(ReportHelperInterface::class); + $this->repository = app(BudgetRepositoryInterface::class); return $next($request); } @@ -87,6 +90,7 @@ class ReportController extends Controller if ($start < session('first')) { $start = session('first'); } + $this->repository->cleanupBudgets(); View::share( 'subTitle', trans( @@ -120,6 +124,7 @@ class ReportController extends Controller if ($start < session('first')) { $start = session('first'); } + $this->repository->cleanupBudgets(); View::share( 'subTitle', @@ -157,6 +162,7 @@ class ReportController extends Controller if ($start < session('first')) { $start = session('first'); } + $this->repository->cleanupBudgets(); View::share( 'subTitle', @@ -195,6 +201,7 @@ class ReportController extends Controller if ($start < session('first')) { $start = session('first'); } + $this->repository->cleanupBudgets(); View::share( 'subTitle', @@ -233,6 +240,7 @@ class ReportController extends Controller if ($start < session('first')) { $start = session('first'); } + $this->repository->cleanupBudgets(); View::share( 'subTitle', @@ -265,6 +273,7 @@ class ReportController extends Controller $customFiscalYear = Preferences::get('customFiscalYear', 0)->data; $accounts = $repository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); $accountList = join(',', $accounts->pluck('id')->toArray()); + $this->repository->cleanupBudgets(); return view('reports.index', compact('months', 'accounts', 'start', 'accountList', 'customFiscalYear')); } @@ -391,6 +400,7 @@ class ReportController extends Controller if ($start < session('first')) { $start = session('first'); } + $this->repository->cleanupBudgets(); View::share( 'subTitle', diff --git a/app/Http/Controllers/Transaction/LinkController.php b/app/Http/Controllers/Transaction/LinkController.php index 28b7b78719..e1fe464f18 100644 --- a/app/Http/Controllers/Transaction/LinkController.php +++ b/app/Http/Controllers/Transaction/LinkController.php @@ -38,6 +38,11 @@ use URL; */ class LinkController extends Controller { + /** @var JournalRepositoryInterface */ + private $journalRepository; + /** @var LinkTypeRepositoryInterface */ + private $repository; + /** * */ @@ -50,6 +55,9 @@ class LinkController extends Controller app('view')->share('title', trans('firefly.transactions')); app('view')->share('mainTitleIcon', 'fa-repeat'); + $this->journalRepository = app(JournalRepositoryInterface::class); + $this->repository = app(LinkTypeRepositoryInterface::class); + return $next($request); } ); @@ -70,14 +78,13 @@ class LinkController extends Controller } /** - * @param LinkTypeRepositoryInterface $repository * @param TransactionJournalLink $link * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector */ - public function destroy(LinkTypeRepositoryInterface $repository, TransactionJournalLink $link) + public function destroy(TransactionJournalLink $link) { - $repository->destroyLink($link); + $this->repository->destroyLink($link); Session::flash('success', strval(trans('firefly.deleted_link'))); Preferences::mark(); @@ -87,18 +94,13 @@ class LinkController extends Controller /** * @param JournalLinkRequest $request - * @param LinkTypeRepositoryInterface $repository - * @param JournalRepositoryInterface $journalRepository * @param TransactionJournal $journal * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector */ - public function store( - JournalLinkRequest $request, - LinkTypeRepositoryInterface $repository, - JournalRepositoryInterface $journalRepository, - TransactionJournal $journal - ) { + public function store(JournalLinkRequest $request, TransactionJournal $journal) + { + Log::debug('We are here (store)'); $linkInfo = $request->getLinkInfo(); if (0 === $linkInfo['transaction_journal_id']) { @@ -106,30 +108,28 @@ class LinkController extends Controller return redirect(route('transactions.show', [$journal->id])); } - $other = $journalRepository->find($linkInfo['transaction_journal_id']); - $alreadyLinked = $repository->findLink($journal, $other); + $other = $this->journalRepository->find($linkInfo['transaction_journal_id']); + $alreadyLinked = $this->repository->findLink($journal, $other); if ($alreadyLinked) { Session::flash('error', trans('firefly.journals_error_linked')); return redirect(route('transactions.show', [$journal->id])); } Log::debug(sprintf('Journal is %d, opposing is %d', $journal->id, $other->id)); - - $repository->storeLink($linkInfo, $other, $journal); + $this->repository->storeLink($linkInfo, $other, $journal); Session::flash('success', trans('firefly.journals_linked')); return redirect(route('transactions.show', [$journal->id])); } /** - * @param LinkTypeRepositoryInterface $repository * @param TransactionJournalLink $link * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector */ - public function switchLink(LinkTypeRepositoryInterface $repository, TransactionJournalLink $link) + public function switchLink(TransactionJournalLink $link) { - $repository->switchLink($link); + $this->repository->switchLink($link); return redirect(URL::previous()); } diff --git a/app/Http/Controllers/TransactionController.php b/app/Http/Controllers/TransactionController.php index b271a9f4ad..ba24a58696 100644 --- a/app/Http/Controllers/TransactionController.php +++ b/app/Http/Controllers/TransactionController.php @@ -272,7 +272,7 @@ class TransactionController extends Controller $return = []; /** @var Transaction $transaction */ foreach ($collection as $transaction) { - $currencyId = $transaction->transaction_currency_id; + $currencyId = intval($transaction->transaction_currency_id); // save currency information: if (!isset($return[$currencyId])) { diff --git a/app/Http/Middleware/AuthenticateTwoFactor.php b/app/Http/Middleware/AuthenticateTwoFactor.php index c2ead8de22..aaa026ee19 100644 --- a/app/Http/Middleware/AuthenticateTwoFactor.php +++ b/app/Http/Middleware/AuthenticateTwoFactor.php @@ -24,11 +24,10 @@ namespace FireflyIII\Http\Middleware; use Closure; use Illuminate\Http\Request; -use Illuminate\Support\Facades\Auth; use Log; use Preferences; +use Auth; use Session; - /** * Class AuthenticateTwoFactor. */ @@ -45,26 +44,14 @@ class AuthenticateTwoFactor */ public function handle(Request $request, Closure $next, $guard = null) { - // do the usual auth, again: if (Auth::guard($guard)->guest()) { - if ($request->ajax()) { - return response('Unauthorized.', 401); - } return redirect()->guest('login'); } - if (1 === intval(auth()->user()->blocked)) { - Auth::guard($guard)->logout(); - Session::flash('logoutMessage', trans('firefly.block_account_logout')); - - return redirect()->guest('login'); - } $is2faEnabled = Preferences::get('twoFactorAuthEnabled', false)->data; $has2faSecret = null !== Preferences::get('twoFactorAuthSecret'); - - // grab 2auth information from session. - $is2faAuthed = 'true' === $request->cookie('twoFactorAuthenticated'); + $is2faAuthed = 'true' === $request->cookie('twoFactorAuthenticated'); if ($is2faEnabled && $has2faSecret && !$is2faAuthed) { Log::debug('Does not seem to be 2 factor authed, redirect.'); diff --git a/app/Http/Middleware/IsDemoUser.php b/app/Http/Middleware/IsDemoUser.php index fe5e7f86c1..c4b1b5123f 100644 --- a/app/Http/Middleware/IsDemoUser.php +++ b/app/Http/Middleware/IsDemoUser.php @@ -51,9 +51,9 @@ class IsDemoUser /** @var User $user */ $user = auth()->user(); if ($user->hasRole('demo')) { - Session::flash('warning', strval(trans('firefly.not_available_demo_user'))); + Session::flash('info', strval(trans('firefly.not_available_demo_user'))); - return redirect(route('index')); + return redirect($request->session()->previousUrl()); } return $next($request); diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php index 2391787dd5..e2089b222c 100644 --- a/app/Http/Middleware/TrustProxies.php +++ b/app/Http/Middleware/TrustProxies.php @@ -60,8 +60,8 @@ class TrustProxies extends Middleware public function __construct(Repository $config) { $trustedProxies = env('TRUSTED_PROXIES', null); - if (null !== $trustedProxies && strlen($trustedProxies) > 0) { - $this->proxies = $trustedProxies; + if (false !== $trustedProxies && null !== $trustedProxies && strlen($trustedProxies) > 0) { + $this->proxies = strval($trustedProxies); } parent::__construct($config); diff --git a/app/Http/Requests/JournalLinkRequest.php b/app/Http/Requests/JournalLinkRequest.php index 5544706986..725f71e40c 100644 --- a/app/Http/Requests/JournalLinkRequest.php +++ b/app/Http/Requests/JournalLinkRequest.php @@ -48,7 +48,7 @@ class JournalLinkRequest extends Request $parts = explode('_', $linkType); $return['link_type_id'] = intval($parts[0]); $return['transaction_journal_id'] = $this->integer('link_journal_id'); - $return['comments'] = strlen($this->string('comments')) > 0 ? $this->string('comments') : null; + $return['notes'] = strlen($this->string('notes')) > 0 ? $this->string('notes') : ''; $return['direction'] = $parts[1]; if (0 === $return['transaction_journal_id'] && ctype_digit($this->string('link_other'))) { $return['transaction_journal_id'] = $this->integer('link_other'); diff --git a/app/Import/Configuration/FileConfigurator.php b/app/Import/Configuration/FileConfigurator.php index 940842abdf..1cde0e8015 100644 --- a/app/Import/Configuration/FileConfigurator.php +++ b/app/Import/Configuration/FileConfigurator.php @@ -88,11 +88,9 @@ class FileConfigurator implements ConfiguratorInterface if (is_null($this->job)) { throw new FireflyException('Cannot call configureJob() without a job.'); } - $class = $this->getConfigurationClass(); - $job = $this->job; /** @var ConfigurationInterface $object */ - $object = app($class); - $object->setJob($job); + $object = app($this->getConfigurationClass()); + $object->setJob($this->job); $result = $object->storeConfiguration($data); $this->warning = $object->getWarningMessage(); @@ -111,12 +109,9 @@ class FileConfigurator implements ConfiguratorInterface if (is_null($this->job)) { throw new FireflyException('Cannot call getNextData() without a job.'); } - - $class = $this->getConfigurationClass(); - $job = $this->job; /** @var ConfigurationInterface $object */ - $object = app($class); - $object->setJob($job); + $object = app($this->getConfigurationClass()); + $object->setJob($this->job); return $object->getData(); } @@ -192,6 +187,12 @@ class FileConfigurator implements ConfiguratorInterface $this->repository = app(ImportJobRepositoryInterface::class); $this->repository->setUser($job->user); + // set number of steps to 100: + $extendedStatus = $this->getExtendedStatus(); + $extendedStatus['steps'] = 6; + $extendedStatus['done'] = 0; + $this->setExtendedStatus($extendedStatus); + $config = $this->getConfig(); $newConfig = array_merge($this->defaultConfig, $config); $this->repository->setConfiguration($job, $newConfig); @@ -246,4 +247,28 @@ class FileConfigurator implements ConfiguratorInterface return $class; } + + /** + * Shorthand method to return the extended status. + * + * @codeCoverageIgnore + * @return array + */ + private function getExtendedStatus(): array + { + return $this->repository->getExtendedStatus($this->job); + } + + /** + * Shorthand method to set the extended status. + * + * @codeCoverageIgnore + * @param array $extended + */ + private function setExtendedStatus(array $extended): void + { + $this->repository->setExtendedStatus($this->job, $extended); + + return; + } } diff --git a/app/Import/Configuration/SpectreConfigurator.php b/app/Import/Configuration/SpectreConfigurator.php index 126e964601..d3ed6d5b87 100644 --- a/app/Import/Configuration/SpectreConfigurator.php +++ b/app/Import/Configuration/SpectreConfigurator.php @@ -24,6 +24,7 @@ namespace FireflyIII\Import\Configuration; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\ImportJob; +use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; use FireflyIII\Support\Import\Configuration\Spectre\HaveAccounts; use Log; @@ -35,6 +36,9 @@ class SpectreConfigurator implements ConfiguratorInterface /** @var ImportJob */ private $job; + /** @var ImportJobRepositoryInterface */ + private $repository; + /** @var string */ private $warning = ''; @@ -51,12 +55,14 @@ class SpectreConfigurator implements ConfiguratorInterface * @param array $data * * @return bool + * @throws FireflyException */ public function configureJob(array $data): bool { - $config = $this->job->configuration; - $stage = $config['stage']; - $status = $this->job->status; + 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': @@ -66,13 +72,11 @@ class SpectreConfigurator implements ConfiguratorInterface $class->storeConfiguration($data); // update job for next step and set to "configured". - $config = $this->job->configuration; - $config['stage'] = 'have-account-mapping'; - $this->job->configuration = $config; - $this->job->status = 'configured'; - $this->job->save(); + $config = $this->getConfig(); + $config['stage'] = 'have-account-mapping'; + $this->repository->setConfiguration($this->job, $config); + return true; - break; default: throw new FireflyException(sprintf('Cannot store configuration when job is in state "%s"', $stage)); break; @@ -83,12 +87,16 @@ class SpectreConfigurator implements ConfiguratorInterface * Return the data required for the next step in the job configuration. * * @return array + * @throws FireflyException */ public function getNextData(): array { - $config = $this->job->configuration; - $stage = $config['stage']; - $status = $this->job->status; + 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 'has-token': @@ -96,9 +104,13 @@ class SpectreConfigurator implements ConfiguratorInterface $config['is-redirected'] = true; $config['stage'] = 'user-logged-in'; $status = 'configured'; - break; + + // update config and status: + $this->repository->setConfiguration($this->job, $config); + $this->repository->setStatus($this->job, $status); + + return $this->repository->getConfiguration($this->job); case 'have-accounts': - // use special class: /** @var HaveAccounts $class */ $class = app(HaveAccounts::class); $class->setJob($this->job); @@ -107,37 +119,30 @@ class SpectreConfigurator implements ConfiguratorInterface return $data; default: return []; - break; - } - - // update config and status: - $this->job->configuration = $config; - $this->job->status = $status; - $this->job->save(); - - return $this->job->configuration; } /** * @return string + * @throws FireflyException */ public function getNextView(): string { - $config = $this->job->configuration; - $stage = $config['stage']; + if (is_null($this->job)) { + throw new FireflyException('Cannot call configureJob() without a job.'); + } + $stage = $this->getConfig()['stage'] ?? 'initial'; Log::debug(sprintf('in getNextView(), for stage "%s".', $stage)); switch ($stage) { case 'has-token': // redirect to Spectre. + Log::info('User is being redirected to Spectre.'); + return 'import.spectre.redirect'; - break; case 'have-accounts': return 'import.spectre.accounts'; - break; default: return ''; - break; } } @@ -154,11 +159,14 @@ class SpectreConfigurator implements ConfiguratorInterface /** * @return bool + * @throws FireflyException */ public function isJobConfigured(): bool { - $config = $this->job->configuration; - $stage = $config['stage']; + 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 'has-token': @@ -176,9 +184,14 @@ class SpectreConfigurator implements ConfiguratorInterface /** * @param ImportJob $job */ - public function setJob(ImportJob $job) + public function setJob(ImportJob $job): void { - $defaultConfig = [ + // make repository + $this->repository = app(ImportJobRepositoryInterface::class); + $this->repository->setUser($job->user); + + // set default config: + $defaultConfig = [ 'has-token' => false, 'token' => '', 'token-expires' => 0, @@ -190,16 +203,31 @@ class SpectreConfigurator implements ConfiguratorInterface 'accounts' => '', 'accounts-mapped' => '', 'auto-start' => true, + 'apply-rules' => true, + 'match-bills' => false, ]; - $extendedStatus = $job->extended_status; - $extendedStatus['steps'] = 100; + $currentConfig = $this->repository->getConfiguration($job); + $finalConfig = array_merge($defaultConfig, $currentConfig); + // set default extended status: + $extendedStatus = $this->repository->getExtendedStatus($job); + $extendedStatus['steps'] = 6; - $config = $job->configuration; - $finalConfig = array_merge($defaultConfig, $config); - $job->configuration = $finalConfig; - $job->extended_status = $extendedStatus; - $job->save(); + // 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/Converter/Amount.php b/app/Import/Converter/Amount.php index 802664269a..ccf7f6f76c 100644 --- a/app/Import/Converter/Amount.php +++ b/app/Import/Converter/Amount.php @@ -77,25 +77,25 @@ class Amount implements ConverterInterface Log::debug(sprintf('Searched from the left for "." in amount "%s", assume this is the decimal sign.', $value)); $decimal = '.'; } - unset($options, $res); + unset($res); } // if decimal is dot, replace all comma's and spaces with nothing. then parse as float (round to 4 pos) if ('.' === $decimal) { - $search = [',', ' ']; - $value = str_replace($search, '', $value); + $search = [',', ' ']; + $value = str_replace($search, '', $value); Log::debug(sprintf('Converted amount from "%s" to "%s".', $original, $value)); } if (',' === $decimal) { - $search = ['.', ' ']; - $value = str_replace($search, '', $value); - $value = str_replace(',', '.', $value); + $search = ['.', ' ']; + $value = str_replace($search, '', $value); + $value = str_replace(',', '.', $value); Log::debug(sprintf('Converted amount from "%s" to "%s".', $original, $value)); } if (null === $decimal) { // replace all: - $search = ['.', ' ', ',']; - $value = str_replace($search, '', $value); + $search = ['.', ' ', ',']; + $value = str_replace($search, '', $value); Log::debug(sprintf('No decimal character found. Converted amount from "%s" to "%s".', $original, $value)); } diff --git a/app/Import/FileProcessor/CsvProcessor.php b/app/Import/FileProcessor/CsvProcessor.php index 22327c9445..a0de8ca0ff 100644 --- a/app/Import/FileProcessor/CsvProcessor.php +++ b/app/Import/FileProcessor/CsvProcessor.php @@ -90,6 +90,7 @@ class CsvProcessor implements FileProcessorInterface Log::debug('Now in CsvProcessor run(). Job is now running...'); $entries = new Collection($this->getImportArray()); + $this->addStep(); Log::notice('Building importable objects from CSV file.'); Log::debug(sprintf('Number of entries: %d', $entries->count())); $notImported = $entries->filter( @@ -97,8 +98,7 @@ class CsvProcessor implements FileProcessorInterface $row = array_values($row); if ($this->rowAlreadyImported($row)) { $message = sprintf('Row #%d has already been imported.', $index); - $this->repository->addStepsDone($this->job, 5); - $this->addError($index, $message); + $this->repository->addError($this->job, $index, $message); Log::info($message); return null; @@ -107,30 +107,24 @@ class CsvProcessor implements FileProcessorInterface return $row; } ); + $this->addStep(); Log::debug(sprintf('Number of entries left: %d', $notImported->count())); - // set (new) number of steps: - $extended = $this->getExtendedStatus(); - $steps = $notImported->count() * 5; - $extended['steps'] = $steps; - $this->setExtendedStatus($extended); - Log::debug(sprintf('Number of steps: %d', $steps)); - $notImported->each( function (array $row, int $index) { $journal = $this->importRow($index, $row); $this->objects->push($journal); - $this->repository->addStepsDone($this->job, 1); } ); + $this->addStep(); return true; } /** - * @codeCoverageIgnore - * Shorthand method + * Shorthand method to set the extended status. * + * @codeCoverageIgnore * @param array $array */ public function setExtendedStatus(array $array) @@ -155,20 +149,13 @@ class CsvProcessor implements FileProcessorInterface } /** - * Shorthand method. + * Shorthand method to add a step. * * @codeCoverageIgnore - * - * @param int $index - * @param string $message */ - private function addError(int $index, string $message): void + private function addStep() { - $extended = $this->getExtendedStatus(); - $extended['errors'][$index][] = $message; - $this->setExtendedStatus($extended); - - return; + $this->repository->addStepsDone($this->job, 1); } /** @@ -202,9 +189,9 @@ class CsvProcessor implements FileProcessorInterface } /** - * @codeCoverageIgnore - * Shorthand method. + * Shorthand method to return configuration. * + * @codeCoverageIgnore * @return array */ private function getConfig(): array @@ -212,24 +199,11 @@ class CsvProcessor implements FileProcessorInterface return $this->repository->getConfiguration($this->job); } - /** - * @codeCoverageIgnore - * Shorthand method. - * - * @return array - */ - private function getExtendedStatus(): array - { - return $this->repository->getExtendedStatus($this->job); - } - - /** * @return Iterator * * @throws \League\Csv\Exception * @throws \League\Csv\Exception - * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException */ private function getImportArray(): Iterator { @@ -375,7 +349,7 @@ class CsvProcessor implements FileProcessorInterface */ private function specifics(array $row): array { - $config = $this->job->configuration; + $config = $this->getConfig(); $names = array_keys($config['specifics'] ?? []); foreach ($names as $name) { if (!in_array($name, $this->validSpecifics)) { diff --git a/app/Import/Object/ImportJournal.php b/app/Import/Object/ImportJournal.php index 1b3ac44a42..740e60e0cf 100644 --- a/app/Import/Object/ImportJournal.php +++ b/app/Import/Object/ImportJournal.php @@ -48,6 +48,8 @@ class ImportJournal public $currency; /** @var string */ public $description = ''; + /** @var ImportCurrency */ + public $foreignCurrency; /** @var string */ public $hash; /** @var array */ @@ -71,6 +73,8 @@ class ImportJournal /** @var string */ private $externalId = ''; /** @var array */ + private $foreignAmount; + /** @var array */ private $modifiers = []; /** @var User */ private $user; @@ -80,12 +84,13 @@ class ImportJournal */ public function __construct() { - $this->asset = new ImportAccount; - $this->opposing = new ImportAccount; - $this->bill = new ImportBill; - $this->category = new ImportCategory; - $this->budget = new ImportBudget; - $this->currency = new ImportCurrency; + $this->asset = new ImportAccount; + $this->opposing = new ImportAccount; + $this->bill = new ImportBill; + $this->category = new ImportCategory; + $this->budget = new ImportBudget; + $this->currency = new ImportCurrency; + $this->foreignCurrency = new ImportCurrency; } /** @@ -179,6 +184,8 @@ class ImportJournal */ public function setValue(array $array) { + $array['mapped'] = $array['mapped'] ?? null; + $array['value'] = $array['value'] ?? null; switch ($array['role']) { default: throw new FireflyException(sprintf('ImportJournal cannot handle "%s" with value "%s".', $array['role'], $array['value'])); @@ -188,6 +195,12 @@ class ImportJournal case 'amount': $this->amount = $array; break; + case 'amount_foreign': + $this->foreignAmount = $array; + break; + case 'foreign-currency-code': + $this->foreignCurrency->setId($array); + break; case 'amount_debit': $this->amountDebit = $array; break; diff --git a/app/Import/Prerequisites/FilePrerequisites.php b/app/Import/Prerequisites/FilePrerequisites.php index 4f3fc873ab..e47bb4c797 100644 --- a/app/Import/Prerequisites/FilePrerequisites.php +++ b/app/Import/Prerequisites/FilePrerequisites.php @@ -22,6 +22,7 @@ declare(strict_types=1); namespace FireflyIII\Import\Prerequisites; +use FireflyIII\Exceptions\FireflyException; use FireflyIII\User; use Illuminate\Http\Request; use Illuminate\Support\MessageBag; @@ -62,9 +63,13 @@ class FilePrerequisites implements PrerequisitesInterface * True if prerequisites. False if not. * * @return bool + * @throws FireflyException */ public function hasPrerequisites(): bool { + if($this->user->hasRole('demo')) { + throw new FireflyException('Apologies, the demo user cannot import files.'); + } return false; } diff --git a/app/Import/Routine/FileRoutine.php b/app/Import/Routine/FileRoutine.php index 99f1c14d75..828dbd5d0f 100644 --- a/app/Import/Routine/FileRoutine.php +++ b/app/Import/Routine/FileRoutine.php @@ -28,6 +28,7 @@ use FireflyIII\Import\FileProcessor\FileProcessorInterface; use FireflyIII\Import\Storage\ImportStorage; use FireflyIII\Models\ImportJob; use FireflyIII\Models\Tag; +use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; use FireflyIII\Repositories\Tag\TagRepositoryInterface; use Illuminate\Support\Collection; use Log; @@ -46,6 +47,9 @@ class FileRoutine implements RoutineInterface /** @var ImportJob */ private $job; + /** @var ImportJobRepositoryInterface */ + private $repository; + /** * ImportRoutine constructor. */ @@ -84,26 +88,32 @@ class FileRoutine implements RoutineInterface */ public function run(): bool { - if ('configured' !== $this->job->status) { - Log::error(sprintf('Job %s is in state "%s" so it cannot be started.', $this->job->key, $this->job->status)); + if ('configured' !== $this->getStatus()) { + Log::error(sprintf('Job %s is in state "%s" so it cannot be started.', $this->job->key, $this->getStatus())); return false; } set_time_limit(0); Log::info(sprintf('Start with import job %s', $this->job->key)); + // total steps: 6 + $this->setTotalSteps(6); + $importObjects = $this->getImportObjects(); $this->lines = $importObjects->count(); + $this->addStep(); + + // total steps can now be extended. File has been scanned. 7 steps per line: + $this->addTotalSteps(7 * $this->lines); // once done, use storage thing to actually store them: Log::info(sprintf('Returned %d valid objects from file processor', $this->lines)); $storage = $this->storeObjects($importObjects); + $this->addStep(); Log::debug('Back in run()'); - // update job: - $this->job->status = 'finished'; - $this->job->save(); + Log::debug('Updated job...'); Log::debug(sprintf('%d journals in $storage->journals', $storage->journals->count())); @@ -114,6 +124,10 @@ class FileRoutine implements RoutineInterface // create tag, link tag to all journals: $this->createImportTag(); + $this->addStep(); + + // update job: + $this->setStatus('finished'); Log::info(sprintf('Done with import job %s', $this->job->key)); @@ -125,7 +139,9 @@ class FileRoutine implements RoutineInterface */ public function setJob(ImportJob $job) { - $this->job = $job; + $this->job = $job; + $this->repository = app(ImportJobRepositoryInterface::class); + $this->repository->setUser($job->user); } /** @@ -134,18 +150,16 @@ class FileRoutine implements RoutineInterface protected function getImportObjects(): Collection { $objects = new Collection; - $config = $this->job->configuration; - $fileType = $config['file-type'] ?? 'csv'; + $fileType = $this->getConfig()['file-type'] ?? 'csv'; // will only respond to "file" $class = config(sprintf('import.options.file.processors.%s', $fileType)); /** @var FileProcessorInterface $processor */ $processor = app($class); $processor->setJob($this->job); - if ('configured' === $this->job->status) { + if ('configured' === $this->getStatus()) { // set job as "running"... - $this->job->status = 'running'; - $this->job->save(); + $this->setStatus('running'); Log::debug('Job is configured, start with run()'); $processor->run(); @@ -155,6 +169,14 @@ class FileRoutine implements RoutineInterface return $objects; } + /** + * Shorthand method. + */ + private function addStep() + { + $this->repository->addStepsDone($this->job, 1); + } + /** * */ @@ -167,11 +189,12 @@ class FileRoutine implements RoutineInterface return new Tag; } + $this->addTotalSteps($this->journals->count() + 2); /** @var TagRepositoryInterface $repository */ $repository = app(TagRepositoryInterface::class); $repository->setUser($this->job->user); - $data = [ + $data = [ 'tag' => trans('import.import_with_key', ['key' => $this->job->key]), 'date' => new Carbon, 'description' => null, @@ -180,11 +203,11 @@ class FileRoutine implements RoutineInterface 'zoomLevel' => null, 'tagMode' => 'nothing', ]; - $tag = $repository->store($data); - $extended = $this->job->extended_status; - $extended['tag'] = $tag->id; - $this->job->extended_status = $extended; - $this->job->save(); + $tag = $repository->store($data); + $this->addStep(); + $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...'); @@ -193,12 +216,81 @@ class FileRoutine implements RoutineInterface foreach ($journalIds as $journalId) { Log::debug(sprintf('Linking journal #%d to tag #%d...', $journalId, $tagId)); DB::table('tag_transaction_journal')->insert(['transaction_journal_id' => $journalId, 'tag_id' => $tagId]); + $this->addStep(); } Log::info(sprintf('Linked %d journals to tag #%d ("%s")', $this->journals->count(), $tag->id, $tag->tag)); - + $this->addStep(); return $tag; } + /** + * Shorthand method + * + * @return array + */ + private function getConfig(): array + { + return $this->repository->getConfiguration($this->job); + } + + /** + * @return array + */ + private function getExtendedStatus(): array + { + return $this->repository->getExtendedStatus($this->job); + } + + /** + * Shorthand method. + * + * @return string + */ + private function getStatus(): string + { + return $this->repository->getStatus($this->job); + } + + /** + * @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); + } + + /** + * Shorthand + * + * @param int $steps + */ + private function setTotalSteps(int $steps) + { + $this->repository->setTotalSteps($this->job, $steps); + } + + /** + * Shorthand + * + * @param int $steps + */ + private function addTotalSteps(int $steps) + { + $this->repository->addTotalSteps($this->job, $steps); + } + /** * @param Collection $objects * @@ -206,9 +298,10 @@ class FileRoutine implements RoutineInterface */ private function storeObjects(Collection $objects): ImportStorage { + $config = $this->getConfig(); $storage = new ImportStorage; $storage->setJob($this->job); - $storage->setDateFormat($this->job->configuration['date-format']); + $storage->setDateFormat($config['date-format']); $storage->setObjects($objects); $storage->store(); Log::info('Back in storeObjects()'); diff --git a/app/Import/Routine/SpectreRoutine.php b/app/Import/Routine/SpectreRoutine.php index 993983e062..dfc29781bb 100644 --- a/app/Import/Routine/SpectreRoutine.php +++ b/app/Import/Routine/SpectreRoutine.php @@ -22,15 +22,21 @@ declare(strict_types=1); namespace FireflyIII\Import\Routine; +use Carbon\Carbon; +use DB; use FireflyIII\Exceptions\FireflyException; +use FireflyIII\Import\Object\ImportJournal; +use FireflyIII\Import\Storage\ImportStorage; use FireflyIII\Models\ImportJob; use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; +use FireflyIII\Repositories\Tag\TagRepositoryInterface; use FireflyIII\Services\Spectre\Exception\DuplicatedCustomerException; use FireflyIII\Services\Spectre\Exception\SpectreException; use FireflyIII\Services\Spectre\Object\Account; use FireflyIII\Services\Spectre\Object\Customer; use FireflyIII\Services\Spectre\Object\Login; use FireflyIII\Services\Spectre\Object\Token; +use FireflyIII\Services\Spectre\Object\Transaction; use FireflyIII\Services\Spectre\Request\CreateTokenRequest; use FireflyIII\Services\Spectre\Request\ListAccountsRequest; use FireflyIII\Services\Spectre\Request\ListCustomersRequest; @@ -116,15 +122,14 @@ class SpectreRoutine implements RoutineInterface */ public function run(): bool { - if ('configured' === $this->job->status) { + if ('configured' === $this->getStatus()) { $this->repository->updateStatus($this->job, 'running'); } Log::info(sprintf('Start with import job %s using Spectre.', $this->job->key)); set_time_limit(0); // check if job has token first! - $config = $this->job->configuration; - $stage = $config['stage']; + $stage = $this->getConfig()['stage'] ?? 'unknown'; switch ($stage) { case 'initial': @@ -144,10 +149,7 @@ class SpectreRoutine implements RoutineInterface throw new FireflyException(sprintf('Cannot handle stage %s', $stage)); } - var_dump($config); - exit; - - throw new FireflyException('Application cannot handle this.'); + return true; } /** @@ -189,6 +191,7 @@ class SpectreRoutine implements RoutineInterface } } + Preferences::setForUser($this->job->user, 'spectre_customer', $customer->toArray()); return $customer; @@ -202,21 +205,20 @@ class SpectreRoutine implements RoutineInterface */ protected function getCustomer(): Customer { - $config = $this->job->configuration; + $config = $this->getConfig(); if (!is_null($config['customer'])) { $customer = new Customer($config['customer']); return $customer; } - $customer = $this->createCustomer(); - $config['customer'] = [ + $customer = $this->createCustomer(); + $config['customer'] = [ 'id' => $customer->getId(), 'identifier' => $customer->getIdentifier(), 'secret' => $customer->getSecret(), ]; - $this->job->configuration = $config; - $this->job->save(); + $this->setConfig($config); return $customer; } @@ -259,20 +261,20 @@ class SpectreRoutine implements RoutineInterface Log::debug(sprintf('Token is %s', $token->getToken())); // update job, give it the token: - $config = $this->job->configuration; - $config['has-token'] = true; - $config['token'] = $token->getToken(); - $config['token-expires'] = $token->getExpiresAt()->format('U'); - $config['token-url'] = $token->getConnectUrl(); - $config['stage'] = 'has-token'; - $this->job->configuration = $config; + $config = $this->getConfig(); + $config['has-token'] = true; + $config['token'] = $token->getToken(); + $config['token-expires'] = $token->getExpiresAt()->format('U'); + $config['token-url'] = $token->getConnectUrl(); + $config['stage'] = 'has-token'; + $this->setConfig($config); Log::debug('Job config is now', $config); // update job, set status to "configuring". - $this->job->status = 'configuring'; - $this->job->save(); + $this->setStatus('configuring'); Log::debug(sprintf('Job status is now %s', $this->job->status)); + $this->addStep(); } /** @@ -287,6 +289,7 @@ class SpectreRoutine implements RoutineInterface $request = new ListLoginsRequest($this->job->user); $request->setCustomer($customer); $request->call(); + $logins = $request->getLogins(); /** @var Login $final */ $final = null; @@ -302,8 +305,13 @@ class SpectreRoutine implements RoutineInterface } } if (is_null($final)) { - throw new FireflyException('No valid login attempt found.'); + Log::error('Could not find a valid login for this user.'); + $this->repository->addError($this->job, 0, 'Spectre connection failed. Did you use invalid credentials, press Cancel or failed the 2FA challenge?'); + $this->repository->setStatus($this->job, 'error'); + + return; } + $this->addStep(); // list the users accounts using this login. $accountRequest = new ListAccountsRequest($this->job->user); @@ -319,45 +327,266 @@ class SpectreRoutine implements RoutineInterface } // update job: - $config = $this->job->configuration; - $config['accounts'] = $all; - $config['login'] = $login->toArray(); - $config['stage'] = 'have-accounts'; - $this->job->configuration = $config; - $this->job->status = 'configuring'; - $this->job->save(); + $config = $this->getConfig(); + $config['accounts'] = $all; + $config['login'] = $login->toArray(); + $config['stage'] = 'have-accounts'; + + $this->setConfig($config); + $this->setStatus('configuring'); + $this->addStep(); return; } /** + * Shorthand method. + */ + private function addStep() + { + $this->repository->addStepsDone($this->job, 1); + } + + /** + * Shorthand * + * @param int $steps + */ + private function addTotalSteps(int $steps) + { + $this->repository->addTotalSteps($this->job, $steps); + } + + /** + * @return array + */ + private function getConfig(): array + { + return $this->repository->getConfiguration($this->job); + } + + /** + * Shorthand method. + * + * @return array + */ + private function getExtendedStatus(): array + { + return $this->repository->getExtendedStatus($this->job); + } + + /** + * Shorthand method. + * + * @return string + */ + private function getStatus(): string + { + return $this->repository->getStatus($this->job); + } + + /** + * @param array $all + * + * @throws FireflyException + */ + private function importTransactions(array $all) + { + Log::debug('Going to import transactions'); + $collection = new Collection; + // create import objects? + foreach ($all as $accountId => $data) { + Log::debug(sprintf('Now at account #%d', $accountId)); + /** @var Transaction $transaction */ + foreach ($data['transactions'] as $transaction) { + Log::debug(sprintf('Now at transaction #%d', $transaction->getId())); + /** @var Account $account */ + $account = $data['account']; + $importJournal = new ImportJournal; + $importJournal->setUser($this->job->user); + $importJournal->asset->setDefaultAccountId($data['import_id']); + // call set value a bunch of times for various data entries: + $tags = []; + $tags[] = $transaction->getMode(); + $tags[] = $transaction->getStatus(); + if ($transaction->isDuplicated()) { + $tags[] = 'possibly-duplicated'; + } + $extra = $transaction->getExtra()->toArray(); + $notes = ''; + $notes .= strval(trans('import.imported_from_account', ['account' => $account->getName()])) . ' ' + . "\n"; // double space for newline in Markdown. + + foreach ($extra as $key => $value) { + switch ($key) { + case 'account_number': + $importJournal->setValue(['role' => 'account-number', 'value' => $value]); + break; + case 'original_category': + case 'original_subcategory': + case 'customer_category_code': + case 'customer_category_name': + $tags[] = $value; + break; + case 'payee': + $importJournal->setValue(['role' => 'opposing-name', 'value' => $value]); + break; + case 'original_amount': + $importJournal->setValue(['role' => 'amount_foreign', 'value' => $value]); + break; + case 'original_currency_code': + $importJournal->setValue(['role' => 'foreign-currency-code', 'value' => $value]); + break; + default: + $notes .= $key . ': ' . $value . ' '; // for newline in Markdown. + } + } + // hash + $importJournal->setHash($transaction->getHash()); + + // account ID (Firefly III account): + $importJournal->setValue(['role' => 'account-id', 'value' => $data['import_id'], 'mapped' => $data['import_id']]); + + // description: + $importJournal->setValue(['role' => 'description', 'value' => $transaction->getDescription()]); + + // 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)]); + $collection->push($importJournal); + } + } + $this->addStep(); + Log::debug(sprintf('Going to try and store all %d them.', $collection->count())); + + $this->addTotalSteps(7 * $collection->count()); + // try to store them (seven steps per transaction) + $storage = new ImportStorage; + + $storage->setJob($this->job); + $storage->setDateFormat('Y-m-d\TH:i:sO'); + $storage->setObjects($collection); + $storage->store(); + Log::info('Back in importTransactions()'); + + // 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...'); + $journalIds = $storage->journals->pluck('id')->toArray(); + $tagId = $tag->id; + $this->addTotalSteps(count($journalIds)); + + foreach ($journalIds as $journalId) { + Log::debug(sprintf('Linking journal #%d to tag #%d...', $journalId, $tagId)); + DB::table('tag_transaction_journal')->insert(['transaction_journal_id' => $journalId, 'tag_id' => $tagId]); + $this->addStep(); + } + Log::info(sprintf('Linked %d journals to tag #%d ("%s")', $storage->journals->count(), $tag->id, $tag->tag)); + + // set status to "finished"? + // update job: + $this->setStatus('finished'); + $this->addStep(); + + return; + } + + /** + * @throws FireflyException + * @throws SpectreException */ private function runStageHaveMapping() { - // for each spectre account id in 'account-mappings'. - // find FF account - // get transactions. - // import?! - $config = $this->job->configuration; + $config = $this->getConfig(); $accounts = $config['accounts'] ?? []; + $all = []; + $count = 0; /** @var array $accountArray */ foreach ($accounts as $accountArray) { $account = new Account($accountArray); $importId = intval($config['accounts-mapped'][$account->getid()] ?? 0); $doImport = $importId !== 0 ? true : false; if (!$doImport) { + Log::debug(sprintf('Will NOT import from Spectre account #%d ("%s")', $account->getId(), $account->getName())); continue; } - // import into account + // grab all transactions $listTransactionsRequest = new ListTransactionsRequest($this->job->user); $listTransactionsRequest->setAccount($account); $listTransactionsRequest->call(); - $transactions = $listTransactionsRequest->getTransactions(); - var_dump($transactions);exit; - + $transactions = $listTransactionsRequest->getTransactions(); + $all[$account->getId()] = [ + 'account' => $account, + 'import_id' => $importId, + 'transactions' => $transactions, + ]; + $count += count($transactions); } - var_dump($config); - exit; + Log::debug(sprintf('Total number of transactions: %d', $count)); + $this->addStep(); + + + $this->importTransactions($all); + } + + /** + * 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/Storage/ImportStorage.php b/app/Import/Storage/ImportStorage.php index a9ff0341d0..8990aab387 100644 --- a/app/Import/Storage/ImportStorage.php +++ b/app/Import/Storage/ImportStorage.php @@ -30,11 +30,22 @@ use FireflyIII\Models\ImportJob; use FireflyIII\Models\Note; use FireflyIII\Models\TransactionType; use FireflyIII\Repositories\Bill\BillRepositoryInterface; +use FireflyIII\Repositories\ImportJob\ImportJobRepositoryInterface; use Illuminate\Support\Collection; use Log; +use Preferences; /** * Is capable of storing individual ImportJournal objects. + * Adds 7 steps per object stored: + * 1. get all import data from import journal + * 2. is not a duplicate + * 3. create the journal + * 4. store journal + * 5. run rules + * 6. run bills + * 7. finished storing object + * * Class ImportStorage. */ class ImportStorage @@ -53,6 +64,8 @@ class ImportStorage protected $defaultCurrencyId = 1; /** @var ImportJob */ protected $job; + /** @var ImportJobRepositoryInterface */ + protected $repository; /** @var Collection */ protected $rules; /** @var bool */ @@ -63,6 +76,8 @@ class ImportStorage private $matchBills = false; /** @var Collection */ private $objects; + /** @var int */ + private $total = 0; /** @var array */ private $transfers = []; @@ -89,13 +104,17 @@ class ImportStorage */ public function setJob(ImportJob $job) { - $this->job = $job; - $currency = app('amount')->getDefaultCurrencyByUser($this->job->user); + $this->repository = app(ImportJobRepositoryInterface::class); + $this->repository->setUser($job->user); + + $config = $this->repository->getConfiguration($job); + $currency = app('amount')->getDefaultCurrencyByUser($job->user); $this->defaultCurrencyId = $currency->id; + $this->job = $job; $this->transfers = $this->getTransfers(); - $config = $job->configuration; $this->applyRules = $config['apply-rules'] ?? false; $this->matchBills = $config['match-bills'] ?? false; + if (true === $this->applyRules) { Log::debug('applyRules seems to be true, get the rules.'); $this->rules = $this->getRules(); @@ -108,6 +127,8 @@ 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))); + + } /** @@ -116,6 +137,7 @@ class ImportStorage public function setObjects(Collection $objects) { $this->objects = $objects; + $this->total = $objects->count(); } /** @@ -129,6 +151,7 @@ class ImportStorage function (ImportJournal $importJournal, int $index) { try { $this->storeImportJournal($index, $importJournal); + $this->addStep(); } catch (FireflyException | ErrorException | Exception $e) { $this->errors->push($e->getMessage()); Log::error(sprintf('Cannot import row #%d because: %s', $index, $e->getMessage())); @@ -150,7 +173,7 @@ class ImportStorage */ protected function storeImportJournal(int $index, ImportJournal $importJournal): bool { - Log::debug(sprintf('Going to store object #%d with description "%s"', $index, $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(); $currencyId = $this->getCurrencyId($importJournal); @@ -159,9 +182,7 @@ class ImportStorage $opposingAccount = $this->getOpposingAccount($importJournal->opposing, $assetAccount->id, $amount); $transactionType = $this->getTransactionType($amount, $opposingAccount); $description = $importJournal->getDescription(); - - // First step done! - $this->job->addStepsDone(1); + $this->addStep(); /** * Check for double transfer. @@ -175,13 +196,17 @@ class ImportStorage 'opposing' => $opposingAccount->name, ]; if ($this->isDoubleTransfer($parameters) || $this->hashAlreadyImported($importJournal->hash)) { - $this->job->addStepsDone(3); // throw error $message = sprintf('Detected a possible duplicate, skip this one (hash: %s).', $importJournal->hash); Log::error($message, $parameters); + + // add five steps to keep the pace: + $this->addSteps(5); + throw new FireflyException($message); } unset($parameters); + $this->addStep(); // store journal and create transactions: $parameters = [ @@ -197,9 +222,7 @@ class ImportStorage ]; $journal = $this->storeJournal($parameters); unset($parameters); - - // Another step done! - $this->job->addStepsDone(1); + $this->addStep(); // store meta object things: $this->storeCategory($journal, $importJournal->category->getCategory()); @@ -221,31 +244,31 @@ class ImportStorage // set journal completed: $journal->completed = true; $journal->save(); - - // Another step done! - $this->job->addStepsDone(1); + $this->addStep(); // run rules if config calls for it: if (true === $this->applyRules) { Log::info('Will apply rules to this journal.'); $this->applyRules($journal); } + Preferences::setForUser($this->job->user, 'lastActivity', microtime()); + if (!(true === $this->applyRules)) { Log::info('Will NOT apply rules to this journal.'); } + $this->addStep(); // match bills if config calls for it. if (true === $this->matchBills) { - Log::info('Cannot match bills (yet).'); + Log::info('Will match bills.'); $this->matchBills($journal); } if (!(true === $this->matchBills)) { Log::info('Cannot match bills (yet), but do not have to.'); } + $this->addStep(); - // Another step done! - $this->job->addStepsDone(1); $this->journals->push($journal); Log::info(sprintf('Imported new journal #%d: "%s", amount %s %s.', $journal->id, $journal->description, $journal->transactionCurrency->code, $amount)); @@ -253,6 +276,24 @@ class ImportStorage return true; } + /** + * Shorthand method. + */ + private function addStep() + { + $this->repository->addStepsDone($this->job, 1); + } + + /** + * Shorthand method + * + * @param int $steps + */ + private function addSteps(int $steps) + { + $this->repository->addStepsDone($this->job, $steps); + } + /** * @param array $parameters * @@ -269,7 +310,6 @@ class ImportStorage $amount = app('steam')->positive($parameters['amount']); $names = [$parameters['asset'], $parameters['opposing']]; - $transfer = []; sort($names); diff --git a/app/Import/Storage/ImportSupport.php b/app/Import/Storage/ImportSupport.php index 94fe0d0188..2861dc9f6a 100644 --- a/app/Import/Storage/ImportSupport.php +++ b/app/Import/Storage/ImportSupport.php @@ -121,11 +121,11 @@ trait ImportSupport { $transaction = new Transaction; $transaction->account_id = $parameters['account']; - $transaction->transaction_journal_id = $parameters['id']; - $transaction->transaction_currency_id = $parameters['currency']; + $transaction->transaction_journal_id = intval($parameters['id']); + $transaction->transaction_currency_id = intval($parameters['currency']); $transaction->amount = $parameters['amount']; - $transaction->foreign_currency_id = $parameters['foreign_currency']; - $transaction->foreign_amount = $parameters['foreign_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()); @@ -155,6 +155,7 @@ trait ImportSupport * @param ImportJournal $importJournal * * @return int + * @throws FireflyException */ private function getCurrencyId(ImportJournal $importJournal): int { @@ -192,7 +193,7 @@ trait ImportSupport { // use given currency by import journal. $currency = $importJournal->currency->getTransactionCurrency(); - if (null !== $currency->id && $currency->id !== $currencyId) { + if (null !== $currency->id && intval($currency->id) !== intval($currencyId)) { return $currency->id; } @@ -216,6 +217,7 @@ trait ImportSupport * @see ImportSupport::getTransactionType * * @return Account + * @throws FireflyException */ private function getOpposingAccount(ImportAccount $account, int $forbiddenAccount, string $amount): Account { @@ -435,8 +437,6 @@ trait ImportSupport if (!$journal->save()) { $errorText = join(', ', $journal->getErrors()->all()); - // add three steps: - $this->job->addStepsDone(3); // throw error throw new FireflyException($errorText); } diff --git a/app/Models/Account.php b/app/Models/Account.php index b04ec43d8e..81ad0d8016 100644 --- a/app/Models/Account.php +++ b/app/Models/Account.php @@ -212,7 +212,7 @@ class Account extends Model * * @return string */ - public function getNameAttribute($value): string + public function getNameAttribute($value): ?string { if ($this->encrypted) { return Crypt::decrypt($value); diff --git a/app/Models/ExportJob.php b/app/Models/ExportJob.php index 1c019919e6..629d212b18 100644 --- a/app/Models/ExportJob.php +++ b/app/Models/ExportJob.php @@ -30,6 +30,7 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; * Class ExportJob. * * @property User $user + * @property string $key */ class ExportJob extends Model { diff --git a/app/Models/ImportJob.php b/app/Models/ImportJob.php index 7dd51ff571..9ad55c7c31 100644 --- a/app/Models/ImportJob.php +++ b/app/Models/ImportJob.php @@ -82,32 +82,6 @@ class ImportJob extends Model throw new NotFoundHttpException; } - /** - * @param int $index - * @param string $message - * - * @return bool - */ - public function addError(int $index, string $message): bool - { - $extended = $this->extended_status; - $extended['errors'][$index][] = $message; - $this->extended_status = $extended; - - return true; - } - - /** - * @param int $count - */ - public function addStepsDone(int $count) - { - $status = $this->extended_status; - $status['done'] += $count; - $this->extended_status = $status; - $this->save(); - } - /** * @param int $count */ @@ -117,6 +91,7 @@ class ImportJob extends Model $status['steps'] += $count; $this->extended_status = $status; $this->save(); + Log::debug(sprintf('Add %d to total steps for job "%s" making total steps %d', $count, $this->key, $status['steps'])); } /** diff --git a/app/Models/PiggyBank.php b/app/Models/PiggyBank.php index 51904e9f9d..2140c33b8b 100644 --- a/app/Models/PiggyBank.php +++ b/app/Models/PiggyBank.php @@ -158,7 +158,7 @@ class PiggyBank extends Model public function leftOnAccount(Carbon $date): string { $balance = Steam::balanceIgnoreVirtual($this->account, $date); - // @var PiggyBank $p + /** @var PiggyBank $piggyBank */ foreach ($this->account->piggyBanks as $piggyBank) { $currentAmount = $piggyBank->currentRelevantRep()->currentamount ?? '0'; diff --git a/app/Models/Transaction.php b/app/Models/Transaction.php index 35d388ad99..0ac3df916e 100644 --- a/app/Models/Transaction.php +++ b/app/Models/Transaction.php @@ -66,6 +66,7 @@ use Watson\Validating\ValidatingTrait; * @property string $transaction_currency_symbol * @property int $transaction_currency_dp * @property string $transaction_currency_code + * @property string $description */ class Transaction extends Model { diff --git a/app/Models/TransactionCurrency.php b/app/Models/TransactionCurrency.php index 708fc36217..304b45487f 100644 --- a/app/Models/TransactionCurrency.php +++ b/app/Models/TransactionCurrency.php @@ -28,6 +28,9 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; /** * Class TransactionCurrency. + * + * @property string $code + * */ class TransactionCurrency extends Model { diff --git a/app/Models/TransactionJournal.php b/app/Models/TransactionJournal.php index 74fc1fd07a..12408be513 100644 --- a/app/Models/TransactionJournal.php +++ b/app/Models/TransactionJournal.php @@ -92,8 +92,6 @@ class TransactionJournal extends Model if (auth()->check()) { $journalId = intval($value); $journal = auth()->user()->transactionJournals()->where('transaction_journals.id', $journalId) - ->with('transactionType') - ->leftJoin('transaction_types', 'transaction_types.id', '=', 'transaction_journals.transaction_type_id') ->first(['transaction_journals.*']); if (!is_null($journal)) { return $journal; diff --git a/app/Models/TransactionJournalLink.php b/app/Models/TransactionJournalLink.php index 36ec286341..8d216cc8ae 100644 --- a/app/Models/TransactionJournalLink.php +++ b/app/Models/TransactionJournalLink.php @@ -95,6 +95,15 @@ class TransactionJournalLink extends Model return $this->belongsTo(LinkType::class); } + /** + * @codeCoverageIgnore + * Get all of the notes. + */ + public function notes() + { + return $this->morphMany(Note::class, 'noteable'); + } + /** * @codeCoverageIgnore * diff --git a/app/Repositories/Account/AccountRepository.php b/app/Repositories/Account/AccountRepository.php index 328cfc21e7..36ca48e872 100644 --- a/app/Repositories/Account/AccountRepository.php +++ b/app/Repositories/Account/AccountRepository.php @@ -699,6 +699,7 @@ class AccountRepository implements AccountRepositoryInterface return null; } + return $iban; } } diff --git a/app/Repositories/Budget/BudgetRepository.php b/app/Repositories/Budget/BudgetRepository.php index ed65e673ad..e448182f7e 100644 --- a/app/Repositories/Budget/BudgetRepository.php +++ b/app/Repositories/Budget/BudgetRepository.php @@ -67,8 +67,11 @@ class BudgetRepository implements BudgetRepositoryInterface if ($entry->ct > 1) { $newest = BudgetLimit::where('start_date', $entry->start_date)->where('end_date', $entry->end_date) ->where('budget_id', $entry->budget_id)->orderBy('updated_at', 'DESC')->first(['budget_limits.*']); - BudgetLimit::where('start_date', $entry->start_date)->where('end_date', $entry->end_date) - ->where('budget_id', $entry->budget_id)->where('id', '!=', $newest->id)->delete(); + if (!is_null($newest)) { + BudgetLimit::where('start_date', $entry->start_date)->where('end_date', $entry->end_date) + ->where('budget_id', $entry->budget_id) + ->where('id', '!=', $newest->id)->delete(); + } } } diff --git a/app/Repositories/ImportJob/ImportJobRepository.php b/app/Repositories/ImportJob/ImportJobRepository.php index 7300ee4bc2..722bb1b1f9 100644 --- a/app/Repositories/ImportJob/ImportJobRepository.php +++ b/app/Repositories/ImportJob/ImportJobRepository.php @@ -42,6 +42,21 @@ class ImportJobRepository implements ImportJobRepositoryInterface /** @var User */ private $user; + /** + * @param ImportJob $job + * @param int $index + * @param string $error + * + * @return ImportJob + */ + public function addError(ImportJob $job, int $index, string $error): ImportJob + { + $extended = $this->getExtendedStatus($job); + $extended['errors'][$index][] = $error; + + return $this->setExtendedStatus($job, $extended); + } + /** * @param ImportJob $job * @param int $steps @@ -50,9 +65,28 @@ class ImportJobRepository implements ImportJobRepositoryInterface */ public function addStepsDone(ImportJob $job, int $steps = 1): ImportJob { - $job->addStepsDone($steps); + $status = $this->getExtendedStatus($job); + $status['done'] += $steps; + Log::debug(sprintf('Add %d to steps done for job "%s" making steps done %d', $steps, $job->key, $status['done'])); + + return $this->setExtendedStatus($job, $status); + } + + /** + * @param ImportJob $job + * @param int $steps + * + * @return ImportJob + */ + public function addTotalSteps(ImportJob $job, int $steps = 1): ImportJob + { + $extended = $this->getExtendedStatus($job); + $total = $extended['steps'] ?? 0; + $total += $steps; + $extended['steps'] = $total; + + return $this->setExtendedStatus($job, $extended); - return $job; } /** @@ -161,6 +195,16 @@ class ImportJobRepository implements ImportJobRepositoryInterface return []; } + /** + * @param ImportJob $job + * + * @return string + */ + public function getStatus(ImportJob $job): string + { + return $job->status; + } + /** * @param ImportJob $job * @param UploadedFile $file @@ -277,6 +321,50 @@ class ImportJobRepository implements ImportJobRepositoryInterface return $job; } + /** + * @param ImportJob $job + * @param string $status + * + * @return ImportJob + */ + public function setStatus(ImportJob $job, string $status): ImportJob + { + $job->status = $status; + $job->save(); + + return $job; + } + + /** + * @param ImportJob $job + * @param int $steps + * + * @return ImportJob + */ + public function setStepsDone(ImportJob $job, int $steps): ImportJob + { + $status = $this->getExtendedStatus($job); + $status['done'] = $steps; + Log::debug(sprintf('Set steps done for job "%s" to %d', $job->key, $steps)); + + return $this->setExtendedStatus($job, $status); + } + + /** + * @param ImportJob $job + * @param int $count + * + * @return ImportJob + */ + public function setTotalSteps(ImportJob $job, int $count): ImportJob + { + $status = $this->getExtendedStatus($job); + $status['steps'] = $count; + Log::debug(sprintf('Set total steps for job "%s" to %d', $job->key, $count)); + + return $this->setExtendedStatus($job, $status); + } + /** * @param User $user */ diff --git a/app/Repositories/ImportJob/ImportJobRepositoryInterface.php b/app/Repositories/ImportJob/ImportJobRepositoryInterface.php index 658befe70a..2c0efe97f2 100644 --- a/app/Repositories/ImportJob/ImportJobRepositoryInterface.php +++ b/app/Repositories/ImportJob/ImportJobRepositoryInterface.php @@ -31,6 +31,16 @@ use Symfony\Component\HttpFoundation\File\UploadedFile; */ interface ImportJobRepositoryInterface { + + /** + * @param ImportJob $job + * @param int $index + * @param string $error + * + * @return ImportJob + */ + public function addError(ImportJob $job, int $index, string $error): ImportJob; + /** * @param ImportJob $job * @param int $steps @@ -39,6 +49,14 @@ interface ImportJobRepositoryInterface */ public function addStepsDone(ImportJob $job, int $steps = 1): ImportJob; + /** + * @param ImportJob $job + * @param int $steps + * + * @return ImportJob + */ + public function addTotalSteps(ImportJob $job, int $steps = 1): ImportJob; + /** * Return number of imported rows with this hash value. * @@ -80,6 +98,13 @@ interface ImportJobRepositoryInterface */ public function getExtendedStatus(ImportJob $job): array; + /** + * @param ImportJob $job + * + * @return string + */ + public function getStatus(ImportJob $job); + /** * @param ImportJob $job * @param UploadedFile $file @@ -112,6 +137,30 @@ interface ImportJobRepositoryInterface */ public function setExtendedStatus(ImportJob $job, array $array): ImportJob; + /** + * @param ImportJob $job + * @param string $status + * + * @return ImportJob + */ + public function setStatus(ImportJob $job, string $status): ImportJob; + + /** + * @param ImportJob $job + * @param int $count + * + * @return ImportJob + */ + public function setStepsDone(ImportJob $job, int $steps): ImportJob; + + /** + * @param ImportJob $job + * @param int $count + * + * @return ImportJob + */ + public function setTotalSteps(ImportJob $job, int $count): ImportJob; + /** * @param User $user */ diff --git a/app/Repositories/Journal/JournalTasker.php b/app/Repositories/Journal/JournalTasker.php index b70c575dce..b51181fdf4 100644 --- a/app/Repositories/Journal/JournalTasker.php +++ b/app/Repositories/Journal/JournalTasker.php @@ -27,7 +27,6 @@ use FireflyIII\Models\AccountType; use FireflyIII\Models\PiggyBankEvent; use FireflyIII\Models\Transaction; use FireflyIII\Models\TransactionJournal; -use FireflyIII\Support\SingleCacheProperties; use FireflyIII\User; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Query\JoinClause; @@ -70,14 +69,6 @@ class JournalTasker implements JournalTaskerInterface */ public function getTransactionsOverview(TransactionJournal $journal): array { - $cache = new SingleCacheProperties; - $cache->addProperty('transaction-overview'); - $cache->addProperty($journal->id); - $cache->addProperty($journal->updated_at); - if ($cache->has()) { - return $cache->get(); - } - // get all transaction data + the opposite site in one list. $set = $journal ->transactions()// "source" ->leftJoin( @@ -177,7 +168,6 @@ class JournalTasker implements JournalTaskerInterface $transactions[] = $transaction; } - $cache->store($transactions); return $transactions; } diff --git a/app/Repositories/LinkType/LinkTypeRepository.php b/app/Repositories/LinkType/LinkTypeRepository.php index 0e9c7acf8e..2d47f0964e 100644 --- a/app/Repositories/LinkType/LinkTypeRepository.php +++ b/app/Repositories/LinkType/LinkTypeRepository.php @@ -24,6 +24,7 @@ namespace FireflyIII\Repositories\LinkType; use FireflyIII\Exceptions\FireflyException; use FireflyIII\Models\LinkType; +use FireflyIII\Models\Note; use FireflyIII\Models\TransactionJournal; use FireflyIII\Models\TransactionJournalLink; use FireflyIII\User; @@ -188,10 +189,19 @@ class LinkTypeRepository implements LinkTypeRepositoryInterface $link->source()->associate($right); $link->destination()->associate($left); } - - $link->comment = $link['comments'] ?? null; $link->save(); + // make note in noteable: + if (strlen($information['notes']) > 0) { + $dbNote = $link->notes()->first(); + if (null === $dbNote) { + $dbNote = new Note(); + $dbNote->noteable()->associate($link); + } + $dbNote->text = trim($information['notes']); + $dbNote->save(); + } + return $link; } diff --git a/app/Repositories/Tag/TagRepository.php b/app/Repositories/Tag/TagRepository.php index 9d18a137cb..901d43221c 100644 --- a/app/Repositories/Tag/TagRepository.php +++ b/app/Repositories/Tag/TagRepository.php @@ -126,7 +126,7 @@ class TagRepository implements TagRepositoryInterface public function findByTag(string $tag): Tag { $tags = $this->user->tags()->get(); - // @var Tag $tag + /** @var Tag $databaseTag */ foreach ($tags as $databaseTag) { if ($databaseTag->tag === $tag) { return $databaseTag; diff --git a/app/Repositories/User/UserRepository.php b/app/Repositories/User/UserRepository.php index 5f7c793f15..b69f13381d 100644 --- a/app/Repositories/User/UserRepository.php +++ b/app/Repositories/User/UserRepository.php @@ -128,6 +128,18 @@ class UserRepository implements UserRepositoryInterface return $this->all()->count(); } + /** + * @param string $name + * @param string $displayName + * @param string $description + * + * @return Role + */ + public function createRole(string $name, string $displayName, string $description): Role + { + return Role::create(['name' => $name, 'display_name' => $displayName, 'description' => $description]); + } + /** * @param User $user * @@ -178,6 +190,16 @@ class UserRepository implements UserRepositoryInterface return User::first(); } + /** + * @param string $role + * + * @return Role|null + */ + public function getRole(string $role): ?Role + { + return Role::where('name', $role)->first(); + } + /** * Return basic user information. * @@ -215,8 +237,8 @@ class UserRepository implements UserRepositoryInterface ->where('budgets.user_id', $user->id)->get(['budget_limits.budget_id'])->count(); $return['export_jobs'] = $user->exportJobs()->count(); $return['export_jobs_success'] = $user->exportJobs()->where('status', 'export_downloaded')->count(); - $return['import_jobs'] = $user->exportJobs()->count(); - $return['import_jobs_success'] = $user->exportJobs()->where('status', 'import_complete')->count(); + $return['import_jobs'] = $user->importJobs()->count(); + $return['import_jobs_success'] = $user->importJobs()->where('status', 'finished')->count(); $return['rule_groups'] = $user->ruleGroups()->count(); $return['rules'] = $user->rules()->count(); $return['tags'] = $user->tags()->count(); diff --git a/app/Repositories/User/UserRepositoryInterface.php b/app/Repositories/User/UserRepositoryInterface.php index f3a76efcd4..13568f754b 100644 --- a/app/Repositories/User/UserRepositoryInterface.php +++ b/app/Repositories/User/UserRepositoryInterface.php @@ -22,6 +22,7 @@ declare(strict_types=1); namespace FireflyIII\Repositories\User; +use FireflyIII\Models\Role; use FireflyIII\User; use Illuminate\Support\Collection; @@ -30,6 +31,15 @@ use Illuminate\Support\Collection; */ interface UserRepositoryInterface { + + /** + * @param string $name + * @param string $displayName + * @param string $description + * + * @return Role + */ + public function createRole(string $name, string $displayName, string $description): Role; /** * Returns a collection of all users. * @@ -37,6 +47,13 @@ interface UserRepositoryInterface */ public function all(): Collection; + /** + * @param string $role + * + * @return Role|null + */ + public function getRole(string $role): ?Role; + /** * Gives a user a role. * diff --git a/app/Services/Spectre/Object/Account.php b/app/Services/Spectre/Object/Account.php index 92f01ed6c3..d904b119c4 100644 --- a/app/Services/Spectre/Object/Account.php +++ b/app/Services/Spectre/Object/Account.php @@ -78,6 +78,14 @@ class Account extends SpectreObject return $this->id; } + /** + * @return string + */ + public function getName(): string + { + return $this->name; + } + /** * @return array */ diff --git a/app/Services/Spectre/Object/Transaction.php b/app/Services/Spectre/Object/Transaction.php index 23c8633a91..5aa7cd5052 100644 --- a/app/Services/Spectre/Object/Transaction.php +++ b/app/Services/Spectre/Object/Transaction.php @@ -23,19 +23,167 @@ declare(strict_types=1); namespace FireflyIII\Services\Spectre\Object; +use Carbon\Carbon; + /** * Class Transaction */ class Transaction extends SpectreObject { + /** @var int */ + private $accountId; + /** @var string */ + private $amount; + /** @var string */ + private $category; + /** @var Carbon */ + private $createdAt; + /** @var string */ + private $currencyCode; + /** @var string */ + private $description; + /** @var bool */ + private $duplicated; + /** @var TransactionExtra */ + private $extra; + /** @var int */ + private $id; + /** @var Carbon */ + private $madeOn; + /** @var string */ + private $mode; + /** @var string */ + private $status; + /** @var Carbon */ + private $updatedAt; + + /** + * @return int + */ + public function getId(): int + { + return $this->id; + } + /** * Transaction constructor. * * @param array $data */ - public function __construct(array $data) { - var_dump($data); - exit; + public function __construct(array $data) + { + $this->id = $data['id']; + $this->mode = $data['mode']; + $this->status = $data['status']; + $this->madeOn = new Carbon($data['made_on']); + $this->amount = $data['amount']; + $this->currencyCode = $data['currency_code']; + $this->description = $data['description']; + $this->category = $data['category']; + $this->duplicated = $data['duplicated']; + $this->extra = new TransactionExtra($data['extra'] ?? []); + $this->accountId = $data['account_id']; + $this->createdAt = new Carbon($data['created_at']); + $this->updatedAt = new Carbon($data['updated_at']); } + /** + * @return string + */ + public function getMode(): string + { + return $this->mode; + } + + /** + * @return string + */ + public function getStatus(): string + { + return $this->status; + } + + /** + * @return bool + */ + public function isDuplicated(): bool + { + return $this->duplicated; + } + + /** + * @return TransactionExtra + */ + public function getExtra(): TransactionExtra + { + return $this->extra; + } + + + /** + * @return string + */ + public function getAmount(): string + { + return strval($this->amount); + } + + /** + * @return string + */ + public function getCategory(): string + { + return $this->category; + } + + /** + * @return string + */ + public function getCurrencyCode(): string + { + return $this->currencyCode; + } + + /** + * @return string + */ + public function getDescription(): string + { + return $this->description; + } + + /** + * @return string + */ + public function getHash(): string + { + $array = [ + 'id' => $this->id, + 'mode' => $this->mode, + 'status' => $this->status, + 'made_on' => $this->madeOn->toIso8601String(), + 'amount' => $this->amount, + 'currency_code' => $this->currencyCode, + 'description' => $this->description, + 'category' => $this->category, + 'duplicated' => $this->duplicated, + 'extra' => $this->extra->toArray(), + 'account_id' => $this->accountId, + 'created_at' => $this->createdAt->toIso8601String(), + 'updated_at' => $this->updatedAt->toIso8601String(), + ]; + $hashed = hash('sha256', json_encode($array)); + + return $hashed; + } + + /** + * @return Carbon + */ + public function getMadeOn(): Carbon + { + return $this->madeOn; + } + + } \ No newline at end of file diff --git a/app/Services/Spectre/Object/TransactionExtra.php b/app/Services/Spectre/Object/TransactionExtra.php new file mode 100644 index 0000000000..6facc4af54 --- /dev/null +++ b/app/Services/Spectre/Object/TransactionExtra.php @@ -0,0 +1,169 @@ +. + */ + +declare(strict_types=1); + +namespace FireflyIII\Services\Spectre\Object; + +use Carbon\Carbon; + +/** + * Class TransactionExtra + */ +class TransactionExtra extends SpectreObject +{ + /** @var string */ + private $accountBalanceSnapshot; + /** @var string */ + private $accountNumber; + /** @var string */ + private $additional; + /** @var string */ + private $assetAmount; + /** @var string */ + private $assetCode; + /** @var string */ + private $categorizationConfidence; + /** @var string */ + private $checkNumber; + /** @var string */ + private $customerCategoryCode; + /** @var string */ + private $customerCategoryName; + /** @var string */ + private $id; + /** @var string */ + private $information; + /** @var string */ + private $mcc; + /** @var string */ + private $originalAmount; + /** @var string */ + private $originalCategory; + /** @var string */ + private $originalCurrencyCode; + /** @var string */ + private $originalSubCategory; + /** @var string */ + private $payee; + /** @var bool */ + private $possibleDuplicate; + /** @var Carbon */ + private $postingDate; + /** @var Carbon */ + private $postingTime; + /** @var string */ + private $recordNumber; + /** @var array */ + private $tags; + /** @var Carbon */ + private $time; + /** @var string */ + private $type; + /** @var string */ + private $unitPrice; + /** @var string */ + private $units; + + /** + * TransactionExtra constructor. + * + * @param array $data + */ + public function __construct(array $data) + { + $this->id = $data['id'] ?? null; + $this->recordNumber = $data['record_number'] ?? null; + $this->information = $data['information'] ?? null; + $this->time = isset($data['time']) ? new Carbon($data['time']) : null; + $this->postingDate = isset($data['posting_date']) ? new Carbon($data['posting_date']) : null; + $this->postingTime = isset($data['posting_time']) ? new Carbon($data['posting_time']) : null; + $this->accountNumber = $data['account_number'] ?? null; + $this->originalAmount = $data['original_amount'] ?? null; + $this->originalCurrencyCode = $data['original_currency_code'] ?? null; + $this->assetCode = $data['asset_code'] ?? null; + $this->assetAmount = $data['asset_amount'] ?? null; + $this->originalCategory = $data['original_category'] ?? null; + $this->originalSubCategory = $data['original_subcategory'] ?? null; + $this->customerCategoryCode = $data['customer_category_code'] ?? null; + $this->customerCategoryName = $data['customer_category_name'] ?? null; + $this->possibleDuplicate = $data['possible_duplicate'] ?? null; + $this->tags = $data['tags'] ?? null; + $this->mcc = $data['mcc'] ?? null; + $this->payee = $data['payee'] ?? null; + $this->type = $data['type'] ?? null; + $this->checkNumber = $data['check_number'] ?? null; + $this->units = $data['units'] ?? null; + $this->additional = $data['additional'] ?? null; + $this->unitPrice = $data['unit_price'] ?? null; + $this->accountBalanceSnapshot = $data['account_balance_snapshot'] ?? null; + $this->categorizationConfidence = $data['categorization_confidence'] ?? null; + } + + /** + * @return string|null + */ + public function getId(): ?string + { + return $this->id; + } + + /** + * @return array + */ + public function toArray(): array + { + + $array = [ + 'id' => $this->id, + 'record_number' => $this->recordNumber, + 'information' => $this->information, + 'time' => is_null($this->time) ? null : $this->time->toIso8601String(), + 'posting_date' => is_null($this->postingDate) ? null : $this->postingDate->toIso8601String(), + 'posting_time' => is_null($this->postingTime) ? null : $this->postingTime->toIso8601String(), + 'account_number' => $this->accountNumber, + 'original_amount' => $this->originalAmount, + 'original_currency_code' => $this->originalCurrencyCode, + 'asset_code' => $this->assetCode, + 'asset_amount' => $this->assetAmount, + 'original_category' => $this->originalCategory, + 'original_subcategory' => $this->originalSubCategory, + 'customer_category_code' => $this->customerCategoryCode, + 'customer_category_name' => $this->customerCategoryName, + 'possible_duplicate' => $this->possibleDuplicate, + 'tags' => $this->tags, + 'mcc' => $this->mcc, + 'payee' => $this->payee, + 'type' => $this->type, + 'check_number' => $this->checkNumber, + 'units' => $this->units, + 'additional' => $this->additional, + 'unit_price' => $this->unitPrice, + 'account_balance_snapshot' => $this->accountBalanceSnapshot, + 'categorization_confidence' => $this->categorizationConfidence, + ]; + + + return $array; + } + + +} \ No newline at end of file diff --git a/app/Services/Spectre/Request/ListTransactionsRequest.php b/app/Services/Spectre/Request/ListTransactionsRequest.php index 57f45f199a..bb03a2d2f1 100644 --- a/app/Services/Spectre/Request/ListTransactionsRequest.php +++ b/app/Services/Spectre/Request/ListTransactionsRequest.php @@ -23,9 +23,12 @@ declare(strict_types=1); namespace FireflyIII\Services\Spectre\Request; +use FireflyIII\Exceptions\FireflyException; +use FireflyIII\Services\Spectre\Exception\SpectreException; use FireflyIII\Services\Spectre\Object\Account; use FireflyIII\Services\Spectre\Object\Transaction; use Log; + /** * Class ListTransactionsRequest */ @@ -37,7 +40,8 @@ class ListTransactionsRequest extends SpectreRequest private $transactions = []; /** - * + * @throws FireflyException + * @throws SpectreException */ public function call(): void { @@ -45,7 +49,7 @@ class ListTransactionsRequest extends SpectreRequest $nextId = 0; while ($hasNextPage) { Log::debug(sprintf('Now calling ListTransactionsRequest for next_id %d', $nextId)); - $parameters = ['from_id' => $nextId,'account_id' => $this->account->getId()]; + $parameters = ['from_id' => $nextId, 'account_id' => $this->account->getId()]; $uri = '/api/v3/transactions?' . http_build_query($parameters); $response = $this->sendSignedSpectreGet($uri, []); @@ -59,7 +63,7 @@ class ListTransactionsRequest extends SpectreRequest $nextId = $response['meta']['next_id']; Log::debug(sprintf('Next ID is now %d.', $nextId)); } else { - Log::debug('No next page.'); + Log::debug('No next page, done with ListTransactionsRequest.'); } // store customers: diff --git a/app/Support/Binder/TagList.php b/app/Support/Binder/TagList.php index 60ec2f86dd..8cf851c9dc 100644 --- a/app/Support/Binder/TagList.php +++ b/app/Support/Binder/TagList.php @@ -45,7 +45,7 @@ class TagList implements BinderInterface $list = []; $incoming = explode(',', $value); foreach ($incoming as $entry) { - $list[] = trim($entry); + $list[] = strtolower(trim($entry)); } $list = array_unique($list); if (count($list) === 0) { @@ -57,7 +57,7 @@ class TagList implements BinderInterface $collection = $allTags->filter( function (Tag $tag) use ($list) { - return in_array($tag->tag, $list); + return in_array(strtolower($tag->tag), $list); } ); diff --git a/app/Support/Import/Configuration/File/Roles.php b/app/Support/Import/Configuration/File/Roles.php index 884e6bcdbd..e779582df2 100644 --- a/app/Support/Import/Configuration/File/Roles.php +++ b/app/Support/Import/Configuration/File/Roles.php @@ -143,14 +143,13 @@ class Roles implements ConfigurationInterface $this->saveConfig($config); $this->ignoreUnmappableColumns(); - $this->setRolesComplete(); - - $config = $this->getConfig(); - $config['stage'] = 'map'; - $this->saveConfig($config); - - $this->isMappingNecessary(); - + $res = $this->isRolesComplete(); + if ($res === true) { + $config = $this->getConfig(); + $config['stage'] = 'map'; + $this->saveConfig($config); + $this->isMappingNecessary(); + } return true; } @@ -225,6 +224,56 @@ class Roles implements ConfigurationInterface return true; } + /** + * @return bool + */ + private function isRolesComplete(): bool + { + $config = $this->getConfig(); + $count = $config['column-count']; + $assigned = 0; + + // check if data actually contains amount column (foreign amount does not count) + $hasAmount = false; + $hasForeignAmount = false; + $hasForeignCode = false; + for ($i = 0; $i < $count; ++$i) { + $role = $config['column-roles'][$i] ?? '_ignore'; + if ('_ignore' !== $role) { + ++$assigned; + } + if (in_array($role, ['amount', 'amount_credit', 'amount_debit'])) { + $hasAmount = true; + } + if ($role === 'foreign-currency-code') { + $hasForeignCode = true; + } + if ($role === 'amount_foreign') { + $hasForeignAmount = true; + } + } + if ($assigned > 0 && $hasAmount && ($hasForeignCode === false && $hasForeignAmount === false)) { + $this->warning = ''; + $this->saveConfig($config); + + return true; + } + // warn if has foreign amount but no currency code: + if ($hasForeignAmount && !$hasForeignCode) { + $this->warning = strval(trans('import.foreign_amount_warning')); + + return false; + } + + if (0 === $assigned || !$hasAmount) { + $this->warning = strval(trans('import.roles_warning')); + + return false; + } + + return false; + } + /** * make unique example data. */ @@ -284,36 +333,6 @@ class Roles implements ConfigurationInterface $this->repository->setConfiguration($this->job, $array); } - /** - * @return bool - */ - private function setRolesComplete(): bool - { - $config = $this->getConfig(); - $count = $config['column-count']; - $assigned = 0; - $hasAmount = false; - for ($i = 0; $i < $count; ++$i) { - $role = $config['column-roles'][$i] ?? '_ignore'; - if ('_ignore' !== $role) { - ++$assigned; - } - if (in_array($role, ['amount', 'amount_credit', 'amount_debit'])) { - $hasAmount = true; - } - } - if ($assigned > 0 && $hasAmount) { - $config['column-roles-complete'] = true; - $this->warning = ''; - } - if (0 === $assigned || !$hasAmount) { - $this->warning = strval(trans('import.roles_warning')); - } - $this->saveConfig($config); - - return true; - } - /** * @return bool */ diff --git a/app/Support/Import/Configuration/Spectre/HaveAccounts.php b/app/Support/Import/Configuration/Spectre/HaveAccounts.php index 796d05afd9..9a7bedb9c6 100644 --- a/app/Support/Import/Configuration/Spectre/HaveAccounts.php +++ b/app/Support/Import/Configuration/Spectre/HaveAccounts.php @@ -51,7 +51,6 @@ class HaveAccounts implements ConfigurationInterface $accountRepository = app(AccountRepositoryInterface::class); /** @var CurrencyRepositoryInterface $currencyRepository */ $currencyRepository = app(CurrencyRepositoryInterface::class); - $data = []; $config = $this->job->configuration; $collection = $accountRepository->getAccountsByType([AccountType::DEFAULT, AccountType::ASSET]); $defaultCurrency = app('amount')->getDefaultCurrency(); diff --git a/app/Support/Models/TransactionJournalTrait.php b/app/Support/Models/TransactionJournalTrait.php index 196f154d45..103bb83c36 100644 --- a/app/Support/Models/TransactionJournalTrait.php +++ b/app/Support/Models/TransactionJournalTrait.php @@ -42,6 +42,27 @@ use Illuminate\Support\Collection; */ trait TransactionJournalTrait { + /** + * @param Builder $query + * @param string $table + * + * @return bool + */ + public static function isJoined(Builder $query, string $table): bool + { + $joins = $query->getQuery()->joins; + if (null === $joins) { + return false; + } + foreach ($joins as $join) { + if ($join->table === $table) { + return true; + } + } + + return false; + } + /** * @return string */ @@ -211,27 +232,6 @@ trait TransactionJournalTrait */ abstract public function isDeposit(): bool; - /** - * @param Builder $query - * @param string $table - * - * @return bool - */ - public function isJoined(Builder $query, string $table): bool - { - $joins = $query->getQuery()->joins; - if (null === $joins) { - return false; - } - foreach ($joins as $join) { - if ($join->table === $table) { - return true; - } - } - - return false; - } - /** * @return bool */ diff --git a/app/Support/Navigation.php b/app/Support/Navigation.php index 59de0f956d..29c569d26f 100644 --- a/app/Support/Navigation.php +++ b/app/Support/Navigation.php @@ -80,6 +80,68 @@ class Navigation return $date; } + /** + * @param \Carbon\Carbon $start + * @param \Carbon\Carbon $end + * @param string $range + * + * @return array + * @throws FireflyException + */ + public function blockPeriods(\Carbon\Carbon $start, \Carbon\Carbon $end, string $range): array + { + $periods = []; + // Start by looping per period: + $perMonthEnd = clone $end; + $perMonthStart = clone $end; + $perMonthStart->startOfyear()->subYear(); + $perMonthStart = $start->lt($perMonthStart) ? $perMonthStart : $start; + + // loop first set: + while ($perMonthEnd >= $perMonthStart) { + $perMonthEnd = $this->startOfPeriod($perMonthEnd, $range); + $currentEnd = $this->endOfPeriod($perMonthEnd, $range); + if ($currentEnd->gt($start)) { + $periods[] = [ + 'start' => $perMonthEnd, + 'end' => $currentEnd, + 'period' => $range, + ]; + } + $perMonthEnd = $this->subtractPeriod($perMonthEnd, $range, 1); + } + + // do not continue if date is already less + if ($perMonthEnd->lt($start)) { + return $periods; + } + + // per year variables: + $perYearEnd = clone $perMonthStart; + $perYearStart = clone $perMonthStart; + unset($perMonthEnd, $currentEnd, $perMonthStart); + $perYearEnd->subYear(); + $perYearStart->subYears(50); + $perYearStart = $start->lt($perYearStart) ? $perYearStart : $start; + $perYearStart->startOfYear(); + + // per year + while ($perYearEnd >= $perYearStart) { + $perYearEnd = $this->startOfPeriod($perYearEnd, '1Y'); + $currentEnd = $this->endOfPeriod($perYearEnd, '1Y')->subDay()->endOfDay(); + if ($currentEnd->gt($start)) { + $periods[] = [ + 'start' => $perYearEnd, + 'end' => $currentEnd, + 'period' => '1Y', + ]; + } + $perYearEnd = $this->subtractPeriod($perYearEnd, '1Y', 1); + } + + return $periods; + } + /** * @param \Carbon\Carbon $end * @param $repeatFreq @@ -194,7 +256,7 @@ class Navigation { // define period to increment $increment = 'addDay'; - $format = self::preferredCarbonFormat($start, $end); + $format = $this->preferredCarbonFormat($start, $end); $displayFormat = strval(trans('config.month_and_day')); // increment by month (for year) if ($start->diffInMonths($end) > 1) { @@ -419,6 +481,7 @@ class Navigation return $date; } + if ('custom' === $repeatFreq) { return $date; // the date is already at the start. } diff --git a/app/Support/Steam.php b/app/Support/Steam.php index 989801716a..c0f5f291f0 100644 --- a/app/Support/Steam.php +++ b/app/Support/Steam.php @@ -184,11 +184,11 @@ class Steam $modified = null === $entry->modified ? '0' : strval($entry->modified); $foreignModified = null === $entry->modified_foreign ? '0' : strval($entry->modified_foreign); $amount = '0'; - if ($currencyId === $entry->transaction_currency_id || 0 === $currencyId) { + if ($currencyId === intval($entry->transaction_currency_id) || 0 === $currencyId) { // use normal amount: $amount = $modified; } - if ($currencyId === $entry->foreign_currency_id) { + if ($currencyId === intval($entry->foreign_currency_id)) { // use foreign amount: $amount = $foreignModified; } diff --git a/app/Support/Twig/Extension/Transaction.php b/app/Support/Twig/Extension/Transaction.php index 5fea1eb71d..bd87af5b36 100644 --- a/app/Support/Twig/Extension/Transaction.php +++ b/app/Support/Twig/Extension/Transaction.php @@ -27,7 +27,6 @@ use FireflyIII\Models\Attachment; use FireflyIII\Models\Transaction as TransactionModel; use FireflyIII\Models\TransactionCurrency; use FireflyIII\Models\TransactionType; -use FireflyIII\Support\SingleCacheProperties; use Lang; use Twig_Extension; @@ -45,14 +44,6 @@ class Transaction extends Twig_Extension */ public function amount(TransactionModel $transaction): string { - $cache = new SingleCacheProperties; - $cache->addProperty('transaction-amount'); - $cache->addProperty($transaction->id); - $cache->addProperty($transaction->updated_at); - if ($cache->has()) { - return $cache->get(); - } - $amount = bcmul(app('steam')->positive(strval($transaction->transaction_amount)), '-1'); $format = '%s'; $coloured = true; @@ -97,8 +88,6 @@ class Transaction extends Twig_Extension $currency->decimal_places = $transaction->foreign_currency_dp; $str .= ' (' . sprintf($format, app('amount')->formatAnything($currency, $amount, $coloured)) . ')'; } - $cache->store($str); - return $str; } @@ -109,15 +98,6 @@ class Transaction extends Twig_Extension */ public function amountArray(array $transaction): string { - $cache = new SingleCacheProperties; - $cache->addProperty('transaction-array-amount'); - $cache->addProperty($transaction['source_id']); - $cache->addProperty($transaction['destination_id']); - $cache->addProperty($transaction['updated_at']); - if ($cache->has()) { - return $cache->get(); - } - // first display amount: $amount = TransactionType::WITHDRAWAL === $transaction['journal_type'] ? $transaction['source_amount'] : $transaction['destination_amount']; @@ -135,8 +115,6 @@ class Transaction extends Twig_Extension $fakeCurrency->symbol = $transaction['foreign_currency_symbol']; $string .= ' (' . app('amount')->formatAnything($fakeCurrency, $amount, true) . ')'; } - $cache->store($string); - return $string; } @@ -147,19 +125,10 @@ class Transaction extends Twig_Extension */ public function budgets(TransactionModel $transaction): string { - $cache = new SingleCacheProperties; - $cache->addProperty('transaction-budgets'); - $cache->addProperty($transaction->id); - $cache->addProperty($transaction->updated_at); - if ($cache->has()) { - return $cache->get(); - } - // journal has a budget: if (isset($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); - $cache->store($txt); return $txt; } @@ -168,7 +137,6 @@ class Transaction extends Twig_Extension if (isset($transaction->transaction_budget_id)) { $name = app('steam')->tryDecrypt($transaction->transaction_budget_name); $txt = sprintf('%s', route('budgets.show', [$transaction->transaction_budget_id]), $name, $name); - $cache->store($txt); return $txt; } @@ -185,12 +153,10 @@ class Transaction extends Twig_Extension } $txt = join(', ', $str); - $cache->store($txt); return $txt; } $txt = ''; - $cache->store($txt); return $txt; } @@ -202,19 +168,10 @@ class Transaction extends Twig_Extension */ public function categories(TransactionModel $transaction): string { - $cache = new SingleCacheProperties; - $cache->addProperty('transaction-categories'); - $cache->addProperty($transaction->id); - $cache->addProperty($transaction->updated_at); - if ($cache->has()) { - return $cache->get(); - } - // journal has a category: if (isset($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); - $cache->store($txt); return $txt; } @@ -223,7 +180,6 @@ class Transaction extends Twig_Extension if (isset($transaction->transaction_category_id)) { $name = app('steam')->tryDecrypt($transaction->transaction_category_name); $txt = sprintf('%s', route('categories.show', [$transaction->transaction_category_id]), $name, $name); - $cache->store($txt); return $txt; } @@ -240,14 +196,11 @@ class Transaction extends Twig_Extension } $txt = join(', ', $str); - $cache->store($txt); return $txt; } $txt = ''; - $cache->store($txt); - return $txt; } @@ -258,20 +211,11 @@ class Transaction extends Twig_Extension */ public function description(TransactionModel $transaction): string { - $cache = new SingleCacheProperties; - $cache->addProperty('description'); - $cache->addProperty($transaction->id); - $cache->addProperty($transaction->updated_at); - if ($cache->has()) { - return $cache->get(); - } $description = $transaction->description; if (strlen(strval($transaction->transaction_description)) > 0) { - $description = $transaction->transaction_description . '(' . $transaction->description . ')'; + $description = $transaction->transaction_description . ' (' . $transaction->description . ')'; } - $cache->store($description); - return $description; } @@ -282,14 +226,6 @@ class Transaction extends Twig_Extension */ public function destinationAccount(TransactionModel $transaction): string { - $cache = new SingleCacheProperties; - $cache->addProperty('transaction-destination'); - $cache->addProperty($transaction->id); - $cache->addProperty($transaction->updated_at); - if ($cache->has()) { - return $cache->get(); - } - if (TransactionType::RECONCILIATION === $transaction->transaction_type_type) { return '—'; } @@ -325,13 +261,11 @@ class Transaction extends Twig_Extension if (AccountType::CASH === $type) { $txt = '(' . trans('firefly.cash') . ')'; - $cache->store($txt); return $txt; } $txt = sprintf('%1$s', e($name), route('accounts.show', [$transactionId])); - $cache->store($txt); return $txt; } @@ -343,13 +277,6 @@ class Transaction extends Twig_Extension */ public function hasAttachments(TransactionModel $transaction): string { - $cache = new SingleCacheProperties; - $cache->addProperty('attachments'); - $cache->addProperty($transaction->id); - $cache->addProperty($transaction->updated_at); - if ($cache->has()) { - return $cache->get(); - } $journalId = intval($transaction->journal_id); $count = Attachment::whereNull('deleted_at') ->where('attachable_type', 'FireflyIII\Models\TransactionJournal') @@ -357,13 +284,11 @@ class Transaction extends Twig_Extension ->count(); if ($count > 0) { $res = sprintf('', Lang::choice('firefly.nr_of_attachments', $count, ['count' => $count])); - $cache->store($res); return $res; } $res = ''; - $cache->store($res); return $res; } @@ -375,14 +300,6 @@ class Transaction extends Twig_Extension */ public function icon(TransactionModel $transaction): string { - $cache = new SingleCacheProperties; - $cache->addProperty('icon'); - $cache->addProperty($transaction->id); - $cache->addProperty($transaction->updated_at); - if ($cache->has()) { - return $cache->get(); - } - switch ($transaction->transaction_type_type) { case TransactionType::WITHDRAWAL: $txt = sprintf('', trans('firefly.withdrawal')); @@ -403,7 +320,6 @@ class Transaction extends Twig_Extension $txt = ''; break; } - $cache->store($txt); return $txt; } @@ -415,21 +331,11 @@ class Transaction extends Twig_Extension */ public function isReconciled(TransactionModel $transaction): string { - $cache = new SingleCacheProperties; - $cache->addProperty('transaction-reconciled'); - $cache->addProperty($transaction->id); - $cache->addProperty($transaction->updated_at); - $cache->addProperty($transaction->reconciled); - if ($cache->has()) { - return $cache->get(); - } $icon = ''; if (1 === intval($transaction->reconciled)) { $icon = ''; } - $cache->store($icon); - return $icon; } @@ -440,25 +346,14 @@ class Transaction extends Twig_Extension */ public function isSplit(TransactionModel $transaction): string { - $cache = new SingleCacheProperties; - $cache->addProperty('split'); - $cache->addProperty($transaction->id); - $cache->addProperty($transaction->updated_at); - if ($cache->has()) { - return $cache->get(); - } $journalId = intval($transaction->journal_id); $count = TransactionModel::where('transaction_journal_id', $journalId)->whereNull('deleted_at')->count(); if ($count > 2) { $res = ''; - $cache->store($res); - return $res; } $res = ''; - $cache->store($res); - return $res; } @@ -469,13 +364,6 @@ class Transaction extends Twig_Extension */ public function sourceAccount(TransactionModel $transaction): string { - $cache = new SingleCacheProperties; - $cache->addProperty('transaction-source'); - $cache->addProperty($transaction->id); - $cache->addProperty($transaction->updated_at); - if ($cache->has()) { - return $cache->get(); - } if (TransactionType::RECONCILIATION === $transaction->transaction_type_type) { return '—'; } @@ -510,14 +398,11 @@ class Transaction extends Twig_Extension if (AccountType::CASH === $type) { $txt = '(' . trans('firefly.cash') . ')'; - $cache->store($txt); return $txt; } $txt = sprintf('%1$s', e($name), route('accounts.show', [$transactionId])); - $cache->store($txt); - return $txt; } } diff --git a/app/Support/Twig/Extension/TransactionJournal.php b/app/Support/Twig/Extension/TransactionJournal.php index 8fd0347fd9..dba951d952 100644 --- a/app/Support/Twig/Extension/TransactionJournal.php +++ b/app/Support/Twig/Extension/TransactionJournal.php @@ -25,7 +25,6 @@ namespace FireflyIII\Support\Twig\Extension; use FireflyIII\Models\Transaction as TransactionModel; use FireflyIII\Models\TransactionJournal as JournalModel; use FireflyIII\Models\TransactionType; -use FireflyIII\Support\SingleCacheProperties; use Twig_Extension; /** @@ -40,14 +39,6 @@ class TransactionJournal extends Twig_Extension */ public function totalAmount(JournalModel $journal): string { - $cache = new SingleCacheProperties; - $cache->addProperty('total-amount'); - $cache->addProperty($journal->id); - $cache->addProperty($journal->updated_at); - if ($cache->has()) { - return $cache->get(); - } - $transactions = $journal->transactions()->where('amount', '>', 0)->get(); $totals = []; $type = $journal->transactionType->type; @@ -84,7 +75,6 @@ class TransactionJournal extends Twig_Extension $array[] = app('amount')->formatAnything($total['currency'], $total['amount']); } $txt = join(' / ', $array); - $cache->store($txt); return $txt; } diff --git a/app/Support/Twig/General.php b/app/Support/Twig/General.php index cfa0f73f35..d3387e31fd 100644 --- a/app/Support/Twig/General.php +++ b/app/Support/Twig/General.php @@ -256,9 +256,64 @@ class General extends Twig_Extension return 'fa-file-o'; case 'application/pdf': return 'fa-file-pdf-o'; + /* image */ case 'image/png': case 'image/jpeg': + case 'image/svg+xml': + case 'image/heic': + case 'image/heic-sequence': + case 'application/vnd.oasis.opendocument.image': return 'fa-file-image-o'; + /* MS word */ + case 'application/msword': + case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': + case 'application/vnd.openxmlformats-officedocument.wordprocessingml.template': + case 'application/x-iwork-pages-sffpages': + case 'application/vnd.sun.xml.writer': + case 'application/vnd.sun.xml.writer.template': + case 'application/vnd.sun.xml.writer.global': + case 'application/vnd.stardivision.writer': + case 'application/vnd.stardivision.writer-global': + case 'application/vnd.oasis.opendocument.text': + case 'application/vnd.oasis.opendocument.text-template': + case 'application/vnd.oasis.opendocument.text-web': + case 'application/vnd.oasis.opendocument.text-master': + return 'fa-file-word-o'; + /* MS excel */ + case 'application/vnd.ms-excel': + case 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': + case 'application/vnd.openxmlformats-officedocument.spreadsheetml.template': + case 'application/vnd.sun.xml.calc': + case 'application/vnd.sun.xml.calc.template': + case 'application/vnd.stardivision.calc': + case 'application/vnd.oasis.opendocument.spreadsheet': + case 'application/vnd.oasis.opendocument.spreadsheet-template': + return 'fa-file-excel-o'; + /* MS powerpoint */ + case 'application/vnd.ms-powerpoint': + case 'application/vnd.openxmlformats-officedocument.presentationml.presentation': + case 'application/vnd.openxmlformats-officedocument.presentationml.template': + case 'application/vnd.openxmlformats-officedocument.presentationml.slideshow': + case 'application/vnd.sun.xml.impress': + case 'application/vnd.sun.xml.impress.template': + case 'application/vnd.stardivision.impress': + case 'application/vnd.oasis.opendocument.presentation': + case 'application/vnd.oasis.opendocument.presentation-template': + return 'fa-file-powerpoint-o'; + /* calc */ + case 'application/vnd.sun.xml.draw': + case 'application/vnd.sun.xml.draw.template': + case 'application/vnd.stardivision.draw': + case 'application/vnd.oasis.opendocument.chart': + return 'fa-paint-brush'; + case 'application/vnd.oasis.opendocument.graphics': + case 'application/vnd.oasis.opendocument.graphics-template': + case 'application/vnd.sun.xml.math': + case 'application/vnd.stardivision.math': + case 'application/vnd.oasis.opendocument.formula': + case 'application/vnd.oasis.opendocument.database': + return 'fa-calculator'; + } }, ['is_safe' => ['html']] diff --git a/app/User.php b/app/User.php index d0620307ec..db03b5189f 100644 --- a/app/User.php +++ b/app/User.php @@ -32,6 +32,7 @@ use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Log; use Request; +use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; /** * Class User. @@ -60,6 +61,23 @@ class User extends Authenticatable */ protected $table = 'users'; + /** + * @param string $value + * + * @return User + */ + public static function routeBinder(string $value): User + { + if (auth()->check()) { + $userId = intval($value); + $user = self::find($userId); + if (!is_null($user)) { + return $user; + } + } + throw new NotFoundHttpException; + } + /** * @codeCoverageIgnore * Link to accounts. diff --git a/app/Validation/FireflyValidator.php b/app/Validation/FireflyValidator.php index b50b3b4659..8427db6780 100644 --- a/app/Validation/FireflyValidator.php +++ b/app/Validation/FireflyValidator.php @@ -65,7 +65,7 @@ class FireflyValidator extends Validator * * @return bool */ - public function validate2faCode($attribute, $value): bool + public function validate2faCode(/** @scrutinizer ignore-unused */ $attribute, $value): bool { if (!is_string($value) || null === $value || 6 != strlen($value)) { return false; @@ -85,7 +85,7 @@ class FireflyValidator extends Validator * * @return bool */ - public function validateBelongsToUser($attribute, $value, $parameters): bool + public function validateBelongsToUser(/** @scrutinizer ignore-unused */ $attribute, $value, $parameters): bool { $field = $parameters[1] ?? 'id'; @@ -108,7 +108,7 @@ class FireflyValidator extends Validator * * @return bool */ - public function validateBic($attribute, $value): bool + public function validateBic(/** @scrutinizer ignore-unused */ $attribute, $value): bool { $regex = '/^[a-z]{6}[0-9a-z]{2}([0-9a-z]{3})?\z/i'; $result = preg_match($regex, $value); @@ -130,13 +130,63 @@ class FireflyValidator extends Validator * * @return bool */ - public function validateIban($attribute, $value): bool + public function validateIban(/** @scrutinizer ignore-unused */ $attribute, $value): bool { if (!is_string($value) || null === $value || strlen($value) < 6) { return false; } - - $value = strtoupper($value); + // strip spaces + $search = [ + "\x20", // normal space + "\u{0001}", // start of heading + "\u{0002}", // start of text + "\u{0003}", // end of text + "\u{0004}", // end of transmission + "\u{0005}", // enquiry + "\u{0006}", // ACK + "\u{0007}", // BEL + "\u{0008}", // backspace + "\u{000E}", // shift out + "\u{000F}", // shift in + "\u{0010}", // data link escape + "\u{0011}", // DC1 + "\u{0012}", // DC2 + "\u{0013}", // DC3 + "\u{0014}", // DC4 + "\u{0015}", // NAK + "\u{0016}", // SYN + "\u{0017}", // ETB + "\u{0018}", // CAN + "\u{0019}", // EM + "\u{001A}", // SUB + "\u{001B}", // escape + "\u{001C}", // file separator + "\u{001D}", // group separator + "\u{001E}", // record separator + "\u{001F}", // unit separator + "\u{007F}", // DEL + "\u{00A0}", // non-breaking space + "\u{1680}", // ogham space mark + "\u{180E}", // mongolian vowel separator + "\u{2000}", // en quad + "\u{2001}", // em quad + "\u{2002}", // en space + "\u{2003}", // em space + "\u{2004}", // three-per-em space + "\u{2005}", // four-per-em space + "\u{2006}", // six-per-em space + "\u{2007}", // figure space + "\u{2008}", // punctuation space + "\u{2009}", // thin space + "\u{200A}", // hair space + "\u{200B}", // zero width space + "\u{202F}", // narrow no-break space + "\u{3000}", // ideographic space + "\u{FEFF}", // zero width no -break space + ]; + $replace = ''; + $value = str_replace($search, $replace, $value); + $value = strtoupper($value); $search = [' ', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']; $replace = ['', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30', '31', @@ -160,7 +210,7 @@ class FireflyValidator extends Validator * * @return bool */ - public function validateMore($attribute, $value, $parameters): bool + public function validateMore(/** @scrutinizer ignore-unused */ $attribute, $value, $parameters): bool { $compare = $parameters[0] ?? '0'; @@ -176,7 +226,7 @@ class FireflyValidator extends Validator * * @return bool */ - public function validateMustExist($attribute, $value, $parameters): bool + public function validateMustExist(/** @scrutinizer ignore-unused */ $attribute, $value, $parameters): bool { $field = $parameters[1] ?? 'id'; @@ -285,7 +335,7 @@ class FireflyValidator extends Validator * * @return bool */ - public function validateSecurePassword($attribute, $value): bool + public function validateSecurePassword(/** @scrutinizer ignore-unused */ $attribute, $value): bool { $verify = false; if (isset($this->data['verify_password'])) { @@ -310,7 +360,7 @@ class FireflyValidator extends Validator * * @return bool */ - public function validateUniqueAccountForUser($attribute, $value, $parameters): bool + public function validateUniqueAccountForUser(/** @scrutinizer ignore-unused */ $attribute, $value, $parameters): bool { // because a user does not have to be logged in (tests and what-not). if (!auth()->check()) { @@ -340,7 +390,7 @@ class FireflyValidator extends Validator * * @return bool */ - public function validateUniqueAccountNumberForUser($attribute, $value): bool + public function validateUniqueAccountNumberForUser(/** @scrutinizer ignore-unused */ $attribute, $value): bool { $accountId = $this->data['id'] ?? 0; @@ -378,7 +428,7 @@ class FireflyValidator extends Validator * * @return bool */ - public function validateUniqueObjectForUser($attribute, $value, $parameters): bool + public function validateUniqueObjectForUser(/** @scrutinizer ignore-unused */ $attribute, $value, $parameters): bool { $value = $this->tryDecrypt($value); // exclude? @@ -410,7 +460,7 @@ class FireflyValidator extends Validator * * @return bool */ - public function validateUniquePiggyBankForUser($attribute, $value, $parameters): bool + public function validateUniquePiggyBankForUser(/** @scrutinizer ignore-unused */ $attribute, $value, $parameters): bool { $exclude = $parameters[0] ?? null; $query = DB::table('piggy_banks')->whereNull('piggy_banks.deleted_at') diff --git a/CHANGELOG.md b/changelog.md similarity index 93% rename from CHANGELOG.md rename to changelog.md index 8be3f71abc..bedddff2fb 100644 --- a/CHANGELOG.md +++ b/changelog.md @@ -2,6 +2,42 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). +## [4.7.0] - 2018-01-31 +### Added +- Support for Russian and Portuguese (Brazil) +- Support for the Spectre API (Salt Edge) +- Many strings now translatable thanks to [Nik-vr](https://github.com/Nik-vr) ([issue 1118](https://github.com/firefly-iii/firefly-iii/issues/1118), [issue 1116](https://github.com/firefly-iii/firefly-iii/issues/1116), [issue 1109](https://github.com/firefly-iii/firefly-iii/issues/1109), ) +- Many buttons to quickly create stuff +- Sum of tables in reports, requested by [MacPaille](https://github.com/MacPaille) ([issue 1106](https://github.com/firefly-iii/firefly-iii/issues/1106)) +- Future versions of Firefly III will notify you there is a new version, as suggested by [8bitgentleman](https://github.com/8bitgentleman) in [issue 1050](https://github.com/firefly-iii/firefly-iii/issues/1050) +- Improved net worth box [issue 1101](https://github.com/firefly-iii/firefly-iii/issues/1101) ([Nik-vr](https://github.com/Nik-vr)) +- Nice dropdown in transaction list [issue 1082](https://github.com/firefly-iii/firefly-iii/issues/1082) +- Better support for local fonts thanks to [devlearner](https://github.com/devlearner) ([issue 1145](https://github.com/firefly-iii/firefly-iii/issues/1145)) +- Improve attachment support and view capabilities (suggested by [trinhit](https://github.com/trinhit) in [issue 1146](https://github.com/firefly-iii/firefly-iii/issues/1146)) + +### Changed +- Whole new [read me file](https://github.com/firefly-iii/firefly-iii/blob/master/readme.md), [new end user documentation](https://firefly-iii.readthedocs.io/en/latest/) and an [updated website](https://www.firefly-iii.org/)! +- Many charts and info-blocks now scale property ([issue 989](https://github.com/firefly-iii/firefly-iii/issues/989) and [issue 1040](https://github.com/firefly-iii/firefly-iii/issues/1040)) + +### Fixed +- Charts work in IE thanks to [devlearner](https://github.com/devlearner) ([issue 1107](https://github.com/firefly-iii/firefly-iii/issues/1107)) +- Various fixes in import routine +- Bug that left charts empty ([issue 1088](https://github.com/firefly-iii/firefly-iii/issues/1088)), reported by various users amongst which [jinformatique](https://github.com/jinformatique) +- [Issue 1124](https://github.com/firefly-iii/firefly-iii/issues/1124), as reported by [gavu](https://github.com/gavu) +- [Issue 1125](https://github.com/firefly-iii/firefly-iii/issues/1125), as reported by [gavu](https://github.com/gavu) +- [Issue 1126](https://github.com/firefly-iii/firefly-iii/issues/1126), as reported by [gavu](https://github.com/gavu) +- [Issue 1131](https://github.com/firefly-iii/firefly-iii/issues/1131), as reported by [dp87](https://github.com/dp87) +- [Issue 1129](https://github.com/firefly-iii/firefly-iii/issues/1129), as reported by [gavu](https://github.com/gavu) +- [Issue 1132](https://github.com/firefly-iii/firefly-iii/issues/1132), as reported by [gavu](https://github.com/gavu) +- Issue with cache in Sandstorm ([issue 1130](https://github.com/firefly-iii/firefly-iii/issues/1130)) +- [Issue 1134](https://github.com/firefly-iii/firefly-iii/issues/1134) +- [Issue 1140](https://github.com/firefly-iii/firefly-iii/issues/1140) +- [Issue 1141](https://github.com/firefly-iii/firefly-iii/issues/1141), reported by [ErikFontanel](https://github.com/ErikFontanel) +- [Issue 1142](https://github.com/firefly-iii/firefly-iii/issues/1142) + +### Security +- Removed many access rights from the demo user + ## [4.6.13] - 2018-01-06 ### Added - [Issue 1074](https://github.com/firefly-iii/firefly-iii/issues/1074), suggested by [MacPaille](https://github.com/MacPaille) diff --git a/composer.json b/composer.json index a047ab4618..607f2251c9 100644 --- a/composer.json +++ b/composer.json @@ -1,129 +1,126 @@ { - "name": "grumpydictator/firefly-iii", - "description": "Firefly III: a personal finances manager.", - "keywords": [ - "finance", - "finances", - "manager", - "management", - "euro", - "dollar", - "laravel", - "money", - "currency", - "financials", - "financial", - "budgets", - "administration", - "tool", - "tooling", - "help", - "helper", - "assistant", - "planning", - "organizing", - "bills", - "personal finance", - "budgets", - "budgeting", - "budgeting tool", - "budgeting application", - "transactions", - "self hosted", - "self-hosted", - "transfers", - "management" - ], - "license": "GPL-3.0", - "homepage": "https://github.com/firefly-iii/firefly-iii", - "type": "project", - "authors": [ - { - "name": "James Cole", - "email": "thegrumpydictator@gmail.com", - "homepage": "https://github.com/firefly-iii", - "role": "Developer" - } - ], - "require": { - "php": ">=7.1.0", - "ext-bcmath": "*", - "ext-curl": "*", - "ext-gd": "*", - "ext-intl": "*", - "ext-mbstring": "*", - "ext-zip": "*", - "bacon/bacon-qr-code": "1.*", - "davejamesmiller/laravel-breadcrumbs": "4.*", - "doctrine/dbal": "2.*", - "fideloper/proxy": "3.*", - "laravel/framework": "5.5.*", - "laravelcollective/html": "5.5.*", - "league/commonmark": "0.*", - "league/csv": "9.*", - "pragmarx/google2fa": "2.*", - "pragmarx/google2fa-laravel": "^0.1.4", - "rcrowe/twigbridge": "0.9.*", - "rmccue/requests": "1.*", - "twig/twig": "1.*", - "watson/validating": "3.*" - }, - "require-dev": { - "barryvdh/laravel-debugbar": "3.*", - "barryvdh/laravel-ide-helper": "2.*", - "filp/whoops": "2.*", - "fzaninotto/faker": "1.*", - "mockery/mockery": "^1.0", - "php-coveralls/php-coveralls": "^2.0", - "phpunit/phpunit": "^6.0" - }, - "autoload": { - "classmap": [ - "database/seeds", - "database/factories" - ], - "psr-4": { - "FireflyIII\\": "app/" - } - }, - "autoload-dev": { - "psr-4": { - "Tests\\": "tests/" - } - }, - "extra": { - "laravel": { - "dont-discover": [ - ] - } - }, - "scripts": { - "pre-install-cmd": [ - "@php -r \"if (!(getenv('DYNO'))===false){file_exists('.env') || copy('.env.heroku', '.env');}\"" - ], - "post-root-package-install": [ - "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" - ], - "post-create-project-cmd": [ - "@php artisan key:generate" - ], - "post-autoload-dump": [ - "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump" - ], - "post-update-cmd": [ - "php artisan firefly:upgrade-database", - "php artisan firefly:verify", - "php artisan firefly:instructions update", - "php artisan optimize" - ], - "post-install-cmd": [ - "php artisan optimize", - "php artisan firefly:instructions install" - ] - }, - "config": { - "preferred-install": "dist", - "sort-packages": true, - "optimize-autoloader": true - } + "name": "grumpydictator/firefly-iii", + "description": "Firefly III: a personal finances manager.", + "keywords": [ + "finance", + "finances", + "manager", + "management", + "euro", + "dollar", + "laravel", + "money", + "currency", + "financials", + "financial", + "budgets", + "administration", + "tool", + "tooling", + "help", + "helper", + "assistant", + "planning", + "organizing", + "bills", + "personal finance", + "budgets", + "budgeting", + "budgeting tool", + "budgeting application", + "transactions", + "self hosted", + "self-hosted", + "transfers", + "management" + ], + "license": "GPL-3.0-or-later", + "homepage": "https://github.com/firefly-iii/firefly-iii", + "type": "project", + "authors": [{ + "name": "James Cole", + "email": "thegrumpydictator@gmail.com", + "homepage": "https://github.com/firefly-iii", + "role": "Developer" + }], + "require": { + "php": ">=7.1.0", + "ext-bcmath": "*", + "ext-curl": "*", + "ext-gd": "*", + "ext-intl": "*", + "ext-mbstring": "*", + "ext-zip": "*", + "bacon/bacon-qr-code": "1.*", + "davejamesmiller/laravel-breadcrumbs": "4.*", + "doctrine/dbal": "2.*", + "fideloper/proxy": "3.*", + "laravel/framework": "5.5.*", + "laravelcollective/html": "5.5.*", + "league/commonmark": "0.*", + "league/csv": "9.*", + "pragmarx/google2fa": "2.*", + "pragmarx/google2fa-laravel": "^0.1.4", + "rcrowe/twigbridge": "0.9.*", + "rmccue/requests": "1.*", + "twig/twig": "1.*", + "watson/validating": "3.*" + }, + "require-dev": { + "barryvdh/laravel-debugbar": "3.*", + "barryvdh/laravel-ide-helper": "2.*", + "filp/whoops": "2.*", + "fzaninotto/faker": "1.*", + "mockery/mockery": "^1.0", + "php-coveralls/php-coveralls": "^2.0", + "phpunit/phpunit": "^6.0" + }, + "autoload": { + "classmap": [ + "database/seeds", + "database/factories" + ], + "psr-4": { + "FireflyIII\\": "app/" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + } + }, + "extra": { + "laravel": { + "dont-discover": [] + } + }, + "scripts": { + "pre-install-cmd": [ + "@php -r \"if (!(getenv('DYNO'))===false){file_exists('.env') || copy('.env.heroku', '.env');}\"" + ], + "post-root-package-install": [ + "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" + ], + "post-create-project-cmd": [ + "@php artisan key:generate" + ], + "post-autoload-dump": [ + "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump" + ], + "post-update-cmd": [ + "php artisan firefly:upgrade-database", + "php artisan firefly:verify", + "php artisan firefly:instructions update", + "php artisan optimize" + ], + "post-install-cmd": [ + "php artisan optimize", + "php artisan firefly:instructions install" + ] + }, + "config": { + "preferred-install": "dist", + "sort-packages": true, + "optimize-autoloader": true + } } diff --git a/composer.lock b/composer.lock index f81c640d57..a1ba0048ab 100644 --- a/composer.lock +++ b/composer.lock @@ -468,20 +468,20 @@ }, { "name": "doctrine/inflector", - "version": "v1.2.0", + "version": "v1.3.0", "source": { "type": "git", "url": "https://github.com/doctrine/inflector.git", - "reference": "e11d84c6e018beedd929cff5220969a3c6d1d462" + "reference": "5527a48b7313d15261292c149e55e26eae771b0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/inflector/zipball/e11d84c6e018beedd929cff5220969a3c6d1d462", - "reference": "e11d84c6e018beedd929cff5220969a3c6d1d462", + "url": "https://api.github.com/repos/doctrine/inflector/zipball/5527a48b7313d15261292c149e55e26eae771b0a", + "reference": "5527a48b7313d15261292c149e55e26eae771b0a", "shasum": "" }, "require": { - "php": "^7.0" + "php": "^7.1" }, "require-dev": { "phpunit/phpunit": "^6.2" @@ -489,7 +489,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.2.x-dev" + "dev-master": "1.3.x-dev" } }, "autoload": { @@ -531,7 +531,7 @@ "singularize", "string" ], - "time": "2017-07-22T12:18:28+00:00" + "time": "2018-01-09T20:05:19+00:00" }, { "name": "doctrine/lexer", @@ -748,16 +748,16 @@ }, { "name": "laravel/framework", - "version": "v5.5.28", + "version": "v5.5.33", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "cfafae1f2043208390a7c984e3070696f4969605" + "reference": "ef7880e665390f999f4def7c9f78133636f973cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/cfafae1f2043208390a7c984e3070696f4969605", - "reference": "cfafae1f2043208390a7c984e3070696f4969605", + "url": "https://api.github.com/repos/laravel/framework/zipball/ef7880e665390f999f4def7c9f78133636f973cf", + "reference": "ef7880e665390f999f4def7c9f78133636f973cf", "shasum": "" }, "require": { @@ -878,7 +878,7 @@ "framework", "laravel" ], - "time": "2017-12-26T16:24:40+00:00" + "time": "2018-01-30T15:06:13+00:00" }, { "name": "laravelcollective/html", @@ -1080,16 +1080,16 @@ }, { "name": "league/flysystem", - "version": "1.0.41", + "version": "1.0.42", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "f400aa98912c561ba625ea4065031b7a41e5a155" + "reference": "09eabc54e199950041aef258a85847676496fe8e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/f400aa98912c561ba625ea4065031b7a41e5a155", - "reference": "f400aa98912c561ba625ea4065031b7a41e5a155", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/09eabc54e199950041aef258a85847676496fe8e", + "reference": "09eabc54e199950041aef258a85847676496fe8e", "shasum": "" }, "require": { @@ -1100,12 +1100,13 @@ }, "require-dev": { "ext-fileinfo": "*", - "mockery/mockery": "~0.9", - "phpspec/phpspec": "^2.2", - "phpunit/phpunit": "~4.8" + "phpspec/phpspec": "^3.4", + "phpunit/phpunit": "^5.7" }, "suggest": { "ext-fileinfo": "Required for MimeType", + "ext-ftp": "Allows you to use FTP server storage", + "ext-openssl": "Allows you to use FTPS server storage", "league/flysystem-aws-s3-v2": "Allows you to use S3 storage with AWS SDK v2", "league/flysystem-aws-s3-v3": "Allows you to use S3 storage with AWS SDK v3", "league/flysystem-azure": "Allows you to use Windows Azure Blob storage", @@ -1159,7 +1160,7 @@ "sftp", "storage" ], - "time": "2017-08-06T17:41:04+00:00" + "time": "2018-01-27T16:03:56+00:00" }, { "name": "monolog/monolog", @@ -1338,16 +1339,16 @@ }, { "name": "paragonie/constant_time_encoding", - "version": "v2.2.0", + "version": "v2.2.1", "source": { "type": "git", "url": "https://github.com/paragonie/constant_time_encoding.git", - "reference": "9e7d88e6e4015c2f06a3fa22f06e1d5faa77e6c4" + "reference": "7c74c5d08761ead7b5e89d07c854bc28eb0b2186" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/9e7d88e6e4015c2f06a3fa22f06e1d5faa77e6c4", - "reference": "9e7d88e6e4015c2f06a3fa22f06e1d5faa77e6c4", + "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/7c74c5d08761ead7b5e89d07c854bc28eb0b2186", + "reference": "7c74c5d08761ead7b5e89d07c854bc28eb0b2186", "shasum": "" }, "require": { @@ -1396,7 +1397,7 @@ "hex2bin", "rfc4648" ], - "time": "2017-09-22T14:55:37+00:00" + "time": "2018-01-23T00:54:57+00:00" }, { "name": "paragonie/random_compat", @@ -1724,16 +1725,16 @@ }, { "name": "ramsey/uuid", - "version": "3.7.1", + "version": "3.7.3", "source": { "type": "git", "url": "https://github.com/ramsey/uuid.git", - "reference": "45cffe822057a09e05f7bd09ec5fb88eeecd2334" + "reference": "44abcdad877d9a46685a3a4d221e3b2c4b87cb76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ramsey/uuid/zipball/45cffe822057a09e05f7bd09ec5fb88eeecd2334", - "reference": "45cffe822057a09e05f7bd09ec5fb88eeecd2334", + "url": "https://api.github.com/repos/ramsey/uuid/zipball/44abcdad877d9a46685a3a4d221e3b2c4b87cb76", + "reference": "44abcdad877d9a46685a3a4d221e3b2c4b87cb76", "shasum": "" }, "require": { @@ -1744,17 +1745,15 @@ "rhumsaa/uuid": "self.version" }, "require-dev": { - "apigen/apigen": "^4.1", - "codeception/aspect-mock": "^1.0 | ^2.0", + "codeception/aspect-mock": "^1.0 | ~2.0.0", "doctrine/annotations": "~1.2.0", "goaop/framework": "1.0.0-alpha.2 | ^1.0 | ^2.1", "ircmaxell/random-lib": "^1.1", "jakub-onderka/php-parallel-lint": "^0.9.0", - "mockery/mockery": "^0.9.4", + "mockery/mockery": "^0.9.9", "moontoast/math": "^1.1", "php-mock/php-mock-phpunit": "^0.3|^1.1", - "phpunit/phpunit": "^4.7|>=5.0 <5.4", - "satooshi/php-coveralls": "^0.6.1", + "phpunit/phpunit": "^4.7|^5.0", "squizlabs/php_codesniffer": "^2.3" }, "suggest": { @@ -1802,7 +1801,7 @@ "identifier", "uuid" ], - "time": "2017-09-22T20:46:04+00:00" + "time": "2018-01-20T00:28:24+00:00" }, { "name": "rcrowe/twigbridge", @@ -1974,16 +1973,16 @@ }, { "name": "symfony/console", - "version": "v3.4.3", + "version": "v3.4.4", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "8394c8ef121949e8f858f13bc1e34f05169e4e7d" + "reference": "26b6f419edda16c19775211987651cb27baea7f1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/8394c8ef121949e8f858f13bc1e34f05169e4e7d", - "reference": "8394c8ef121949e8f858f13bc1e34f05169e4e7d", + "url": "https://api.github.com/repos/symfony/console/zipball/26b6f419edda16c19775211987651cb27baea7f1", + "reference": "26b6f419edda16c19775211987651cb27baea7f1", "shasum": "" }, "require": { @@ -2039,29 +2038,29 @@ ], "description": "Symfony Console Component", "homepage": "https://symfony.com", - "time": "2018-01-03T07:37:34+00:00" + "time": "2018-01-29T09:03:43+00:00" }, { "name": "symfony/css-selector", - "version": "v3.4.3", + "version": "v4.0.4", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "e66394bc7610e69279bfdb3ab11b4fe65403f556" + "reference": "f97600434e3141ef3cbb9ea42cf500fba88022b7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/e66394bc7610e69279bfdb3ab11b4fe65403f556", - "reference": "e66394bc7610e69279bfdb3ab11b4fe65403f556", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/f97600434e3141ef3cbb9ea42cf500fba88022b7", + "reference": "f97600434e3141ef3cbb9ea42cf500fba88022b7", "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": { @@ -2092,20 +2091,20 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "time": "2018-01-03T07:37:34+00:00" + "time": "2018-01-03T07:38:00+00:00" }, { "name": "symfony/debug", - "version": "v3.4.3", + "version": "v3.4.4", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "603b95dda8b00020e4e6e60dc906e7b715b1c245" + "reference": "53f6af2805daf52a43b393b93d2f24925d35c937" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/603b95dda8b00020e4e6e60dc906e7b715b1c245", - "reference": "603b95dda8b00020e4e6e60dc906e7b715b1c245", + "url": "https://api.github.com/repos/symfony/debug/zipball/53f6af2805daf52a43b393b93d2f24925d35c937", + "reference": "53f6af2805daf52a43b393b93d2f24925d35c937", "shasum": "" }, "require": { @@ -2148,11 +2147,11 @@ ], "description": "Symfony Debug Component", "homepage": "https://symfony.com", - "time": "2018-01-03T17:14:19+00:00" + "time": "2018-01-18T22:16:57+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v4.0.3", + "version": "v4.0.4", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", @@ -2215,7 +2214,7 @@ }, { "name": "symfony/finder", - "version": "v3.4.3", + "version": "v3.4.4", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", @@ -2264,16 +2263,16 @@ }, { "name": "symfony/http-foundation", - "version": "v3.4.3", + "version": "v3.4.4", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "4a213be1cc8598089b8c7451529a2927b49b5d26" + "reference": "8c39071ac9cc7e6d8dab1d556c990dc0d2cc3d30" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/4a213be1cc8598089b8c7451529a2927b49b5d26", - "reference": "4a213be1cc8598089b8c7451529a2927b49b5d26", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/8c39071ac9cc7e6d8dab1d556c990dc0d2cc3d30", + "reference": "8c39071ac9cc7e6d8dab1d556c990dc0d2cc3d30", "shasum": "" }, "require": { @@ -2314,20 +2313,20 @@ ], "description": "Symfony HttpFoundation Component", "homepage": "https://symfony.com", - "time": "2018-01-03T17:14:19+00:00" + "time": "2018-01-29T09:03:43+00:00" }, { "name": "symfony/http-kernel", - "version": "v3.4.3", + "version": "v3.4.4", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "1c2a82d6a8ec9b354fe4ef48ad1ad3f1a4f7db0e" + "reference": "911d2e5dd4beb63caad9a72e43857de984301907" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/1c2a82d6a8ec9b354fe4ef48ad1ad3f1a4f7db0e", - "reference": "1c2a82d6a8ec9b354fe4ef48ad1ad3f1a4f7db0e", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/911d2e5dd4beb63caad9a72e43857de984301907", + "reference": "911d2e5dd4beb63caad9a72e43857de984301907", "shasum": "" }, "require": { @@ -2335,7 +2334,7 @@ "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.3.11|~4.0" + "symfony/http-foundation": "^3.4.4|^4.0.4" }, "conflict": { "symfony/config": "<2.8", @@ -2402,7 +2401,7 @@ ], "description": "Symfony HttpKernel Component", "homepage": "https://symfony.com", - "time": "2018-01-05T08:33:00+00:00" + "time": "2018-01-29T12:29:46+00:00" }, { "name": "symfony/polyfill-mbstring", @@ -2632,16 +2631,16 @@ }, { "name": "symfony/process", - "version": "v3.4.3", + "version": "v3.4.4", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "ff69f110c6b33fd33cd2089ba97d6112f44ef0ba" + "reference": "09a5172057be8fc677840e591b17f385e58c7c0d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/ff69f110c6b33fd33cd2089ba97d6112f44ef0ba", - "reference": "ff69f110c6b33fd33cd2089ba97d6112f44ef0ba", + "url": "https://api.github.com/repos/symfony/process/zipball/09a5172057be8fc677840e591b17f385e58c7c0d", + "reference": "09a5172057be8fc677840e591b17f385e58c7c0d", "shasum": "" }, "require": { @@ -2677,20 +2676,20 @@ ], "description": "Symfony Process Component", "homepage": "https://symfony.com", - "time": "2018-01-03T07:37:34+00:00" + "time": "2018-01-29T09:03:43+00:00" }, { "name": "symfony/routing", - "version": "v3.4.3", + "version": "v3.4.4", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "e2b6d6fe7b090c7af720b75c7722c6dfa7a52658" + "reference": "235d01730d553a97732990588407eaf6779bb4b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/e2b6d6fe7b090c7af720b75c7722c6dfa7a52658", - "reference": "e2b6d6fe7b090c7af720b75c7722c6dfa7a52658", + "url": "https://api.github.com/repos/symfony/routing/zipball/235d01730d553a97732990588407eaf6779bb4b2", + "reference": "235d01730d553a97732990588407eaf6779bb4b2", "shasum": "" }, "require": { @@ -2755,20 +2754,20 @@ "uri", "url" ], - "time": "2018-01-04T15:09:34+00:00" + "time": "2018-01-16T18:03:57+00:00" }, { "name": "symfony/translation", - "version": "v3.4.3", + "version": "v3.4.4", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "17b5962d252b2d6d1d37a2485ebb7ddc5b2bef0a" + "reference": "10b32cf0eae28b9b39fe26c456c42b19854c4b84" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/17b5962d252b2d6d1d37a2485ebb7ddc5b2bef0a", - "reference": "17b5962d252b2d6d1d37a2485ebb7ddc5b2bef0a", + "url": "https://api.github.com/repos/symfony/translation/zipball/10b32cf0eae28b9b39fe26c456c42b19854c4b84", + "reference": "10b32cf0eae28b9b39fe26c456c42b19854c4b84", "shasum": "" }, "require": { @@ -2823,20 +2822,20 @@ ], "description": "Symfony Translation Component", "homepage": "https://symfony.com", - "time": "2018-01-03T07:37:34+00:00" + "time": "2018-01-18T22:16:57+00:00" }, { "name": "symfony/var-dumper", - "version": "v3.4.3", + "version": "v3.4.4", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "545be7e78ccbec43e599f10ff7500d0b09eda9d0" + "reference": "472a9849930cf21f73abdb02240f17cf5b5bd1a7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/545be7e78ccbec43e599f10ff7500d0b09eda9d0", - "reference": "545be7e78ccbec43e599f10ff7500d0b09eda9d0", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/472a9849930cf21f73abdb02240f17cf5b5bd1a7", + "reference": "472a9849930cf21f73abdb02240f17cf5b5bd1a7", "shasum": "" }, "require": { @@ -2892,33 +2891,33 @@ "debug", "dump" ], - "time": "2018-01-03T17:14:19+00:00" + "time": "2018-01-29T09:03:43+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", - "version": "2.2.0", + "version": "2.2.1", "source": { "type": "git", "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", - "reference": "ab03919dfd85a74ae0372f8baf9f3c7d5c03b04b" + "reference": "0ed4a2ea4e0902dac0489e6436ebcd5bbcae9757" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/ab03919dfd85a74ae0372f8baf9f3c7d5c03b04b", - "reference": "ab03919dfd85a74ae0372f8baf9f3c7d5c03b04b", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/0ed4a2ea4e0902dac0489e6436ebcd5bbcae9757", + "reference": "0ed4a2ea4e0902dac0489e6436ebcd5bbcae9757", "shasum": "" }, "require": { - "php": "^5.5 || ^7", - "symfony/css-selector": "^2.7|~3.0" + "php": "^5.5 || ^7.0", + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0" }, "require-dev": { - "phpunit/phpunit": "~4.8|5.1.*" + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "2.2.x-dev" } }, "autoload": { @@ -2939,7 +2938,7 @@ ], "description": "CssToInlineStyles is a class that enables you to convert HTML-pages/files into HTML-pages/files with inline styles. This is very useful when you're sending emails.", "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", - "time": "2016-09-20T12:50:39+00:00" + "time": "2017-11-27T11:13:29+00:00" }, { "name": "twig/twig", @@ -4104,16 +4103,16 @@ }, { "name": "phpdocumentor/reflection-docblock", - "version": "4.2.0", + "version": "4.3.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "66465776cfc249844bde6d117abff1d22e06c2da" + "reference": "94fd0001232e47129dd3504189fa1c7225010d08" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/66465776cfc249844bde6d117abff1d22e06c2da", - "reference": "66465776cfc249844bde6d117abff1d22e06c2da", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08", + "reference": "94fd0001232e47129dd3504189fa1c7225010d08", "shasum": "" }, "require": { @@ -4151,7 +4150,7 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2017-11-27T17:38:31+00:00" + "time": "2017-11-30T07:14:17+00:00" }, { "name": "phpdocumentor/type-resolver", @@ -4752,16 +4751,16 @@ }, { "name": "sebastian/comparator", - "version": "2.1.1", + "version": "2.1.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "b11c729f95109b56a0fe9650c6a63a0fcd8c439f" + "reference": "11c07feade1d65453e06df3b3b90171d6d982087" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/b11c729f95109b56a0fe9650c6a63a0fcd8c439f", - "reference": "b11c729f95109b56a0fe9650c6a63a0fcd8c439f", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/11c07feade1d65453e06df3b3b90171d6d982087", + "reference": "11c07feade1d65453e06df3b3b90171d6d982087", "shasum": "" }, "require": { @@ -4812,7 +4811,7 @@ "compare", "equality" ], - "time": "2017-12-22T14:50:35+00:00" + "time": "2018-01-12T06:34:42+00:00" }, { "name": "sebastian/diff", @@ -5266,7 +5265,7 @@ }, { "name": "symfony/class-loader", - "version": "v3.4.3", + "version": "v3.4.4", "source": { "type": "git", "url": "https://github.com/symfony/class-loader.git", @@ -5322,16 +5321,16 @@ }, { "name": "symfony/config", - "version": "v4.0.3", + "version": "v4.0.4", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "0e86d267db0851cf55f339c97df00d693fe8592f" + "reference": "ecd917899167922086ddb3247aa43eb1c418fcb2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/0e86d267db0851cf55f339c97df00d693fe8592f", - "reference": "0e86d267db0851cf55f339c97df00d693fe8592f", + "url": "https://api.github.com/repos/symfony/config/zipball/ecd917899167922086ddb3247aa43eb1c418fcb2", + "reference": "ecd917899167922086ddb3247aa43eb1c418fcb2", "shasum": "" }, "require": { @@ -5378,11 +5377,11 @@ ], "description": "Symfony Config Component", "homepage": "https://symfony.com", - "time": "2018-01-03T07:38:00+00:00" + "time": "2018-01-21T19:06:11+00:00" }, { "name": "symfony/filesystem", - "version": "v4.0.3", + "version": "v4.0.4", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", @@ -5431,7 +5430,7 @@ }, { "name": "symfony/stopwatch", - "version": "v4.0.3", + "version": "v4.0.4", "source": { "type": "git", "url": "https://github.com/symfony/stopwatch.git", @@ -5480,16 +5479,16 @@ }, { "name": "symfony/yaml", - "version": "v4.0.3", + "version": "v4.0.4", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "b84f646b9490d2101e2c25ddeec77ceefbda2eee" + "reference": "ffc60bda1d4a00ec0b32eeabf39dc017bf480028" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/b84f646b9490d2101e2c25ddeec77ceefbda2eee", - "reference": "b84f646b9490d2101e2c25ddeec77ceefbda2eee", + "url": "https://api.github.com/repos/symfony/yaml/zipball/ffc60bda1d4a00ec0b32eeabf39dc017bf480028", + "reference": "ffc60bda1d4a00ec0b32eeabf39dc017bf480028", "shasum": "" }, "require": { @@ -5534,7 +5533,7 @@ ], "description": "Symfony Yaml Component", "homepage": "https://symfony.com", - "time": "2018-01-03T07:38:00+00:00" + "time": "2018-01-21T19:06:11+00:00" }, { "name": "theseer/tokenizer", @@ -5578,16 +5577,16 @@ }, { "name": "webmozart/assert", - "version": "1.2.0", + "version": "1.3.0", "source": { "type": "git", "url": "https://github.com/webmozart/assert.git", - "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f" + "reference": "0df1908962e7a3071564e857d86874dad1ef204a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f", - "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f", + "url": "https://api.github.com/repos/webmozart/assert/zipball/0df1908962e7a3071564e857d86874dad1ef204a", + "reference": "0df1908962e7a3071564e857d86874dad1ef204a", "shasum": "" }, "require": { @@ -5624,7 +5623,7 @@ "check", "validate" ], - "time": "2016-11-23T20:04:58+00:00" + "time": "2018-01-29T19:49:41+00:00" } ], "aliases": [], diff --git a/config/app.php b/config/app.php index 9d5c96d992..1c45157c18 100644 --- a/config/app.php +++ b/config/app.php @@ -76,8 +76,6 @@ return [ FireflyIII\Providers\RouteServiceProvider::class, // own stuff: - // Barryvdh\LaravelIdeHelper\IdeHelperServiceProvider::class, - // Barryvdh\Debugbar\ServiceProvider::class, TwigBridge\ServiceProvider::class, PragmaRX\Google2FALaravel\ServiceProvider::class, @@ -104,7 +102,6 @@ return [ ], 'aliases' => [ - 'App' => Illuminate\Support\Facades\App::class, 'Artisan' => Illuminate\Support\Facades\Artisan::class, 'Auth' => Illuminate\Support\Facades\Auth::class, diff --git a/config/csv.php b/config/csv.php index ed530932c7..3b72a48efd 100644 --- a/config/csv.php +++ b/config/csv.php @@ -73,7 +73,7 @@ return [ * */ 'import_roles' => [ - '_ignore' => [ + '_ignore' => [ 'mappable' => false, 'pre-process-map' => false, 'field' => 'ignored', @@ -82,48 +82,55 @@ return [ ], - 'bill-id' => [ + 'bill-id' => [ 'mappable' => true, 'pre-process-map' => false, 'field' => 'bill', 'converter' => 'BillId', 'mapper' => 'Bills', ], - 'note' => [ + 'note' => [ 'mappable' => false, 'pre-process-map' => false, 'field' => 'note', 'converter' => 'Note', ], - 'bill-name' => [ + 'bill-name' => [ 'mappable' => true, 'pre-process-map' => false, 'field' => 'bill', 'converter' => 'BillName', 'mapper' => 'Bills', ], - 'currency-id' => [ + 'currency-id' => [ 'mappable' => true, 'pre-process-map' => false, 'field' => 'currency', 'converter' => 'CurrencyId', 'mapper' => 'TransactionCurrencies', ], - 'currency-name' => [ + 'currency-name' => [ 'mappable' => true, 'pre-process-map' => false, 'converter' => 'CurrencyName', 'field' => 'currency', 'mapper' => 'TransactionCurrencies', ], - 'currency-code' => [ + 'currency-code' => [ 'mappable' => true, 'pre-process-map' => false, 'converter' => 'CurrencyCode', 'field' => 'currency', 'mapper' => 'TransactionCurrencies', ], - 'external-id' => [ + 'foreign-currency-code' => [ + 'mappable' => true, + 'pre-process-map' => false, + 'converter' => 'CurrencyCode', + 'field' => 'foreign_currency', + 'mapper' => 'TransactionCurrencies', + ], + 'external-id' => [ 'mappable' => false, 'pre-process-map' => false, 'converter' => 'ExternalId', @@ -298,6 +305,12 @@ return [ 'converter' => 'AmountCredit', 'field' => 'amount_credit', ], + 'amount_foreign' => [ + 'mappable' => false, + 'pre-process-map' => false, + 'converter' => 'Amount', + 'field' => 'amount_foreign', + ], 'sepa-ct-id' => [ 'mappable' => false, 'pre-process-map' => false, diff --git a/config/firefly.php b/config/firefly.php index 29e9979ccf..98c8543aae 100644 --- a/config/firefly.php +++ b/config/firefly.php @@ -33,9 +33,70 @@ return [ 'is_demo_site' => false, ], 'encryption' => (is_null(env('USE_ENCRYPTION')) || env('USE_ENCRYPTION') === true), - 'version' => '4.6.13', + 'version' => '4.7.0', 'maxUploadSize' => 15242880, - 'allowedMimes' => ['image/png', 'image/jpeg', 'application/pdf', 'text/plain'], + 'allowedMimes' => [ + /* plain files */ + 'text/plain', + + /* images */ + 'image/jpeg', + 'image/svg+xml', + 'image/png', + 'image/heic', + 'image/heic-sequence', + + /* PDF */ + 'application/pdf', + + + /* MS word */ + 'application/msword', + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + 'application/vnd.openxmlformats-officedocument.wordprocessingml.template', + /* MS excel */ + 'application/vnd.ms-excel', + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'application/vnd.openxmlformats-officedocument.spreadsheetml.template', + /* MS powerpoint */ + 'application/vnd.ms-powerpoint', + 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + 'application/vnd.openxmlformats-officedocument.presentationml.template', + 'application/vnd.openxmlformats-officedocument.presentationml.slideshow', + /* iWork */ + 'application/x-iwork-pages-sffpages', + /* open office */ + 'application/vnd.sun.xml.writer', + 'application/vnd.sun.xml.writer.template', + 'application/vnd.sun.xml.writer.global', + 'application/vnd.stardivision.writer', + 'application/vnd.stardivision.writer-global', + 'application/vnd.sun.xml.calc', + 'application/vnd.sun.xml.calc.template', + 'application/vnd.stardivision.calc', + 'application/vnd.sun.xml.impress', + 'application/vnd.sun.xml.impress.template', + 'application/vnd.stardivision.impress', + 'application/vnd.sun.xml.draw', + 'application/vnd.sun.xml.draw.template', + 'application/vnd.stardivision.draw', + 'application/vnd.sun.xml.math', + 'application/vnd.stardivision.math', + 'application/vnd.oasis.opendocument.text', + 'application/vnd.oasis.opendocument.text-template', + 'application/vnd.oasis.opendocument.text-web', + 'application/vnd.oasis.opendocument.text-master', + 'application/vnd.oasis.opendocument.graphics', + 'application/vnd.oasis.opendocument.graphics-template', + 'application/vnd.oasis.opendocument.presentation', + 'application/vnd.oasis.opendocument.presentation-template', + 'application/vnd.oasis.opendocument.spreadsheet', + 'application/vnd.oasis.opendocument.spreadsheet-template', + 'application/vnd.oasis.opendocument.chart', + 'application/vnd.oasis.opendocument.formula', + 'application/vnd.oasis.opendocument.database', + 'application/vnd.oasis.opendocument.image', + ], 'list_length' => 10, 'export_formats' => [ 'csv' => 'FireflyIII\Export\Exporter\CsvExporter', @@ -119,15 +180,14 @@ return [ 'id_ID' => ['name_locale' => 'Bahasa Indonesia', 'name_english' => 'Indonesian'], '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)'], + 'ru_RU' => ['name_locale' => 'Русский', 'name_english' => 'Russian'], 'tr_TR' => ['name_locale' => 'Türkçe', 'name_english' => 'Turkish'], // incomplete languages: - //'pt_BR' => ['name_locale' => 'Português do Brasil', 'name_english' => 'Portuguese (Brazil)'], //'id_ID' => ['name_locale' => 'Indonesian', 'name_english' => 'Indonesian'], //'es_ES' => ['name_locale' => 'Spanish', 'name_english' => 'Spanish'], - //'ru_RU' => ['name_locale' => 'Русский', 'name_english' => 'Russian'], //'sl_SI' => ['name_locale' => 'Slovenščina', 'name_english' => 'Slovenian'], - // ], 'transactionTypesByWhat' => [ 'expenses' => ['Withdrawal'], @@ -152,12 +212,12 @@ return [ 'attachment' => \FireflyIII\Models\Attachment::class, 'bill' => \FireflyIII\Models\Bill::class, 'budget' => \FireflyIII\Models\Budget::class, + 'budgetLimit' => \FireflyIII\Models\BudgetLimit::class, 'category' => \FireflyIII\Models\Category::class, 'linkType' => \FireflyIII\Models\LinkType::class, - 'transaction_type' => \FireflyIII\Models\TransactionType::class, + 'transactionType' => \FireflyIII\Models\TransactionType::class, 'journalLink' => \FireflyIII\Models\TransactionJournalLink::class, 'currency' => \FireflyIII\Models\TransactionCurrency::class, - 'budgetlimit' => \FireflyIII\Models\BudgetLimit::class, 'piggyBank' => \FireflyIII\Models\PiggyBank::class, 'tj' => \FireflyIII\Models\TransactionJournal::class, 'tag' => \FireflyIII\Models\Tag::class, @@ -165,20 +225,29 @@ return [ 'ruleGroup' => \FireflyIII\Models\RuleGroup::class, 'exportJob' => \FireflyIII\Models\ExportJob::class, 'importJob' => \FireflyIII\Models\ImportJob::class, + 'user' => \FireflyIII\User::class, - // binders - 'fromCurrencyCode' => \FireflyIII\Support\Binder\CurrencyCode::class, - 'toCurrencyCode' => \FireflyIII\Support\Binder\CurrencyCode::class, - 'unfinishedJournal' => \FireflyIII\Support\Binder\UnfinishedJournal::class, + // strings + + // dates + 'start_date' => \FireflyIII\Support\Binder\Date::class, + 'end_date' => \FireflyIII\Support\Binder\Date::class, + 'date' => \FireflyIII\Support\Binder\Date::class, + + // lists 'accountList' => \FireflyIII\Support\Binder\AccountList::class, 'expenseList' => \FireflyIII\Support\Binder\AccountList::class, 'budgetList' => \FireflyIII\Support\Binder\BudgetList::class, 'journalList' => \FireflyIII\Support\Binder\JournalList::class, 'categoryList' => \FireflyIII\Support\Binder\CategoryList::class, 'tagList' => \FireflyIII\Support\Binder\TagList::class, - 'start_date' => \FireflyIII\Support\Binder\Date::class, - 'end_date' => \FireflyIII\Support\Binder\Date::class, - 'date' => \FireflyIII\Support\Binder\Date::class, + + // others + 'fromCurrencyCode' => \FireflyIII\Support\Binder\CurrencyCode::class, + 'toCurrencyCode' => \FireflyIII\Support\Binder\CurrencyCode::class, + 'unfinishedJournal' => \FireflyIII\Support\Binder\UnfinishedJournal::class, + + ], 'rule-triggers' => [ 'user_action' => 'FireflyIII\TransactionRules\Triggers\UserAction', diff --git a/database/seeds/AccountTypeSeeder.php b/database/seeds/AccountTypeSeeder.php index c59597e880..0ebde97fb3 100644 --- a/database/seeds/AccountTypeSeeder.php +++ b/database/seeds/AccountTypeSeeder.php @@ -30,15 +30,24 @@ class AccountTypeSeeder extends Seeder { public function run() { - AccountType::create(['type' => AccountType::DEFAULT]); - AccountType::create(['type' => AccountType::CASH]); - AccountType::create(['type' => AccountType::ASSET]); - AccountType::create(['type' => AccountType::EXPENSE]); - AccountType::create(['type' => AccountType::REVENUE]); - AccountType::create(['type' => AccountType::INITIAL_BALANCE]); - AccountType::create(['type' => AccountType::BENEFICIARY]); - AccountType::create(['type' => AccountType::IMPORT]); - AccountType::create(['type' => AccountType::LOAN]); - AccountType::create(['type' => AccountType::RECONCILIATION]); + $types = [ + AccountType::DEFAULT, + AccountType::CASH, + AccountType::ASSET, + AccountType::EXPENSE, + AccountType::REVENUE, + AccountType::INITIAL_BALANCE, + AccountType::BENEFICIARY, + AccountType::IMPORT, + AccountType::LOAN, + AccountType::RECONCILIATION, + ]; + foreach ($types as $type) { + try { + AccountType::create(['type' => $type]); + } catch (PDOException $e) { + Log::warning(sprintf('Could not create account type "%s". It might exist already.', $type)); + } + } } } diff --git a/database/seeds/LinkTypeSeeder.php b/database/seeds/LinkTypeSeeder.php index c8d0266ca6..56fe78d7e8 100644 --- a/database/seeds/LinkTypeSeeder.php +++ b/database/seeds/LinkTypeSeeder.php @@ -11,7 +11,7 @@ * (at your option) any later version. * * Firefly III is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of + * but WITHOUT ANY WARRANTY, without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * @@ -33,32 +33,38 @@ class LinkTypeSeeder extends Seeder */ public function run() { - $link = new LinkType; - $link->name = 'Related'; - $link->inward = 'relates to'; - $link->outward = 'relates to'; - $link->editable = false; - $link->save(); + $types = [ + [ + 'name' => 'Related', + 'inward' => 'relates to', + 'outward' => 'relates to', + 'editable' => false, + ], + [ + 'name' => 'Refund', + 'inward' => 'is (partially) refunded by', + 'outward' => '(partially) refunds', + 'editable' => false, + ], + ['name' => 'Paid', + 'inward' => 'is (partially) paid for by', + 'outward' => '(partially) pays for', + 'editable' => false, + ], + [ + 'name' => 'Reimbursement', + 'inward' => 'is (partially) reimbursed by', + 'outward' => '(partially) reimburses', + 'editable' => false, + ], + ]; + foreach ($types as $type) { + try { + LinkType::create($type); + } catch (PDOException $e) { + Log::warning(sprintf('Could not create link type "%s". It might exist already.', $type['name'])); + } + } - $link = new LinkType; - $link->name = 'Refund'; - $link->inward = 'is (partially) refunded by'; - $link->outward = '(partially) refunds'; - $link->editable = false; - $link->save(); - - $link = new LinkType; - $link->name = 'Paid'; - $link->inward = 'is (partially) paid for by'; - $link->outward = '(partially) pays for'; - $link->editable = false; - $link->save(); - - $link = new LinkType; - $link->name = 'Reimbursement'; - $link->inward = 'is (partially) reimbursed by'; - $link->outward = '(partially) reimburses'; - $link->editable = false; - $link->save(); } } diff --git a/database/seeds/PermissionSeeder.php b/database/seeds/PermissionSeeder.php index 13690c8d62..2b8e1c202d 100644 --- a/database/seeds/PermissionSeeder.php +++ b/database/seeds/PermissionSeeder.php @@ -30,16 +30,25 @@ class PermissionSeeder extends Seeder { public function run() { - $owner = new Role; - $owner->name = 'owner'; - $owner->display_name = 'Site Owner'; - $owner->description = 'User runs this instance of FF3'; // optional - $owner->save(); + $roles = [ + [ + 'name' => 'owner', + 'display_name' => 'Site Owner', + 'description' => 'User runs this instance of FF3', + ], + [ + 'name' => 'demo', + 'display_name' => 'Demo User', + 'description' => 'User is a demo user', + ], + ]; + foreach ($roles as $role) { + try { + Role::create($role); + } catch (PDOException $e) { + Log::warning(sprintf('Could not create role "%s". It might exist already.', $role['display_name'])); + } + } - $demo = new Role; - $demo->name = 'demo'; - $demo->display_name = 'Demo User'; - $demo->description = 'User is a demo user'; - $demo->save(); } } diff --git a/database/seeds/TransactionCurrencySeeder.php b/database/seeds/TransactionCurrencySeeder.php index 99552db096..49b62b2697 100644 --- a/database/seeds/TransactionCurrencySeeder.php +++ b/database/seeds/TransactionCurrencySeeder.php @@ -30,34 +30,43 @@ class TransactionCurrencySeeder extends Seeder { public function run() { + $currencies = []; // european currencies - TransactionCurrency::create(['code' => 'EUR', 'name' => 'Euro', 'symbol' => '€', 'decimal_places' => 2]); - TransactionCurrency::create(['code' => 'HUF', 'name' => 'Hungarian forint', 'symbol' => 'Ft', 'decimal_places' => 2]); - TransactionCurrency::create(['code' => 'GBP', 'name' => 'British Pound', 'symbol' => '£', 'decimal_places' => 2]); + $currencies[] = ['code' => 'EUR', 'name' => 'Euro', 'symbol' => '€', 'decimal_places' => 2]; + $currencies[] = ['code' => 'HUF', 'name' => 'Hungarian forint', 'symbol' => 'Ft', 'decimal_places' => 2]; + $currencies[] = ['code' => 'GBP', 'name' => 'British Pound', 'symbol' => '£', 'decimal_places' => 2]; // american currencies - TransactionCurrency::create(['code' => 'USD', 'name' => 'US Dollar', 'symbol' => '$', 'decimal_places' => 2]); - TransactionCurrency::create(['code' => 'BRL', 'name' => 'Brazilian real', 'symbol' => 'R$', 'decimal_places' => 2]); - TransactionCurrency::create(['code' => 'CAD', 'name' => 'Canadian dollar', 'symbol' => 'C$', 'decimal_places' => 2]); + $currencies[] = ['code' => 'USD', 'name' => 'US Dollar', 'symbol' => '$', 'decimal_places' => 2]; + $currencies[] = ['code' => 'BRL', 'name' => 'Brazilian real', 'symbol' => 'R$', 'decimal_places' => 2]; + $currencies[] = ['code' => 'CAD', 'name' => 'Canadian dollar', 'symbol' => 'C$', 'decimal_places' => 2]; // oceanian currencies - TransactionCurrency::create(['code' => 'IDR', 'name' => 'Indonesian rupiah', 'symbol' => 'Rp', 'decimal_places' => 2]); - TransactionCurrency::create(['code' => 'AUD', 'name' => 'Australian dollar', 'symbol' => 'A$', 'decimal_places' => 2]); - TransactionCurrency::create(['code' => 'NZD', 'name' => 'New Zealand dollar', 'symbol' => 'NZ$', 'decimal_places' => 2]); + $currencies[] = ['code' => 'IDR', 'name' => 'Indonesian rupiah', 'symbol' => 'Rp', 'decimal_places' => 2]; + $currencies[] = ['code' => 'AUD', 'name' => 'Australian dollar', 'symbol' => 'A$', 'decimal_places' => 2]; + $currencies[] = ['code' => 'NZD', 'name' => 'New Zealand dollar', 'symbol' => 'NZ$', 'decimal_places' => 2]; // african currencies - TransactionCurrency::create(['code' => 'EGP', 'name' => 'Egyptian pound', 'symbol' => 'E£', 'decimal_places' => 2]); - TransactionCurrency::create(['code' => 'MAD', 'name' => 'Moroccan dirham', 'symbol' => 'DH', 'decimal_places' => 2]); - TransactionCurrency::create(['code' => 'ZAR', 'name' => 'South African rand', 'symbol' => 'R', 'decimal_places' => 2]); + $currencies[] = ['code' => 'EGP', 'name' => 'Egyptian pound', 'symbol' => 'E£', 'decimal_places' => 2]; + $currencies[] = ['code' => 'MAD', 'name' => 'Moroccan dirham', 'symbol' => 'DH', 'decimal_places' => 2]; + $currencies[] = ['code' => 'ZAR', 'name' => 'South African rand', 'symbol' => 'R', 'decimal_places' => 2]; // asian currencies - TransactionCurrency::create(['code' => 'JPY', 'name' => 'Japanese yen', 'symbol' => '¥', 'decimal_places' => 2]); - TransactionCurrency::create(['code' => 'RMB', 'name' => 'Chinese yuan', 'symbol' => '元', 'decimal_places' => 2]); - TransactionCurrency::create(['code' => 'RUB', 'name' => 'Russian ruble ', 'symbol' => '₽', 'decimal_places' => 2]); + $currencies[] = ['code' => 'JPY', 'name' => 'Japanese yen', 'symbol' => '¥', 'decimal_places' => 2]; + $currencies[] = ['code' => 'RMB', 'name' => 'Chinese yuan', 'symbol' => '元', 'decimal_places' => 2]; + $currencies[] = ['code' => 'RUB', 'name' => 'Russian ruble ', 'symbol' => '₽', 'decimal_places' => 2]; // international currencies - TransactionCurrency::create(['code' => 'XBT', 'name' => 'Bitcoin', 'symbol' => '₿', 'decimal_places' => 8]); - TransactionCurrency::create(['code' => 'BCH', 'name' => 'Bitcoin cash', 'symbol' => '₿C', 'decimal_places' => 8]); - TransactionCurrency::create(['code' => 'ETH', 'name' => 'Ethereum', 'symbol' => 'Ξ', 'decimal_places' => 12]); + $currencies[] = ['code' => 'XBT', 'name' => 'Bitcoin', 'symbol' => '₿', 'decimal_places' => 8]; + $currencies[] = ['code' => 'BCH', 'name' => 'Bitcoin cash', 'symbol' => '₿C', 'decimal_places' => 8]; + $currencies[] = ['code' => 'ETH', 'name' => 'Ethereum', 'symbol' => 'Ξ', 'decimal_places' => 12]; + + foreach ($currencies as $currency) { + try { + TransactionCurrency::create($currency); + } catch (PDOException $e) { + Log::warning(sprintf('Could not create transaction currency "%s". It might exist already.', $currency['code'])); + } + } } } diff --git a/database/seeds/TransactionTypeSeeder.php b/database/seeds/TransactionTypeSeeder.php index 7bed4bd7f9..809e5260cb 100644 --- a/database/seeds/TransactionTypeSeeder.php +++ b/database/seeds/TransactionTypeSeeder.php @@ -30,10 +30,21 @@ class TransactionTypeSeeder extends Seeder { public function run() { - TransactionType::create(['type' => TransactionType::WITHDRAWAL]); - TransactionType::create(['type' => TransactionType::DEPOSIT]); - TransactionType::create(['type' => TransactionType::TRANSFER]); - TransactionType::create(['type' => TransactionType::OPENING_BALANCE]); - TransactionType::create(['type' => TransactionType::RECONCILIATION]); + $types = [ + TransactionType::WITHDRAWAL, + TransactionType::DEPOSIT, + TransactionType::TRANSFER, + TransactionType::OPENING_BALANCE, + TransactionType::RECONCILIATION, + ]; + + foreach ($types as $type) { + try { + TransactionType::create(['type' => $type]); + } catch (PDOException $e) { + Log::warning(sprintf('Could not create transaction type "%s". It might exist already.', $type)); + } + } + } } diff --git a/public/css/firefly.css b/public/css/firefly.css index 3f783c50c2..5c3b249e0a 100644 --- a/public/css/firefly.css +++ b/public/css/firefly.css @@ -22,6 +22,13 @@ cursor: pointer; } +.markdown blockquote p { + font-size:14px; +} +.markdown h1 { + font-size:24px; +} + .general-chart-error { height: 30px; background: url('/images/error.png') no-repeat center center; diff --git a/public/css/google-fonts.css b/public/css/google-fonts.css index fcc127cf4b..1f95488861 100644 --- a/public/css/google-fonts.css +++ b/public/css/google-fonts.css @@ -23,7 +23,7 @@ font-family: 'Source Sans Pro'; font-style: italic; font-weight: 300; - src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url('../fonts/SourceSansPro-LightItalic-cyrillic-ext.woff2') format('woff2'); + src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url('../fonts/SourceSansPro-LightItalic-cyrillic-ext.woff2') format('woff2'), url('../fonts/SourceSansPro-LightItalic-cyrillic-ext.woff') format('woff'); unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; } @@ -32,7 +32,7 @@ font-family: 'Source Sans Pro'; font-style: italic; font-weight: 300; - src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url('../fonts/SourceSansPro-LightItalic-cyrillic.woff2') format('woff2'); + src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url('../fonts/SourceSansPro-LightItalic-cyrillic.woff2') format('woff2'), url('../fonts/SourceSansPro-LightItalic-cyrillic.woff') format('woff'); unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } @@ -41,7 +41,7 @@ font-family: 'Source Sans Pro'; font-style: italic; font-weight: 300; - src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url('../fonts/SourceSansPro-LightItalic-greek-ext.woff2') format('woff2'); + src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url('../fonts/SourceSansPro-LightItalic-greek-ext.woff2') format('woff2'), url('../fonts/SourceSansPro-LightItalic-greek-ext.woff') format('woff'); unicode-range: U+1F00-1FFF; } @@ -50,7 +50,7 @@ font-family: 'Source Sans Pro'; font-style: italic; font-weight: 300; - src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url('../fonts/SourceSansPro-LightItalic-greek.woff2') format('woff2'); + src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url('../fonts/SourceSansPro-LightItalic-greek.woff2') format('woff2'), url('../fonts/SourceSansPro-LightItalic-greek.woff') format('woff'); unicode-range: U+0370-03FF; } @@ -59,7 +59,7 @@ font-family: 'Source Sans Pro'; font-style: italic; font-weight: 300; - src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url('../fonts/SourceSansPro-LightItalic-vietnamese.woff2') format('woff2'); + src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url('../fonts/SourceSansPro-LightItalic-vietnamese.woff2') format('woff2'), url('../fonts/SourceSansPro-LightItalic-vietnamese.woff') format('woff'); unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; } @@ -68,7 +68,7 @@ font-family: 'Source Sans Pro'; font-style: italic; font-weight: 300; - src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url('../fonts/SourceSansPro-LightItalic-latin-ext.woff2') format('woff2'); + src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url('../fonts/SourceSansPro-LightItalic-latin-ext.woff2') format('woff2'), url('../fonts/SourceSansPro-LightItalic-latin-ext.woff') format('woff'); unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; } @@ -77,7 +77,7 @@ font-family: 'Source Sans Pro'; font-style: italic; font-weight: 300; - src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url('../fonts/SourceSansPro-LightItalic-latin.woff2') format('woff2'); + src: local('Source Sans Pro Light Italic'), local('SourceSansPro-LightItalic'), url('../fonts/SourceSansPro-LightItalic-latin.woff2') format('woff2'), url('../fonts/SourceSansPro-LightItalic-latin.woff') format('woff'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215; } @@ -86,7 +86,7 @@ font-family: 'Source Sans Pro'; font-style: italic; font-weight: 400; - src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url('../fonts/SourceSansPro-Italic-cyrillic-ext.woff2') format('woff2'); + src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url('../fonts/SourceSansPro-Italic-cyrillic-ext.woff2') format('woff2'), url('../fonts/SourceSansPro-Italic-cyrillic-ext.woff') format('woff'); unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; } @@ -95,7 +95,7 @@ font-family: 'Source Sans Pro'; font-style: italic; font-weight: 400; - src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url('../fonts/SourceSansPro-Italic-cyrillic.woff2') format('woff2'); + src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url('../fonts/SourceSansPro-Italic-cyrillic.woff2') format('woff2'), url('../fonts/SourceSansPro-Italic-cyrillic.woff') format('woff'); unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } @@ -104,7 +104,7 @@ font-family: 'Source Sans Pro'; font-style: italic; font-weight: 400; - src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url('../fonts/SourceSansPro-Italic-greek-ext.woff2') format('woff2'); + src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url('../fonts/SourceSansPro-Italic-greek-ext.woff2') format('woff2'), url('../fonts/SourceSansPro-Italic-greek-ext.woff') format('woff'); unicode-range: U+1F00-1FFF; } @@ -113,7 +113,7 @@ font-family: 'Source Sans Pro'; font-style: italic; font-weight: 400; - src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url('../fonts/SourceSansPro-Italic-greek.woff2') format('woff2'); + src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url('../fonts/SourceSansPro-Italic-greek.woff2') format('woff2'), url('../fonts/SourceSansPro-Italic-greek.woff') format('woff'); unicode-range: U+0370-03FF; } @@ -122,7 +122,7 @@ font-family: 'Source Sans Pro'; font-style: italic; font-weight: 400; - src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url('../fonts/SourceSansPro-Italic-vietnamese.woff2') format('woff2'); + src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url('../fonts/SourceSansPro-Italic-vietnamese.woff2') format('woff2'), url('../fonts/SourceSansPro-Italic-vietnamese.woff') format('woff'); unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; } @@ -131,7 +131,7 @@ font-family: 'Source Sans Pro'; font-style: italic; font-weight: 400; - src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url('../fonts/SourceSansPro-Italic-latin-ext.woff2') format('woff2'); + src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url('../fonts/SourceSansPro-Italic-latin-ext.woff2') format('woff2'), url('../fonts/SourceSansPro-Italic-latin-ext.woff') format('woff'); unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; } @@ -140,7 +140,7 @@ font-family: 'Source Sans Pro'; font-style: italic; font-weight: 400; - src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url('../fonts/SourceSansPro-Italic-latin.woff2') format('woff2'); + src: local('Source Sans Pro Italic'), local('SourceSansPro-Italic'), url('../fonts/SourceSansPro-Italic-latin.woff2') format('woff2'), url('../fonts/SourceSansPro-Italic-latin.woff') format('woff'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215; } @@ -149,7 +149,7 @@ font-family: 'Source Sans Pro'; font-style: italic; font-weight: 600; - src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url('../fonts/SourceSansPro-SemiBoldItalic-cyrillic-ext.woff2') format('woff2'); + src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url('../fonts/SourceSansPro-SemiBoldItalic-cyrillic-ext.woff2') format('woff2'), url('../fonts/SourceSansPro-SemiBoldItalic-cyrillic-ext.woff') format('woff'); unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; } @@ -158,7 +158,7 @@ font-family: 'Source Sans Pro'; font-style: italic; font-weight: 600; - src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url('../fonts/SourceSansPro-SemiBoldItalic-cyrillic.woff2') format('woff2'); + src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url('../fonts/SourceSansPro-SemiBoldItalic-cyrillic.woff2') format('woff2'), url('../fonts/SourceSansPro-SemiBoldItalic-cyrillic.woff') format('woff'); unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } @@ -167,7 +167,7 @@ font-family: 'Source Sans Pro'; font-style: italic; font-weight: 600; - src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url('../fonts/SourceSansPro-SemiBoldItalic-greek-ext.woff2') format('woff2'); + src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url('../fonts/SourceSansPro-SemiBoldItalic-greek-ext.woff2') format('woff2'), url('../fonts/SourceSansPro-SemiBoldItalic-greek-ext.woff') format('woff'); unicode-range: U+1F00-1FFF; } @@ -176,7 +176,7 @@ font-family: 'Source Sans Pro'; font-style: italic; font-weight: 600; - src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url('../fonts/SourceSansPro-SemiBoldItalic-greek.woff2') format('woff2'); + src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url('../fonts/SourceSansPro-SemiBoldItalic-greek.woff2') format('woff2'), url('../fonts/SourceSansPro-SemiBoldItalic-greek.woff') format('woff'); unicode-range: U+0370-03FF; } @@ -185,7 +185,7 @@ font-family: 'Source Sans Pro'; font-style: italic; font-weight: 600; - src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url('../fonts/SourceSansPro-SemiBoldItalic-vietnamese.woff2') format('woff2'); + src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url('../fonts/SourceSansPro-SemiBoldItalic-vietnamese.woff2') format('woff2'), url('../fonts/SourceSansPro-SemiBoldItalic-vietnamese.woff') format('woff'); unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; } @@ -194,7 +194,7 @@ font-family: 'Source Sans Pro'; font-style: italic; font-weight: 600; - src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url('../fonts/SourceSansPro-SemiBoldItalic-latin-ext.woff2') format('woff2'); + src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url('../fonts/SourceSansPro-SemiBoldItalic-latin-ext.woff2') format('woff2'), url('../fonts/SourceSansPro-SemiBoldItalic-latin-ext.woff') format('woff'); unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; } @@ -203,196 +203,7 @@ font-family: 'Source Sans Pro'; font-style: italic; font-weight: 600; - src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url('../fonts/SourceSansPro-SemiBoldItalic-latin.woff2') format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215; -} - -/* cyrillic-ext */ -@font-face { - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 300; - src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/SourceSansPro-Light-cyrillic-ext.woff2') format('woff2'); - unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; -} - -/* cyrillic */ -@font-face { - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 300; - src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/SourceSansPro-Light-cyrillic.woff2') format('woff2'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} - -/* greek-ext */ -@font-face { - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 300; - src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/SourceSansPro-Light-greek-ext.woff2') format('woff2'); - unicode-range: U+1F00-1FFF; -} - -/* greek */ -@font-face { - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 300; - src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/SourceSansPro-Light-greek.woff2') format('woff2'); - unicode-range: U+0370-03FF; -} - -/* vietnamese */ -@font-face { - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 300; - src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/SourceSansPro-Light-vietnamese.woff2') format('woff2'); - unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; -} - -/* latin-ext */ -@font-face { - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 300; - src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/SourceSansPro-Light-latin-ext.woff2') format('woff2'); - unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; -} - -/* latin */ -@font-face { - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 300; - src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/SourceSansPro-Light-latin.woff2') format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215; -} - -/* cyrillic-ext */ -@font-face { - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 400; - src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('../fonts/SourceSansPro-Regular-cyrillic-ext.woff2') format('woff2'); - unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; -} - -/* cyrillic */ -@font-face { - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 400; - src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('../fonts/SourceSansPro-Regular-cyrillic.woff2') format('woff2'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} - -/* greek-ext */ -@font-face { - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 400; - src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('../fonts/SourceSansPro-Regular-greek-ext.woff2') format('woff2'); - unicode-range: U+1F00-1FFF; -} - -/* greek */ -@font-face { - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 400; - src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('../fonts/SourceSansPro-Regular-greek.woff2') format('woff2'); - unicode-range: U+0370-03FF; -} - -/* vietnamese */ -@font-face { - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 400; - src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('../fonts/SourceSansPro-Regular-vietnamese.woff2') format('woff2'); - unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; -} - -/* latin-ext */ -@font-face { - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 400; - src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('../fonts/SourceSansPro-Regular-latin-ext.woff2') format('woff2'); - unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; -} - -/* latin */ -@font-face { - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 400; - src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('../fonts/SourceSansPro-Regular-latin.woff2') format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215; -} - -/* cyrillic-ext */ -@font-face { - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 600; - src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url('../fonts/SourceSansPro-SemiBold-cyrillic-ext.woff2') format('woff2'); - unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; -} - -/* cyrillic */ -@font-face { - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 600; - src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url('../fonts/SourceSansPro-SemiBold-cyrillic.woff2') format('woff2'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} - -/* greek-ext */ -@font-face { - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 600; - src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url('../fonts/SourceSansPro-SemiBold-greek-ext.woff2') format('woff2'); - unicode-range: U+1F00-1FFF; -} - -/* greek */ -@font-face { - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 600; - src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url('../fonts/SourceSansPro-SemiBold-greek.woff2') format('woff2'); - unicode-range: U+0370-03FF; -} - -/* vietnamese */ -@font-face { - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 600; - src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url('../fonts/SourceSansPro-SemiBold-vietnamese.woff2') format('woff2'); - unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; -} - -/* latin-ext */ -@font-face { - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 600; - src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url('../fonts/SourceSansPro-SemiBold-latin-ext.woff2') format('woff2'); - unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; -} - -/* latin */ -@font-face { - font-family: 'Source Sans Pro'; - font-style: normal; - font-weight: 600; - src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url('../fonts/SourceSansPro-SemiBold-latin.woff2') format('woff2'); + src: local('Source Sans Pro SemiBold Italic'), local('SourceSansPro-SemiBoldItalic'), url('../fonts/SourceSansPro-SemiBoldItalic-latin.woff2') format('woff2'), url('../fonts/SourceSansPro-SemiBoldItalic-latin.woff') format('woff'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215; } @@ -401,7 +212,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 700; - src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/SourceSansPro-Bold-cyrillic-ext.woff2') format('woff2'); + src: local('Source Sans Pro Bold Italic'), local('SourceSansPro-BoldItalic'), url('../fonts/SourceSansPro-BoldItalic-cyrillic-ext.woff2') format('woff2'), url('../fonts/SourceSansPro-BoldItalic-cyrillic-ext.woff') format('woff'); unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; } @@ -410,7 +221,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 700; - src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/SourceSansPro-Bold-cyrillic.woff2') format('woff2'); + src: local('Source Sans Pro Bold Italic'), local('SourceSansPro-BoldItalic'), url('../fonts/SourceSansPro-BoldItalic-cyrillic.woff2') format('woff2'), url('../fonts/SourceSansPro-BoldItalic-cyrillic.woff') format('woff'); unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } @@ -419,7 +230,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 700; - src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/SourceSansPro-Bold-greek-ext.woff2') format('woff2'); + src: local('Source Sans Pro Bold Italic'), local('SourceSansPro-BoldItalic'), url('../fonts/SourceSansPro-BoldItalic-greek-ext.woff2') format('woff2'), url('../fonts/SourceSansPro-BoldItalic-greek-ext.woff') format('woff'); unicode-range: U+1F00-1FFF; } @@ -428,7 +239,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 700; - src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/SourceSansPro-Bold-greek.woff2') format('woff2'); + src: local('Source Sans Pro Bold Italic'), local('SourceSansPro-BoldItalic'), url('../fonts/SourceSansPro-BoldItalic-greek.woff2') format('woff2'), url('../fonts/SourceSansPro-BoldItalic-greek.woff') format('woff'); unicode-range: U+0370-03FF; } @@ -437,7 +248,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 700; - src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/SourceSansPro-Bold-vietnamese.woff2') format('woff2'); + src: local('Source Sans Pro Bold Italic'), local('SourceSansPro-BoldItalic'), url('../fonts/SourceSansPro-BoldItalic-vietnamese.woff2') format('woff2'), url('../fonts/SourceSansPro-BoldItalic-vietnamese.woff') format('woff'); unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; } @@ -446,7 +257,7 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 700; - src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/SourceSansPro-Bold-latin-ext.woff2') format('woff2'); + src: local('Source Sans Pro Bold Italic'), local('SourceSansPro-BoldItalic'), url('../fonts/SourceSansPro-BoldItalic-latin-ext.woff2') format('woff2'), url('../fonts/SourceSansPro-BoldItalic-latin-ext.woff') format('woff'); unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; } @@ -455,6 +266,258 @@ font-family: 'Source Sans Pro'; font-style: normal; font-weight: 700; - src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/SourceSansPro-Bold-latin.woff2') format('woff2'); + src: local('Source Sans Pro Bold Italic'), local('SourceSansPro-BoldItalic'), url('../fonts/SourceSansPro-BoldItalic-latin.woff2') format('woff2'), url('../fonts/SourceSansPro-BoldItalic-latin.woff') format('woff'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215; -} \ No newline at end of file +} + +/* cyrillic-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 300; + src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/SourceSansPro-Light-cyrillic-ext.woff2') format('woff2'), url('../fonts/SourceSansPro-Light-cyrillic-ext.woff') format('woff'); + unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; +} + +/* cyrillic */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 300; + src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/SourceSansPro-Light-cyrillic.woff2') format('woff2'), url('../fonts/SourceSansPro-Light-cyrillic.woff') format('woff'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + +/* greek-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 300; + src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/SourceSansPro-Light-greek-ext.woff2') format('woff2'), url('../fonts/SourceSansPro-Light-greek-ext.woff') format('woff'); + unicode-range: U+1F00-1FFF; +} + +/* greek */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 300; + src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/SourceSansPro-Light-greek.woff2') format('woff2'), url('../fonts/SourceSansPro-Light-greek.woff') format('woff'); + unicode-range: U+0370-03FF; +} + +/* vietnamese */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 300; + src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/SourceSansPro-Light-vietnamese.woff2') format('woff2'), url('../fonts/SourceSansPro-Light-vietnamese.woff') format('woff'); + unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; +} + +/* latin-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 300; + src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/SourceSansPro-Light-latin-ext.woff2') format('woff2'), url('../fonts/SourceSansPro-Light-latin-ext.woff') format('woff'); + unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; +} + +/* latin */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 300; + src: local('Source Sans Pro Light'), local('SourceSansPro-Light'), url('../fonts/SourceSansPro-Light-latin.woff2') format('woff2'), url('../fonts/SourceSansPro-Light-latin.woff') format('woff'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215; +} + +/* cyrillic-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('../fonts/SourceSansPro-Regular-cyrillic-ext.woff2') format('woff2'), url('../fonts/SourceSansPro-Regular-cyrillic-ext.woff') format('woff'); + unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; +} + +/* cyrillic */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('../fonts/SourceSansPro-Regular-cyrillic.woff2') format('woff2'), url('../fonts/SourceSansPro-Regular-cyrillic.woff') format('woff'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + +/* greek-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('../fonts/SourceSansPro-Regular-greek-ext.woff2') format('woff2'), url('../fonts/SourceSansPro-Regular-greek-ext.woff') format('woff'); + unicode-range: U+1F00-1FFF; +} + +/* greek */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('../fonts/SourceSansPro-Regular-greek.woff2') format('woff2'), url('../fonts/SourceSansPro-Regular-greek.woff') format('woff'); + unicode-range: U+0370-03FF; +} + +/* vietnamese */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('../fonts/SourceSansPro-Regular-vietnamese.woff2') format('woff2'), url('../fonts/SourceSansPro-Regular-vietnamese.woff') format('woff'); + unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; +} + +/* latin-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('../fonts/SourceSansPro-Regular-latin-ext.woff2') format('woff2'), url('../fonts/SourceSansPro-Regular-latin-ext.woff') format('woff'); + unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; +} + +/* latin */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 400; + src: local('Source Sans Pro Regular'), local('SourceSansPro-Regular'), url('../fonts/SourceSansPro-Regular-latin.woff2') format('woff2'), url('../fonts/SourceSansPro-Regular-latin.woff') format('woff'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215; +} + +/* cyrillic-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 600; + src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url('../fonts/SourceSansPro-SemiBold-cyrillic-ext.woff2') format('woff2'), url('../fonts/SourceSansPro-SemiBold-cyrillic-ext.woff') format('woff'); + unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; +} + +/* cyrillic */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 600; + src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url('../fonts/SourceSansPro-SemiBold-cyrillic.woff2') format('woff2'), url('../fonts/SourceSansPro-SemiBold-cyrillic.woff') format('woff'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + +/* greek-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 600; + src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url('../fonts/SourceSansPro-SemiBold-greek-ext.woff2') format('woff2'), url('../fonts/SourceSansPro-SemiBold-greek-ext.woff') format('woff'); + unicode-range: U+1F00-1FFF; +} + +/* greek */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 600; + src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url('../fonts/SourceSansPro-SemiBold-greek.woff2') format('woff2'), url('../fonts/SourceSansPro-SemiBold-greek.woff') format('woff'); + unicode-range: U+0370-03FF; +} + +/* vietnamese */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 600; + src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url('../fonts/SourceSansPro-SemiBold-vietnamese.woff2') format('woff2'), url('../fonts/SourceSansPro-SemiBold-vietnamese.woff') format('woff'); + unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; +} + +/* latin-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 600; + src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url('../fonts/SourceSansPro-SemiBold-latin-ext.woff2') format('woff2'), url('../fonts/SourceSansPro-SemiBold-latin-ext.woff') format('woff'); + unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; +} + +/* latin */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 600; + src: local('Source Sans Pro SemiBold'), local('SourceSansPro-SemiBold'), url('../fonts/SourceSansPro-SemiBold-latin.woff2') format('woff2'), url('../fonts/SourceSansPro-SemiBold-latin.woff') format('woff'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215; +} + +/* cyrillic-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/SourceSansPro-Bold-cyrillic-ext.woff2') format('woff2'), url('../fonts/SourceSansPro-Bold-cyrillic-ext.woff') format('woff'); + unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; +} + +/* cyrillic */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/SourceSansPro-Bold-cyrillic.woff2') format('woff2'), url('../fonts/SourceSansPro-Bold-cyrillic.woff') format('woff'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} + +/* greek-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/SourceSansPro-Bold-greek-ext.woff2') format('woff2'), url('../fonts/SourceSansPro-Bold-greek-ext.woff') format('woff'); + unicode-range: U+1F00-1FFF; +} + +/* greek */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/SourceSansPro-Bold-greek.woff2') format('woff2'), url('../fonts/SourceSansPro-Bold-greek.woff') format('woff'); + unicode-range: U+0370-03FF; +} + +/* vietnamese */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/SourceSansPro-Bold-vietnamese.woff2') format('woff2'), url('../fonts/SourceSansPro-Bold-vietnamese.woff') format('woff'); + unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; +} + +/* latin-ext */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/SourceSansPro-Bold-latin-ext.woff2') format('woff2'), url('../fonts/SourceSansPro-Bold-latin-ext.woff') format('woff'); + unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; +} + +/* latin */ +@font-face { + font-family: 'Source Sans Pro'; + font-style: normal; + font-weight: 700; + src: local('Source Sans Pro Bold'), local('SourceSansPro-Bold'), url('../fonts/SourceSansPro-Bold-latin.woff2') format('woff2'), url('../fonts/SourceSansPro-Bold-latin.woff') format('woff'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215; +} diff --git a/public/fonts/SourceSansPro-Bold-cyrillic-ext.woff b/public/fonts/SourceSansPro-Bold-cyrillic-ext.woff new file mode 100644 index 0000000000..b72af4d82d Binary files /dev/null and b/public/fonts/SourceSansPro-Bold-cyrillic-ext.woff differ diff --git a/public/fonts/SourceSansPro-Bold-cyrillic.woff b/public/fonts/SourceSansPro-Bold-cyrillic.woff new file mode 100644 index 0000000000..120079b15d Binary files /dev/null and b/public/fonts/SourceSansPro-Bold-cyrillic.woff differ diff --git a/public/fonts/SourceSansPro-Bold-greek-ext.woff b/public/fonts/SourceSansPro-Bold-greek-ext.woff new file mode 100644 index 0000000000..2a9ed1ca56 Binary files /dev/null and b/public/fonts/SourceSansPro-Bold-greek-ext.woff differ diff --git a/public/fonts/SourceSansPro-Bold-greek.woff b/public/fonts/SourceSansPro-Bold-greek.woff new file mode 100644 index 0000000000..7beed8bed1 Binary files /dev/null and b/public/fonts/SourceSansPro-Bold-greek.woff differ diff --git a/public/fonts/SourceSansPro-Bold-latin-ext.woff b/public/fonts/SourceSansPro-Bold-latin-ext.woff new file mode 100644 index 0000000000..c7bab33e6f Binary files /dev/null and b/public/fonts/SourceSansPro-Bold-latin-ext.woff differ diff --git a/public/fonts/SourceSansPro-Bold-latin.woff b/public/fonts/SourceSansPro-Bold-latin.woff new file mode 100644 index 0000000000..9d77184ce6 Binary files /dev/null and b/public/fonts/SourceSansPro-Bold-latin.woff differ diff --git a/public/fonts/SourceSansPro-Bold-vietnamese.woff b/public/fonts/SourceSansPro-Bold-vietnamese.woff new file mode 100644 index 0000000000..e13ffdf8d7 Binary files /dev/null and b/public/fonts/SourceSansPro-Bold-vietnamese.woff differ diff --git a/public/fonts/SourceSansPro-BoldItalic-cyrillic-ext.woff b/public/fonts/SourceSansPro-BoldItalic-cyrillic-ext.woff new file mode 100644 index 0000000000..df807fe5e6 Binary files /dev/null and b/public/fonts/SourceSansPro-BoldItalic-cyrillic-ext.woff differ diff --git a/public/fonts/SourceSansPro-BoldItalic-cyrillic-ext.woff2 b/public/fonts/SourceSansPro-BoldItalic-cyrillic-ext.woff2 new file mode 100644 index 0000000000..9165569335 Binary files /dev/null and b/public/fonts/SourceSansPro-BoldItalic-cyrillic-ext.woff2 differ diff --git a/public/fonts/SourceSansPro-BoldItalic-cyrillic.woff b/public/fonts/SourceSansPro-BoldItalic-cyrillic.woff new file mode 100644 index 0000000000..df807fe5e6 Binary files /dev/null and b/public/fonts/SourceSansPro-BoldItalic-cyrillic.woff differ diff --git a/public/fonts/SourceSansPro-BoldItalic-cyrillic.woff2 b/public/fonts/SourceSansPro-BoldItalic-cyrillic.woff2 new file mode 100644 index 0000000000..9165569335 Binary files /dev/null and b/public/fonts/SourceSansPro-BoldItalic-cyrillic.woff2 differ diff --git a/public/fonts/SourceSansPro-BoldItalic-greek-ext.woff b/public/fonts/SourceSansPro-BoldItalic-greek-ext.woff new file mode 100644 index 0000000000..bdf5a8bdb5 Binary files /dev/null and b/public/fonts/SourceSansPro-BoldItalic-greek-ext.woff differ diff --git a/public/fonts/SourceSansPro-BoldItalic-greek-ext.woff2 b/public/fonts/SourceSansPro-BoldItalic-greek-ext.woff2 new file mode 100644 index 0000000000..a8877a873e Binary files /dev/null and b/public/fonts/SourceSansPro-BoldItalic-greek-ext.woff2 differ diff --git a/public/fonts/SourceSansPro-BoldItalic-greek.woff b/public/fonts/SourceSansPro-BoldItalic-greek.woff new file mode 100644 index 0000000000..bdf5a8bdb5 Binary files /dev/null and b/public/fonts/SourceSansPro-BoldItalic-greek.woff differ diff --git a/public/fonts/SourceSansPro-BoldItalic-greek.woff2 b/public/fonts/SourceSansPro-BoldItalic-greek.woff2 new file mode 100644 index 0000000000..a8877a873e Binary files /dev/null and b/public/fonts/SourceSansPro-BoldItalic-greek.woff2 differ diff --git a/public/fonts/SourceSansPro-BoldItalic-latin-ext.woff b/public/fonts/SourceSansPro-BoldItalic-latin-ext.woff new file mode 100644 index 0000000000..58bea39dc5 Binary files /dev/null and b/public/fonts/SourceSansPro-BoldItalic-latin-ext.woff differ diff --git a/public/fonts/SourceSansPro-BoldItalic-latin-ext.woff2 b/public/fonts/SourceSansPro-BoldItalic-latin-ext.woff2 new file mode 100644 index 0000000000..66e003be18 Binary files /dev/null and b/public/fonts/SourceSansPro-BoldItalic-latin-ext.woff2 differ diff --git a/public/fonts/SourceSansPro-BoldItalic-latin.woff b/public/fonts/SourceSansPro-BoldItalic-latin.woff new file mode 100644 index 0000000000..df807fe5e6 Binary files /dev/null and b/public/fonts/SourceSansPro-BoldItalic-latin.woff differ diff --git a/public/fonts/SourceSansPro-BoldItalic-latin.woff2 b/public/fonts/SourceSansPro-BoldItalic-latin.woff2 new file mode 100644 index 0000000000..9165569335 Binary files /dev/null and b/public/fonts/SourceSansPro-BoldItalic-latin.woff2 differ diff --git a/public/fonts/SourceSansPro-BoldItalic-vietnamese.woff b/public/fonts/SourceSansPro-BoldItalic-vietnamese.woff new file mode 100644 index 0000000000..229d937042 Binary files /dev/null and b/public/fonts/SourceSansPro-BoldItalic-vietnamese.woff differ diff --git a/public/fonts/SourceSansPro-BoldItalic-vietnamese.woff2 b/public/fonts/SourceSansPro-BoldItalic-vietnamese.woff2 new file mode 100644 index 0000000000..f5cbac4985 Binary files /dev/null and b/public/fonts/SourceSansPro-BoldItalic-vietnamese.woff2 differ diff --git a/public/fonts/SourceSansPro-Italic-cyrillic-ext.woff b/public/fonts/SourceSansPro-Italic-cyrillic-ext.woff new file mode 100644 index 0000000000..acd3f44f20 Binary files /dev/null and b/public/fonts/SourceSansPro-Italic-cyrillic-ext.woff differ diff --git a/public/fonts/SourceSansPro-Italic-cyrillic.woff b/public/fonts/SourceSansPro-Italic-cyrillic.woff new file mode 100644 index 0000000000..acd3f44f20 Binary files /dev/null and b/public/fonts/SourceSansPro-Italic-cyrillic.woff differ diff --git a/public/fonts/SourceSansPro-Italic-greek-ext.woff b/public/fonts/SourceSansPro-Italic-greek-ext.woff new file mode 100644 index 0000000000..87bdb30e04 Binary files /dev/null and b/public/fonts/SourceSansPro-Italic-greek-ext.woff differ diff --git a/public/fonts/SourceSansPro-Italic-greek.woff b/public/fonts/SourceSansPro-Italic-greek.woff new file mode 100644 index 0000000000..87bdb30e04 Binary files /dev/null and b/public/fonts/SourceSansPro-Italic-greek.woff differ diff --git a/public/fonts/SourceSansPro-Italic-latin-ext.woff b/public/fonts/SourceSansPro-Italic-latin-ext.woff new file mode 100644 index 0000000000..89d85e9906 Binary files /dev/null and b/public/fonts/SourceSansPro-Italic-latin-ext.woff differ diff --git a/public/fonts/SourceSansPro-Italic-latin.woff b/public/fonts/SourceSansPro-Italic-latin.woff new file mode 100644 index 0000000000..acd3f44f20 Binary files /dev/null and b/public/fonts/SourceSansPro-Italic-latin.woff differ diff --git a/public/fonts/SourceSansPro-Italic-vietnamese.woff b/public/fonts/SourceSansPro-Italic-vietnamese.woff new file mode 100644 index 0000000000..7ab473380c Binary files /dev/null and b/public/fonts/SourceSansPro-Italic-vietnamese.woff differ diff --git a/public/fonts/SourceSansPro-Light-cyrillic-ext.woff b/public/fonts/SourceSansPro-Light-cyrillic-ext.woff new file mode 100644 index 0000000000..0ae46b8e75 Binary files /dev/null and b/public/fonts/SourceSansPro-Light-cyrillic-ext.woff differ diff --git a/public/fonts/SourceSansPro-Light-cyrillic.woff b/public/fonts/SourceSansPro-Light-cyrillic.woff new file mode 100644 index 0000000000..5a771e709b Binary files /dev/null and b/public/fonts/SourceSansPro-Light-cyrillic.woff differ diff --git a/public/fonts/SourceSansPro-Light-greek-ext.woff b/public/fonts/SourceSansPro-Light-greek-ext.woff new file mode 100644 index 0000000000..0406b44079 Binary files /dev/null and b/public/fonts/SourceSansPro-Light-greek-ext.woff differ diff --git a/public/fonts/SourceSansPro-Light-greek.woff b/public/fonts/SourceSansPro-Light-greek.woff new file mode 100644 index 0000000000..bce40897c6 Binary files /dev/null and b/public/fonts/SourceSansPro-Light-greek.woff differ diff --git a/public/fonts/SourceSansPro-Light-latin-ext.woff b/public/fonts/SourceSansPro-Light-latin-ext.woff new file mode 100644 index 0000000000..1d56327323 Binary files /dev/null and b/public/fonts/SourceSansPro-Light-latin-ext.woff differ diff --git a/public/fonts/SourceSansPro-Light-latin.woff b/public/fonts/SourceSansPro-Light-latin.woff new file mode 100644 index 0000000000..7ceadfc812 Binary files /dev/null and b/public/fonts/SourceSansPro-Light-latin.woff differ diff --git a/public/fonts/SourceSansPro-Light-vietnamese.woff b/public/fonts/SourceSansPro-Light-vietnamese.woff new file mode 100644 index 0000000000..c4c358b664 Binary files /dev/null and b/public/fonts/SourceSansPro-Light-vietnamese.woff differ diff --git a/public/fonts/SourceSansPro-LightItalic-cyrillic-ext.woff b/public/fonts/SourceSansPro-LightItalic-cyrillic-ext.woff new file mode 100644 index 0000000000..aa69b60673 Binary files /dev/null and b/public/fonts/SourceSansPro-LightItalic-cyrillic-ext.woff differ diff --git a/public/fonts/SourceSansPro-LightItalic-cyrillic.woff b/public/fonts/SourceSansPro-LightItalic-cyrillic.woff new file mode 100644 index 0000000000..aa69b60673 Binary files /dev/null and b/public/fonts/SourceSansPro-LightItalic-cyrillic.woff differ diff --git a/public/fonts/SourceSansPro-LightItalic-greek-ext.woff b/public/fonts/SourceSansPro-LightItalic-greek-ext.woff new file mode 100644 index 0000000000..d6444d6b4d Binary files /dev/null and b/public/fonts/SourceSansPro-LightItalic-greek-ext.woff differ diff --git a/public/fonts/SourceSansPro-LightItalic-greek.woff b/public/fonts/SourceSansPro-LightItalic-greek.woff new file mode 100644 index 0000000000..d6444d6b4d Binary files /dev/null and b/public/fonts/SourceSansPro-LightItalic-greek.woff differ diff --git a/public/fonts/SourceSansPro-LightItalic-latin-ext.woff b/public/fonts/SourceSansPro-LightItalic-latin-ext.woff new file mode 100644 index 0000000000..235ba030c2 Binary files /dev/null and b/public/fonts/SourceSansPro-LightItalic-latin-ext.woff differ diff --git a/public/fonts/SourceSansPro-LightItalic-latin.woff b/public/fonts/SourceSansPro-LightItalic-latin.woff new file mode 100644 index 0000000000..aa69b60673 Binary files /dev/null and b/public/fonts/SourceSansPro-LightItalic-latin.woff differ diff --git a/public/fonts/SourceSansPro-LightItalic-vietnamese.woff b/public/fonts/SourceSansPro-LightItalic-vietnamese.woff new file mode 100644 index 0000000000..b4e1e3bfb6 Binary files /dev/null and b/public/fonts/SourceSansPro-LightItalic-vietnamese.woff differ diff --git a/public/fonts/SourceSansPro-Regular-cyrillic-ext.woff b/public/fonts/SourceSansPro-Regular-cyrillic-ext.woff new file mode 100644 index 0000000000..7208ac33bb Binary files /dev/null and b/public/fonts/SourceSansPro-Regular-cyrillic-ext.woff differ diff --git a/public/fonts/SourceSansPro-Regular-cyrillic.woff b/public/fonts/SourceSansPro-Regular-cyrillic.woff new file mode 100644 index 0000000000..968ab912a8 Binary files /dev/null and b/public/fonts/SourceSansPro-Regular-cyrillic.woff differ diff --git a/public/fonts/SourceSansPro-Regular-greek-ext.woff b/public/fonts/SourceSansPro-Regular-greek-ext.woff new file mode 100644 index 0000000000..3bd3298563 Binary files /dev/null and b/public/fonts/SourceSansPro-Regular-greek-ext.woff differ diff --git a/public/fonts/SourceSansPro-Regular-greek.woff b/public/fonts/SourceSansPro-Regular-greek.woff new file mode 100644 index 0000000000..8572b30c4c Binary files /dev/null and b/public/fonts/SourceSansPro-Regular-greek.woff differ diff --git a/public/fonts/SourceSansPro-Regular-latin-ext.woff b/public/fonts/SourceSansPro-Regular-latin-ext.woff new file mode 100644 index 0000000000..ba4a980274 Binary files /dev/null and b/public/fonts/SourceSansPro-Regular-latin-ext.woff differ diff --git a/public/fonts/SourceSansPro-Regular-latin.woff b/public/fonts/SourceSansPro-Regular-latin.woff new file mode 100644 index 0000000000..16f51fff18 Binary files /dev/null and b/public/fonts/SourceSansPro-Regular-latin.woff differ diff --git a/public/fonts/SourceSansPro-Regular-vietnamese.woff b/public/fonts/SourceSansPro-Regular-vietnamese.woff new file mode 100644 index 0000000000..4e2a67d85b Binary files /dev/null and b/public/fonts/SourceSansPro-Regular-vietnamese.woff differ diff --git a/public/fonts/SourceSansPro-SemiBold-cyrillic-ext.woff b/public/fonts/SourceSansPro-SemiBold-cyrillic-ext.woff new file mode 100644 index 0000000000..33c1e69911 Binary files /dev/null and b/public/fonts/SourceSansPro-SemiBold-cyrillic-ext.woff differ diff --git a/public/fonts/SourceSansPro-SemiBold-cyrillic.woff b/public/fonts/SourceSansPro-SemiBold-cyrillic.woff new file mode 100644 index 0000000000..3fc34ef47a Binary files /dev/null and b/public/fonts/SourceSansPro-SemiBold-cyrillic.woff differ diff --git a/public/fonts/SourceSansPro-SemiBold-greek-ext.woff b/public/fonts/SourceSansPro-SemiBold-greek-ext.woff new file mode 100644 index 0000000000..2c6c1834c4 Binary files /dev/null and b/public/fonts/SourceSansPro-SemiBold-greek-ext.woff differ diff --git a/public/fonts/SourceSansPro-SemiBold-greek.woff b/public/fonts/SourceSansPro-SemiBold-greek.woff new file mode 100644 index 0000000000..a592bbfbef Binary files /dev/null and b/public/fonts/SourceSansPro-SemiBold-greek.woff differ diff --git a/public/fonts/SourceSansPro-SemiBold-latin-ext.woff b/public/fonts/SourceSansPro-SemiBold-latin-ext.woff new file mode 100644 index 0000000000..1d7ccf5fea Binary files /dev/null and b/public/fonts/SourceSansPro-SemiBold-latin-ext.woff differ diff --git a/public/fonts/SourceSansPro-SemiBold-latin.woff b/public/fonts/SourceSansPro-SemiBold-latin.woff new file mode 100644 index 0000000000..3c6ce2ff36 Binary files /dev/null and b/public/fonts/SourceSansPro-SemiBold-latin.woff differ diff --git a/public/fonts/SourceSansPro-SemiBold-vietnamese.woff b/public/fonts/SourceSansPro-SemiBold-vietnamese.woff new file mode 100644 index 0000000000..575887febc Binary files /dev/null and b/public/fonts/SourceSansPro-SemiBold-vietnamese.woff differ diff --git a/public/fonts/SourceSansPro-SemiBoldItalic-cyrillic-ext.woff b/public/fonts/SourceSansPro-SemiBoldItalic-cyrillic-ext.woff new file mode 100644 index 0000000000..04f36322b3 Binary files /dev/null and b/public/fonts/SourceSansPro-SemiBoldItalic-cyrillic-ext.woff differ diff --git a/public/fonts/SourceSansPro-SemiBoldItalic-cyrillic.woff b/public/fonts/SourceSansPro-SemiBoldItalic-cyrillic.woff new file mode 100644 index 0000000000..04f36322b3 Binary files /dev/null and b/public/fonts/SourceSansPro-SemiBoldItalic-cyrillic.woff differ diff --git a/public/fonts/SourceSansPro-SemiBoldItalic-greek-ext.woff b/public/fonts/SourceSansPro-SemiBoldItalic-greek-ext.woff new file mode 100644 index 0000000000..5f97786279 Binary files /dev/null and b/public/fonts/SourceSansPro-SemiBoldItalic-greek-ext.woff differ diff --git a/public/fonts/SourceSansPro-SemiBoldItalic-greek.woff b/public/fonts/SourceSansPro-SemiBoldItalic-greek.woff new file mode 100644 index 0000000000..5f97786279 Binary files /dev/null and b/public/fonts/SourceSansPro-SemiBoldItalic-greek.woff differ diff --git a/public/fonts/SourceSansPro-SemiBoldItalic-latin-ext.woff b/public/fonts/SourceSansPro-SemiBoldItalic-latin-ext.woff new file mode 100644 index 0000000000..8f35cfa9eb Binary files /dev/null and b/public/fonts/SourceSansPro-SemiBoldItalic-latin-ext.woff differ diff --git a/public/fonts/SourceSansPro-SemiBoldItalic-latin.woff b/public/fonts/SourceSansPro-SemiBoldItalic-latin.woff new file mode 100644 index 0000000000..04f36322b3 Binary files /dev/null and b/public/fonts/SourceSansPro-SemiBoldItalic-latin.woff differ diff --git a/public/fonts/SourceSansPro-SemiBoldItalic-vietnamese.woff b/public/fonts/SourceSansPro-SemiBoldItalic-vietnamese.woff new file mode 100644 index 0000000000..9f2f37f5cd Binary files /dev/null and b/public/fonts/SourceSansPro-SemiBoldItalic-vietnamese.woff differ diff --git a/public/fonts/lato-100.woff b/public/fonts/lato-100.woff new file mode 100644 index 0000000000..31e741b409 Binary files /dev/null and b/public/fonts/lato-100.woff differ diff --git a/public/fonts/lato-100.woff2 b/public/fonts/lato-100.woff2 index c9da634eac..9cfc8c5771 100644 Binary files a/public/fonts/lato-100.woff2 and b/public/fonts/lato-100.woff2 differ diff --git a/public/fonts/roboto-light-300.woff b/public/fonts/roboto-light-300.woff new file mode 100644 index 0000000000..96663f0727 Binary files /dev/null and b/public/fonts/roboto-light-300.woff differ diff --git a/public/fonts/roboto-light-300.woff2 b/public/fonts/roboto-light-300.woff2 index 4411cbc875..52c5845a7c 100644 Binary files a/public/fonts/roboto-light-300.woff2 and b/public/fonts/roboto-light-300.woff2 differ diff --git a/public/js/ff/accounts/edit-reconciliation.js b/public/js/ff/accounts/edit-reconciliation.js index b32e6da5f8..af97015fa9 100644 --- a/public/js/ff/accounts/edit-reconciliation.js +++ b/public/js/ff/accounts/edit-reconciliation.js @@ -32,7 +32,7 @@ $(document).ready(function () { function setAutocompletes() { $.getJSON('json/categories').done(function (data) { - $('input[name="category"]').typeahead({source: data}); + $('input[name="category"]').typeahead({source: data, autoSelect: false}); }); $.getJSON('json/tags').done(function (data) { diff --git a/public/js/ff/accounts/reconcile.js b/public/js/ff/accounts/reconcile.js index 4f1b46666d..2a2571f338 100644 --- a/public/js/ff/accounts/reconcile.js +++ b/public/js/ff/accounts/reconcile.js @@ -36,7 +36,6 @@ $(function () { Respond to changes in balance statements. */ $('input[type="number"]').on('change', function () { - console.log('On change number input.'); if (reconcileStarted) { calculateBalanceDifference(); difference = balanceDifference - selectedAmount; @@ -50,7 +49,6 @@ $(function () { Respond to changes in the date range. */ $('input[type="date"]').on('change', function () { - console.log('On change date input.'); if (reconcileStarted) { // hide original instructions. $('.select_transactions_instruction').hide(); @@ -70,19 +68,16 @@ $(function () { }); function storeReconcile() { - console.log('In storeReconcile.'); // get modal HTML: var ids = []; $.each($('.reconcile_checkbox:checked'), function (i, v) { ids.push($(v).data('id')); }); - console.log('Ids is ' + ids); var cleared = []; $.each($('input[class="cleared"]'), function (i, v) { var obj = $(v); cleared.push(obj.data('id')); }); - console.log('Cleared is ' + ids); var variables = { startBalance: parseFloat($('input[name="start_balance"]').val()), @@ -105,7 +100,6 @@ function storeReconcile() { * @param e */ function checkReconciledBox(e) { - console.log('In checkReconciledBox.'); var el = $(e.target); var amount = parseFloat(el.val()); // if checked, add to selected amount @@ -125,13 +119,9 @@ function checkReconciledBox(e) { * and put it in balanceDifference. */ function calculateBalanceDifference() { - console.log('In calculateBalanceDifference.'); var startBalance = parseFloat($('input[name="start_balance"]').val()); var endBalance = parseFloat($('input[name="end_balance"]').val()); balanceDifference = startBalance - endBalance; - //if (balanceDifference < 0) { - // balanceDifference = balanceDifference * -1; - //} } /** @@ -139,7 +129,6 @@ function calculateBalanceDifference() { * This more or less resets the reconciliation. */ function getTransactionsForRange() { - console.log('In getTransactionsForRange.'); // clear out the box: $('#transactions_holder').empty().append($('

').addClass('text-center').html('')); var uri = transactionsUri.replace('%start%', $('input[name="start_date"]').val()).replace('%end%', $('input[name="end_date"]').val()); @@ -154,7 +143,6 @@ function getTransactionsForRange() { * */ function includeClearedTransactions() { - console.log('In includeClearedTransactions.'); $.each($('input[class="cleared"]'), function (i, v) { var obj = $(v); if (obj.data('younger') === false) { @@ -168,7 +156,6 @@ function includeClearedTransactions() { * @param data */ function placeTransactions(data) { - console.log('In placeTransactions.'); $('#transactions_holder').empty().html(data.html); selectedAmount = 0; // update start + end balance when user has not touched them. @@ -200,7 +187,6 @@ function placeTransactions(data) { * @returns {boolean} */ function startReconcile() { - console.log('In startReconcile.'); reconcileStarted = true; // hide the start button. @@ -222,7 +208,6 @@ function startReconcile() { } function updateDifference() { - console.log('In updateDifference.'); var addClass = 'text-info'; if (difference > 0) { addClass = 'text-success'; diff --git a/public/js/ff/charts.js b/public/js/ff/charts.js index a67009b729..aa01a761fd 100644 --- a/public/js/ff/charts.js +++ b/public/js/ff/charts.js @@ -88,7 +88,9 @@ const verticalLinePlugin = { afterDatasetsDraw: function (chart, easing) { if (chart.config.lineAtIndex) { - chart.config.lineAtIndex.forEach(pointIndex => this.renderVerticalLine(chart, pointIndex)); + chart.config.lineAtIndex.forEach(function(pointIndex) { + this.renderVerticalLine(chart, pointIndex); + }, this); } } }; diff --git a/public/js/ff/export/index.js b/public/js/ff/export/index.js index 6bd496b5c0..c4974d4f79 100644 --- a/public/js/ff/export/index.js +++ b/public/js/ff/export/index.js @@ -44,7 +44,6 @@ $(function () { function startExport() { "use strict"; - console.log('startExport'); hideForm(); showLoading(); hideError(); diff --git a/public/js/ff/guest.js b/public/js/ff/guest.js index fcebc44abf..dd2fe1700b 100644 --- a/public/js/ff/guest.js +++ b/public/js/ff/guest.js @@ -22,5 +22,5 @@ $(function () { "use strict"; // Focus first visible form element. - $("form input:enabled:visible:first").first().select() -}); \ No newline at end of file + $("form input:enabled:visible:first").first().focus().select() +}); diff --git a/public/js/ff/help.js b/public/js/ff/help.js index 9e7280b1c0..5ad4465497 100644 --- a/public/js/ff/help.js +++ b/public/js/ff/help.js @@ -17,7 +17,7 @@ * You should have received a copy of the GNU General Public License * along with Firefly III. If not, see . */ -/** global: token */ +/** global: token, helpPageTitle, noHelpForPage,noHelpForPageTitle */ $(function () { "use strict"; $('#help').click(showHelp); @@ -35,12 +35,12 @@ function showHelp(e) { } $('#helpBody').html(''); $('#helpModal').modal('show'); - $('#helpTitle').html('Help for this page'); + $('#helpTitle').html(helpPageTitle); $.getJSON('help/' + encodeURI(route)).done(function (data) { $('#helpBody').html(data.html); }).fail(function () { - $('#helpBody').html('

No help text could be found.

'); - $('#helpTitle').html('Apologies'); + $('#helpBody').html('

' + noHelpForPage + '

'); + $('#helpTitle').html(noHelpForPageTitle); }); $('#reenableGuidance').unbind('click').click(function () { enableGuidance(route, specialPage); diff --git a/public/js/ff/import/status.js b/public/js/ff/import/status.js index fc65d88ace..99deca6f09 100644 --- a/public/js/ff/import/status.js +++ b/public/js/ff/import/status.js @@ -28,18 +28,21 @@ var interval = 500; var numberOfSteps = 0; var numberOfReports = 0; var jobFailed = false; +var pressedStart = false; // counts how many errors have been detected var knownErrors = 0; $(function () { "use strict"; - console.log('in start'); timeOutId = setTimeout(checkJobStatus, startInterval); - $('.start-job').click(startJob); + $('.start-job').click(function () { + // notify (extra) that start button is pressed. + pressedStart = true; + startJob(); + }); if (job.configuration['auto-start']) { - console.log('Called startJob()!'); startJob(); } }); @@ -48,7 +51,6 @@ $(function () { * Downloads some JSON and responds to its content to see what the status is of the current import. */ function checkJobStatus() { - console.log('in checkJobStatus'); $.getJSON(jobStatusUri).done(reportOnJobStatus).fail(reportFailedJob); } @@ -56,7 +58,6 @@ 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(); @@ -76,7 +77,6 @@ function reportFailedJob(jqxhr, textStatus, error) { * @param data */ function reportOnJobStatus(data) { - console.log('in reportOnJobStatus: ' + data.status); switch (data.status) { case "configured": @@ -86,9 +86,13 @@ function reportOnJobStatus(data) { $('.status_configured').show(); } if (job.configuration['auto-start']) { - console.log('Job is auto start. Check status again in 500ms.'); timeOutId = setTimeout(checkJobStatus, interval); } + if (pressedStart) { + // do a time out just in case. Could be that job is running or is even done already. + timeOutId = setTimeout(checkJobStatus, 2000); + pressedStart = false; + } break; case "running": // job is running! Show the running box: @@ -115,16 +119,17 @@ function reportOnJobStatus(data) { case "finished": $('.statusbox').hide(); $('.status_finished').show(); + // report on detected errors: + reportOnErrors(data); // show text: $('#import-status-more-info').html(data.finishedText); break; - case "errored": - // TODO this view is not yet used. + case "error": // hide all possible boxes: $('.statusbox').hide(); // fill in some details: - var errorMessage = data.error_message; + var errorMessage = data.errors.join(", "); $('.fatal_error_txt').text(errorMessage); @@ -133,7 +138,6 @@ function reportOnJobStatus(data) { break; case "configuring": // redirect back to configure screen. - console.log('Will now redirect to ' + jobConfigureUri); window.location = jobConfigureUri; break; default: @@ -178,7 +182,6 @@ function jobIsStalled(data) { */ function startJob() { if (job.status === "configured") { - console.log("Job auto started!"); // disable the button, add loading thing. $('.start-job').prop('disabled', true).text('...'); $.post(jobStartUri, {_token: token}).fail(reportOnSubmitError); @@ -187,7 +190,6 @@ function startJob() { timeOutId = setTimeout(checkJobStatus, startInterval); return; } - console.log("Job not auto started because state is " + job.status); } /** diff --git a/public/js/ff/index.js b/public/js/ff/index.js index ca69033a7d..38765985d1 100644 --- a/public/js/ff/index.js +++ b/public/js/ff/index.js @@ -67,7 +67,7 @@ function getPiggyBanks() { function getNetWorthBox() { // box-net-worth $.getJSON('json/box/net-worth').done(function (data) { - $('#box-net-worth').html(data.net_worth); + $('#box-net-worth').html(data.net_worths.join(', ')); }); } diff --git a/public/js/ff/intro/intro.js b/public/js/ff/intro/intro.js index a6e2bdfa99..8d5af27e0e 100644 --- a/public/js/ff/intro/intro.js +++ b/public/js/ff/intro/intro.js @@ -18,8 +18,7 @@ * along with Firefly III. If not, see . */ -/** global: routeForTour, token, routeStepsUri, routeForFinishedTour, forceDemoOff */ - +/** global: nextLabel, prevLabel,skipLabel,doneLabel routeForTour, token, routeStepsUri, routeForFinishedTour, forceDemoOff */ $(function () { "use strict"; if (!forceDemoOff) { @@ -31,6 +30,10 @@ function setupIntro(steps) { var intro = introJs(); intro.setOptions({ + nextLabel: nextLabel, + prevLabel: prevLabel, + skipLabel: skipLabel, + doneLabel: doneLabel, steps: steps, exitOnEsc: true, exitOnOverlayClick: true, diff --git a/public/js/ff/reports/index.js b/public/js/ff/reports/index.js index 9e9562e947..971a31f1f7 100644 --- a/public/js/ff/reports/index.js +++ b/public/js/ff/reports/index.js @@ -18,11 +18,13 @@ * along with Firefly III. If not, see . */ -/** global: minDate, nonSelectedText, allSelectedText, filterPlaceholder */ +/** global: minDate, nonSelectedText, allSelectedText, filterPlaceholder, nSelectedText, selectAllText */ var defaultMultiSelect = { disableIfEmpty: true, + selectAllText: selectAllText, nonSelectedText: nonSelectedText, + nSelectedText: nSelectedText, allSelectedText: allSelectedText, includeSelectAllOption: true, enableFiltering: true, diff --git a/public/js/ff/rules/create-edit.js b/public/js/ff/rules/create-edit.js index 5b2015abc3..50e6a7db88 100644 --- a/public/js/ff/rules/create-edit.js +++ b/public/js/ff/rules/create-edit.js @@ -296,7 +296,7 @@ function updateTriggerInput(selectList) { function createAutoComplete(input, URI) { input.typeahead('destroy'); $.getJSON(URI).done(function (data) { - input.typeahead({source: data}); + input.typeahead({source: data, autoSelect: false}); }); } diff --git a/public/js/ff/transactions/mass/edit-bulk.js b/public/js/ff/transactions/mass/edit-bulk.js index 0aa1f01a3c..c4eeba57ff 100644 --- a/public/js/ff/transactions/mass/edit-bulk.js +++ b/public/js/ff/transactions/mass/edit-bulk.js @@ -24,17 +24,16 @@ $(document).ready(function () { "use strict"; $.getJSON('json/categories').done(function (data) { - $('input[name="category"]').typeahead({source: data}); + $('input[name="category"]').typeahead({source: data, autoSelect: false}); }); $.getJSON('json/tags').done(function (data) { var opt = { - typeahead: { - source: data, - afterSelect: function () { - this.$element.val(""); - } - } + source: data, + afterSelect: function () { + this.$element.val(""); + }, + autoSelect: false }; $('input[name="tags"]').tagsinput( opt diff --git a/public/js/ff/transactions/mass/edit.js b/public/js/ff/transactions/mass/edit.js index 7a2b1aa228..b267ab1bd0 100644 --- a/public/js/ff/transactions/mass/edit.js +++ b/public/js/ff/transactions/mass/edit.js @@ -26,18 +26,18 @@ $(document).ready(function () { // destination account names: if ($('input[name^="destination_account_name["]').length > 0) { $.getJSON('json/expense-accounts').done(function (data) { - $('input[name^="destination_account_name["]').typeahead({source: data}); + $('input[name^="destination_account_name["]').typeahead({source: data, autoSelect: false}); }); } // source account name if ($('input[name^="source_account_name["]').length > 0) { $.getJSON('json/revenue-accounts').done(function (data) { - $('input[name^="source_account_name["]').typeahead({source: data}); + $('input[name^="source_account_name["]').typeahead({source: data, autoSelect: false}); }); } $.getJSON('json/categories').done(function (data) { - $('input[name^="category["]').typeahead({source: data}); + $('input[name^="category["]').typeahead({source: data, autoSelect: false}); }); }); \ No newline at end of file diff --git a/public/js/ff/transactions/single/common.js b/public/js/ff/transactions/single/common.js index 330022be71..67fd6a6f87 100644 --- a/public/js/ff/transactions/single/common.js +++ b/public/js/ff/transactions/single/common.js @@ -47,12 +47,11 @@ function runModernizer() { function setCommonAutocomplete() { $.getJSON('json/tags').done(function (data) { var opt = { - typeahead: { - source: data, - afterSelect: function () { - this.$element.val(""); - } - } + source: data, + afterSelect: function () { + this.$element.val(""); + }, + autoSelect: false, }; $('input[name="tags"]').tagsinput( opt @@ -61,18 +60,18 @@ function setCommonAutocomplete() { if ($('input[name="destination_account_name"]').length > 0) { $.getJSON('json/expense-accounts').done(function (data) { - $('input[name="destination_account_name"]').typeahead({source: data}); + $('input[name="destination_account_name"]').typeahead({source: data, autoSelect: false}); }); } if ($('input[name="source_account_name"]').length > 0) { $.getJSON('json/revenue-accounts').done(function (data) { - $('input[name="source_account_name"]').typeahead({source: data}); + $('input[name="source_account_name"]').typeahead({source: data, autoSelect: false}); }); } $.getJSON('json/categories').done(function (data) { - $('input[name="category"]').typeahead({source: data}); + $('input[name="category"]').typeahead({source: data, autoSelect: false}); }); } diff --git a/public/js/ff/transactions/single/create.js b/public/js/ff/transactions/single/create.js index 38699ca7b0..d12878a468 100644 --- a/public/js/ff/transactions/single/create.js +++ b/public/js/ff/transactions/single/create.js @@ -98,7 +98,7 @@ function updateNativeCurrency(useAccountCurrency) { */ function updateDescription() { $.getJSON('json/transaction-journals/' + what).done(function (data) { - $('input[name="description"]').typeahead('destroy').typeahead({source: data}); + $('input[name="description"]').typeahead('destroy').typeahead({source: data, autoSelect: false}); }); $('#ffInput_description').focus(); } diff --git a/public/js/ff/transactions/single/edit.js b/public/js/ff/transactions/single/edit.js index 078216f34b..d36d22bce5 100644 --- a/public/js/ff/transactions/single/edit.js +++ b/public/js/ff/transactions/single/edit.js @@ -94,7 +94,7 @@ function getAccountId() { */ function setAutocompletes() { $.getJSON('json/transaction-journals/' + what).done(function (data) { - $('input[name="description"]').typeahead({source: data}); + $('input[name="description"]').typeahead({source: data, autoSelect: false}); }); } diff --git a/public/js/ff/transactions/split/edit.js b/public/js/ff/transactions/split/edit.js index bcf5a8b484..2ff1fced5d 100644 --- a/public/js/ff/transactions/split/edit.js +++ b/public/js/ff/transactions/split/edit.js @@ -33,23 +33,23 @@ $(document).ready(function () { $.getJSON('json/expense-accounts').done(function (data) { destAccounts = data; - $('input[name$="destination_account_name]"]').typeahead({source: destAccounts}); + $('input[name$="destination_account_name]"]').typeahead({source: destAccounts, autoSelect: false}); }); $.getJSON('json/revenue-accounts').done(function (data) { srcAccounts = data; - $('input[name$="source_account_name]"]').typeahead({source: srcAccounts}); + $('input[name$="source_account_name]"]').typeahead({source: srcAccounts, autoSelect: false}); }); $.getJSON('json/categories').done(function (data) { categories = data; - $('input[name$="category]"]').typeahead({source: categories}); + $('input[name$="category]"]').typeahead({source: categories, autoSelect: false}); }); $.getJSON('json/transaction-journals/' + what).done(function (data) { descriptions = data; - $('input[name="journal_description"]').typeahead({source: descriptions}); - $('input[name$="description]"]').typeahead({source: descriptions}); + $('input[name="journal_description"]').typeahead({source: descriptions, autoSelect: false}); + $('input[name$="description]"]').typeahead({source: descriptions, autoSelect: false}); }); $.getJSON('json/tags').done(function (data) { @@ -59,7 +59,8 @@ $(document).ready(function () { source: data, afterSelect: function () { this.$element.val(""); - } + }, + autoSelect: false } }; $('input[name="tags"]').tagsinput( @@ -114,17 +115,17 @@ function cloneDivRow() { source.find('input[name$="][amount]"]').val("").on('input', calculateSum); if (destAccounts.length > 0) { - source.find('input[name$="destination_account_name]"]').typeahead({source: destAccounts}); + source.find('input[name$="destination_account_name]"]').typeahead({source: destAccounts, autoSelect: false}); } if (destAccounts.length > 0) { - source.find('input[name$="source_account_name]"]').typeahead({source: srcAccounts}); + source.find('input[name$="source_account_name]"]').typeahead({source: srcAccounts, autoSelect: false}); } if (categories.length > 0) { - source.find('input[name$="category]"]').typeahead({source: categories}); + source.find('input[name$="category]"]').typeahead({source: categories, autoSelect: false}); } if (descriptions.length > 0) { - source.find('input[name$="description]"]').typeahead({source: descriptions}); + source.find('input[name$="description]"]').typeahead({source: descriptions, autoSelect: false}); } $('div.split_row_holder').append(source); diff --git a/public/js/lib/bootstrap3-typeahead.min.js b/public/js/lib/bootstrap3-typeahead.min.js index dfe9b7bbff..79335b18af 100755 --- a/public/js/lib/bootstrap3-typeahead.min.js +++ b/public/js/lib/bootstrap3-typeahead.min.js @@ -1 +1 @@ -!function(a,b){"use strict";"undefined"!=typeof module&&module.exports?module.exports=b(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):b(a.jQuery)}(this,function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.defaults,d),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.select=this.options.select||this.select,this.autoSelect="boolean"!=typeof this.options.autoSelect||this.options.autoSelect,this.highlighter=this.options.highlighter||this.highlighter,this.render=this.options.render||this.render,this.updater=this.options.updater||this.updater,this.displayText=this.options.displayText||this.displayText,this.itemLink=this.options.itemLink||this.itemLink,this.followLinkOnSelect=this.options.followLinkOnSelect||this.followLinkOnSelect,this.source=this.options.source,this.delay=this.options.delay,this.$menu=a(this.options.menu),this.$appendTo=this.options.appendTo?a(this.options.appendTo):null,this.fitToElement="boolean"==typeof this.options.fitToElement&&this.options.fitToElement,this.shown=!1,this.listen(),this.showHintOnFocus=("boolean"==typeof this.options.showHintOnFocus||"all"===this.options.showHintOnFocus)&&this.options.showHintOnFocus,this.afterSelect=this.options.afterSelect,this.afterEmptySelect=this.options.afterEmptySelect,this.addItem=!1,this.value=this.$element.val()||this.$element.text(),this.keyPressed=!1,this.focused=this.$element.is(":focus")};b.prototype={constructor:b,setDefault:function(a){if(this.$element.data("active",a),this.autoSelect||a){var b=this.updater(a);b||(b=""),this.$element.val(this.displayText(b)||b).text(this.displayText(b)||b).change(),this.afterSelect(b)}return this.hide()},select:function(){var a=this.$menu.find(".active").data("value");if(this.$element.data("active",a),this.autoSelect||a){var b=this.updater(a);b||(b=""),this.$element.val(this.displayText(b)||b).text(this.displayText(b)||b).change(),this.afterSelect(b),this.followLinkOnSelect&&this.itemLink(a)?(document.location=this.itemLink(a),this.afterSelect(b)):this.followLinkOnSelect&&!this.itemLink(a)?this.afterEmptySelect(b):this.afterSelect(b)}else this.afterEmptySelect(b);return this.hide()},updater:function(a){return a},setSource:function(a){this.source=a},show:function(){var b,c=a.extend({},this.$element.position(),{height:this.$element[0].offsetHeight}),d="function"==typeof this.options.scrollHeight?this.options.scrollHeight.call():this.options.scrollHeight;if(this.shown?b=this.$menu:this.$appendTo?(b=this.$menu.appendTo(this.$appendTo),this.hasSameParent=this.$appendTo.is(this.$element.parent())):(b=this.$menu.insertAfter(this.$element),this.hasSameParent=!0),!this.hasSameParent){b.css("position","fixed");var e=this.$element.offset();c.top=e.top,c.left=e.left}var f=a(b).parent().hasClass("dropup"),g=f?"auto":c.top+c.height+d,h=a(b).hasClass("dropdown-menu-right"),i=h?"auto":c.left;return b.css({top:g,left:i}).show(),!0===this.options.fitToElement&&b.css("width",this.$element.outerWidth()+"px"),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(b){if(this.query=void 0!==b&&null!==b?b:this.$element.val(),this.query.length0?this.$element.data("active",b[0]):this.$element.data("active",null),"all"!=this.options.items&&(b=b.slice(0,this.options.items)),this.options.addItem&&b.push(this.options.addItem),this.render(b).show()):this.shown?this.hide():this},matcher:function(a){return~this.displayText(a).toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(a){for(var b,c=[],d=[],e=[];b=a.shift();){var f=this.displayText(b);f.toLowerCase().indexOf(this.query.toLowerCase())?~f.indexOf(this.query)?d.push(b):e.push(b):c.push(b)}return c.concat(d,e)},highlighter:function(a){var b=this.query;if(""===b)return a;var c,d=a.match(/(>)([^<]*)(<)/g),e=[],f=[];if(d&&d.length)for(c=0;c2&&e.push(d[c]);else e=[],e.push(a);b=b.replace(/[\(\)\/\.\*\+\?\[\]]/g,function(a){return"\\"+a});var g,h=new RegExp(b,"g");for(c=0;c0&&f.push(e[c]);for(c=0;c$&"));return a},render:function(b){var c=this,d=this,e=!1,f=[],g=c.options.separator;return a.each(b,function(a,c){a>0&&c[g]!==b[a-1][g]&&f.push({__type:"divider"}),!c[g]||0!==a&&c[g]===b[a-1][g]||f.push({__type:"category",name:c[g]}),f.push(c)}),b=a(f).map(function(b,f){if("category"==(f.__type||!1))return a(c.options.headerHtml).text(f.name)[0];if("divider"==(f.__type||!1))return a(c.options.headerDivider)[0];var g=d.displayText(f);return b=a(c.options.item).data("value",f),b.find(c.options.itemContentSelector).addBack(c.options.itemContentSelector).html(c.highlighter(g,f)),this.followLinkOnSelect&&b.find("a").attr("href",d.itemLink(f)),g==d.$element.val()&&(b.addClass("active"),d.$element.data("active",f),e=!0),b[0]}),this.autoSelect&&!e&&(b.filter(":not(.dropdown-header)").first().addClass("active"),this.$element.data("active",b.first().data("value"))),this.$menu.html(b),this},displayText:function(a){return void 0!==a&&void 0!==a.name?a.name:a},itemLink:function(a){return null},next:function(b){var c=this.$menu.find(".active").removeClass("active"),d=c.next();d.length||(d=a(this.$menu.find("li")[0])),d.addClass("active");var e=this.updater(d.data("value"));this.$element.val(this.displayText(e)||e)},prev:function(a){var b=this.$menu.find(".active").removeClass("active"),c=b.prev();c.length||(c=this.$menu.find("li").last()),c.addClass("active");var d=this.updater(c.data("value"));this.$element.val(this.displayText(d)||d)},listen:function(){this.$element.on("focus.bootstrap3Typeahead",a.proxy(this.focus,this)).on("blur.bootstrap3Typeahead",a.proxy(this.blur,this)).on("keypress.bootstrap3Typeahead",a.proxy(this.keypress,this)).on("propertychange.bootstrap3Typeahead input.bootstrap3Typeahead",a.proxy(this.input,this)).on("keyup.bootstrap3Typeahead",a.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown.bootstrap3Typeahead",a.proxy(this.keydown,this)),"ontouchstart"in document.documentElement?this.$menu.on("touchstart","li",a.proxy(this.touchstart,this)).on("touchend","li",a.proxy(this.click,this)):this.$menu.on("click",a.proxy(this.click,this)).on("mouseenter","li",a.proxy(this.mouseenter,this)).on("mouseleave","li",a.proxy(this.mouseleave,this)).on("mousedown",a.proxy(this.mousedown,this))},destroy:function(){this.$element.data("typeahead",null),this.$element.data("active",null),this.$element.unbind("focus.bootstrap3Typeahead").unbind("blur.bootstrap3Typeahead").unbind("keypress.bootstrap3Typeahead").unbind("propertychange.bootstrap3Typeahead input.bootstrap3Typeahead").unbind("keyup.bootstrap3Typeahead"),this.eventSupported("keydown")&&this.$element.unbind("keydown.bootstrap3-typeahead"),this.$menu.remove(),this.destroyed=!0},eventSupported:function(a){var b=a in this.$element;return b||(this.$element.setAttribute(a,"return;"),b="function"==typeof this.$element[a]),b},move:function(a){if(this.shown)switch(a.keyCode){case 9:case 13:case 27:a.preventDefault();break;case 38:if(a.shiftKey)return;a.preventDefault(),this.prev();break;case 40:if(a.shiftKey)return;a.preventDefault(),this.next()}},keydown:function(b){this.keyPressed=!0,this.suppressKeyPressRepeat=~a.inArray(b.keyCode,[40,38,9,13,27]),this.shown||40!=b.keyCode?this.move(b):this.lookup()},keypress:function(a){this.suppressKeyPressRepeat||this.move(a)},input:function(a){var b=this.$element.val()||this.$element.text();this.value!==b&&(this.value=b,this.lookup())},keyup:function(a){if(!this.destroyed)switch(a.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:if(!this.shown||this.showHintOnFocus&&!this.keyPressed)return;this.select();break;case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide()}},focus:function(a){this.focused||(this.focused=!0,this.keyPressed=!1,this.options.showHintOnFocus&&!0!==this.skipShowHintOnFocus&&("all"===this.options.showHintOnFocus?this.lookup(""):this.lookup())),this.skipShowHintOnFocus&&(this.skipShowHintOnFocus=!1)},blur:function(a){this.mousedover||this.mouseddown||!this.shown?this.mouseddown&&(this.skipShowHintOnFocus=!0,this.$element.focus(),this.mouseddown=!1):(this.select(),this.hide(),this.focused=!1,this.keyPressed=!1)},click:function(a){a.preventDefault(),this.skipShowHintOnFocus=!0,this.select(),this.$element.focus(),this.hide()},mouseenter:function(b){this.mousedover=!0,this.$menu.find(".active").removeClass("active"),a(b.currentTarget).addClass("active")},mouseleave:function(a){this.mousedover=!1,!this.focused&&this.shown&&this.hide()},mousedown:function(a){this.mouseddown=!0,this.$menu.one("mouseup",function(a){this.mouseddown=!1}.bind(this))},touchstart:function(b){b.preventDefault(),this.$menu.find(".active").removeClass("active"),a(b.currentTarget).addClass("active")},touchend:function(a){a.preventDefault(),this.select(),this.$element.focus()}};var c=a.fn.typeahead;a.fn.typeahead=function(c){var d=arguments;return"string"==typeof c&&"getActive"==c?this.data("active"):this.each(function(){var e=a(this),f=e.data("typeahead"),g="object"==typeof c&&c;f||e.data("typeahead",f=new b(this,g)),"string"==typeof c&&f[c]&&(d.length>1?f[c].apply(f,Array.prototype.slice.call(d,1)):f[c]())})},b.defaults={source:[],items:8,menu:'',item:'
  • ',itemContentSelector:"a",minLength:1,scrollHeight:0,autoSelect:!0,afterSelect:a.noop,afterEmptySelect:a.noop,addItem:!1,followLinkOnSelect:!1,delay:0,separator:"category",headerHtml:'',headerDivider:''},a.fn.typeahead.Constructor=b,a.fn.typeahead.noConflict=function(){return a.fn.typeahead=c,this},a(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(b){var c=a(this);c.data("typeahead")||c.typeahead(c.data())})}); \ No newline at end of file +!function(root,factory){"use strict";"undefined"!=typeof module&&module.exports?module.exports=factory(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],function($){return factory($)}):factory(root.jQuery)}(this,function($){"use strict";var Typeahead=function(element,options){this.$element=$(element),this.options=$.extend({},Typeahead.defaults,options),this.matcher=this.options.matcher||this.matcher,this.sorter=this.options.sorter||this.sorter,this.select=this.options.select||this.select,this.autoSelect="boolean"!=typeof this.options.autoSelect||this.options.autoSelect,this.highlighter=this.options.highlighter||this.highlighter,this.render=this.options.render||this.render,this.updater=this.options.updater||this.updater,this.displayText=this.options.displayText||this.displayText,this.itemLink=this.options.itemLink||this.itemLink,this.itemTitle=this.options.itemTitle||this.itemTitle,this.followLinkOnSelect=this.options.followLinkOnSelect||this.followLinkOnSelect,this.source=this.options.source,this.delay=this.options.delay,this.theme=this.options.theme&&this.options.themes&&this.options.themes[this.options.theme]||Typeahead.defaults.themes[Typeahead.defaults.theme],this.$menu=$(this.options.menu||this.theme.menu),this.$appendTo=this.options.appendTo?$(this.options.appendTo):null,this.fitToElement="boolean"==typeof this.options.fitToElement&&this.options.fitToElement,this.shown=!1,this.listen(),this.showHintOnFocus=("boolean"==typeof this.options.showHintOnFocus||"all"===this.options.showHintOnFocus)&&this.options.showHintOnFocus,this.afterSelect=this.options.afterSelect,this.afterEmptySelect=this.options.afterEmptySelect,this.addItem=!1,this.value=this.$element.val()||this.$element.text(),this.keyPressed=!1,this.focused=this.$element.is(":focus")};Typeahead.prototype={constructor:Typeahead,setDefault:function(val){if(this.$element.data("active",val),this.autoSelect||val){var newVal=this.updater(val);newVal||(newVal=""),this.$element.val(this.displayText(newVal)||newVal).text(this.displayText(newVal)||newVal).change(),this.afterSelect(newVal)}return this.hide()},select:function(){var val=this.$menu.find(".active").data("value");if(this.$element.data("active",val),this.autoSelect||val){var newVal=this.updater(val);newVal||(newVal=""),this.$element.val(this.displayText(newVal)||newVal).text(this.displayText(newVal)||newVal).change(),this.afterSelect(newVal),this.followLinkOnSelect&&this.itemLink(val)?(document.location=this.itemLink(val),this.afterSelect(newVal)):this.followLinkOnSelect&&!this.itemLink(val)?this.afterEmptySelect(newVal):this.afterSelect(newVal)}else this.afterEmptySelect(newVal);return this.hide()},updater:function(item){return item},setSource:function(source){this.source=source},show:function(){var element,pos=$.extend({},this.$element.position(),{height:this.$element[0].offsetHeight}),scrollHeight="function"==typeof this.options.scrollHeight?this.options.scrollHeight.call():this.options.scrollHeight;if(this.shown?element=this.$menu:this.$appendTo?(element=this.$menu.appendTo(this.$appendTo),this.hasSameParent=this.$appendTo.is(this.$element.parent())):(element=this.$menu.insertAfter(this.$element),this.hasSameParent=!0),!this.hasSameParent){element.css("position","fixed");var offset=this.$element.offset();pos.top=offset.top,pos.left=offset.left}var newTop=$(element).parent().hasClass("dropup")?"auto":pos.top+pos.height+scrollHeight,newLeft=$(element).hasClass("dropdown-menu-right")?"auto":pos.left;return element.css({top:newTop,left:newLeft}).show(),!0===this.options.fitToElement&&element.css("width",this.$element.outerWidth()+"px"),this.shown=!0,this},hide:function(){return this.$menu.hide(),this.shown=!1,this},lookup:function(query){if(this.query=void 0!==query&&null!==query?query:this.$element.val(),this.query.length0?this.$element.data("active",items[0]):this.$element.data("active",null),"all"!=this.options.items&&(items=items.slice(0,this.options.items)),this.options.addItem&&items.push(this.options.addItem),this.render(items).show()):this.shown?this.hide():this},matcher:function(item){return~this.displayText(item).toLowerCase().indexOf(this.query.toLowerCase())},sorter:function(items){for(var item,beginswith=[],caseSensitive=[],caseInsensitive=[];item=items.shift();){var it=this.displayText(item);it.toLowerCase().indexOf(this.query.toLowerCase())?~it.indexOf(this.query)?caseSensitive.push(item):caseInsensitive.push(item):beginswith.push(item)}return beginswith.concat(caseSensitive,caseInsensitive)},highlighter:function(item){var text=this.query;if(""===text)return item;var i,matches=item.match(/(>)([^<]*)(<)/g),first=[],second=[];if(matches&&matches.length)for(i=0;i2&&first.push(matches[i]);else(first=[]).push(item);text=text.replace(/[\(\)\/\.\*\+\?\[\]]/g,function(mat){return"\\"+mat});var m,reg=new RegExp(text,"g");for(i=0;i0&&second.push(first[i]);for(i=0;i$&"));return item},render:function(items){var that=this,self=this,activeFound=!1,data=[],_category=that.options.separator;return $.each(items,function(key,value){key>0&&value[_category]!==items[key-1][_category]&&data.push({__type:"divider"}),!value[_category]||0!==key&&value[_category]===items[key-1][_category]||data.push({__type:"category",name:value[_category]}),data.push(value)}),items=$(data).map(function(i,item){if("category"==(item.__type||!1))return $(that.options.headerHtml||that.theme.headerHtml).text(item.name)[0];if("divider"==(item.__type||!1))return $(that.options.headerDivider||that.theme.headerDivider)[0];var text=self.displayText(item);return(i=$(that.options.item||that.theme.item).data("value",item)).find(that.options.itemContentSelector||that.theme.itemContentSelector).addBack(that.options.itemContentSelector||that.theme.itemContentSelector).html(that.highlighter(text,item)),this.followLinkOnSelect&&i.find("a").attr("href",self.itemLink(item)),i.find("a").attr("title",self.itemTitle(item)),text==self.$element.val()&&(i.addClass("active"),self.$element.data("active",item),activeFound=!0),i[0]}),this.autoSelect&&!activeFound&&(items.filter(":not(.dropdown-header)").first().addClass("active"),this.$element.data("active",items.first().data("value"))),this.$menu.html(items),this},displayText:function(item){return void 0!==item&&void 0!==item.name?item.name:item},itemLink:function(item){return null},itemTitle:function(item){return null},next:function(event){var next=this.$menu.find(".active").removeClass("active").next();next.length||(next=$(this.$menu.find($(this.options.item||this.theme.item).prop("tagName"))[0])),next.addClass("active");var newVal=this.updater(next.data("value"));this.$element.val(this.displayText(newVal)||newVal)},prev:function(event){var prev=this.$menu.find(".active").removeClass("active").prev();prev.length||(prev=this.$menu.find($(this.options.item||this.theme.item).prop("tagName")).last()),prev.addClass("active");var newVal=this.updater(prev.data("value"));this.$element.val(this.displayText(newVal)||newVal)},listen:function(){this.$element.on("focus.bootstrap3Typeahead",$.proxy(this.focus,this)).on("blur.bootstrap3Typeahead",$.proxy(this.blur,this)).on("keypress.bootstrap3Typeahead",$.proxy(this.keypress,this)).on("propertychange.bootstrap3Typeahead input.bootstrap3Typeahead",$.proxy(this.input,this)).on("keyup.bootstrap3Typeahead",$.proxy(this.keyup,this)),this.eventSupported("keydown")&&this.$element.on("keydown.bootstrap3Typeahead",$.proxy(this.keydown,this));var itemTagName=$(this.options.item||this.theme.item).prop("tagName");"ontouchstart"in document.documentElement?this.$menu.on("touchstart",itemTagName,$.proxy(this.touchstart,this)).on("touchend",itemTagName,$.proxy(this.click,this)):this.$menu.on("click",$.proxy(this.click,this)).on("mouseenter",itemTagName,$.proxy(this.mouseenter,this)).on("mouseleave",itemTagName,$.proxy(this.mouseleave,this)).on("mousedown",$.proxy(this.mousedown,this))},destroy:function(){this.$element.data("typeahead",null),this.$element.data("active",null),this.$element.unbind("focus.bootstrap3Typeahead").unbind("blur.bootstrap3Typeahead").unbind("keypress.bootstrap3Typeahead").unbind("propertychange.bootstrap3Typeahead input.bootstrap3Typeahead").unbind("keyup.bootstrap3Typeahead"),this.eventSupported("keydown")&&this.$element.unbind("keydown.bootstrap3-typeahead"),this.$menu.remove(),this.destroyed=!0},eventSupported:function(eventName){var isSupported=eventName in this.$element;return isSupported||(this.$element.setAttribute(eventName,"return;"),isSupported="function"==typeof this.$element[eventName]),isSupported},move:function(e){if(this.shown)switch(e.keyCode){case 9:case 13:case 27:e.preventDefault();break;case 38:if(e.shiftKey)return;e.preventDefault(),this.prev();break;case 40:if(e.shiftKey)return;e.preventDefault(),this.next()}},keydown:function(e){17!==e.keyCode&&(this.keyPressed=!0,this.suppressKeyPressRepeat=~$.inArray(e.keyCode,[40,38,9,13,27]),this.shown||40!=e.keyCode?this.move(e):this.lookup())},keypress:function(e){this.suppressKeyPressRepeat||this.move(e)},input:function(e){var currentValue=this.$element.val()||this.$element.text();this.value!==currentValue&&(this.value=currentValue,this.lookup())},keyup:function(e){if(!this.destroyed)switch(e.keyCode){case 40:case 38:case 16:case 17:case 18:break;case 9:if(!this.shown||this.showHintOnFocus&&!this.keyPressed)return;this.select();break;case 13:if(!this.shown)return;this.select();break;case 27:if(!this.shown)return;this.hide()}},focus:function(e){this.focused||(this.focused=!0,this.keyPressed=!1,this.options.showHintOnFocus&&!0!==this.skipShowHintOnFocus&&("all"===this.options.showHintOnFocus?this.lookup(""):this.lookup())),this.skipShowHintOnFocus&&(this.skipShowHintOnFocus=!1)},blur:function(e){this.mousedover||this.mouseddown||!this.shown?this.mouseddown&&(this.skipShowHintOnFocus=!0,this.$element.focus(),this.mouseddown=!1):(this.select(),this.hide(),this.focused=!1,this.keyPressed=!1)},click:function(e){e.preventDefault(),this.skipShowHintOnFocus=!0,this.select(),this.$element.focus(),this.hide()},mouseenter:function(e){this.mousedover=!0,this.$menu.find(".active").removeClass("active"),$(e.currentTarget).addClass("active")},mouseleave:function(e){this.mousedover=!1,!this.focused&&this.shown&&this.hide()},mousedown:function(e){this.mouseddown=!0,this.$menu.one("mouseup",function(e){this.mouseddown=!1}.bind(this))},touchstart:function(e){e.preventDefault(),this.$menu.find(".active").removeClass("active"),$(e.currentTarget).addClass("active")},touchend:function(e){e.preventDefault(),this.select(),this.$element.focus()}};var old=$.fn.typeahead;$.fn.typeahead=function(option){var arg=arguments;return"string"==typeof option&&"getActive"==option?this.data("active"):this.each(function(){var $this=$(this),data=$this.data("typeahead"),options="object"==typeof option&&option;data||$this.data("typeahead",data=new Typeahead(this,options)),"string"==typeof option&&data[option]&&(arg.length>1?data[option].apply(data,Array.prototype.slice.call(arg,1)):data[option]())})},Typeahead.defaults={source:[],items:8,minLength:1,scrollHeight:0,autoSelect:!0,afterSelect:$.noop,afterEmptySelect:$.noop,addItem:!1,followLinkOnSelect:!1,delay:0,separator:"category",theme:"bootstrap3",themes:{bootstrap3:{menu:'',item:'
  • ',itemContentSelector:"a",headerHtml:'',headerDivider:''},bootstrap4:{menu:'',item:'',itemContentSelector:".dropdown-item",headerHtml:'',headerDivider:''}}},$.fn.typeahead.Constructor=Typeahead,$.fn.typeahead.noConflict=function(){return $.fn.typeahead=old,this},$(document).on("focus.typeahead.data-api",'[data-provide="typeahead"]',function(e){var $this=$(this);$this.data("typeahead")||$this.typeahead($this.data())})}); \ No newline at end of file diff --git a/readme.md b/readme.md new file mode 100644 index 0000000000..a66daf7fd2 --- /dev/null +++ b/readme.md @@ -0,0 +1,136 @@ +

    +

    Firefly III

    + +

    + + + Packagist + + License +

    + + + +* [Introduction](#introduction) + * [Purpose](#purpose) + * [Features](#features) + * [Who is it for?](#who-is-it-for) +* [Get started](#get-started) + * [Update your instance](#update-your-instance) +* [Contribute](#contribute) +* [The goal](#the-goal) +* [Contact](#contact) +* [Other stuff](#other-stuff) + * [Versioning](#versioning) + * [License](#license) + * [Donate](#donate) + * [Alternatives](#alternatives) + * [Badges](#badges) + + + +## Introduction +"Firefly III" is a (self-hosted) manager for your personal finances. It can help you keep track of your expenses and income, so you can spend less and save more. Firefly III supports the use of budgets, categories and tags. It can import data from external sources and it has many neat financial reports available. Here are some screenshots: + +[![The index of Firefly III](https://firefly-iii.org/static/screenshots/4.7.0/tiny/index.png)](https://firefly-iii.org/static/screenshots/4.7.0/index.png) [![The account overview of Firefly III](https://firefly-iii.org/static/screenshots/4.7.0/tiny/account.png)](https://firefly-iii.org/static/screenshots/4.7.0/account.png) + +[![Overview of all budgets](https://firefly-iii.org/static/screenshots/4.7.0/tiny/budget.png)](https://firefly-iii.org/static/screenshots/4.7.0/budget.png) [![Overview of a category](https://firefly-iii.org/static/screenshots/4.7.0/tiny/category.png)](https://firefly-iii.org/static/screenshots/4.7.0/category.png) + +### Purpose +Personal financial management is pretty difficult, and everybody has their own approach to it. Some people make budgets, other people limit their cashflow by throwing away their credit cards, +others try to increase their current cashflow. There are tons of ways to save and earn money. Firefly III works on the principle that if you know where you're money is going, you can stop it from going there. + +By keeping track of your expenses and your income you can budget accordingly and save money. Stop living from paycheck to paycheck but give yourself the financial wiggle room you need. + +You can read more about this in the [official documentation](http://firefly-iii.readthedocs.io/en/latest/index.html). + +### Features +Most importantly... + +* Firefly III runs on your own server, so you are fully in control of your data. It will not contact other sites or servers +* You can import from over 2500 financial providers, in 55 countries when you enable the [Spectre API](http://firefly-iii.readthedocs.io/en/latest/import/spectre.html) +* You can import CSV files from practically any bank +* If you feel you’re missing something you can just ask me and I’ll add it! + +But actually, it features: + +* [A double-entry bookkeeping system](https://en.wikipedia.org/wiki/Double-entry_bookkeeping_system) +* You can store, edit and remove [withdrawals, deposits and transfers](http://firefly-iii.readthedocs.io/en/latest/concepts/transactions.html). This allows you full financial management +* You can manage different types of accounts + * [Asset](http://firefly-iii.readthedocs.io/en/latest/concepts/accounts.html) accounts + * Shared [asset accounts](http://firefly-iii.readthedocs.io/en/latest/concepts/accounts.html) ([household accounts](http://firefly-iii.readthedocs.io/en/latest/concepts/accounts.html)) + * Saving accounts + * Credit cards +* It's possible to create, change and manage money using [budgets](http://firefly-iii.readthedocs.io/en/latest/concepts/budgets.html) +* Organize transactions using [categories](http://firefly-iii.readthedocs.io/en/latest/concepts/categories.html) +* Save towards a goal using [piggy banks](http://firefly-iii.readthedocs.io/en/latest/advanced/piggies.html) +* Predict and anticipate [bills](http://firefly-iii.readthedocs.io/en/latest/advanced/bills.html) +* View income / expense [reports](http://firefly-iii.readthedocs.io/en/latest/advanced/reports.html) +* [Rule based](http://firefly-iii.readthedocs.io/en/latest/advanced/rules.html) transaction handling with the ability to create your own rules. +* The ability to [export data](http://firefly-iii.readthedocs.io/en/latest/import/export.html) so you can move to another system. +* The ability to [import data](http://firefly-iii.readthedocs.io/en/latest/import/csv.html) so you can move _from_ another system. +* Organize expenses using [tags](http://firefly-iii.readthedocs.io/en/latest/concepts/tags.html) +* 2 factor authentication for extra security 🔒 +* Supports any currency you want, including [crypto currencies](http://firefly-iii.readthedocs.io/en/latest/concepts/currencies.html) such as ₿itcoin and Ξthereum +* Lots of help text in case you don’t get it + +Everything is organised: + +* Clear views that should show you how you're doing +* Easy navigation through your records +* Browse back and forth to see previous months or even years +* Lots of charts because we all love them +* Financial reporting showing you how well you are doing +* Lots of math because we all like math! + +### Who is it for? +This application is for people who want to track their finances, keep an eye on their money **without having to upload their financial records to the cloud**. You're a bit tech-savvy, you like open source software and you don't mind tinkering with (self-hosted) servers. + +## Get started +There are many ways to run Firefly III +1. There is a [demo site](https://demo.firefly-iii.org) with an example financial administration already present. +2. You can [install it on your server](http://firefly-iii.readthedocs.io/en/latest/installation/server.html). +3. You can [run it using Docker](http://firefly-iii.readthedocs.io/en/latest/installation/docker.html). +4. You can [deploy to Heroku](https://heroku.com/deploy?template=https://github.com/firefly-iii/firefly-iii/tree/master) +5. You can [deploy to Sandstorm.io](https://apps.sandstorm.io/app/uws252ya9mep4t77tevn85333xzsgrpgth8q4y1rhknn1hammw70) +6. You can [install it using Softaculous](https://softaculous.com/). These guys even have made [another demo site](http://www.softaculous.com/softaculous/apps/others/Firefly_III)! +7. You can [install it using AMPPS](https://www.ampps.com/) +5. *Even more options are on the way!* + +### Update your instance +Make sure you check for updates regularly. Your Firefly III instance will ask you to do this. Upgrade instructions can be found with the installation instructions. + +## Contribute +Your help is always welcome! Feel free to open issues, ask questions, talk about it and discuss this tool. I've create several social media accounts and I invite you to follow them, tweet at them and post to them. There's [reddit](https://www.reddit.com/r/FireflyIII/), [Twitter](https://twitter.com/Firefly_III) and [Facebook](https://www.facebook.com/FireflyIII/) just to start. It's not very active but it's a start! + +Of course there are some [contributing guidelines](https://github.com/firefly-iii/firefly-iii/blob/master/.github/contributing.md) and a [code of conduct](https://github.com/firefly-iii/firefly-iii/blob/master/.github/code_of_conduct.md), which I invite you to check out. + +I can always use your help [squashing bugs](http://firefly-iii.readthedocs.io/en/latest/support/contribute.html#bugs), thinking about [new features](http://firefly-iii.readthedocs.io/en/latest/support/contribute.html#feature-requests) or [translating Firefly III](http://firefly-iii.readthedocs.io/en/latest/support/contribute.html#translations) into other languages. + +## The goal +Firefly III should give you **insight** into and **control** over your finances. Money should be useful, not scary. You should be able to *see* where it is going, to *feel* your expenses and to... wow, I'm going overboard with this aren't I? + +But you get the idea: this is your money. These are your expenses. Stop them from controlling you. I built this tool because I started to dislike money. Having it, not having, paying bills with it, etc. But no more. I want to feel "safe", whatever my balance is. And I hoop this tool can help. I know it helps me. + +## Contact +You can contact me at [thegrumpydictator@gmail.com](mailto:thegrumpydictator@gmail.com), you may open an issue or contact me through the various social media pages there are: [reddit](https://www.reddit.com/r/FireflyIII/), [Twitter](https://twitter.com/Firefly_III) and [Facebook](https://www.facebook.com/FireflyIII/). + +Over time, [many people have contributed to Firefly III](https://github.com/firefly-iii/firefly-iii/graphs/contributors). + +## Other stuff +### Versioning +We use [SemVer](http://semver.org/) for versioning. For the versions available, see [the tags](https://github.com/firefly-iii/firefly-iii/tags) on this repository. + +### License +This work [is licensed](https://github.com/firefly-iii/firefly-iii/blob/master/LICENSE) under the [GPL v3](https://www.gnu.org/licenses/gpl.html). + +### Donate +If you like Firefly III and if it helps you save lots of money, why not send me [a dime for every dollar saved](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=44UKUT455HUFA) (this is a joke, although the Paypal form works just fine, try it!) + +### Alternatives +If you are looking for alternatives, check out [Kickball's Awesome-Selfhosted list](https://github.com/Kickball/awesome-selfhosted) which features not only Firefly III but also noteworthy alternatives such as [Silverstrike](https://github.com/agstrike/silverstrike). + +### Badges +I like badges! + +[![Travis branch](https://img.shields.io/travis/firefly-iii/firefly-iii/master.svg?style=flat-square)](https://travis-ci.org/firefly-iii/firefly-iii/branches) [![Scrutinizer](https://img.shields.io/scrutinizer/g/firefly-iii/firefly-iii.svg?style=flat-square)](https://scrutinizer-ci.com/g/firefly-iii/firefly-iii/) [![Coveralls github branch](https://img.shields.io/coveralls/github/firefly-iii/firefly-iii/master.svg?style=flat-square)](https://coveralls.io/github/firefly-iii/firefly-iii) [![Requires PHP7.1](https://img.shields.io/badge/php-7.1-red.svg?style=flat-square)](https://secure.php.net/downloads.php) [![license](https://img.shields.io/github/license/firefly-iii/firefly-iii.svg?style=flat-square)](https://www.gnu.org/licenses/gpl-3.0.en.html) [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg?style=flat-square)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=44UKUT455HUFA) diff --git a/resources/lang/de_DE/breadcrumbs.php b/resources/lang/de_DE/breadcrumbs.php index 742e727791..bb3e302e00 100644 --- a/resources/lang/de_DE/breadcrumbs.php +++ b/resources/lang/de_DE/breadcrumbs.php @@ -22,34 +22,34 @@ declare(strict_types=1); return [ 'home' => 'Home', - 'edit_currency' => 'Bearbeite die Währung ":name"', - 'delete_currency' => 'Lösche die Währung ":name"', - 'newPiggyBank' => 'Erstellen Sie ein neues Sparschwein', - 'edit_piggyBank' => 'Bearbeite Sparschwein ":name"', + 'edit_currency' => 'Währung ":name" bearbeiten', + 'delete_currency' => 'Währung ":name" löschen', + 'newPiggyBank' => 'Neues Sparschwein erstellen', + 'edit_piggyBank' => 'Sparschwein ":name" bearbeiten', 'preferences' => 'Einstellungen', 'profile' => 'Profil', 'changePassword' => 'Passwort ändern', 'change_email' => 'E-Mail Adresse ändern', 'bills' => 'Rechnungen', 'newBill' => 'Neue Rechnung', - 'edit_bill' => 'Bearbeite Rechnung ":name"', - 'delete_bill' => 'Lösche Rechnung ":name"', + 'edit_bill' => 'Rechnung ":name" bearbeiten', + 'delete_bill' => 'Rechnung ":name" löschen', 'reports' => 'Berichte', 'search_result' => 'Suchergebnisse für ":query"', 'withdrawal_list' => 'Ausgaben', 'deposit_list' => 'Umsatz, Einkommen und Einlagen', - 'transfer_list' => 'Überweisungen', - 'transfers_list' => 'Überweisungen', - 'reconciliation_list' => 'Reconciliations', - 'create_withdrawal' => 'Erstelle eine neue Ausgabe', - 'create_deposit' => 'Erstelle ein neues Einkommen', - 'create_transfer' => 'Erstelle eine neue Überweisung', - 'edit_journal' => 'Bearbeite Transaktion ":description"', + 'transfer_list' => 'Umbuchungen', + 'transfers_list' => 'Umbuchungen', + 'reconciliation_list' => 'Kontenabgleiche', + 'create_withdrawal' => 'Neue Ausgabe erstellen', + 'create_deposit' => 'Neue Einnahme erstellen', + 'create_transfer' => 'Umbuchung erstellen', + 'edit_journal' => 'Transaktion ":description" bearbeiten', 'edit_reconciliation' => '":description" bearbeiten', - 'delete_journal' => 'Lösche Transaktion ":description"', + 'delete_journal' => 'Transaktion ":description" löschen', 'tags' => 'Tags', 'createTag' => 'Neuen Tag erstellen', - 'edit_tag' => 'Bearbeite Tag ":tag"', - 'delete_tag' => 'Lösche Tag ":tag"', + 'edit_tag' => 'Tag ":tag" bearbeiten', + 'delete_tag' => 'Tag ":tag" löschen', 'delete_journal_link' => 'Verbindung zwischen Transaktionen löschen', ]; diff --git a/resources/lang/de_DE/config.php b/resources/lang/de_DE/config.php index c522918cb9..3cdedd8691 100644 --- a/resources/lang/de_DE/config.php +++ b/resources/lang/de_DE/config.php @@ -21,12 +21,13 @@ declare(strict_types=1); return [ + 'html_language' => 'de', 'locale' => 'de, Deutsch, de_DE, de_DE.utf8, de_DE.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' => 'Woche %W, %Y', + 'week_in_year' => 'KW %W, %Y', 'year' => '%Y', 'half_year' => '%B %Y', ]; diff --git a/resources/lang/de_DE/demo.php b/resources/lang/de_DE/demo.php index 220e0b6c84..5d2e2c2af2 100644 --- a/resources/lang/de_DE/demo.php +++ b/resources/lang/de_DE/demo.php @@ -21,17 +21,15 @@ declare(strict_types=1); return [ - 'no_demo_text' => 'Leider gibt es keine zusätzlichen Demoerklärungen für diese Seite.', - 'see_help_icon' => 'Trotzdem kann der -Icon in der oberen rechten Ecke mehr erzählen.', - 'index' => 'Willkommen bei Firefly III! Auf dieser Seite erhalten Sie einen schnellen Überblick über Ihre Finanzen. Für weitere Informationen, besuchen Sie die Accounts → Girokonten und natürlich Budgets und Berichte Seiten. Oder sehen Sie sich einfach um und schauen wo Sie landen.', - 'accounts-index' => 'Vermögenskonten sind Ihre persönlichen Bank-Konten. Aufwandskonten sind Konten, denen Sie Geld zahlen, z. B. Läden und Freunde. Einnahmekonten sind Konten von denen Sie Geld erhalten, z. B. Ihr Arbeitgeber und andere Einkommensquellen. Auf dieser Seite können Sie diese bearbeiten oder entfernen.', - 'budgets-index' => 'Diese Seite zeigt Ihnen einen Überblick über Ihre Budgets. Die obere Leiste zeigt den Betrag, der zur Verfügung steht. Dieser kann für einen Zeitraum angepasst werden, indem Sie auf den Betrag auf der rechten Seite klicken. Wie viel bisher ausgegeben wurde wird darunter angezeigt. Darunter sind die Aufwendungen pro Haushalt und wie viel dafür veranschlagt ist.', - 'reports-index-start' => 'Firefly III supports a number of types of reports. Read about them by clicking on the -icon in the top right corner.', + 'no_demo_text' => 'Leider gibt es keine zusätzlichen Demo-Erklärungen für diese Seite.', + 'see_help_icon' => 'Vielleicht erfahren Sie mehr über das -Icon in der oberen rechten Ecke.', + 'index' => 'Willkommen bei Firefly III! Auf dieser Seite erhalten Sie einen schnellen Überblick über Ihre Finanzen. Für einen schnellen Start empfehlen wir einen Besuch bei den → Girokonten, den Budgets oder den Berichten. Oder sehen Sie sich einfach um und schauen wo Sie landen.', + 'accounts-index' => 'Konten sind Ihre persönlichen Bankkonten, Kreditkarten, Bar-Kassen, usw.. Kreditoren (Zahlungsempfänger) sind Konten, die Geld von Ihnen erhalten, z. B. der Supermarkt, das Kino oder der Vermieter. Debitoren (Einnahmequellen) sind Konten von denen Sie Geld erhalten, z. B. Ihr Arbeitgeber, die Familienkassen oder andere Einkommensquellen. Auf dieser Seite können Sie diese bearbeiten oder entfernen.', + 'budgets-index' => 'Hier finden Sie einen Überblick über Ihre Budgets. Die obere Leiste zeigt den zur Verfügung stehenden Betrag. Dieser kann angepasst werden, indem Sie auf den Betrag auf der rechten Seite klicken. Bisherige Ausgaben werden in der darunter liegenden Leiste angezeigt. Darunter finden Sie die von Ihnen angelegten Budgets sowie die bereits darauf verbuchten Ausgaben.', + 'reports-index-start' => 'Firefly III unterstützt eine Reihe von Berichten. Weitere Informationen dazu erhalten Sie über das -Symbol in der oberen rechten Ecke.', 'reports-index-examples' => 'Sehen Sie sich auch diese Beispiele an: eine monatliche Finanzübersicht, eine jährliche Finanzübersicht und eine Haushaltsübersicht.', - 'currencies-index' => 'Firefly III unterstützt mehrere Währungen. Obwohl es den Euro standardmäßig nutzt, ist es möglich US-Dollar oder viele andere Währungen zu verwenden. Wie Sie sehen können, ist eine kleine Auswahl an Währungen aufgenommen worden, aber Sie können Ihre eigenen hinzufügen. Die Standardwährung zu ändern, wird die Währung der vorhandenen Buchungen jedoch nicht ändern: Firefly III unterstützt die Verwendung mehrerer Währungen zur gleichen Zeit.', - 'transactions-index' => 'Diese Aufwendungen, Einzahlungen und Überweisungen sind nicht besonders einfallsreich. Sie wurden automatisch generiert.', - 'piggy-banks-index' => 'Wie Sie sehen können, gibt es drei Sparschweine. Benutzen die Plus- und Minusknöpfe um die Menge des Geldes in den Sparschweinen zu beeinflussen. Klicken Sie auf den Namen des Sparschweins um Details einzusehen.', + 'currencies-index' => 'Firefly III kann mit Zahlungen in unterschiedlichen Währungen umgeben. Obwohl es den Euro standardmäßig nutzt, ist es möglich, US-Dollar oder andere Währungen zu verwenden. Eine kleine Auswahl an Währungen wird bereitgestellt, Sie können jedoch weitere hinzufügen. Eine Veränderung der Standardwährung verändert keine bestehende Buchungen. Firefly III unterstützt die Verwendung mehrerer Währungen zur gleichen Zeit.', + 'transactions-index' => 'Diese Ausgaben, Einnahmen und Umbuchungen sind nicht besonders einfallsreich. Sie wurden automatisch generiert.', + 'piggy-banks-index' => 'Hier wurden bereits drei Sparschweine angelegt. Der Betrag in den Sparschweinen kann über die Plus-/Minus-Buttons angepasst werden. Klicken Sie auf den Namen des Sparschweins um weitere Informationen einzusehen.', 'import-index' => 'Natürlich kann jede CSV-Datei in Firefly III importiert werden', - 'import-configure-security' => 'Aufgrund von Sicherheitsbedenken wurde der Upload mit einer lokalen Datei ersetzt.', - 'import-configure-configuration' => 'Die unten stehende Konfiguration für die lokale Datei ist korrekt.', ]; diff --git a/resources/lang/de_DE/firefly.php b/resources/lang/de_DE/firefly.php index af93b51dce..69331a717f 100644 --- a/resources/lang/de_DE/firefly.php +++ b/resources/lang/de_DE/firefly.php @@ -44,8 +44,17 @@ return [ 'Opening balance' => 'Eröffnungsbilanz', 'create_new_stuff' => 'Erstelle neue Dinge', 'new_withdrawal' => 'Neue Ausgabe', + 'create_new_transaction' => 'Transaktion erstellen', + 'go_to_asset_accounts' => 'Zeige Girokonten', + 'go_to_budgets' => 'Budgets anzeigen', + 'go_to_categories' => 'Kategorien anzeigen', + 'go_to_bills' => 'Rechnungen anzeigen', + 'go_to_expense_accounts' => 'Ausgabe-Konten ansehen', + 'go_to_revenue_accounts' => 'Einnahme-Konten ansehen', + 'go_to_piggies' => 'Sparschweine anzeigen', 'new_deposit' => 'Neue Einnahme', - 'new_transfer' => 'Neue Überweisung', + 'new_transfer' => 'Neue Umbuchung', + 'new_transfers' => 'Neue Umbuchung', 'new_asset_account' => 'Neues Girokonto', 'new_expense_account' => 'Neuer Debitor (Geldausgang)', 'new_revenue_account' => 'Neuer Kreditor (Geldeingang)', @@ -60,6 +69,9 @@ return [ 'flash_error_multiple' => 'Es gibt einen Fehler|Es gibt :count Fehler', 'net_worth' => 'Vermögen', 'route_has_no_help' => 'Es gibt keinen Hilfetext für diese Seite.', + 'help_for_this_page' => 'Hilfe zu dieser Seite', + 'no_help_could_be_found' => 'Es wurde kein Hilfetext gefunden.', + 'no_help_title' => 'Es tut uns Leid, aber ein Fehler ist aufgetreten.', 'two_factor_welcome' => 'Hallo :user!', 'two_factor_enter_code' => 'Um fortzufahren geben Sie bitte ihren Zwei-Faktor-Authentifizierungscode ein. Ihre Anwendung kann diesen für Sie generieren.', 'two_factor_code_here' => 'Code hier eingeben', @@ -106,10 +118,16 @@ return [ 'chart_category_all' => 'Diagramm für alle Transaktionen der Kategorie ":name"', 'clone_withdrawal' => 'Diese Ausgabe klonen', 'clone_deposit' => 'Diese Einnahme klonen', - 'clone_transfer' => 'Diese Überweisung klonen', + 'clone_transfer' => 'Diese Umbuchung duplizieren', 'multi_select_no_selection' => 'Nichts ausgewählt', + 'multi_select_select_all' => 'Alle auswählen', + 'multi_select_n_selected' => 'ausgewählt', 'multi_select_all_selected' => 'Alle ausgewählt', 'multi_select_filter_placeholder' => 'Suche..', + 'intro_next_label' => 'Nächste', + 'intro_prev_label' => 'Vorherige', + 'intro_skip_label' => 'Überspringen', + 'intro_done_label' => 'Erledigt', 'between_dates_breadcrumb' => 'Zwischen :start und :end', 'all_journals_without_budget' => 'Alle Transaktionen ohne Budget', 'journals_without_budget' => 'Transaktionen ohne Budget', @@ -118,17 +136,17 @@ return [ 'all_journals_for_account' => 'Alle Transaktionen für Konto :name', 'chart_all_journals_for_account' => 'Diagramm für alle Transaktionen des Kontos :name', 'journals_in_period_for_account' => 'Alle Transaktionen für Konto :name zwischen :start und :end', - 'transferred' => 'Überwiesen', + 'transferred' => 'Umgebucht', 'all_withdrawal' => 'Alle Ausgaben', 'all_transactions' => 'Alle Transaktionen', 'title_withdrawal_between' => 'Alle Ausgaben zwischen :start und :end', 'all_deposit' => 'Alle Einnahmen', 'title_deposit_between' => 'Alle Einnahmen zwischen :start und :end', - 'all_transfers' => 'Alle Transfers', - 'title_transfers_between' => 'Alle Transfers zwischen :start und :end', - 'all_transfer' => 'Alle Transfers', + 'all_transfers' => 'Alle Umbuchungen', + 'title_transfers_between' => 'Alle Umbuchungen zwischen :start und :end', + 'all_transfer' => 'Alle Umbuchungen', 'all_journals_for_tag' => 'Alle Transaktionen für Tag ":tag"', - 'title_transfer_between' => 'Alle Transfers zwischen :start und :end', + 'title_transfer_between' => 'Alle Umbuchungen zwischen :start und :end', 'all_journals_for_category' => 'Alle Transaktionen für Kategorie :name', 'all_journals_for_budget' => 'Alle Transaktionen des Haushalts :name', 'chart_all_journals_for_budget' => 'Diagramm für alle Transaktionen des Haushalts :name', @@ -141,32 +159,32 @@ return [ 'invalid_server_configuration' => 'Ungültige Serverkonfiguration', 'invalid_locale_settings' => 'Firefly III kann keine Geldbeträge formatieren, da auf Ihrem Server die erforderlichen Pakete fehlen. Es gibt eine Anleitung, wie dies behoben werden kann.', 'quickswitch' => 'Schnellauswahl', - 'sign_in_to_start' => 'Sign in to start your session', - 'sign_in' => 'Sign in', - 'register_new_account' => 'Register a new account', - 'forgot_my_password' => 'I forgot my password', - 'problems_with_input' => 'There were some problems with your input.', - 'reset_password' => 'Reset your password', - 'button_reset_password' => 'Reset password', - 'reset_button' => 'Reset', - 'want_to_login' => 'I want to login', - 'button_register' => 'Register', + 'sign_in_to_start' => 'Melden Sie sich an um Ihre Sitzung zu starten', + 'sign_in' => 'Anmelden', + 'register_new_account' => 'Neues Benutzerkonto anlegen', + 'forgot_my_password' => 'Passwort vergessen', + 'problems_with_input' => 'Es gab einige Probleme mit Ihrer Eingabe.', + 'reset_password' => 'Ihr Passwort zurücksetzen', + 'button_reset_password' => 'Passwort zurücksetzen', + 'reset_button' => 'Zurücksetzen', + 'want_to_login' => 'Ich möchte mich anmelden', + 'button_register' => 'Registrieren', // check for updates: - 'update_check_title' => 'Check for updates', - 'admin_update_check_title' => 'Automatically check for update', - 'admin_update_check_explain' => 'Firefly III can check for updates automatically. When you enable this setting, it will contact Github to see if a new version of Firefly III is available. When it is, you will get a notification. You can test this notification using the button on the right. Please indicate below if you want Firefly III to check for updates.', - 'check_for_updates_permission' => 'Firefly III can check for updates, but it needs your permission to do so. Please go to the administration to indicate if you would like this feature to be enabled.', - 'updates_ask_me_later' => 'Ask me later', - 'updates_do_not_check' => 'Do not check for updates', - 'updates_enable_check' => 'Enable the check for updates', - 'admin_update_check_now_title' => 'Check for updates now', - 'admin_update_check_now_explain' => 'If you press the button, Firefly III will see if your current version is the latest.', - 'check_for_updates_button' => 'Check now!', - 'update_new_version_alert' => 'A new version is available. You are running v:your_version, the latest version is v:new_version which was released on :date.', - 'update_current_version_alert' => 'You are running v:version, which is the latest available release.', - 'update_newer_version_alert' => 'You are running v:your_version, which is newer than the latest release, v:new_version.', - 'update_check_error' => 'An error occurred while checking for updates. Please view the log files.', + 'update_check_title' => 'Nach Updates suchen', + 'admin_update_check_title' => 'Automatisch nach Updates suchen', + 'admin_update_check_explain' => 'Firefly III kann automatisch nach Updates suchen. Wenn Sie diese Einstellung aktivieren, wird Github aufgerufen, um festzustellen, ob eine neue Version von Firefly III verfügbar ist. Falls dies der Fall ist, erhalten Sie eine Benachrichtigung. Sie können diese Benachrichtigung mit der Schaltfläche auf der rechten Seite testen. Bitte geben Sie unten an, ob Sie möchten, dass Firefly III nach Updates sucht.', + 'check_for_updates_permission' => 'Firefly III kann nach Updates suchen, benötigt jedoch Ihre Erlaubnis dazu. Bitte gehen Sie zur Administration, um anzugeben, ob diese Funktion aktiviert werden soll.', + 'updates_ask_me_later' => 'Später fragen', + 'updates_do_not_check' => 'Nicht nach Updates suchen', + 'updates_enable_check' => 'Nach Updates suchen', + 'admin_update_check_now_title' => 'Auf Update überprüfen', + 'admin_update_check_now_explain' => 'Wenn Sie den Knopf drücken, wird Firefly III sehen, ob Ihre aktuelle Version die neueste ist.', + 'check_for_updates_button' => 'Jetzt prüfen!', + '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_current_version_alert' => 'Sie verwenden Version v:version. Dies ist die neueste verfügbare Version.', + 'update_newer_version_alert' => 'Sie verwenden v:your_version, welches neuer als die neueste Version (v:new_version) ist.', + 'update_check_error' => 'Beim Suchen nach Updates ist ein Fehler aufgetreten. Bitte sehen Sie sich die Log-Dateien an.', // search 'search' => 'Suche', @@ -193,8 +211,8 @@ return [ // export data: 'import_and_export' => 'Import und Export', 'export_data' => 'Daten exportieren', - 'export_and_backup_data' => 'Export und Sicherung', - 'export_data_intro' => 'Zum Backup, zum Migrieren auf ein anderes System oder zum Migrieren in eine andere Firefly III Installation.', + '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_format' => 'Export-Format', 'export_format_csv' => 'Durch Komma getrennte Werte (CSV-Datei)', 'export_format_mt940' => 'MT940 kompatibles Format', @@ -433,7 +451,7 @@ 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' => 'Any list of things (accounts, transactions, etc) shows at most this many per page.', + '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', @@ -506,47 +524,47 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'title_withdrawal' => 'Ausgaben', 'title_revenue' => 'Einnahmen / Einkommen', 'title_deposit' => 'Einnahmen / Einkommen', - 'title_transfer' => 'Überweisungen', - 'title_transfers' => 'Überweisungen', + '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 Überweisung', + '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 Überweisung 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 Überweisung', - 'convert_options_DepositTransfer' => 'Konvertieren Sie eine Einzahlung in eine Überweisung', + '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 Überweisung in eine Ausgabe', - 'convert_options_TransferDeposit' => 'Konvertieren Sie eine Überweisung in eine Einzahlung', + '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 zu einer Überweisung', + '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 zu einer Überweisung', - 'convert_Transfer_to_deposit' => 'Konvertieren Sie diese Überweisung zu einer Einzahlung', - 'convert_Transfer_to_withdrawal' => 'Konvertieren Sie diese Überweisung zu einer Ausgabe', + 'convert_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 Überweisung konvertieren, wird :amount von :sourceName auf ein neues Girokonto überwiesen, statt :destinationName zu bezahlen.', + '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 Überweisung konvertieren, wird :amount von einem Girokonto Ihrer Wahl auf :destinationName überweisen.', - 'convert_explanation_transfer_withdrawal' => 'Falls sie diese Überweisung in Ausgabe konvertieren, wird :amount von :sourceName zu einem neuen Ziel geleitet, statt auf :destinationName überwiesen zu werden.', - 'convert_explanation_transfer_deposit' => 'Falls sie diese Überweisung in eine Einlage konvertieren, wird :amount auf das Konto :destinationName eingezahlt statt dorthin überwisen 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 Überweisung 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.', // create new stuff: 'create_new_withdrawal' => 'Erstelle eine neue Ausgabe', 'create_new_deposit' => 'Erstelle ein neues Einkommen', - 'create_new_transfer' => 'Eine neue Überweisung erstellen', + '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', @@ -601,8 +619,8 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'between_amounts' => 'zwischen :low und :high.', 'repeats' => 'Wiederholungen', 'connected_journals' => 'Verknüpfte Überweisungen', - 'auto_match_on' => 'Automatisch von Firefly abgestimmt', - 'auto_match_off' => 'Nicht automatisch gefunden von Firefly', + 'auto_match_on' => 'Automatically matched by Firefly III', + 'auto_match_off' => 'Not automatically matched by Firefly III', 'next_expected_match' => 'Nächste erwartete Übereinstimmung', 'delete_bill' => 'Rechnung ":name" löschen', 'deleted_bill' => 'Rechnung ":name" gelöscht', @@ -723,16 +741,16 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', // transactions: 'update_withdrawal' => 'Ausgaben aktualisieren', 'update_deposit' => 'Einnahmen aktualisieren', - 'update_transfer' => 'Überweisungen aktualisieren', + 'update_transfer' => 'Umbuchung aktualisieren', 'updated_withdrawal' => 'Ausgabe ":description" aktualisiert', 'updated_deposit' => 'Einnahme ":description" aktualisiert', - 'updated_transfer' => 'Überweisung ":description" aktualisiert', + 'updated_transfer' => 'Umbuchung ":description" aktualisiert', 'delete_withdrawal' => 'Ausgabe ":description" löschen', 'delete_deposit' => 'Einnahme ":description" löschen', - 'delete_transfer' => 'Überweisung ":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' => 'Überweisung ":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', @@ -744,10 +762,10 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', '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_category' => 'Kategorie nicht aktualisieren', + 'no_bulk_budget' => 'Budget nicht aktualisieren', 'no_bulk_tags' => 'Don\'t update tag(s)', - 'bulk_edit' => 'Bulk edit', + '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)', @@ -759,10 +777,10 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'opt_group_savingAsset' => 'Sparkonten', 'opt_group_sharedAsset' => 'Shared asset accounts', 'opt_group_ccAsset' => 'Kreditkarten', - 'notes' => 'Notes', + 'notes' => 'Notizen', // new user: - 'welcome' => 'Willkommen bei Firefly!', + 'welcome' => 'Welcome to 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.', @@ -776,7 +794,7 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'savings' => 'Erspartes', 'newWithdrawal' => 'Neue Ausgabe', 'newDeposit' => 'Neue Einnahme', - 'newTransfer' => 'Neue Überweisung', + 'newTransfer' => 'Neue Umbuchung', 'bills_to_pay' => 'Unbezahlte Rechnungen', 'per_day' => 'Pro Tag', 'left_to_spend_per_day' => 'Left to spend per day', @@ -803,7 +821,7 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'transactions' => 'Überweisungen', 'expenses' => 'Ausgaben', 'income' => 'Einnahmen / Einkommen', - 'transfers' => 'Überweisungen', + 'transfers' => 'Umbuchungen', 'moneyManagement' => 'Geldverwaltung', 'piggyBanks' => 'Sparschweine', 'bills' => 'Rechnungen', @@ -811,10 +829,10 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'opening_balance' => 'Eröffnungsbilanz', 'deposit' => 'Einnahme', 'account' => 'Konto', - 'transfer' => 'Überweisung', + 'transfer' => 'Umbuchung', 'Withdrawal' => 'Ausgabe', 'Deposit' => 'Einnahme', - 'Transfer' => 'Überweisung', + 'Transfer' => 'Umbuchung', 'bill' => 'Rechnung', 'yes' => 'Ja', 'no' => 'Nein', @@ -1065,7 +1083,7 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'journal_links' => 'Transaction links', 'this_withdrawal' => 'This withdrawal', 'this_deposit' => 'Diese Einnahme', - 'this_transfer' => 'This transfer', + 'this_transfer' => 'Diese Umbuchung', 'overview_for_link' => 'Overview for link type ":name"', 'source_transaction' => 'Source transaction', 'link_description' => 'Linkbeschreibung', @@ -1090,7 +1108,7 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', 'do_split' => 'Aufteilen', 'split_this_withdrawal' => 'Diese Ausgabe aufteilen', 'split_this_deposit' => 'Diese Einnahme aufteilen', - 'split_this_transfer' => 'Diese Überweisung 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.', @@ -1148,10 +1166,10 @@ Sollen zusätzlich Ihre Girokonten angezeigt werden?', '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' => 'Let\'s create a transfer!', - 'no_transactions_intro_transfers' => 'Sie haben noch keine Transfers. Wenn Sie Geld zwischen Ihren Konten bewegen, wird es als Überweisung erfasst.', - 'no_transactions_imperative_transfers' => 'Haben Sie Geld überwiesen? Dann sollten Sie es aufschreiben:', - 'no_transactions_create_transfers' => 'Eine Überweisung 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_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_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:', diff --git a/resources/lang/de_DE/form.php b/resources/lang/de_DE/form.php index 94140675dc..2856625cc6 100644 --- a/resources/lang/de_DE/form.php +++ b/resources/lang/de_DE/form.php @@ -78,7 +78,7 @@ return [ 'new_email_address' => 'Neue E-Mail-Adresse', 'verification' => 'Bestätigung', 'api_key' => 'API-Schlüssel', - 'remember_me' => 'Remember me', + 'remember_me' => 'Angemeldet bleiben', 'source_account_asset' => 'Quellkonto (Bestandskonto)', 'destination_account_expense' => 'Zielkonto (Unkostenkonto)', @@ -87,7 +87,7 @@ return [ 'type' => 'Type', 'convert_Withdrawal' => 'Ändere zu Abhebung', 'convert_Deposit' => 'Ändere zu Einzahlung', - 'convert_Transfer' => 'Ändere zu Überweisung', + 'convert_Transfer' => 'In Umbuchung umwandeln', 'amount' => 'Betrag', 'date' => 'Datum', @@ -113,10 +113,10 @@ return [ 'attachments[]' => 'Anhänge', 'store_new_withdrawal' => 'Speichere neue Ausgabe', 'store_new_deposit' => 'Speichere neue Einnahme', - 'store_new_transfer' => 'Speichere neue Überweisung', + 'store_new_transfer' => 'Neue Umbuchung speichern', 'add_new_withdrawal' => 'Fügen Sie eine neue Ausgabe hinzu', 'add_new_deposit' => 'Fügen Sie eine neue Einnahme hinzu', - 'add_new_transfer' => 'Fügen Sie eine neue Überweisung hinzu', + 'add_new_transfer' => 'Neue Umbuchung anlegen', 'title' => 'Titel', 'notes' => 'Notizen', 'filename' => 'Dateiname', @@ -170,7 +170,7 @@ return [ 'budget_keep_transactions' => 'Die eine Überweisung, die mit diesem Budget verknüpft ist, wird nicht gelöscht. | Keines der :count Budgets, die mit dieser Rechnung verknüpft sind, werden gelöscht.', 'category_keep_transactions' => 'Die eine Überweisungen, die mit dieser Kategorie verknüpft ist, wird nicht gelöscht. | Keine der :count Kategorien, die mit dieser Rechnung verknüpft sind, werden gelöscht.', 'tag_keep_transactions' => 'Die einzige Überweisung, die mit diesem Tag verknüpft ist, wird nicht gelöscht. | Keiner der :count Tags, die mit dieser Rechnung verknüpft sind, werden gelöscht.', - 'check_for_updates' => 'Check for updates', + 'check_for_updates' => 'Nach Updates suchen', 'email' => 'E-Mail Adresse', 'password' => 'Passwort', diff --git a/resources/lang/de_DE/import.php b/resources/lang/de_DE/import.php index 76de95c13f..39445186d3 100644 --- a/resources/lang/de_DE/import.php +++ b/resources/lang/de_DE/import.php @@ -22,138 +22,169 @@ declare(strict_types=1); return [ // status of import: - 'status_wait_title' => 'Bitte warten...', - 'status_wait_text' => 'Diese Box wird gleich verschwinden.', - '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_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' => 'The job is brand new.', - 'status_job_configuring' => 'The import is being configured.', - 'status_job_configured' => 'Der Import ist konfiguriert.', - 'status_job_running' => 'Der Import läuft.. Bitte warten..', - 'status_job_error' => 'The job has generated an error.', - 'status_job_finished' => 'Der Import ist abgeschlossen!', - 'status_running_title' => 'Der Import läuft', - 'status_running_placeholder' => 'Bitte warten Sie auf eine Aktualisierung...', - 'status_finished_title' => 'Importassistent abgeschlossen', - 'status_finished_text' => 'Der Importassistent hat Ihre Daten importiert.', - 'status_errors_title' => 'Fehler beim Import', - '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_bread_crumb' => 'Importstatus', - 'status_sub_title' => 'Importstatus', - 'config_sub_title' => 'Import einrichten', - 'status_finished_job' => 'Die importierten Transaktionen finden Sie im Tag :tag.', - 'import_with_key' => 'Import mit Schlüssel \':key\'', + 'status_wait_title' => 'Bitte warten...', + 'status_wait_text' => 'Diese Box wird gleich verschwinden.', + '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_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' => 'The job is brand new.', + 'status_job_configuring' => 'The import is being configured.', + 'status_job_configured' => 'Der Import ist konfiguriert.', + 'status_job_running' => 'Der Import läuft.. Bitte warten..', + 'status_job_error' => 'The job has generated an error.', + 'status_job_finished' => 'Der Import ist abgeschlossen!', + 'status_running_title' => 'Der Import läuft', + 'status_running_placeholder' => 'Bitte warten Sie auf eine Aktualisierung...', + 'status_finished_title' => 'Importassistent abgeschlossen', + 'status_finished_text' => 'Der Importassistent hat Ihre Daten importiert.', + 'status_errors_title' => 'Fehler beim Import', + '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_bread_crumb' => 'Importstatus', + 'status_sub_title' => 'Importstatus', + 'config_sub_title' => 'Import einrichten', + 'status_finished_job' => 'The :count transactions imported can be found in tag :tag.', + 'status_finished_no_tag' => 'Firefly III has not collected any journals from your import file.', + 'import_with_key' => 'Import mit Schlüssel \':key\'', // file, upload something - 'file_upload_title' => 'Import-Setup (1/4) - Laden Sie Ihre Datei hoch', - 'file_upload_text' => 'Dieser Assistent hilft Ihnen, Dateien von Ihrer Bank in Firefly III zu importieren. Bitte sehen Sie sich die Hilfeseiten in der oberen rechten Ecke an.', - 'file_upload_fields' => 'Felder', - 'file_upload_help' => 'Datei auswählen', - 'file_upload_config_help' => 'Wenn Sie bereits zuvor Daten in Firefly III importiert haben, haben Sie eventuell eine Konfigurationsdatei, welche einige Einstellungen für Sie voreinstellt. Für einige Banken haben andere Nutzer freundlicherweise bereits ihre Konfigurationsdatei zur Verfügung gestellt', - 'file_upload_type_help' => 'Wählen Sie den Typ der hochzuladenden Datei', - 'file_upload_submit' => 'Dateien hochladen', + 'file_upload_title' => 'Import-Setup (1/4) - Laden Sie Ihre Datei hoch', + 'file_upload_text' => 'Dieser Assistent hilft Ihnen, Dateien von Ihrer Bank in Firefly III zu importieren. Bitte sehen Sie sich die Hilfeseiten in der oberen rechten Ecke an.', + 'file_upload_fields' => 'Felder', + 'file_upload_help' => 'Datei auswählen', + 'file_upload_config_help' => 'Wenn Sie bereits zuvor Daten in Firefly III importiert haben, haben Sie eventuell eine Konfigurationsdatei, welche einige Einstellungen für Sie voreinstellt. Für einige Banken haben andere Nutzer freundlicherweise bereits ihre Konfigurationsdatei zur Verfügung gestellt', + 'file_upload_type_help' => 'Wählen Sie den Typ der hochzuladenden Datei', + 'file_upload_submit' => 'Dateien hochladen', // file, upload types - 'import_file_type_csv' => 'CSV (Kommagetrennte Werte)', + 'import_file_type_csv' => 'CSV (Kommagetrennte Werte)', // file, initial config for CSV - 'csv_initial_title' => 'Import Einrichten (2/4) - Grundlegende Einstellungen', - 'csv_initial_text' => 'Um Ihre Datei korrekt importieren zu können, überprüfen Sie bitte die folgenden Optionen.', - 'csv_initial_box' => 'Standard CSV Importeinstellungen', - '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_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_submit' => 'Fortfahren mit Schritt 3/4', + 'csv_initial_title' => 'Import Einrichten (2/4) - Grundlegende Einstellungen', + 'csv_initial_text' => 'Um Ihre Datei korrekt importieren zu können, überprüfen Sie bitte die folgenden Optionen.', + 'csv_initial_box' => 'Standard CSV Importeinstellungen', + '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_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_submit' => 'Fortfahren mit Schritt 3/4', // file, new options: - 'file_apply_rules_title' => 'Regeln anwenden', - 'file_apply_rules_description' => 'Regeln anwenden. Beachten Sie, dass dadurch der Import erheblich verlangsamt wird.', - 'file_match_bills_title' => 'Rechnungen zuordnen', - 'file_match_bills_description' => 'Ordnen Sie Ihre Rechnungen den neu erstellten Ausgaben zu. Beachten Sie, dass dadurch der Import erheblich verlangsamt wird.', + 'file_apply_rules_title' => 'Regeln anwenden', + 'file_apply_rules_description' => 'Regeln anwenden. Beachten Sie, dass dadurch der Import erheblich verlangsamt wird.', + 'file_match_bills_title' => 'Rechnungen zuordnen', + 'file_match_bills_description' => 'Ordnen Sie Ihre Rechnungen den neu erstellten Ausgaben zu. Beachten Sie, dass dadurch der Import erheblich verlangsamt wird.', // file, roles config - 'csv_roles_title' => 'Import Einrichten (3/4) - Jeder Spalte eine Rolle zuordnen', - 'csv_roles_text' => 'Jede Spalte in Ihrer CSV-Datei enthält bestimmte Daten. Bitte geben Sie an, welche Art von Daten enthalten sind. Die Option "Daten zuordnen" bedeutet, dass jeder Eintrag in der Spalte mit einem Wert aus Ihrer der Datenbank ersetzt wird. Eine oft zugeordnete Spalte ist die Spalte, welche die IBAN des fremden Kontos enthält. Diese können leicht mit bereits angelegten IBANs in Ihrer Datenbank verglichen werden.', - 'csv_roles_table' => 'Tabelle', - 'csv_roles_column_name' => 'Name der Spalte', - 'csv_roles_column_example' => 'Beispieldaten', - 'csv_roles_column_role' => 'Bedeutung der Spalte', - 'csv_roles_do_map_value' => 'Diese Werte zuordnen', - 'csv_roles_column' => 'Spalte', - 'csv_roles_no_example_data' => 'Keine Beispieldaten vorhanden', - 'csv_roles_submit' => 'Fortfahren mit Schritt 4/4', + 'csv_roles_title' => 'Import Einrichten (3/4) - Jeder Spalte eine Rolle zuordnen', + 'csv_roles_text' => 'Jede Spalte in Ihrer CSV-Datei enthält bestimmte Daten. Bitte geben Sie an, welche Art von Daten enthalten sind. Die Option "Daten zuordnen" bedeutet, dass jeder Eintrag in der Spalte mit einem Wert aus Ihrer der Datenbank ersetzt wird. Eine oft zugeordnete Spalte ist die Spalte, welche die IBAN des fremden Kontos enthält. Diese können leicht mit bereits angelegten IBANs in Ihrer Datenbank verglichen werden.', + 'csv_roles_table' => 'Tabelle', + 'csv_roles_column_name' => 'Name der Spalte', + 'csv_roles_column_example' => 'Beispieldaten', + 'csv_roles_column_role' => 'Bedeutung der Spalte', + 'csv_roles_do_map_value' => 'Diese Werte zuordnen', + 'csv_roles_column' => 'Spalte', + 'csv_roles_no_example_data' => 'Keine Beispieldaten vorhanden', + 'csv_roles_submit' => 'Fortfahren mit Schritt 4/4', // 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.', - + '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' => '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_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_nothing_to_map' => 'There is no data present in your file that you can map to existing values. Please press "Start the import" to continue.', + 'file_map_title' => 'Import Einrichten (4/4) - Import mit bereits vorhandenen Daten verknüpfen', + 'file_map_text' => 'In den folgenden Tabellen zeigt der linke Wert Informationen, die sich in Ihrer hochgeladenen Datei befinden. Es ist Ihre Aufgabe, diesen Wert, wenn möglich, einem bereits in der Datenbank vorhandenen zuzuordnen. Firefly wird sich an diese Zuordnung halten. Wenn kein Wert für die Zuordnung vorhanden ist oder Sie den bestimmten Wert nicht abbilden möchten, wählen Sie nichts aus.', + 'file_map_field_value' => 'Feldwert', + 'file_map_field_mapped_to' => 'Zugeordnet zu', + 'map_do_not_map' => '(keine Zuordnung)', + 'file_map_submit' => 'Starte den Import', + 'file_nothing_to_map' => 'There is no data present in your file that you can map to existing values. Please press "Start the import" to continue.', // map things. - 'column__ignore' => '(diese Spalte ignorieren)', - 'column_account-iban' => 'Bestandskonto (IBAN)', - 'column_account-id' => 'Bestandskonto (vgl. ID in Firefly)', - 'column_account-name' => 'Bestandskonto (Name)', - 'column_amount' => 'Betrag', - 'column_amount_debit' => 'Amount (debit column)', - 'column_amount_credit' => 'Amount (credit column)', - 'column_amount-comma-separated' => 'Betrag (Komma als Dezimaltrennzeichen)', - 'column_bill-id' => 'Rechnung (ID übereinstimmend mit Firefly)', - 'column_bill-name' => 'Name der Rechnung', - 'column_budget-id' => 'Budget (ID übereinstimmend mit Firefly)', - 'column_budget-name' => 'Budgetname', - 'column_category-id' => 'Kategorie (ID übereinstimmend mit Firefly)', - 'column_category-name' => 'Name der Kategorie', - 'column_currency-code' => 'Währungsstandard (ISO 4217)', - 'column_currency-id' => 'Währung (ID übereinstimmend mit Firefly)', - 'column_currency-name' => 'Währungsname (übereinstimmend mit Firefly)', - 'column_currency-symbol' => 'Währungssysmbol (übereinstimmend mit Firefly)', - 'column_date-interest' => 'Datum der Zinsberechnung', - 'column_date-book' => 'Buchungsdatum der Überweisung', - 'column_date-process' => 'Verarbeitungsdatum der Überweisung', - 'column_date-transaction' => 'Datum', - 'column_description' => 'Beschreibung', - 'column_opposing-iban' => 'Zielkonto (IBAN)', - 'column_opposing-id' => 'Zielkonto (vgl. ID in Firefly)', - '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 Überweisungstransaktionsnummer', - 'column_sepa-ct-op' => 'SEPA Überweisungszielkonto', - 'column_sepa-db' => 'SEPA-Lastschrift', - 'column_tags-comma' => 'Tags (durch Komma getrennt)', - 'column_tags-space' => 'Tags (durch Leerzeichen getrennt)', - 'column_account-number' => 'Bestandskonto (Kontonr.)', - 'column_opposing-number' => 'Zielkonto (Kontonr.)', - 'column_note' => 'Notiz(en)', + 'column__ignore' => '(diese Spalte ignorieren)', + 'column_account-iban' => 'Bestandskonto (IBAN)', + 'column_account-id' => 'Asset account ID (matching FF3)', + 'column_account-name' => 'Bestandskonto (Name)', + 'column_amount' => 'Betrag', + 'column_amount_foreign' => 'Betrag (in Fremdwährung)', + 'column_amount_debit' => 'Amount (debit column)', + 'column_amount_credit' => 'Amount (credit column)', + 'column_amount-comma-separated' => 'Betrag (Komma als Dezimaltrennzeichen)', + 'column_bill-id' => 'Bill ID (matching FF3)', + 'column_bill-name' => 'Name der Rechnung', + 'column_budget-id' => 'Budget ID (matching FF3)', + 'column_budget-name' => 'Budgetname', + 'column_category-id' => 'Category ID (matching FF3)', + 'column_category-name' => 'Name der Kategorie', + 'column_currency-code' => 'Währungsstandard (ISO 4217)', + 'column_foreign-currency-code' => 'Fremdwährungscode (ISO 4217)', + 'column_currency-id' => 'Currency ID (matching FF3)', + 'column_currency-name' => 'Currency name (matching FF3)', + 'column_currency-symbol' => 'Currency symbol (matching FF3)', + 'column_date-interest' => 'Datum der Zinsberechnung', + 'column_date-book' => 'Buchungsdatum der Überweisung', + 'column_date-process' => 'Verarbeitungsdatum der Überweisung', + 'column_date-transaction' => 'Datum', + 'column_description' => 'Beschreibung', + 'column_opposing-iban' => 'Zielkonto (IBAN)', + 'column_opposing-id' => 'Opposing account ID (matching 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_account-number' => 'Bestandskonto (Kontonr.)', + 'column_opposing-number' => 'Zielkonto (Kontonr.)', + 'column_note' => 'Notiz(en)', // prerequisites - 'prerequisites' => '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_title' => 'Voraussetzungen für einen Import von bunq', + 'bunq_prerequisites_text' => 'Um aus bunq importieren zu können, benötigen Sie einen API-Schlüssel. Sie können diesen in der App bekommen.', // Spectre - 'spectre_title' => 'Importieren mit Spectre', - 'spectre_prerequisites_title' => 'Voraussetzungen für einen Import von Spectre', - 'spectre_prerequisites_text' => 'In order to import data using the Spectre API, you must provide Firefly III with two secret values. They can be found on the secrets page.', - 'spectre_enter_pub_key' => 'Der Import funktioniert nur, wenn Sie diesen öffentlichen Schlüssel auf Ihrer Sicherheitsseite eingeben.', + 'spectre_title' => 'Importieren mit Spectre', + 'spectre_prerequisites_title' => 'Voraussetzungen für einen Import von Spectre', + 'spectre_prerequisites_text' => 'In order to import data using the Spectre API, you must provide Firefly III with two secret values. They can be found on the secrets page.', + 'spectre_enter_pub_key' => 'Der Import funktioniert nur, wenn Sie diesen öffentlichen Schlüssel auf Ihrer Sicherheitsseite eingeben.', + 'spectre_accounts_title' => 'Select accounts to import from', + 'spectre_accounts_text' => 'Each account on the left below has been found by Spectre and can be imported into Firefly III. Please select the asset account that should hold any given transactions. If you do not wish to import from any particular account, remove the check from the checkbox.', + 'spectre_do_import' => 'Ja, von diesem Konto importieren', + + // keys from "extra" array: + 'spectre_extra_key_iban' => 'IBAN', + 'spectre_extra_key_swift' => 'BIC (SWIFT) Code', + 'spectre_extra_key_status' => 'Status', + 'spectre_extra_key_card_type' => 'Art der Kreditkarte', + 'spectre_extra_key_account_name' => 'Kontoname', + 'spectre_extra_key_client_name' => 'Kundenname', + '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_interest_rate' => 'Zinssatz', + 'spectre_extra_key_expiry_date' => 'Ablaufdatum', + 'spectre_extra_key_open_date' => 'Open date', + 'spectre_extra_key_current_time' => 'Aktuelle Uhrzeit', + 'spectre_extra_key_current_date' => 'Aktuelles Datum', + 'spectre_extra_key_cards' => 'Karten', + 'spectre_extra_key_units' => 'Einheiten', + 'spectre_extra_key_unit_price' => 'Stückpreis', + 'spectre_extra_key_transactions_count' => 'Anzahl Transaktionen', + + // various other strings: + 'imported_from_account' => 'Von ":account" importiert', ]; + diff --git a/resources/lang/de_DE/intro.php b/resources/lang/de_DE/intro.php index c1d12e1eed..0734ba115c 100644 --- a/resources/lang/de_DE/intro.php +++ b/resources/lang/de_DE/intro.php @@ -31,13 +31,13 @@ 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 angibt.', + '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_currency' => 'Firefly III unterstützt mehrere Währungen. Anlagenkonten haben eine Hauptwährung, die Sie hier einstellen 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 Ihnen mitteilen kann, ob Sie das verfügbare Geld budgetiert haben.', + '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_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.', @@ -74,7 +74,7 @@ return [ 'transactions_create_withdrawal_ffInput_budget' => 'Verbinden Sie Ihre Abhebung mit einem Budget für eine bessere Kontrolle Ihrer Finanzen.', '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 verbinden Sie diese Überweisung mit Ihren Ersparnissen.', + 'transactions_create_transfer_ffInput_piggy_bank_id' => 'Wählen Sie ein Sparschwein aus und verknüpfen Sie diese Umbuchung mit Ihren Ersparnissen.', // piggy banks index: 'piggy-banks_index_saved' => 'Dieses Feld zeigt Ihnen, wie viel Sie in jedem Sparschwein gespart haben.', diff --git a/resources/lang/de_DE/list.php b/resources/lang/de_DE/list.php index 21a2feeb6b..e66b42d507 100644 --- a/resources/lang/de_DE/list.php +++ b/resources/lang/de_DE/list.php @@ -95,9 +95,11 @@ return [ 'number_of_transactions' => 'Anzahl der Zahlungsvorgänge', 'total_amount' => 'Gesamtbetrag', 'sum' => 'Summe', - 'sum_excluding_transfers' => 'Summe (ohne Überweisungen)', + 'sum_excluding_transfers' => 'Summe (ohne Umbuchungen)', 'sum_withdrawals' => 'Summe der Ausgaben', 'sum_deposits' => 'Summe der Einzahlungen', - 'sum_transfers' => 'Summe der Überweisungen', + 'sum_transfers' => 'Summe der Umbuchungen', 'reconcile' => 'Reconcile', + 'account_on_spectre' => 'Konto (Spectre)', + 'do_import' => 'Import from this account', ]; diff --git a/resources/lang/de_DE/validation.php b/resources/lang/de_DE/validation.php index c82dacbdaa..285c1a67f0 100644 --- a/resources/lang/de_DE/validation.php +++ b/resources/lang/de_DE/validation.php @@ -99,4 +99,38 @@ return [ 'present' => 'Das :attribute Feld muss vorhanden sein.', 'amount_zero' => 'Der Gesamtbetrag darf nicht Null sein', 'secure_password' => 'Das ist kein sicheres Passwort. Bitte versuchen Sie es erneut. Weitere Informationen finden Sie unter https://goo.gl/NCh2tN', + 'attributes' => [ + 'email' => 'E-Mail-Adresse', + 'description' => 'Beschreibung', + 'amount' => 'Betrag', + 'name' => 'Name', + 'targetamount' => 'Zielbetrag', + 'openingBalanceDate' => 'Eröffnungsbilanzdatum', + 'openingBalance' => 'Eröffnungsbilanz', + 'match' => 'match', + 'amount_min' => 'Mindestbetrag', + 'amount_max' => 'Höchstbetrag', + 'title' => 'Titel', + 'tag' => 'tag', + '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-trigger.1' => 'Regel #1 auslösen', + 'rule-trigger.2' => 'Regel #2 auslösen', + 'rule-trigger.3' => 'Regel #3 auslösen', + 'rule-trigger.4' => 'Regel 4 auslösen', + 'rule-trigger.5' => 'Regel #5 auslösen', + ], ]; diff --git a/resources/lang/en_US/config.php b/resources/lang/en_US/config.php index d3a8d6d114..3d6cca0315 100644 --- a/resources/lang/en_US/config.php +++ b/resources/lang/en_US/config.php @@ -21,6 +21,7 @@ declare(strict_types=1); return [ + 'html_language' => 'en', 'locale' => 'en, English, en_US, en_US.utf8, en_US.UTF-8', 'month' => '%B %Y', 'month_and_day' => '%B %e, %Y', diff --git a/resources/lang/en_US/demo.php b/resources/lang/en_US/demo.php index ecea1e3411..133ef0752c 100644 --- a/resources/lang/en_US/demo.php +++ b/resources/lang/en_US/demo.php @@ -32,6 +32,4 @@ return [ 'transactions-index' => 'These expenses, deposits and transfers are not particularly imaginative. They have been generated automatically.', 'piggy-banks-index' => 'As you can see, there are three piggy banks. Use the plus and minus buttons to influence the amount of money in each piggy bank. Click the name of the piggy bank to see the administration for each piggy bank.', 'import-index' => 'Of course, any CSV file can be imported into Firefly III', - 'import-configure-security' => 'Because of security concerns, your upload has been replaced with a local file.', - 'import-configure-configuration' => 'The configuration you see below is correct for the local file.', ]; diff --git a/resources/lang/en_US/firefly.php b/resources/lang/en_US/firefly.php index 0c1a5f1f7c..5e41772e02 100644 --- a/resources/lang/en_US/firefly.php +++ b/resources/lang/en_US/firefly.php @@ -44,8 +44,17 @@ return [ 'Opening balance' => 'Opening balance', 'create_new_stuff' => 'Create new stuff', 'new_withdrawal' => 'New withdrawal', + 'create_new_transaction' => 'Create new transaction', + 'go_to_asset_accounts' => 'View your asset accounts', + 'go_to_budgets' => 'Go to your budgets', + 'go_to_categories' => 'Go to your categories', + 'go_to_bills' => 'Go to your bills', + 'go_to_expense_accounts' => 'See your expense accounts', + 'go_to_revenue_accounts' => 'See your revenue accounts', + 'go_to_piggies' => 'Go to your piggy banks', 'new_deposit' => 'New deposit', 'new_transfer' => 'New transfer', + 'new_transfers' => 'New transfer', 'new_asset_account' => 'New asset account', 'new_expense_account' => 'New expense account', 'new_revenue_account' => 'New revenue account', @@ -60,6 +69,9 @@ return [ 'flash_error_multiple' => 'There is one error|There are :count errors', 'net_worth' => 'Net worth', 'route_has_no_help' => 'There is no help for this route.', + 'help_for_this_page' => 'Help for this page', + 'no_help_could_be_found' => 'No help text could be found.', + 'no_help_title' => 'Apologies, an error occurred.', 'two_factor_welcome' => 'Hello, :user!', 'two_factor_enter_code' => 'To continue, please enter your two factor authentication code. Your application can generate it for you.', 'two_factor_code_here' => 'Enter code here', @@ -108,8 +120,14 @@ return [ 'clone_deposit' => 'Clone this deposit', 'clone_transfer' => 'Clone this transfer', 'multi_select_no_selection' => 'None selected', + 'multi_select_select_all' => 'Select all', + 'multi_select_n_selected' => 'selected', 'multi_select_all_selected' => 'All selected', 'multi_select_filter_placeholder' => 'Find..', + 'intro_next_label' => 'Next', + 'intro_prev_label' => 'Previous', + 'intro_skip_label' => 'Skip', + 'intro_done_label' => 'Done', 'between_dates_breadcrumb' => 'Between :start and :end', 'all_journals_without_budget' => 'All transactions without a budget', 'journals_without_budget' => 'Transactions without a budget', @@ -163,7 +181,7 @@ return [ 'admin_update_check_now_title' => 'Check for updates now', 'admin_update_check_now_explain' => 'If you press the button, Firefly III will see if your current version is the latest.', 'check_for_updates_button' => 'Check now!', - 'update_new_version_alert' => 'A new version is available. You are running v:your_version, the latest version is v:new_version which was released on :date.', + '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_current_version_alert' => 'You are running v:version, which is the latest available release.', 'update_newer_version_alert' => 'You are running v:your_version, which is newer than the latest release, v:new_version.', 'update_check_error' => 'An error occurred while checking for updates. Please view the log files.', @@ -193,8 +211,8 @@ return [ // export data: 'import_and_export' => 'Import and export', 'export_data' => 'Export data', - 'export_and_backup_data' => 'Export and backup', - 'export_data_intro' => 'For backup purposes, when migrating to another system or when migrating to another Firefly III installation.', + 'export_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_format' => 'Export format', 'export_format_csv' => 'Comma separated values (CSV file)', 'export_format_mt940' => 'MT940 compatible format', @@ -600,8 +618,8 @@ return [ 'between_amounts' => 'between :low and :high.', 'repeats' => 'Repeats', 'connected_journals' => 'Connected transactions', - 'auto_match_on' => 'Automatically matched by Firefly', - 'auto_match_off' => 'Not automatically matched by Firefly', + '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"', @@ -761,7 +779,7 @@ return [ 'notes' => 'Notes', // new user: - 'welcome' => 'Welcome to Firefly!', + '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.', diff --git a/resources/lang/en_US/import.php b/resources/lang/en_US/import.php index 636fd3e846..f079bd6dd4 100644 --- a/resources/lang/en_US/import.php +++ b/resources/lang/en_US/import.php @@ -22,138 +22,169 @@ declare(strict_types=1); return [ // status of import: - 'status_wait_title' => 'Please hold...', - 'status_wait_text' => 'This box will disappear in a moment.', - 'status_fatal_title' => 'A fatal error occurred', - 'status_fatal_text' => 'A fatal error occurred, which the import-routine cannot recover from. Please see the explanation in red below.', - 'status_fatal_more' => 'If the error is a time-out, the import will have stopped half-way. For some server configurations, it is merely the server that stopped while the import keeps running in the background. To verify this, check out the log files. If the problem persists, consider importing over the command line instead.', - 'status_ready_title' => 'Import is ready to start', - 'status_ready_text' => 'The import is ready to start. All the configuration you needed to do has been done. Please download the configuration file. It will help you with the import should it not go as planned. To actually run the import, you can either execute the following command in your console, or run the web-based import. Depending on your configuration, the console import will give you more feedback.', - 'status_ready_noconfig_text' => 'The import is ready to start. All the configuration you needed to do has been done. To actually run the import, you can either execute the following command in your console, or run the web-based import. Depending on your configuration, the console import will give you more feedback.', - 'status_ready_config' => 'Download configuration', - 'status_ready_start' => 'Start the import', - 'status_ready_share' => 'Please consider downloading your configuration and sharing it at the import configuration center. This will allow other users of Firefly III to import their files more easily.', - 'status_job_new' => 'The job is brand new.', - 'status_job_configuring' => 'The import is being configured.', - 'status_job_configured' => 'The import is configured.', - 'status_job_running' => 'The import is running.. Please wait..', - 'status_job_error' => 'The job has generated an error.', - 'status_job_finished' => 'The import has finished!', - 'status_running_title' => 'The import is running', - 'status_running_placeholder' => 'Please hold for an update...', - 'status_finished_title' => 'Import routine finished', - 'status_finished_text' => 'The import routine has imported your data.', - 'status_errors_title' => 'Errors during the import', - 'status_errors_single' => 'An error has occurred during the import. It does not appear to be fatal.', - 'status_errors_multi' => 'Some errors occurred during the import. These do not appear to be fatal.', - 'status_bread_crumb' => 'Import status', - 'status_sub_title' => 'Import status', - 'config_sub_title' => 'Set up your import', - 'status_finished_job' => 'The transactions imported can be found in tag :tag.', - 'import_with_key' => 'Import with key \':key\'', + 'status_wait_title' => 'Please hold...', + 'status_wait_text' => 'This box will disappear in a moment.', + 'status_fatal_title' => 'A fatal error occurred', + 'status_fatal_text' => 'A fatal error occurred, which the import-routine cannot recover from. Please see the explanation in red below.', + 'status_fatal_more' => 'If the error is a time-out, the import will have stopped half-way. For some server configurations, it is merely the server that stopped while the import keeps running in the background. To verify this, check out the log files. If the problem persists, consider importing over the command line instead.', + 'status_ready_title' => 'Import is ready to start', + 'status_ready_text' => 'The import is ready to start. All the configuration you needed to do has been done. Please download the configuration file. It will help you with the import should it not go as planned. To actually run the import, you can either execute the following command in your console, or run the web-based import. Depending on your configuration, the console import will give you more feedback.', + 'status_ready_noconfig_text' => 'The import is ready to start. All the configuration you needed to do has been done. To actually run the import, you can either execute the following command in your console, or run the web-based import. Depending on your configuration, the console import will give you more feedback.', + 'status_ready_config' => 'Download configuration', + 'status_ready_start' => 'Start the import', + 'status_ready_share' => 'Please consider downloading your configuration and sharing it at the import configuration center. This will allow other users of Firefly III to import their files more easily.', + 'status_job_new' => 'The job is brand new.', + 'status_job_configuring' => 'The import is being configured.', + 'status_job_configured' => 'The import is configured.', + 'status_job_running' => 'The import is running.. Please wait..', + 'status_job_error' => 'The job has generated an error.', + 'status_job_finished' => 'The import has finished!', + 'status_running_title' => 'The import is running', + 'status_running_placeholder' => 'Please hold for an update...', + 'status_finished_title' => 'Import routine finished', + 'status_finished_text' => 'The import routine has imported your data.', + 'status_errors_title' => 'Errors during the import', + 'status_errors_single' => 'An error has occurred during the import. It does not appear to be fatal.', + 'status_errors_multi' => 'Some errors occurred during the import. These do not appear to be fatal.', + 'status_bread_crumb' => 'Import status', + 'status_sub_title' => 'Import status', + 'config_sub_title' => 'Set up your import', + 'status_finished_job' => 'The :count transactions imported can be found in tag :tag.', + 'status_finished_no_tag' => 'Firefly III has not collected any journals from your import file.', + 'import_with_key' => 'Import with key \':key\'', // file, upload something - 'file_upload_title' => 'Import setup (1/4) - Upload your file', - 'file_upload_text' => 'This routine will help you import files from your bank into Firefly III. Please check out the help pages in the top right corner.', - 'file_upload_fields' => 'Fields', - 'file_upload_help' => 'Select your file', - 'file_upload_config_help' => 'If you have previously imported data into Firefly III, you may have a configuration file, which will pre-set configuration values for you. For some banks, other users have kindly provided their configuration file', - 'file_upload_type_help' => 'Select the type of file you will upload', - 'file_upload_submit' => 'Upload files', + 'file_upload_title' => 'Import setup (1/4) - Upload your file', + 'file_upload_text' => 'This routine will help you import files from your bank into Firefly III. Please check out the help pages in the top right corner.', + 'file_upload_fields' => 'Fields', + 'file_upload_help' => 'Select your file', + 'file_upload_config_help' => 'If you have previously imported data into Firefly III, you may have a configuration file, which will pre-set configuration values for you. For some banks, other users have kindly provided their configuration file', + 'file_upload_type_help' => 'Select the type of file you will upload', + 'file_upload_submit' => 'Upload files', // file, upload types - 'import_file_type_csv' => 'CSV (comma separated values)', + 'import_file_type_csv' => 'CSV (comma separated values)', // file, initial config for CSV - 'csv_initial_title' => 'Import setup (2/4) - Basic CSV import setup', - 'csv_initial_text' => 'To be able to import your file correctly, please validate the options below.', - 'csv_initial_box' => 'Basic CSV import setup', - 'csv_initial_box_title' => 'Basic CSV import setup options', - 'csv_initial_header_help' => 'Check this box if the first row of your CSV file are the column titles.', - 'csv_initial_date_help' => 'Date time format in your CSV. Follow the format like this page indicates. The default value will parse dates that look like this: :dateExample.', - 'csv_initial_delimiter_help' => 'Choose the field delimiter that is used in your input file. If not sure, comma is the safest option.', - 'csv_initial_import_account_help' => 'If your CSV file does NOT contain information about your asset account(s), use this dropdown to select to which account the transactions in the CSV belong to.', - 'csv_initial_submit' => 'Continue with step 3/4', + 'csv_initial_title' => 'Import setup (2/4) - Basic CSV import setup', + 'csv_initial_text' => 'To be able to import your file correctly, please validate the options below.', + 'csv_initial_box' => 'Basic CSV import setup', + 'csv_initial_box_title' => 'Basic CSV import setup options', + 'csv_initial_header_help' => 'Check this box if the first row of your CSV file are the column titles.', + 'csv_initial_date_help' => 'Date time format in your CSV. Follow the format like this page indicates. The default value will parse dates that look like this: :dateExample.', + 'csv_initial_delimiter_help' => 'Choose the field delimiter that is used in your input file. If not sure, comma is the safest option.', + 'csv_initial_import_account_help' => 'If your CSV file does NOT contain information about your asset account(s), use this dropdown to select to which account the transactions in the CSV belong to.', + 'csv_initial_submit' => 'Continue with step 3/4', // file, new options: - 'file_apply_rules_title' => 'Apply rules', - 'file_apply_rules_description' => 'Apply your rules. Note that this slows the import significantly.', - 'file_match_bills_title' => 'Match bills', - 'file_match_bills_description' => 'Match your bills to newly created withdrawals. Note that this slows the import significantly.', + 'file_apply_rules_title' => 'Apply rules', + 'file_apply_rules_description' => 'Apply your rules. Note that this slows the import significantly.', + 'file_match_bills_title' => 'Match bills', + 'file_match_bills_description' => 'Match your bills to newly created withdrawals. Note that this slows the import significantly.', // file, roles config - 'csv_roles_title' => 'Import setup (3/4) - Define each column\'s role', - 'csv_roles_text' => 'Each column in your CSV file contains certain data. Please indicate what kind of data the importer should expect. The option to "map" data means that you will link each entry found in the column to a value in your database. An often mapped column is the column that contains the IBAN of the opposing account. That can be easily matched to IBAN\'s present in your database already.', - 'csv_roles_table' => 'Table', - 'csv_roles_column_name' => 'Name of column', - 'csv_roles_column_example' => 'Column example data', - 'csv_roles_column_role' => 'Column data meaning', - 'csv_roles_do_map_value' => 'Map these values', - 'csv_roles_column' => 'Column', - 'csv_roles_no_example_data' => 'No example data available', - 'csv_roles_submit' => 'Continue with step 4/4', + 'csv_roles_title' => 'Import setup (3/4) - Define each column\'s role', + 'csv_roles_text' => 'Each column in your CSV file contains certain data. Please indicate what kind of data the importer should expect. The option to "map" data means that you will link each entry found in the column to a value in your database. An often mapped column is the column that contains the IBAN of the opposing account. That can be easily matched to IBAN\'s present in your database already.', + 'csv_roles_table' => 'Table', + 'csv_roles_column_name' => 'Name of column', + 'csv_roles_column_example' => 'Column example data', + 'csv_roles_column_role' => 'Column data meaning', + 'csv_roles_do_map_value' => 'Map these values', + 'csv_roles_column' => 'Column', + 'csv_roles_no_example_data' => 'No example data available', + 'csv_roles_submit' => 'Continue with step 4/4', // 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.', - + '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.', - 'file_map_field_value' => 'Field value', - 'file_map_field_mapped_to' => 'Mapped to', - 'map_do_not_map' => '(do not map)', - 'file_map_submit' => 'Start the import', - 'file_nothing_to_map' => 'There is no data present in your file that you can map to existing values. Please press "Start the import" to continue.', + 'file_map_title' => 'Import setup (4/4) - Connect import data to Firefly III data', + 'file_map_text' => 'In the following tables, the left value shows you information found in your uploaded file. It is your task to map this value, if possible, to a value already present in your database. Firefly will stick to this mapping. If there is no value to map to, or you do not wish to map the specific value, select nothing.', + 'file_map_field_value' => 'Field value', + 'file_map_field_mapped_to' => 'Mapped to', + 'map_do_not_map' => '(do not map)', + 'file_map_submit' => 'Start the import', + 'file_nothing_to_map' => 'There is no data present in your file that you can map to existing values. Please press "Start the import" to continue.', // map things. - 'column__ignore' => '(ignore this column)', - 'column_account-iban' => 'Asset account (IBAN)', - 'column_account-id' => 'Asset account ID (matching Firefly)', - 'column_account-name' => 'Asset account (name)', - 'column_amount' => 'Amount', - 'column_amount_debit' => 'Amount (debit column)', - 'column_amount_credit' => 'Amount (credit column)', - 'column_amount-comma-separated' => 'Amount (comma as decimal separator)', - 'column_bill-id' => 'Bill ID (matching Firefly)', - 'column_bill-name' => 'Bill name', - 'column_budget-id' => 'Budget ID (matching Firefly)', - 'column_budget-name' => 'Budget name', - 'column_category-id' => 'Category ID (matching Firefly)', - 'column_category-name' => 'Category name', - 'column_currency-code' => 'Currency code (ISO 4217)', - 'column_currency-id' => 'Currency ID (matching Firefly)', - 'column_currency-name' => 'Currency name (matching Firefly)', - 'column_currency-symbol' => 'Currency symbol (matching Firefly)', - 'column_date-interest' => 'Interest calculation date', - 'column_date-book' => 'Transaction booking date', - 'column_date-process' => 'Transaction process date', - 'column_date-transaction' => 'Date', - 'column_description' => 'Description', - 'column_opposing-iban' => 'Opposing account (IBAN)', - 'column_opposing-id' => 'Opposing account ID (matching Firefly)', - '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_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__ignore' => '(ignore this column)', + 'column_account-iban' => 'Asset account (IBAN)', + 'column_account-id' => 'Asset account ID (matching FF3)', + 'column_account-name' => 'Asset account (name)', + 'column_amount' => 'Amount', + 'column_amount_foreign' => 'Amount (in foreign currency)', + 'column_amount_debit' => 'Amount (debit column)', + 'column_amount_credit' => 'Amount (credit column)', + 'column_amount-comma-separated' => 'Amount (comma as decimal separator)', + 'column_bill-id' => 'Bill ID (matching FF3)', + 'column_bill-name' => 'Bill name', + 'column_budget-id' => 'Budget ID (matching FF3)', + 'column_budget-name' => 'Budget name', + 'column_category-id' => 'Category ID (matching FF3)', + 'column_category-name' => 'Category name', + 'column_currency-code' => 'Currency code (ISO 4217)', + 'column_foreign-currency-code' => 'Foreign currency code (ISO 4217)', + 'column_currency-id' => 'Currency ID (matching FF3)', + 'column_currency-name' => 'Currency name (matching FF3)', + 'column_currency-symbol' => 'Currency symbol (matching FF3)', + 'column_date-interest' => 'Interest calculation date', + 'column_date-book' => 'Transaction booking date', + 'column_date-process' => 'Transaction process date', + 'column_date-transaction' => 'Date', + 'column_description' => 'Description', + 'column_opposing-iban' => 'Opposing account (IBAN)', + '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_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)', // prerequisites - 'prerequisites' => '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_title' => 'Prerequisites for an import from bunq', + 'bunq_prerequisites_text' => 'In order to import from bunq, you need to obtain an API key. You can do this through the app.', // Spectre - 'spectre_title' => 'Import using Spectre', - 'spectre_prerequisites_title' => 'Prerequisites for an import using Spectre', - 'spectre_prerequisites_text' => 'In order to import data using the Spectre API, you must provide Firefly III with two secret values. They can be found on the secrets page.', - 'spectre_enter_pub_key' => 'The import will only work when you enter this public key on your security page.', + 'spectre_title' => 'Import using Spectre', + 'spectre_prerequisites_title' => 'Prerequisites for an import using Spectre', + 'spectre_prerequisites_text' => 'In order to import data using the Spectre API, you must provide Firefly III with two secret values. They can be found on the secrets page.', + 'spectre_enter_pub_key' => 'The import will only work when you enter this public key on your security page.', + 'spectre_accounts_title' => 'Select accounts to import from', + 'spectre_accounts_text' => 'Each account on the left below has been found by Spectre and can be imported into Firefly III. Please select the asset account that should hold any given transactions. If you do not wish to import from any particular account, remove the check from the checkbox.', + 'spectre_do_import' => 'Yes, import from this account', + + // keys from "extra" array: + 'spectre_extra_key_iban' => 'IBAN', + 'spectre_extra_key_swift' => 'SWIFT', + 'spectre_extra_key_status' => 'Status', + 'spectre_extra_key_card_type' => 'Card type', + 'spectre_extra_key_account_name' => 'Account name', + 'spectre_extra_key_client_name' => 'Client name', + 'spectre_extra_key_account_number' => 'Account number', + 'spectre_extra_key_blocked_amount' => 'Blocked amount', + 'spectre_extra_key_available_amount' => 'Available amount', + 'spectre_extra_key_credit_limit' => 'Credit limit', + 'spectre_extra_key_interest_rate' => 'Interest rate', + 'spectre_extra_key_expiry_date' => 'Expiry date', + 'spectre_extra_key_open_date' => 'Open date', + 'spectre_extra_key_current_time' => 'Current time', + 'spectre_extra_key_current_date' => 'Current date', + 'spectre_extra_key_cards' => 'Cards', + 'spectre_extra_key_units' => 'Units', + 'spectre_extra_key_unit_price' => 'Unit price', + 'spectre_extra_key_transactions_count' => 'Transaction count', + + // 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 2a09aff2a7..12485de8fd 100644 --- a/resources/lang/en_US/intro.php +++ b/resources/lang/en_US/intro.php @@ -31,13 +31,13 @@ return [ // create account: 'accounts_create_iban' => 'Give your accounts a valid IBAN. This could make a data import very easy in the future.', - 'accounts_create_asset_opening_balance' => 'Assets accounts may have an "opening balance", indicating the start of this account\'s history in Firefly.', + 'accounts_create_asset_opening_balance' => 'Assets accounts may have an "opening balance", indicating the start of this account\'s history in Firefly III.', 'accounts_create_asset_currency' => 'Firefly III supports multiple currencies. Asset accounts have one main currency, which you must set here.', 'accounts_create_asset_virtual' => 'It can sometimes help to give your account a virtual balance: an extra amount always added to or removed from the actual balance.', // budgets index 'budgets_index_intro' => 'Budgets are used to manage your finances and form one of the core functions of Firefly III.', - 'budgets_index_set_budget' => 'Set your total budget for every period so Firefly can tell you if you have budgeted all available money.', + 'budgets_index_set_budget' => 'Set your total budget for every period so Firefly III can tell you if you have budgeted all available money.', 'budgets_index_see_expenses_bar' => 'Spending money will slowly fill this bar.', 'budgets_index_navigate_periods' => 'Navigate through periods to easily set budgets ahead of time.', 'budgets_index_new_budget' => 'Create new budgets as you see fit.', diff --git a/resources/lang/en_US/list.php b/resources/lang/en_US/list.php index a09af7d39a..08ebf2bddd 100644 --- a/resources/lang/en_US/list.php +++ b/resources/lang/en_US/list.php @@ -100,4 +100,6 @@ return [ 'sum_deposits' => 'Sum of deposits', 'sum_transfers' => 'Sum of transfers', 'reconcile' => 'Reconcile', + 'account_on_spectre' => 'Account (Spectre)', + 'do_import' => 'Import from this account', ]; diff --git a/resources/lang/en_US/validation.php b/resources/lang/en_US/validation.php index 2aed996555..0e67946c18 100644 --- a/resources/lang/en_US/validation.php +++ b/resources/lang/en_US/validation.php @@ -99,4 +99,38 @@ return [ 'present' => 'The :attribute field must be present.', 'amount_zero' => 'The total amount cannot be zero', 'secure_password' => 'This is not a secure password. Please try again. For more information, visit https://goo.gl/NCh2tN', + 'attributes' => [ + 'email' => 'email address', + 'description' => 'description', + 'amount' => 'amount', + 'name' => 'name', + 'targetamount' => 'target amount', + 'openingBalanceDate' => 'opening balance date', + 'openingBalance' => 'opening balance', + 'match' => 'match', + 'amount_min' => 'minimum amount', + 'amount_max' => 'maximum amount', + 'title' => 'title', + 'tag' => 'tag', + '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-trigger.1' => 'rule trigger #1', + 'rule-trigger.2' => 'rule trigger #2', + 'rule-trigger.3' => 'rule trigger #3', + 'rule-trigger.4' => 'rule trigger #4', + 'rule-trigger.5' => 'rule trigger #5', + ], ]; diff --git a/resources/lang/fr_FR/config.php b/resources/lang/fr_FR/config.php index 6d11dc4bad..e672331dc5 100644 --- a/resources/lang/fr_FR/config.php +++ b/resources/lang/fr_FR/config.php @@ -21,6 +21,7 @@ declare(strict_types=1); return [ + 'html_language' => 'fr', 'locale' => 'fr, French, fr_FR, fr_FR.utf8, fr_FR.UTF-8', 'month' => '%B %Y', 'month_and_day' => '%e %B %Y', diff --git a/resources/lang/fr_FR/demo.php b/resources/lang/fr_FR/demo.php index 0fc2018806..a0ae5fcc06 100644 --- a/resources/lang/fr_FR/demo.php +++ b/resources/lang/fr_FR/demo.php @@ -32,6 +32,4 @@ return [ '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', - 'import-configure-security' => 'Pour des raisons de sécurité, votre téléchargement a été remplacé par un fichier local.', - 'import-configure-configuration' => 'La configuration que vous voyez ci-dessous est correcte pour le fichier local.', ]; diff --git a/resources/lang/fr_FR/firefly.php b/resources/lang/fr_FR/firefly.php index 13f391f560..636ca3716c 100644 --- a/resources/lang/fr_FR/firefly.php +++ b/resources/lang/fr_FR/firefly.php @@ -44,8 +44,17 @@ return [ 'Opening balance' => 'Solde initial', 'create_new_stuff' => 'Créer de nouvelles choses', 'new_withdrawal' => 'Nouveau retrait', + 'create_new_transaction' => 'Crée une nouvelle transaction', + 'go_to_asset_accounts' => 'Afficher vos comptes d\'actifs', + 'go_to_budgets' => 'Gérer vos budgets', + 'go_to_categories' => 'Gérer vos catégories', + 'go_to_bills' => 'Gérer vos factures', + 'go_to_expense_accounts' => 'Voir vos comptes de dépenses', + 'go_to_revenue_accounts' => 'Voir vos comptes de revenus', + 'go_to_piggies' => 'Gérer vos tirelires', 'new_deposit' => 'Nouveau dépôt', - 'new_transfer' => 'Nouveau virement', + 'new_transfer' => 'Nouveau transfert', + 'new_transfers' => 'New transfer', 'new_asset_account' => 'Nouveau compte d’actif', 'new_expense_account' => 'Nouveau compte de dépenses', 'new_revenue_account' => 'Nouveau compte de recettes', @@ -60,6 +69,9 @@ return [ 'flash_error_multiple' => 'Il y a une erreur|Il y a :count erreurs', 'net_worth' => 'Valeur nette', 'route_has_no_help' => 'Il n\'y a pas d\'aide pour cette page.', + 'help_for_this_page' => 'Aide pour cette page', + 'no_help_could_be_found' => 'Aucun texte d\'aide n\'a pu être trouvé.', + 'no_help_title' => 'Toutes nos excuses, une erreur est survenue.', 'two_factor_welcome' => 'Bonjour, :user !', 'two_factor_enter_code' => 'Pour continuer, veuillez entrer votre code d’authentification à deux facteurs. Votre application peut la générer pour vous.', 'two_factor_code_here' => 'Entrez votre code ici', @@ -108,8 +120,14 @@ return [ 'clone_deposit' => 'Cloner ce dépôt', 'clone_transfer' => 'Cloner ce transfert', 'multi_select_no_selection' => 'Aucun sélectionné', + 'multi_select_select_all' => 'Tout sélectionner', + 'multi_select_n_selected' => 'sélectionné', 'multi_select_all_selected' => 'Tous sélectionnés', 'multi_select_filter_placeholder' => 'Rechercher..', + 'intro_next_label' => 'Suivant', + 'intro_prev_label' => 'Précédent', + 'intro_skip_label' => 'Ignorer', + 'intro_done_label' => 'Terminé', 'between_dates_breadcrumb' => 'Entre :start et :end', 'all_journals_without_budget' => 'Toutes les transactions sans budget', 'journals_without_budget' => 'Transactions sans budget', @@ -133,7 +151,7 @@ return [ 'all_journals_for_budget' => 'Toutes les transactions pour le budget :name', 'chart_all_journals_for_budget' => 'Graphique pour toutes les transactions pour le budget :name', 'journals_in_period_for_category' => 'Toutes les transactions pour la catégorie :name entre :start et :end', - 'journals_in_period_for_tag' => 'Toutes les transactions de balise :tag entre :start et :end', + 'journals_in_period_for_tag' => 'Toutes les transactions de tag :tag entre :start et :end', 'not_available_demo_user' => 'La fonctionnalité à laquelle vous essayez d’accéder n’est pas disponible pour les utilisateurs de la démo.', 'exchange_rate_instructions' => 'Compte d’actif "@name" n’accepte que les transactions en @native_currency. Si vous souhaitez utiliser @foreign_currency à la place, assurez-vous que le montant en @native_currency est aussi bien connu :', 'transfer_exchange_rate_instructions' => 'Compte d’actif source "@source_name" n’accepte que les transactions en @source_currency. Compte d’actif "@dest_name" de destination n’accepte que les transactions en @dest_currency. Vous devez fournir le montant transféré correctement dans les deux devises.', @@ -141,32 +159,32 @@ return [ 'invalid_server_configuration' => 'Configuration de serveur invalide', 'invalid_locale_settings' => 'Firefly III ne parvient pas à formater les montants monétaires car il manque des paquets logiciels sur votre serveur. Voici des instructions sur comment procéder.', 'quickswitch' => 'Changement rapide', - 'sign_in_to_start' => 'Sign in to start your session', - 'sign_in' => 'Sign in', - 'register_new_account' => 'Register a new account', - 'forgot_my_password' => 'I forgot my password', - 'problems_with_input' => 'There were some problems with your input.', - 'reset_password' => 'Reset your password', - 'button_reset_password' => 'Reset password', - 'reset_button' => 'Reset', - 'want_to_login' => 'I want to login', - 'button_register' => 'Register', + 'sign_in_to_start' => 'Connectez-vous pour commencer votre session', + 'sign_in' => 'Connectez-vous', + 'register_new_account' => 'Créer un nouveau compte', + 'forgot_my_password' => 'J\'ai oublié mon mot de passe', + 'problems_with_input' => 'Il y a eu quelques problèmes avec votre entrée.', + 'reset_password' => 'Réinitialisez votre mot de passe', + 'button_reset_password' => 'Réinitialiser le mot de passe', + 'reset_button' => 'Réinitialiser', + 'want_to_login' => 'Je veux me connecter', + 'button_register' => 'S\'inscrire', // check for updates: - 'update_check_title' => 'Check for updates', - 'admin_update_check_title' => 'Automatically check for update', - 'admin_update_check_explain' => 'Firefly III can check for updates automatically. When you enable this setting, it will contact Github to see if a new version of Firefly III is available. When it is, you will get a notification. You can test this notification using the button on the right. Please indicate below if you want Firefly III to check for updates.', - 'check_for_updates_permission' => 'Firefly III can check for updates, but it needs your permission to do so. Please go to the administration to indicate if you would like this feature to be enabled.', - 'updates_ask_me_later' => 'Ask me later', - 'updates_do_not_check' => 'Do not check for updates', - 'updates_enable_check' => 'Enable the check for updates', - 'admin_update_check_now_title' => 'Check for updates now', - 'admin_update_check_now_explain' => 'If you press the button, Firefly III will see if your current version is the latest.', - 'check_for_updates_button' => 'Check now!', - 'update_new_version_alert' => 'A new version is available. You are running v:your_version, the latest version is v:new_version which was released on :date.', - 'update_current_version_alert' => 'You are running v:version, which is the latest available release.', - 'update_newer_version_alert' => 'You are running v:your_version, which is newer than the latest release, v:new_version.', - 'update_check_error' => 'An error occurred while checking for updates. Please view the log files.', + 'update_check_title' => 'Vérifier les mises à jour', + 'admin_update_check_title' => 'Rechercher automatiquement les mises à jour', + 'admin_update_check_explain' => 'Firefly III peut vérifier les mises à jour automatiquement. Lorsque vous activez ce paramètre, il contacte Github pour voir si une nouvelle version de Firefly III est disponible. Quand c\'est le cas, vous recevrez une notification. Vous pouvez tester cette notification en utilisant le bouton sur la droite. Veuillez indiquer ci-dessous si vous voulez que Firefly III vérifie les mises à jour.', + 'check_for_updates_permission' => 'Firefly III peut vérifier les mises à jour, mais il a besoin de votre permission pour le faire. Veuillez vous rendre à l\'adresse administration pour indiquer si vous souhaitez que cette fonctionnalité soit activée.', + 'updates_ask_me_later' => 'Me demander plus tard', + 'updates_do_not_check' => 'Ne pas vérifier les mises à jour', + 'updates_enable_check' => 'Activer la vérification des mises à jour', + '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_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.', // search 'search' => 'Rechercher', @@ -193,8 +211,8 @@ return [ // export data: 'import_and_export' => 'Importer et Exporter', 'export_data' => 'Exporter les données', - 'export_and_backup_data' => 'Export et Sauvegarde', - 'export_data_intro' => 'À des fins de sauvegarde, lors de la migration vers un autre système ou lors de la migration sur une autre installation de Firefly III.', + 'export_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_format' => 'Format d\'export', 'export_format_csv' => 'Valeurs séparées par des virgules (fichier CSV)', 'export_format_mt940' => 'Format compatible MT940', @@ -330,7 +348,7 @@ return [ 'rule_trigger_has_any_budget_choice' => 'A un (des) budget', 'rule_trigger_has_any_budget' => 'La transaction a un(des) budget(s)', 'rule_trigger_has_no_tag_choice' => 'N\'a pas de tag(s)', - 'rule_trigger_has_no_tag' => 'La transaction n\'a pas de tag(s)', + 'rule_trigger_has_no_tag' => 'La transaction n\'a pas de tag·s', 'rule_trigger_has_any_tag_choice' => 'Dispose d\'un ou de plusieurs tags', 'rule_trigger_has_any_tag' => 'La transaction comporte un ou plusieurs tags', 'rule_trigger_any_notes_choice' => 'A une (ou plusieurs) note(s)', @@ -391,7 +409,7 @@ return [ '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 de l\'étiquette.', + 'press_tag_location' => 'Faites un clic droit ou appuyez longuement sur pour définir l\'emplacement du tag.', 'clear_location' => 'Effacer la localisation', // preferences @@ -431,9 +449,9 @@ return [ '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' => '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', + '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', @@ -600,8 +618,8 @@ return [ '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', - 'auto_match_off' => 'Pas mis automatiquement en correspondance par Firefly', + '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', @@ -701,7 +719,7 @@ return [ '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' => 'Initial balance for ":account"', + 'initial_balance_description' => 'Balance initiale pour ":account"', // categories: 'new_category' => 'Nouvelle catégorie', @@ -740,13 +758,13 @@ return [ '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' => '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', + '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)', @@ -761,7 +779,7 @@ return [ 'notes' => 'Notes', // new user: - 'welcome' => 'Bienvenue sur Firefly !', + '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.', @@ -797,7 +815,7 @@ return [ 'Revenue account' => 'Compte de recettes', 'Initial balance account' => 'Balance initiale', 'budgets' => 'Budgets', - 'tags' => 'Mots-clés', + 'tags' => 'Tags', 'reports' => 'Rapports', 'transactions' => 'Opérations', 'expenses' => 'Dépenses', @@ -855,8 +873,8 @@ return [ 'inactive' => 'Désactivé', 'active' => 'Actif', 'difference' => 'Différence', - 'money_flowing_in' => 'In', - 'money_flowing_out' => 'Out', + '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', @@ -866,7 +884,7 @@ return [ 'report_type_category' => 'Rapport par catégories', 'report_type_budget' => 'Rapport du budget', 'report_type_tag' => 'Rapport de tag', - 'report_type_account' => 'Expense/revenue account report', + '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', @@ -886,7 +904,7 @@ return [ '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).', + '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', @@ -899,8 +917,8 @@ return [ '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)', + '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)', @@ -1016,8 +1034,8 @@ return [ 'total_size' => 'taille totale', 'budget_or_budgets' => 'budget(s)', 'budgets_with_limits' => 'budget(s) avec montant configuré', - 'nr_of_rules_in_total_groups' => ':count_rules rule(s) in :count_groups rule group(s)', - 'tag_or_tags' => 'tag(s)', + 'nr_of_rules_in_total_groups' => ':count_rules règle(s) dans :count_groups groupe(s) de règles', + 'tag_or_tags' => 'tag·s', 'configuration_updated' => 'La configuration a été mise à jour', 'setting_is_demo_site' => 'Site de démonstration', 'setting_is_demo_site_explain' => 'Si vous cochez cette case, cette installation se comportera comme si c\'était le site de démonstration, ce qui comporte certaines limitations.', @@ -1100,10 +1118,10 @@ return [ // import bread crumbs and titles: 'import' => 'Import', 'import_data' => 'Importer des données', - 'import_general_index_file' => 'Import a file', - 'import_from_bunq' => 'Import from bunq', - 'import_using_spectre' => 'Import using Spectre', - 'import_using_plaid' => 'Import using Plaid', + 'import_general_index_file' => 'Importer un fichier', + 'import_from_bunq' => 'Importer depuis bunq', + 'import_using_spectre' => 'Importer en utilisant Spectre', + 'import_using_plaid' => 'Importer en utilisant Plaid', 'import_config_bread_crumb' => 'Configurez votre import', // import index page: diff --git a/resources/lang/fr_FR/import.php b/resources/lang/fr_FR/import.php index a8c06a5e26..86e7cdd00f 100644 --- a/resources/lang/fr_FR/import.php +++ b/resources/lang/fr_FR/import.php @@ -22,138 +22,169 @@ declare(strict_types=1); return [ // status of import: - 'status_wait_title' => 'Veuillez patienter...', - 'status_wait_text' => 'Cette boîte disparaîtra dans un instant.', - 'status_fatal_title' => 'Une erreur fatale est survenue', - 'status_fatal_text' => 'Une erreur fatale est survenue que le traitement d\'importation ne peut pas récupérer. Voir l\'explication en rouge ci-dessous.', - 'status_fatal_more' => 'Si l\'erreur est un time-out, l\'importation sera arrêtée pendant son traitement. Pour certaines configurations de serveur, ce n\'est que le serveur qui s\'est arrêté alors que l\'importation continue de fonctionner en arrière-plan. Pour vérifier cela, consultez les fichiers journaux. Si le problème persiste, envisagez d\'importer plutôt par ligne de commande.', - 'status_ready_title' => 'L\'importation est prête à démarrer', - 'status_ready_text' => 'L\'importation est prête à démarrer. Toute la configuration requise été effectuée. Vous pouvez téléchargez le fichier de configuration. Cela vous permettra de recommencer rapidement l\'importation si tout ne fonctionnait pas comme prévu. Pour exécuter l\'importation, vous pouvez soit exécuter la commande suivante dans la console du serveur, soit exécuter l\'importation depuis cette page web. Selon votre configuration générale, l\'importation via la console vous donnera plus de détails.', - 'status_ready_noconfig_text' => 'L\'importation est prête à démarrer. Toute la configuration requise été effectuée. Pour exécuter l\'importation, vous pouvez soit exécuter la commande suivante dans la console du serveur, soit exécuter l\'importation depuis cette page web. Selon votre configuration générale, l\'importation via la console vous donnera plus de détails.', - 'status_ready_config' => 'Télécharger la configuration', - 'status_ready_start' => 'Démarrer l\'importation', - 'status_ready_share' => 'Vous pouvez télécharger votre configuration et de la partager dans le centre de configuration d\'import. Cela permettra à d\'autres utilisateurs de Firefly III d\'importer leurs fichiers plus facilement.', - 'status_job_new' => 'Le travail est tout récent.', - 'status_job_configuring' => 'L\'importation est en cours de configuration.', - 'status_job_configured' => 'L\'importation est configurée.', - 'status_job_running' => 'L\'importation est en cours... Veuillez patienter...', - 'status_job_error' => 'Le travail a généré une erreur.', - 'status_job_finished' => 'L\'importation est terminée !', - 'status_running_title' => 'L\'importation est en cours d\'exécution', - 'status_running_placeholder' => 'Attendez pour une mise à jour...', - 'status_finished_title' => 'Le traitement d\'importation est terminé', - 'status_finished_text' => 'Le traitement d\'importation a importé vos données.', - 'status_errors_title' => 'Erreurs lors de l\'importation', - 'status_errors_single' => 'Une erreur est survenue lors de l\'importation. Cela ne semble pas être fatal.', - 'status_errors_multi' => 'Certaines erreurs sont survenues lors de l\'importation. Celles-ci ne semblent pas être fatales.', - 'status_bread_crumb' => 'Statut d\'importation', - 'status_sub_title' => 'Statut d\'importation', - 'config_sub_title' => 'Configurez votre importation', - 'status_finished_job' => 'Les transactions importées peuvent être trouvées avec le mot-clé :tag.', - 'import_with_key' => 'Importer avec la clé \':key\'', + 'status_wait_title' => 'Veuillez patienter...', + 'status_wait_text' => 'Cette boîte disparaîtra dans un instant.', + 'status_fatal_title' => 'Une erreur fatale est survenue', + 'status_fatal_text' => 'Une erreur fatale est survenue que le traitement d\'importation ne peut pas récupérer. Voir l\'explication en rouge ci-dessous.', + 'status_fatal_more' => 'Si l\'erreur est un time-out, l\'importation sera arrêtée pendant son traitement. Pour certaines configurations de serveur, ce n\'est que le serveur qui s\'est arrêté alors que l\'importation continue de fonctionner en arrière-plan. Pour vérifier cela, consultez les fichiers journaux. Si le problème persiste, envisagez d\'importer plutôt par ligne de commande.', + 'status_ready_title' => 'L\'importation est prête à démarrer', + 'status_ready_text' => 'L\'importation est prête à démarrer. Toute la configuration requise été effectuée. Vous pouvez téléchargez le fichier de configuration. Cela vous permettra de recommencer rapidement l\'importation si tout ne fonctionnait pas comme prévu. Pour exécuter l\'importation, vous pouvez soit exécuter la commande suivante dans la console du serveur, soit exécuter l\'importation depuis cette page web. Selon votre configuration générale, l\'importation via la console vous donnera plus de détails.', + 'status_ready_noconfig_text' => 'L\'importation est prête à démarrer. Toute la configuration requise été effectuée. Pour exécuter l\'importation, vous pouvez soit exécuter la commande suivante dans la console du serveur, soit exécuter l\'importation depuis cette page web. Selon votre configuration générale, l\'importation via la console vous donnera plus de détails.', + 'status_ready_config' => 'Télécharger la configuration', + 'status_ready_start' => 'Démarrer l\'importation', + 'status_ready_share' => 'Vous pouvez télécharger votre configuration et de la partager dans le centre de configuration d\'import. Cela permettra à d\'autres utilisateurs de Firefly III d\'importer leurs fichiers plus facilement.', + 'status_job_new' => 'Le travail est tout récent.', + 'status_job_configuring' => 'L\'importation est en cours de configuration.', + 'status_job_configured' => 'L\'importation est configurée.', + 'status_job_running' => 'L\'importation est en cours... Veuillez patienter...', + 'status_job_error' => 'Le travail a généré une erreur.', + 'status_job_finished' => 'L\'importation est terminée !', + 'status_running_title' => 'L\'importation est en cours d\'exécution', + 'status_running_placeholder' => 'Attendez pour une mise à jour...', + 'status_finished_title' => 'Le traitement d\'importation est terminé', + 'status_finished_text' => 'Le traitement d\'importation a importé vos données.', + 'status_errors_title' => 'Erreurs lors de l\'importation', + 'status_errors_single' => 'Une erreur est survenue lors de l\'importation. Cela ne semble pas être fatal.', + 'status_errors_multi' => 'Certaines erreurs sont survenues lors de l\'importation. Celles-ci ne semblent pas être fatales.', + 'status_bread_crumb' => 'Statut d\'importation', + 'status_sub_title' => 'Statut d\'importation', + 'config_sub_title' => 'Configurez votre importation', + 'status_finished_job' => 'The :count transactions imported can be found in tag :tag.', + 'status_finished_no_tag' => 'Firefly III has not collected any journals from your import file.', + 'import_with_key' => 'Importer avec la clé \':key\'', // file, upload something - 'file_upload_title' => 'Configuration de l\'importation (1/4) - Téléchargez votre fichier', - 'file_upload_text' => 'Ce traitement vous aidera à importer des fichiers de votre banque dans Firefly III. Consultez les pages d\'aide en haut à droite.', - 'file_upload_fields' => 'Champs', - 'file_upload_help' => 'Sélectionnez votre fichier', - 'file_upload_config_help' => 'Si vous avez précédemment importé des données dans Firefly III, vous avez peut-être téléchargé un fichier de configuration qui définit les relations entre les différents champs. Pour certaines banques, des utilisateurs ont bien voulu partager leur fichier ici : fichiers de configuration.', - 'file_upload_type_help' => 'Sélectionnez le type de fichier que vous allez télécharger', - 'file_upload_submit' => 'Envoyer des fichiers', + 'file_upload_title' => 'Configuration de l\'importation (1/4) - Téléchargez votre fichier', + 'file_upload_text' => 'Ce traitement vous aidera à importer des fichiers de votre banque dans Firefly III. Consultez les pages d\'aide en haut à droite.', + 'file_upload_fields' => 'Champs', + 'file_upload_help' => 'Sélectionnez votre fichier', + 'file_upload_config_help' => 'Si vous avez précédemment importé des données dans Firefly III, vous avez peut-être téléchargé un fichier de configuration qui définit les relations entre les différents champs. Pour certaines banques, des utilisateurs ont bien voulu partager leur fichier ici : fichiers de configuration.', + 'file_upload_type_help' => 'Sélectionnez le type de fichier que vous allez télécharger', + 'file_upload_submit' => 'Envoyer des fichiers', // file, upload types - 'import_file_type_csv' => 'CSV (valeurs séparées par des virgules)', + 'import_file_type_csv' => 'CSV (valeurs séparées par des virgules)', // file, initial config for CSV - 'csv_initial_title' => 'Configuration d\'importation (2/4) - Configuration d\'importation CSV', - 'csv_initial_text' => 'Pour pouvoir importer votre fichier correctement, veuillez valider les options ci-dessous.', - 'csv_initial_box' => 'Configuration d\'importation CSV de base', - 'csv_initial_box_title' => 'Options de configuration de l\'importation CSV de base', - 'csv_initial_header_help' => 'Cochez cette case si la première ligne de votre fichier CSV contient les entêtes des colonnes.', - 'csv_initial_date_help' => 'Date time format in your CSV. Follow the format like this page indicates. The default value will parse dates that look like this: :dateExample.', - 'csv_initial_delimiter_help' => 'Choose the field delimiter that is used in your input file. If not sure, comma is the safest option.', - 'csv_initial_import_account_help' => 'If your CSV file does NOT contain information about your asset account(s), use this dropdown to select to which account the transactions in the CSV belong to.', - 'csv_initial_submit' => 'Passez à l’étape 3/4', + 'csv_initial_title' => 'Configuration d\'importation (2/4) - Configuration d\'importation CSV', + 'csv_initial_text' => 'Pour pouvoir importer votre fichier correctement, veuillez valider les options ci-dessous.', + 'csv_initial_box' => 'Configuration d\'importation CSV de base', + 'csv_initial_box_title' => 'Options de configuration de l\'importation CSV de base', + 'csv_initial_header_help' => 'Cochez cette case si la première ligne de votre fichier CSV contient les entêtes des colonnes.', + 'csv_initial_date_help' => 'Date time format in your CSV. Follow the format like this page indicates. The default value will parse dates that look like this: :dateExample.', + 'csv_initial_delimiter_help' => 'Choose the field delimiter that is used in your input file. If not sure, comma is the safest option.', + 'csv_initial_import_account_help' => 'If your CSV file does NOT contain information about your asset account(s), use this dropdown to select to which account the transactions in the CSV belong to.', + 'csv_initial_submit' => 'Passez à l’étape 3/4', // file, new options: - 'file_apply_rules_title' => 'Appliquer les règles', - 'file_apply_rules_description' => 'Apply your rules. Note that this slows the import significantly.', - 'file_match_bills_title' => 'Faire correspondre les factures', - 'file_match_bills_description' => 'Match your bills to newly created withdrawals. Note that this slows the import significantly.', + 'file_apply_rules_title' => 'Appliquer les règles', + 'file_apply_rules_description' => 'Apply your rules. Note that this slows the import significantly.', + 'file_match_bills_title' => 'Faire correspondre les factures', + 'file_match_bills_description' => 'Match your bills to newly created withdrawals. Note that this slows the import significantly.', // file, roles config - 'csv_roles_title' => 'Import setup (3/4) - Define each column\'s role', - 'csv_roles_text' => 'Each column in your CSV file contains certain data. Please indicate what kind of data the importer should expect. The option to "map" data means that you will link each entry found in the column to a value in your database. An often mapped column is the column that contains the IBAN of the opposing account. That can be easily matched to IBAN\'s present in your database already.', - 'csv_roles_table' => 'Tableau', - 'csv_roles_column_name' => 'Nom de colonne', - 'csv_roles_column_example' => 'Données d\'exemple de colonne', - 'csv_roles_column_role' => 'Signification des données de colonne', - 'csv_roles_do_map_value' => 'Mapper ces valeurs', - 'csv_roles_column' => 'Colonne', - 'csv_roles_no_example_data' => 'Aucun exemple de données disponible', - 'csv_roles_submit' => 'Passez à l’étape 4/4', + 'csv_roles_title' => 'Import setup (3/4) - Define each column\'s role', + 'csv_roles_text' => 'Each column in your CSV file contains certain data. Please indicate what kind of data the importer should expect. The option to "map" data means that you will link each entry found in the column to a value in your database. An often mapped column is the column that contains the IBAN of the opposing account. That can be easily matched to IBAN\'s present in your database already.', + 'csv_roles_table' => 'Tableau', + 'csv_roles_column_name' => 'Nom de colonne', + 'csv_roles_column_example' => 'Données d\'exemple de colonne', + 'csv_roles_column_role' => 'Signification des données de colonne', + 'csv_roles_do_map_value' => 'Mapper ces valeurs', + 'csv_roles_column' => 'Colonne', + 'csv_roles_no_example_data' => 'Aucun exemple de données disponible', + 'csv_roles_submit' => 'Passez à l’étape 4/4', // 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.', - + '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.', - 'file_map_field_value' => 'Valeur du champ', - 'file_map_field_mapped_to' => 'Mappé à', - 'map_do_not_map' => '(ne pas mapper)', - 'file_map_submit' => 'Démarrez l\'importation', - 'file_nothing_to_map' => 'There is no data present in your file that you can map to existing values. Please press "Start the import" to continue.', + 'file_map_title' => 'Import setup (4/4) - Connect import data to Firefly III data', + 'file_map_text' => 'In the following tables, the left value shows you information found in your uploaded file. It is your task to map this value, if possible, to a value already present in your database. Firefly will stick to this mapping. If there is no value to map to, or you do not wish to map the specific value, select nothing.', + 'file_map_field_value' => 'Valeur du champ', + 'file_map_field_mapped_to' => 'Mappé à', + 'map_do_not_map' => '(ne pas mapper)', + 'file_map_submit' => 'Démarrez l\'importation', + 'file_nothing_to_map' => 'There is no data present in your file that you can map to existing values. Please press "Start the import" to continue.', // map things. - 'column__ignore' => '(ignorer cette colonne)', - 'column_account-iban' => 'Compte d’actif (IBAN)', - 'column_account-id' => 'Compte d\'actif (ID correspondant à Firefly)', - 'column_account-name' => 'Compte d’actif (nom)', - 'column_amount' => 'Montant', - 'column_amount_debit' => 'Montant (colonne débit)', - 'column_amount_credit' => 'Montant (colonne de crédit)', - 'column_amount-comma-separated' => 'Amount (comma as decimal separator)', - 'column_bill-id' => 'Bill ID (matching Firefly)', - 'column_bill-name' => 'Nom de la facture', - 'column_budget-id' => 'Identifiant du budget (correspondant à Firefly)', - 'column_budget-name' => 'Nom du budget', - 'column_category-id' => 'Identifiant de catégorie (correspondant à Firefly)', - 'column_category-name' => 'Nom de catégorie', - 'column_currency-code' => 'Currency code (ISO 4217)', - 'column_currency-id' => 'Currency ID (matching Firefly)', - 'column_currency-name' => 'Currency name (matching Firefly)', - 'column_currency-symbol' => 'Currency symbol (matching Firefly)', - 'column_date-interest' => 'Interest calculation date', - 'column_date-book' => 'Transaction booking date', - 'column_date-process' => 'Transaction process date', - 'column_date-transaction' => 'Date', - 'column_description' => 'Description', - 'column_opposing-iban' => 'Opposing account (IBAN)', - 'column_opposing-id' => 'Opposing account ID (matching Firefly)', - '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_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__ignore' => '(ignorer cette colonne)', + 'column_account-iban' => 'Compte d’actif (IBAN)', + 'column_account-id' => 'Asset account ID (matching FF3)', + 'column_account-name' => 'Compte d’actif (nom)', + 'column_amount' => 'Montant', + 'column_amount_foreign' => 'Amount (in foreign currency)', + 'column_amount_debit' => 'Montant (colonne débit)', + 'column_amount_credit' => 'Montant (colonne de crédit)', + 'column_amount-comma-separated' => 'Amount (comma as decimal separator)', + 'column_bill-id' => 'Bill ID (matching FF3)', + 'column_bill-name' => 'Nom de la facture', + 'column_budget-id' => 'Budget ID (matching FF3)', + 'column_budget-name' => 'Nom du budget', + 'column_category-id' => 'Category ID (matching FF3)', + 'column_category-name' => 'Nom de catégorie', + 'column_currency-code' => 'Currency code (ISO 4217)', + 'column_foreign-currency-code' => 'Foreign currency code (ISO 4217)', + 'column_currency-id' => 'Currency ID (matching FF3)', + 'column_currency-name' => 'Currency name (matching FF3)', + 'column_currency-symbol' => 'Currency symbol (matching FF3)', + 'column_date-interest' => 'Interest calculation date', + 'column_date-book' => 'Transaction booking date', + 'column_date-process' => 'Transaction process date', + 'column_date-transaction' => 'Date', + 'column_description' => 'Description', + 'column_opposing-iban' => 'Opposing account (IBAN)', + '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_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)', // prerequisites - 'prerequisites' => '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_title' => 'Prerequisites for an import from bunq', + 'bunq_prerequisites_text' => 'In order to import from bunq, you need to obtain an API key. You can do this through the app.', // Spectre - 'spectre_title' => 'Import using Spectre', - 'spectre_prerequisites_title' => 'Prerequisites for an import using Spectre', - 'spectre_prerequisites_text' => 'In order to import data using the Spectre API, you must provide Firefly III with two secret values. They can be found on the secrets page.', - 'spectre_enter_pub_key' => 'The import will only work when you enter this public key on your security page.', + 'spectre_title' => 'Import using Spectre', + 'spectre_prerequisites_title' => 'Prerequisites for an import using Spectre', + 'spectre_prerequisites_text' => 'In order to import data using the Spectre API, you must provide Firefly III with two secret values. They can be found on the secrets page.', + 'spectre_enter_pub_key' => 'The import will only work when you enter this public key on your security page.', + 'spectre_accounts_title' => 'Select accounts to import from', + 'spectre_accounts_text' => 'Each account on the left below has been found by Spectre and can be imported into Firefly III. Please select the asset account that should hold any given transactions. If you do not wish to import from any particular account, remove the check from the checkbox.', + 'spectre_do_import' => 'Yes, import from this account', + + // keys from "extra" array: + 'spectre_extra_key_iban' => 'IBAN', + 'spectre_extra_key_swift' => 'SWIFT', + 'spectre_extra_key_status' => 'Status', + 'spectre_extra_key_card_type' => 'Card type', + 'spectre_extra_key_account_name' => 'Account name', + 'spectre_extra_key_client_name' => 'Client name', + 'spectre_extra_key_account_number' => 'Account number', + 'spectre_extra_key_blocked_amount' => 'Blocked amount', + 'spectre_extra_key_available_amount' => 'Available amount', + 'spectre_extra_key_credit_limit' => 'Credit limit', + 'spectre_extra_key_interest_rate' => 'Interest rate', + 'spectre_extra_key_expiry_date' => 'Expiry date', + 'spectre_extra_key_open_date' => 'Open date', + 'spectre_extra_key_current_time' => 'Current time', + 'spectre_extra_key_current_date' => 'Current date', + 'spectre_extra_key_cards' => 'Cards', + 'spectre_extra_key_units' => 'Units', + 'spectre_extra_key_unit_price' => 'Unit price', + 'spectre_extra_key_transactions_count' => 'Transaction count', + + // 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 bb1a3a3c3d..243855109e 100644 --- a/resources/lang/fr_FR/intro.php +++ b/resources/lang/fr_FR/intro.php @@ -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' => 'Les comptes d\'actifs peuvent avoir un «solde d\'ouverture», indiquant le début de l\'historique de ce compte dans Firefly.', + '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_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' => 'Définissez votre budget total pour chaque période, de sorte que Firefly puisse vous dire si vous avez budgétisé tout l\'argent disponible.', + '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_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 a7f5f6e39b..67222b2721 100644 --- a/resources/lang/fr_FR/list.php +++ b/resources/lang/fr_FR/list.php @@ -100,4 +100,6 @@ 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', ]; diff --git a/resources/lang/fr_FR/validation.php b/resources/lang/fr_FR/validation.php index 64037ac30b..405bb7e911 100644 --- a/resources/lang/fr_FR/validation.php +++ b/resources/lang/fr_FR/validation.php @@ -99,4 +99,38 @@ return [ 'present' => 'Le champs :attribute doit être rempli.', 'amount_zero' => 'Le montant total ne peut pas être zéro', 'secure_password' => 'Ce n’est pas un mot de passe sécurisé. S’il vous plaît essayer de nouveau. Pour plus d’informations, visitez https://goo.gl/NCh2tN', + 'attributes' => [ + 'email' => 'adresse email', + 'description' => 'description', + 'amount' => 'montant', + 'name' => 'nom', + 'targetamount' => 'montant cible', + 'openingBalanceDate' => 'date du solde initial', + 'openingBalance' => 'solde initial', + 'match' => 'correspondance', + 'amount_min' => 'montant minimum', + 'amount_max' => 'montant maximum', + 'title' => 'titre', + 'tag' => 'tag', + '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', + 'rule-action-value.4' => 'valeur d\'action de la règle #4', + 'rule-action-value.5' => 'valeur d\'action de la règle #5', + 'rule-action.1' => 'action de règle #1', + 'rule-action.2' => 'action de règle #2', + 'rule-action.3' => 'action de règle #3', + 'rule-action.4' => 'action de règle #4', + 'rule-action.5' => 'action de règle #5', + 'rule-trigger-value.1' => 'valeur seuil de déclenchement de la règle #1', + 'rule-trigger-value.2' => 'valeur seuil de déclenchement de la règle #2', + 'rule-trigger-value.3' => 'valeur seuil de déclenchement de la règle #3', + 'rule-trigger-value.4' => 'valeur seuil de déclenchement de la règle #4', + 'rule-trigger-value.5' => 'valeur seuil de déclenchement de la règle #5', + 'rule-trigger.1' => 'déclencheur de règle #1', + 'rule-trigger.2' => 'déclencheur de règle #2', + 'rule-trigger.3' => 'déclencheur de règle #3', + 'rule-trigger.4' => 'déclencheur de règle #4', + 'rule-trigger.5' => 'déclencheur de règle #4', + ], ]; diff --git a/resources/lang/id_ID/config.php b/resources/lang/id_ID/config.php index e83657ebbd..2fd4ff1ecc 100644 --- a/resources/lang/id_ID/config.php +++ b/resources/lang/id_ID/config.php @@ -21,6 +21,7 @@ declare(strict_types=1); return [ + 'html_language' => 'id', 'locale' => 'id, Bahasa Indonesia, id_ID, id_ID.utf8, id_ID.UTF-8', 'month' => '%B %Y', 'month_and_day' => '%e %B %Y', diff --git a/resources/lang/id_ID/demo.php b/resources/lang/id_ID/demo.php index 7334a1ecf9..0cf92a4c18 100644 --- a/resources/lang/id_ID/demo.php +++ b/resources/lang/id_ID/demo.php @@ -32,6 +32,4 @@ return [ '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', - 'import-configure-security' => 'Karena masalah keamanan, upload Anda telah diganti dengan file lokal.', - 'import-configure-configuration' => 'Konfigurasi yang Anda lihat di bawah ini benar untuk file lokal.', ]; diff --git a/resources/lang/id_ID/firefly.php b/resources/lang/id_ID/firefly.php index 978d9d76d7..58fc0a344c 100644 --- a/resources/lang/id_ID/firefly.php +++ b/resources/lang/id_ID/firefly.php @@ -44,8 +44,17 @@ return [ 'Opening balance' => 'Saldo awal', 'create_new_stuff' => 'Buat barang baru', 'new_withdrawal' => 'Penarikan baru', + 'create_new_transaction' => 'Create new transaction', + 'go_to_asset_accounts' => 'View your asset accounts', + 'go_to_budgets' => 'Go to your budgets', + 'go_to_categories' => 'Go to your categories', + 'go_to_bills' => 'Go to your bills', + 'go_to_expense_accounts' => 'See your expense accounts', + 'go_to_revenue_accounts' => 'See your revenue accounts', + 'go_to_piggies' => 'Go to your piggy banks', 'new_deposit' => 'Deposit baru', 'new_transfer' => 'Transfer baru', + 'new_transfers' => 'New transfer', 'new_asset_account' => 'Akun aset baru', 'new_expense_account' => 'Akun pengeluaran baru', 'new_revenue_account' => 'Akun pendapatan baru', @@ -60,6 +69,9 @@ return [ 'flash_error_multiple' => 'Ada satu kesalahan|Ada :count kesalahan', 'net_worth' => 'Nilai bersih', 'route_has_no_help' => 'Tidak ada bantuan untuk rute ini.', + 'help_for_this_page' => 'Help for this page', + 'no_help_could_be_found' => 'No help text could be found.', + 'no_help_title' => 'Apologies, an error occurred.', 'two_factor_welcome' => 'Halo, :user!', 'two_factor_enter_code' => 'Untuk melanjutkan, masukkan kode otentikasi dua faktor Anda. Aplikasi Anda bisa menghasilkannya untuk Anda.', 'two_factor_code_here' => 'Masukkan kode di sini', @@ -108,8 +120,14 @@ return [ 'clone_deposit' => 'Kloning deposit ini', 'clone_transfer' => 'Kloning transfer ini', 'multi_select_no_selection' => 'Tidak ada yang di pilih', + 'multi_select_select_all' => 'Select all', + 'multi_select_n_selected' => 'selected', 'multi_select_all_selected' => 'Semua dipilih', 'multi_select_filter_placeholder' => 'Menemukan..', + 'intro_next_label' => 'Next', + 'intro_prev_label' => 'Previous', + 'intro_skip_label' => 'Skip', + 'intro_done_label' => 'Done', 'between_dates_breadcrumb' => 'Antara :start dan :end', 'all_journals_without_budget' => 'Semua transaksi tanpa anggaran', 'journals_without_budget' => 'Transaksi tanpa anggaran', @@ -163,7 +181,7 @@ return [ 'admin_update_check_now_title' => 'Check for updates now', 'admin_update_check_now_explain' => 'If you press the button, Firefly III will see if your current version is the latest.', 'check_for_updates_button' => 'Check now!', - 'update_new_version_alert' => 'A new version is available. You are running v:your_version, the latest version is v:new_version which was released on :date.', + '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_current_version_alert' => 'You are running v:version, which is the latest available release.', 'update_newer_version_alert' => 'You are running v:your_version, which is newer than the latest release, v:new_version.', 'update_check_error' => 'An error occurred while checking for updates. Please view the log files.', @@ -193,8 +211,8 @@ return [ // export data: 'import_and_export' => 'Impor dan ekspor', 'export_data' => 'Data ekspor', - 'export_and_backup_data' => 'Ekspor dan backup', - 'export_data_intro' => 'Untuk keperluan backup, saat bermigrasi ke sistem lain atau saat melakukan migrasi ke instalasi Firefly III lainnya.', + '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_format' => 'Format ekspor', 'export_format_csv' => 'Nilai yang dipisahkan koma (file CSV)', 'export_format_mt940' => 'Format MT940 yang kompatibel', @@ -600,8 +618,8 @@ return [ 'between_amounts' => 'antara :low dan :high.', 'repeats' => 'Berulang', 'connected_journals' => 'Transaksi yang terhubung', - 'auto_match_on' => 'Secara otomatis dicocokkan dengan Firefly', - 'auto_match_off' => 'Tidak secara otomatis dicocokkan dengan Firefly', + '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"', @@ -761,7 +779,7 @@ return [ 'notes' => 'Notes', // new user: - 'welcome' => 'Selamat datang di Firefly!', + '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.', diff --git a/resources/lang/id_ID/import.php b/resources/lang/id_ID/import.php index 5d9f6a3156..5c3c76abe6 100644 --- a/resources/lang/id_ID/import.php +++ b/resources/lang/id_ID/import.php @@ -22,138 +22,169 @@ declare(strict_types=1); return [ // status of import: - 'status_wait_title' => 'Tolong tunggu sebentar...', - 'status_wait_text' => 'Kotak ini akan hilang dalam sekejap.', - 'status_fatal_title' => 'Sebuah kesalahan fatal terjadi', - 'status_fatal_text' => 'Kesalahan fatal terjadi, dimana rutinitas impor tidak dapat dipulihkan. Silakan lihat penjelasannya di bawah ini.', - 'status_fatal_more' => 'Jika kesalahannya adalah time-out, impor akan berhenti setengah jalan. Untuk beberapa konfigurasi server, hanya server yang berhenti sementara impor terus berjalan di latar belakang. Untuk memverifikasi ini, periksa file log. Jika masalah berlanjut, pertimbangkan untuk mengimpor lebih dari baris perintah.', - 'status_ready_title' => 'Impor sudah siap untuk memulai', - 'status_ready_text' => 'Impor sudah siap dimulai. Semua konfigurasi yang perlu Anda lakukan sudah selesai. Silahkan download file konfigurasi. Ini akan membantu Anda dengan impor seandainya tidak berjalan seperti yang direncanakan. Untuk benar-benar menjalankan impor, Anda dapat menjalankan perintah berikut di konsol Anda, atau menjalankan impor berbasis web. Bergantung pada konfigurasi Anda, impor konsol akan memberi Anda lebih banyak umpan balik.', - 'status_ready_noconfig_text' => 'Impor sudah siap dimulai. Semua konfigurasi yang perlu Anda lakukan sudah selesai. Untuk benar-benar menjalankan impor, Anda dapat menjalankan perintah berikut di konsol Anda, atau menjalankan impor berbasis web. Bergantung pada konfigurasi Anda, impor konsol akan memberi Anda lebih banyak umpan balik.', - 'status_ready_config' => 'Download konfigurasi', - 'status_ready_start' => 'Mulai impor', - 'status_ready_share' => 'Harap pertimbangkan untuk mendownload konfigurasi Anda dan membagikannya di pusat konfigurasi impor. Ini akan memungkinkan pengguna Firefly III lainnya untuk mengimpor file mereka dengan lebih mudah.', - 'status_job_new' => 'Pekerjaan itu baru.', - 'status_job_configuring' => 'Impor sedang dikonfigurasi.', - 'status_job_configured' => 'Impor dikonfigurasi.', - 'status_job_running' => 'Impor sedang berjalan.. mohon menunggu..', - 'status_job_error' => 'Pekerjaan telah menimbulkan kesalahan.', - 'status_job_finished' => 'Impor telah selesai!', - 'status_running_title' => 'Impor sedang berjalan', - 'status_running_placeholder' => 'Silakan tunggu update...', - 'status_finished_title' => 'Rutin impor selesai', - 'status_finished_text' => 'Rutin impor telah mengimpor data Anda.', - 'status_errors_title' => 'Kesalahan selama impor', - 'status_errors_single' => 'Terjadi kesalahan saat mengimpor. Itu tidak tampak berakibat fatal.', - 'status_errors_multi' => 'Beberapa kesalahan terjadi saat impor. Ini tidak tampak berakibat fatal.', - 'status_bread_crumb' => 'Status impor', - 'status_sub_title' => 'Status impor', - 'config_sub_title' => 'Siapkan impor Anda', - 'status_finished_job' => 'Transaksi yang diimpor dapat ditemukan di tag :tag.', - 'import_with_key' => 'Impor dengan kunci \':key\'', + 'status_wait_title' => 'Tolong tunggu sebentar...', + 'status_wait_text' => 'Kotak ini akan hilang dalam sekejap.', + 'status_fatal_title' => 'Sebuah kesalahan fatal terjadi', + 'status_fatal_text' => 'Kesalahan fatal terjadi, dimana rutinitas impor tidak dapat dipulihkan. Silakan lihat penjelasannya di bawah ini.', + 'status_fatal_more' => 'Jika kesalahannya adalah time-out, impor akan berhenti setengah jalan. Untuk beberapa konfigurasi server, hanya server yang berhenti sementara impor terus berjalan di latar belakang. Untuk memverifikasi ini, periksa file log. Jika masalah berlanjut, pertimbangkan untuk mengimpor lebih dari baris perintah.', + 'status_ready_title' => 'Impor sudah siap untuk memulai', + 'status_ready_text' => 'Impor sudah siap dimulai. Semua konfigurasi yang perlu Anda lakukan sudah selesai. Silahkan download file konfigurasi. Ini akan membantu Anda dengan impor seandainya tidak berjalan seperti yang direncanakan. Untuk benar-benar menjalankan impor, Anda dapat menjalankan perintah berikut di konsol Anda, atau menjalankan impor berbasis web. Bergantung pada konfigurasi Anda, impor konsol akan memberi Anda lebih banyak umpan balik.', + 'status_ready_noconfig_text' => 'Impor sudah siap dimulai. Semua konfigurasi yang perlu Anda lakukan sudah selesai. Untuk benar-benar menjalankan impor, Anda dapat menjalankan perintah berikut di konsol Anda, atau menjalankan impor berbasis web. Bergantung pada konfigurasi Anda, impor konsol akan memberi Anda lebih banyak umpan balik.', + 'status_ready_config' => 'Download konfigurasi', + 'status_ready_start' => 'Mulai impor', + 'status_ready_share' => 'Harap pertimbangkan untuk mendownload konfigurasi Anda dan membagikannya di pusat konfigurasi impor. Ini akan memungkinkan pengguna Firefly III lainnya untuk mengimpor file mereka dengan lebih mudah.', + 'status_job_new' => 'Pekerjaan itu baru.', + 'status_job_configuring' => 'Impor sedang dikonfigurasi.', + 'status_job_configured' => 'Impor dikonfigurasi.', + 'status_job_running' => 'Impor sedang berjalan.. mohon menunggu..', + 'status_job_error' => 'Pekerjaan telah menimbulkan kesalahan.', + 'status_job_finished' => 'Impor telah selesai!', + 'status_running_title' => 'Impor sedang berjalan', + 'status_running_placeholder' => 'Silakan tunggu update...', + 'status_finished_title' => 'Rutin impor selesai', + 'status_finished_text' => 'Rutin impor telah mengimpor data Anda.', + 'status_errors_title' => 'Kesalahan selama impor', + 'status_errors_single' => 'Terjadi kesalahan saat mengimpor. Itu tidak tampak berakibat fatal.', + 'status_errors_multi' => 'Beberapa kesalahan terjadi saat impor. Ini tidak tampak berakibat fatal.', + 'status_bread_crumb' => 'Status impor', + 'status_sub_title' => 'Status impor', + 'config_sub_title' => 'Siapkan impor Anda', + 'status_finished_job' => 'The :count transactions imported can be found in tag :tag.', + 'status_finished_no_tag' => 'Firefly III has not collected any journals from your import file.', + 'import_with_key' => 'Impor dengan kunci \':key\'', // file, upload something - 'file_upload_title' => 'Impor setup (1/4) - Upload file Anda', - 'file_upload_text' => 'Rutin ini akan membantu Anda mengimpor file dari bank Anda ke Firefly III. Silakan periksa halaman bantuan di pojok kanan atas.', - 'file_upload_fields' => 'Bidang', - 'file_upload_help' => 'Pilih file anda', - 'file_upload_config_help' => 'Jika sebelumnya Anda mengimpor data ke Firefly III, Anda mungkin memiliki file konfigurasi, yang akan menetapkan nilai konfigurasi untuk Anda. Untuk beberapa bank, pengguna lain dengan ramah memberikan berkas konfigurasi mereka', - 'file_upload_type_help' => 'Pilih jenis file yang akan anda upload', - 'file_upload_submit' => 'Unggah berkas', + 'file_upload_title' => 'Impor setup (1/4) - Upload file Anda', + 'file_upload_text' => 'Rutin ini akan membantu Anda mengimpor file dari bank Anda ke Firefly III. Silakan periksa halaman bantuan di pojok kanan atas.', + 'file_upload_fields' => 'Bidang', + 'file_upload_help' => 'Pilih file anda', + 'file_upload_config_help' => 'Jika sebelumnya Anda mengimpor data ke Firefly III, Anda mungkin memiliki file konfigurasi, yang akan menetapkan nilai konfigurasi untuk Anda. Untuk beberapa bank, pengguna lain dengan ramah memberikan berkas konfigurasi mereka', + 'file_upload_type_help' => 'Pilih jenis file yang akan anda upload', + 'file_upload_submit' => 'Unggah berkas', // file, upload types - 'import_file_type_csv' => 'CSV (nilai yang dipisahkan koma)', + 'import_file_type_csv' => 'CSV (nilai yang dipisahkan koma)', // file, initial config for CSV - 'csv_initial_title' => 'Penyiapan impor (2/4) - Penyiapan impor CSV dasar', - 'csv_initial_text' => 'Untuk dapat mengimpor file Anda dengan benar, mohon validasi pilihan di bawah ini.', - 'csv_initial_box' => 'Penyiapan impor CSV dasar', - 'csv_initial_box_title' => 'Opsi penyiapan impor CSV dasar', - 'csv_initial_header_help' => 'Centang kotak ini jika baris pertama file CSV Anda adalah judul kolom.', - 'csv_initial_date_help' => 'Format waktu tanggal di CSV Anda. Ikuti format seperti laman ini menunjukkan. Nilai default akan mengurai tanggal yang terlihat seperti ini: :dateExample.', - 'csv_initial_delimiter_help' => 'Pilih pembatas lapangan yang digunakan dalam file masukan Anda. Jika tidak yakin, koma adalah pilihan teraman.', - 'csv_initial_import_account_help' => 'Jika file CSV TIDAK berisi informasi tentang akun aset Anda, gunakan dropdown ini untuk memilih akun mana yang menjadi tempat transaksi di CSV.', - 'csv_initial_submit' => 'Lanjutkan dengan langkah 3/4', + 'csv_initial_title' => 'Penyiapan impor (2/4) - Penyiapan impor CSV dasar', + 'csv_initial_text' => 'Untuk dapat mengimpor file Anda dengan benar, mohon validasi pilihan di bawah ini.', + 'csv_initial_box' => 'Penyiapan impor CSV dasar', + 'csv_initial_box_title' => 'Opsi penyiapan impor CSV dasar', + 'csv_initial_header_help' => 'Centang kotak ini jika baris pertama file CSV Anda adalah judul kolom.', + 'csv_initial_date_help' => 'Format waktu tanggal di CSV Anda. Ikuti format seperti laman ini menunjukkan. Nilai default akan mengurai tanggal yang terlihat seperti ini: :dateExample.', + 'csv_initial_delimiter_help' => 'Pilih pembatas lapangan yang digunakan dalam file masukan Anda. Jika tidak yakin, koma adalah pilihan teraman.', + 'csv_initial_import_account_help' => 'Jika file CSV TIDAK berisi informasi tentang akun aset Anda, gunakan dropdown ini untuk memilih akun mana yang menjadi tempat transaksi di CSV.', + 'csv_initial_submit' => 'Lanjutkan dengan langkah 3/4', // file, new options: - 'file_apply_rules_title' => 'Terapkan aturan', - 'file_apply_rules_description' => 'Terapkan peraturan Anda Perhatikan bahwa ini memperlambat impor secara signifikan.', - 'file_match_bills_title' => 'Cocokkan tagihan', - 'file_match_bills_description' => 'Cocokkan tagihan Anda dengan penarikan yang baru dibuat. Perhatikan bahwa ini memperlambat impor secara signifikan.', + 'file_apply_rules_title' => 'Terapkan aturan', + 'file_apply_rules_description' => 'Terapkan peraturan Anda Perhatikan bahwa ini memperlambat impor secara signifikan.', + 'file_match_bills_title' => 'Cocokkan tagihan', + 'file_match_bills_description' => 'Cocokkan tagihan Anda dengan penarikan yang baru dibuat. Perhatikan bahwa ini memperlambat impor secara signifikan.', // file, roles config - 'csv_roles_title' => 'Pengaturan impor (3/4) - Tentukan peran masing-masing kolom', - 'csv_roles_text' => 'Setiap kolom dalam file CSV Anda berisi data tertentu. Tolong tunjukkan jenis data yang harus diharapkan oleh importir. Pilihan untuk "memetakan" data berarti Anda akan menghubungkan setiap entri yang ditemukan di kolom ke nilai di database Anda. Kolom yang sering dipetakan adalah kolom yang berisi IBAN dari akun lawan. Itu bisa dengan mudah disesuaikan dengan keberadaan IBAN di database Anda.', - 'csv_roles_table' => 'Meja', - 'csv_roles_column_name' => 'Nama kolom', - 'csv_roles_column_example' => 'Kolom contoh data', - 'csv_roles_column_role' => 'Data kolom berarti', - 'csv_roles_do_map_value' => 'Peta nilai-nilai ini', - 'csv_roles_column' => 'Kolom', - 'csv_roles_no_example_data' => 'Tidak ada data contoh yang tersedia', - 'csv_roles_submit' => 'Lanjutkan dengan langkah 4/4', + 'csv_roles_title' => 'Pengaturan impor (3/4) - Tentukan peran masing-masing kolom', + 'csv_roles_text' => 'Setiap kolom dalam file CSV Anda berisi data tertentu. Tolong tunjukkan jenis data yang harus diharapkan oleh importir. Pilihan untuk "memetakan" data berarti Anda akan menghubungkan setiap entri yang ditemukan di kolom ke nilai di database Anda. Kolom yang sering dipetakan adalah kolom yang berisi IBAN dari akun lawan. Itu bisa dengan mudah disesuaikan dengan keberadaan IBAN di database Anda.', + 'csv_roles_table' => 'Meja', + 'csv_roles_column_name' => 'Nama kolom', + 'csv_roles_column_example' => 'Kolom contoh data', + 'csv_roles_column_role' => 'Data kolom berarti', + 'csv_roles_do_map_value' => 'Peta nilai-nilai ini', + 'csv_roles_column' => 'Kolom', + 'csv_roles_no_example_data' => 'Tidak ada data contoh yang tersedia', + 'csv_roles_submit' => 'Lanjutkan dengan langkah 4/4', // 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.', - + '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.', - 'file_map_field_value' => 'Nilai lapangan', - 'file_map_field_mapped_to' => 'Dipetakan ke', - 'map_do_not_map' => '(jangan memetakan)', - 'file_map_submit' => 'Mulai impor', - 'file_nothing_to_map' => 'There is no data present in your file that you can map to existing values. Please press "Start the import" to continue.', + 'file_map_title' => 'Pengaturan impor (4/4) - Sambungkan data impor ke data Firefly III', + 'file_map_text' => 'Pada tabel berikut, nilai kiri menunjukkan informasi yang Anda temukan di file yang Anda upload. Adalah tugas Anda untuk memetakan nilai ini, jika mungkin, ke nilai yang sudah ada di database Anda. Firefly akan menempel pada pemetaan ini. Jika tidak ada nilai untuk dipetakan, atau Anda tidak ingin memetakan nilai spesifiknya, pilih yang tidak ada.', + 'file_map_field_value' => 'Nilai lapangan', + 'file_map_field_mapped_to' => 'Dipetakan ke', + 'map_do_not_map' => '(jangan memetakan)', + 'file_map_submit' => 'Mulai impor', + 'file_nothing_to_map' => 'There is no data present in your file that you can map to existing values. Please press "Start the import" to continue.', // map things. - 'column__ignore' => '(abaikan kolom ini)', - 'column_account-iban' => 'Akun aset (IBAN)', - 'column_account-id' => 'ID akun aset (cocok dengan Firefly)', - 'column_account-name' => 'Akun aset (nama)', - 'column_amount' => 'Jumlah', - 'column_amount_debit' => 'Jumlah (kolom debit)', - 'column_amount_credit' => 'Jumlah (kolom kredit)', - 'column_amount-comma-separated' => 'Jumlah (koma sebagai pemisah desimal)', - 'column_bill-id' => 'Bill ID (pencocokan Firefly)', - 'column_bill-name' => 'Nama tagihan', - 'column_budget-id' => 'ID Anggaran (cocok dengan Firefly)', - 'column_budget-name' => 'Nama anggaran', - 'column_category-id' => 'ID Kategori (cocok dengan Firefly)', - 'column_category-name' => 'Nama Kategori', - 'column_currency-code' => 'Kode mata uang (ISO 4217)', - 'column_currency-id' => 'ID mata uang (cocok dengan Firefly)', - 'column_currency-name' => 'Nama mata uang (cocok dengan Firefly)', - 'column_currency-symbol' => 'Simbol mata uang (cocok dengan Firefly)', - 'column_date-interest' => 'Tanggal perhitungan bunga', - 'column_date-book' => 'Tanggal pemesanan transaksi', - 'column_date-process' => 'Tanggal proses transaksi', - 'column_date-transaction' => 'Tanggal', - 'column_description' => 'Deskripsi', - 'column_opposing-iban' => 'Akun lawan (IBAN)', - 'column_opposing-id' => 'Menentang ID akun (cocok dengan Firefly)', - '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_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__ignore' => '(abaikan kolom ini)', + 'column_account-iban' => 'Akun aset (IBAN)', + 'column_account-id' => 'Asset account ID (matching FF3)', + 'column_account-name' => 'Akun aset (nama)', + 'column_amount' => 'Jumlah', + 'column_amount_foreign' => 'Amount (in foreign currency)', + 'column_amount_debit' => 'Jumlah (kolom debit)', + 'column_amount_credit' => 'Jumlah (kolom kredit)', + 'column_amount-comma-separated' => 'Jumlah (koma sebagai pemisah desimal)', + 'column_bill-id' => 'Bill ID (matching FF3)', + 'column_bill-name' => 'Nama tagihan', + 'column_budget-id' => 'Budget ID (matching FF3)', + 'column_budget-name' => 'Nama anggaran', + 'column_category-id' => 'Category ID (matching FF3)', + 'column_category-name' => 'Nama Kategori', + 'column_currency-code' => 'Kode mata uang (ISO 4217)', + 'column_foreign-currency-code' => 'Foreign currency code (ISO 4217)', + 'column_currency-id' => 'Currency ID (matching FF3)', + 'column_currency-name' => 'Currency name (matching FF3)', + 'column_currency-symbol' => 'Currency symbol (matching FF3)', + 'column_date-interest' => 'Tanggal perhitungan bunga', + 'column_date-book' => 'Tanggal pemesanan transaksi', + 'column_date-process' => 'Tanggal proses transaksi', + 'column_date-transaction' => 'Tanggal', + 'column_description' => 'Deskripsi', + 'column_opposing-iban' => 'Akun lawan (IBAN)', + '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_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)', // prerequisites - 'prerequisites' => '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_title' => 'Prasyarat untuk impor dari bunq', + 'bunq_prerequisites_text' => 'Untuk mengimpor dari bunq, Anda perlu mendapatkan kunci API. Anda bisa melakukan ini melalui aplikasi.', // Spectre - 'spectre_title' => 'Impor menggunakan momok', - 'spectre_prerequisites_title' => 'Prasyarat untuk impor menggunakan momok', - 'spectre_prerequisites_text' => 'In order to import data using the Spectre API, you must provide Firefly III with two secret values. They can be found on the secrets page.', - 'spectre_enter_pub_key' => 'Impor hanya akan berfungsi saat Anda memasukkan kunci publik ini di halaman keamanan Anda.', + 'spectre_title' => 'Impor menggunakan momok', + 'spectre_prerequisites_title' => 'Prasyarat untuk impor menggunakan momok', + 'spectre_prerequisites_text' => 'In order to import data using the Spectre API, you must provide Firefly III with two secret values. They can be found on the secrets page.', + 'spectre_enter_pub_key' => 'Impor hanya akan berfungsi saat Anda memasukkan kunci publik ini di halaman keamanan Anda.', + 'spectre_accounts_title' => 'Select accounts to import from', + 'spectre_accounts_text' => 'Each account on the left below has been found by Spectre and can be imported into Firefly III. Please select the asset account that should hold any given transactions. If you do not wish to import from any particular account, remove the check from the checkbox.', + 'spectre_do_import' => 'Yes, import from this account', + + // keys from "extra" array: + 'spectre_extra_key_iban' => 'IBAN', + 'spectre_extra_key_swift' => 'SWIFT', + 'spectre_extra_key_status' => 'Status', + 'spectre_extra_key_card_type' => 'Card type', + 'spectre_extra_key_account_name' => 'Account name', + 'spectre_extra_key_client_name' => 'Client name', + 'spectre_extra_key_account_number' => 'Account number', + 'spectre_extra_key_blocked_amount' => 'Blocked amount', + 'spectre_extra_key_available_amount' => 'Available amount', + 'spectre_extra_key_credit_limit' => 'Credit limit', + 'spectre_extra_key_interest_rate' => 'Interest rate', + 'spectre_extra_key_expiry_date' => 'Expiry date', + 'spectre_extra_key_open_date' => 'Open date', + 'spectre_extra_key_current_time' => 'Current time', + 'spectre_extra_key_current_date' => 'Current date', + 'spectre_extra_key_cards' => 'Cards', + 'spectre_extra_key_units' => 'Units', + 'spectre_extra_key_unit_price' => 'Unit price', + 'spectre_extra_key_transactions_count' => 'Transaction count', + + // 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 3940aa8d52..30a5b5cb89 100644 --- a/resources/lang/id_ID/intro.php +++ b/resources/lang/id_ID/intro.php @@ -31,13 +31,13 @@ return [ // create account: 'accounts_create_iban' => 'Berikan akun anda IBAN yang benar. Hal ini bisa membuat data impor sangat mudah di masa yang akan datang.', - 'accounts_create_asset_opening_balance' => 'Akun aset dapat memiliki "saldo awal", yang menandakan dimulainya riwayat pada akun ini di firefly.', + '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_currency' => 'Firelfly III mendukung berbagai mata uang. Akun aset memiliki satu mata uang utama, yang yang harus anda tetapkan.', 'accounts_create_asset_virtual' => 'Kadang-kadang itu dapat membantu memberi akun anda saldo virtual: jumlah tambahan yang selalu ditambahkan atau dihapus dari saldo sebenarnya.', // budgets index 'budgets_index_intro' => 'Anggaran yang digunakan untuk mengelola keuangan anda dan membentuk salah satu fungsi inti dari Firefly III.', - 'budgets_index_set_budget' => 'Tetapkan total anggaran anda untuk setiap periode sehingga Firefly dapat memberi tahu anda jika anda sudah menganggarkan semua uang yang tersedia.', + '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_see_expenses_bar' => 'Menghabiskan uang secara perlahan dengan mengisi di bar ini.', 'budgets_index_navigate_periods' => 'Menavigasi melalui periode dengan mudah menetapkan anggaraan sebelumnya.', 'budgets_index_new_budget' => 'Buat anggaran baru sesuai keinginan anda.', diff --git a/resources/lang/id_ID/list.php b/resources/lang/id_ID/list.php index 4a1557f98a..34601b3139 100644 --- a/resources/lang/id_ID/list.php +++ b/resources/lang/id_ID/list.php @@ -100,4 +100,6 @@ return [ 'sum_deposits' => 'Jumlah simpanan', 'sum_transfers' => 'Jumlah transfer', 'reconcile' => 'Menyesuaikan', + 'account_on_spectre' => 'Account (Spectre)', + 'do_import' => 'Import from this account', ]; diff --git a/resources/lang/id_ID/validation.php b/resources/lang/id_ID/validation.php index 68e8f4f71e..e4c07c4b90 100644 --- a/resources/lang/id_ID/validation.php +++ b/resources/lang/id_ID/validation.php @@ -99,4 +99,38 @@ return [ 'present' => 'Bidang :attribute harus ada.', 'amount_zero' => 'Jumlah total tidak boleh nol', 'secure_password' => 'Ini bukan kata sandi yang aman. Silahkan coba lagi. Untuk informasi lebih lanjut, kunjungi https://goo.gl/NCh2tN', + 'attributes' => [ + 'email' => 'email address', + 'description' => 'description', + 'amount' => 'amount', + 'name' => 'name', + 'targetamount' => 'target amount', + 'openingBalanceDate' => 'opening balance date', + 'openingBalance' => 'opening balance', + 'match' => 'match', + 'amount_min' => 'minimum amount', + 'amount_max' => 'maximum amount', + 'title' => 'title', + 'tag' => 'tag', + '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-trigger.1' => 'rule trigger #1', + 'rule-trigger.2' => 'rule trigger #2', + 'rule-trigger.3' => 'rule trigger #3', + 'rule-trigger.4' => 'rule trigger #4', + 'rule-trigger.5' => 'rule trigger #5', + ], ]; diff --git a/resources/lang/nl_NL/config.php b/resources/lang/nl_NL/config.php index 0379439ef2..c1cd4dd746 100644 --- a/resources/lang/nl_NL/config.php +++ b/resources/lang/nl_NL/config.php @@ -21,6 +21,7 @@ declare(strict_types=1); return [ + 'html_language' => 'nl', 'locale' => 'nl, Dutch, nl_NL, nl_NL.utf8, nl_NL.UTF-8', 'month' => '%B %Y', 'month_and_day' => '%e %B %Y', diff --git a/resources/lang/nl_NL/demo.php b/resources/lang/nl_NL/demo.php index a5f8bcd9a6..1d87431edc 100644 --- a/resources/lang/nl_NL/demo.php +++ b/resources/lang/nl_NL/demo.php @@ -32,6 +32,4 @@ return [ 'transactions-index' => 'Deze uitgaven, inkomsten en overschrijvingen zijn niet heel fantasierijk. Ze zijn automatisch gegenereerd.', 'piggy-banks-index' => 'Zoals je kan zien zijn er drie spaarpotjes. Gebruik de plus- en minknoppen om het bedrag in de spaarpotjes te veranderen. Klik op de naam van het spaarpotje om er de geschiedenis van te zien.', 'import-index' => 'Uiteraard kan je elk CSV bestand importeren in Firefly III', - 'import-configure-security' => 'Uit veiligheidsoverwegingen is je upload vervangen door een lokaal bestand.', - 'import-configure-configuration' => 'Deze configuratie is correct voor het lokale bestand.', ]; diff --git a/resources/lang/nl_NL/firefly.php b/resources/lang/nl_NL/firefly.php index 0f3d6e2e5f..ed533459de 100644 --- a/resources/lang/nl_NL/firefly.php +++ b/resources/lang/nl_NL/firefly.php @@ -44,8 +44,17 @@ return [ 'Opening balance' => 'Startsaldo', 'create_new_stuff' => 'Nieuw', 'new_withdrawal' => 'Nieuwe uitgave', + 'create_new_transaction' => 'Maak nieuwe transactie', + 'go_to_asset_accounts' => 'Bekijk je betaalrekeningen', + 'go_to_budgets' => 'Ga naar je budgetten', + 'go_to_categories' => 'Ga naar je categorieën', + 'go_to_bills' => 'Ga naar je contracten', + 'go_to_expense_accounts' => 'Bekijk je crediteuren', + 'go_to_revenue_accounts' => 'Bekijk je debiteuren', + 'go_to_piggies' => 'Ga naar je spaarpotjes', 'new_deposit' => 'Nieuwe inkomsten', 'new_transfer' => 'Nieuwe overschrijving', + 'new_transfers' => 'Nieuwe overschrijving', 'new_asset_account' => 'Nieuwe betaalrekening', 'new_expense_account' => 'Nieuwe crediteur', 'new_revenue_account' => 'Nieuwe debiteur', @@ -60,6 +69,9 @@ return [ 'flash_error_multiple' => 'Er is één fout|Er zijn :count fouten', 'net_worth' => 'Kapitaal', 'route_has_no_help' => 'Er is geen hulptekst voor deze pagina.', + 'help_for_this_page' => 'Hulp bij deze pagina', + 'no_help_could_be_found' => 'Er kon geen helptekst worden gevonden.', + 'no_help_title' => 'Sorry, er ging wat mis.', 'two_factor_welcome' => 'Hoi :user!', 'two_factor_enter_code' => 'Vul je authenticatiecode in. Je authenticatieapplicatie kan deze voor je genereren.', 'two_factor_code_here' => 'Code', @@ -108,8 +120,14 @@ return [ 'clone_deposit' => 'Kopieer deze inkomsten', 'clone_transfer' => 'Kopieer deze overschrijving', 'multi_select_no_selection' => 'Niets geselecteerd', + 'multi_select_select_all' => 'Selecteer alles', + 'multi_select_n_selected' => 'geselecteerd', 'multi_select_all_selected' => 'Alles geselecteerd', 'multi_select_filter_placeholder' => 'Vinden..', + 'intro_next_label' => 'Volgende', + 'intro_prev_label' => 'Vorige', + 'intro_skip_label' => 'Overslaan', + 'intro_done_label' => 'Klaar', 'between_dates_breadcrumb' => 'Tussen :start en :end', 'all_journals_without_budget' => 'Alle transacties zonder budget', 'journals_without_budget' => 'Transacties zonder budget', @@ -163,7 +181,7 @@ return [ 'admin_update_check_now_title' => 'Op updates controleren', 'admin_update_check_now_explain' => 'Als u op de knop drukt, kijkt Firefly III of je huidige versie de nieuwste is.', 'check_for_updates_button' => 'Controleer nu!', - 'update_new_version_alert' => 'Er is een nieuwe versie beschikbaar. Je gebruikt v:your_version, de nieuwste versie is v:new_version die werd uitgebracht op :date.', + 'update_new_version_alert' => 'Er is een nieuwe versie van Firefly III beschikbaar. Je gebruikt v:your_version, de nieuwste versie is v:new_version die werd uitgebracht op :date.', 'update_current_version_alert' => 'Je gebruikt v:version, de nieuwste beschikbare versie.', 'update_newer_version_alert' => 'Je gebruikt v:your_version, wat nieuwer is dan de nieuwste versie, v:new_version.', 'update_check_error' => 'Er is een fout opgetreden bij het controleren op updates. Bekijk de logbestanden.', @@ -193,8 +211,8 @@ return [ // export data: 'import_and_export' => 'Import en export', 'export_data' => 'Exporteren', - 'export_and_backup_data' => 'Exporteren en backup', - 'export_data_intro' => 'Om te backuppen, of wanneer je naar een ander systeem verhuist.', + 'export_and_backup_data' => 'Exporteren', + 'export_data_intro' => 'Gebruik de geëxporteerde data om naar een nieuwe financiële applicatie te gaan. Gebruik deze bestanden niet als backup. Er zit niet genoeg metadata bij om een nieuwe Firefly III mee op te zetten. Als je een backup wilt maken van je gegevens, backup dan de database zelf.', 'export_format' => 'Exporteerformaat', 'export_format_csv' => 'Komma-gescheiden bestand (CSV)', 'export_format_mt940' => 'MT940 bestand', @@ -600,8 +618,8 @@ return [ 'between_amounts' => 'tussen :low en :high.', 'repeats' => 'Herhaalt', 'connected_journals' => 'Verbonden transacties', - 'auto_match_on' => 'Automatisch herkend door Firefly', - 'auto_match_off' => 'Niet automatisch herkend door Firefly', + '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', @@ -761,7 +779,7 @@ return [ 'notes' => 'Notities', // new user: - 'welcome' => 'Welkom bij Firefly!', + '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.', diff --git a/resources/lang/nl_NL/import.php b/resources/lang/nl_NL/import.php index 2fb98c50a8..f82fe7bf75 100644 --- a/resources/lang/nl_NL/import.php +++ b/resources/lang/nl_NL/import.php @@ -22,138 +22,169 @@ declare(strict_types=1); return [ // status of import: - 'status_wait_title' => 'Momentje...', - 'status_wait_text' => 'Dit vak verdwijnt zometeen.', - 'status_fatal_title' => 'Er is een fatale fout opgetreden', - 'status_fatal_text' => 'Een fatale fout opgetreden, waar de import-routine niet van terug heeft. Zie de uitleg in het rood hieronder.', - 'status_fatal_more' => 'Als de fout een time-out is, zal de import-routine halverwege gestopt zijn. Bij bepaalde serverconfiguraties is het alleen maar de server die gestopt terwijl de import-routine op de achtergrond doorloopt. Controleer de logboekbestanden om te zien wat er aan de hand is. Als het probleem zich blijft voordoen, gebruik dan de command-line opdracht.', - 'status_ready_title' => 'De import is klaar om te beginnen', - 'status_ready_text' => 'De import kan beginnen. Alle configuratie is opgeslagen. Download dit bestand. Het kan schelen als je de import opnieuw moet doen. Om daadwerkelijk te beginnen, gebruik je of het commando in je console, of de website. Afhankelijk van hoe je Firefly III hebt ingesteld, geeft de console-methode meer feedback.', - 'status_ready_noconfig_text' => 'De import kan beginnen. Alle configuratie is opgeslagen. Om daadwerkelijk te beginnen, gebruik je of het commando in je console, of de website. Afhankelijk van hoe je Firefly III hebt ingesteld, geeft de console-methode meer feedback.', - 'status_ready_config' => 'Download importconfiguratie', - 'status_ready_start' => 'Start importeren', - 'status_ready_share' => 'Overweeg om je configuratiebestand te downloaden en te delen op de configuratiebestand-wiki. Hiermee kan je het andere Firefly III gebruikers weer makkelijker maken.', - 'status_job_new' => 'De import is gloednieuw.', - 'status_job_configuring' => 'De import wordt geconfigureerd.', - 'status_job_configured' => 'De import is geconfigureerd.', - 'status_job_running' => 'De import is bezig.. Momentje..', - 'status_job_error' => 'De import heeft een fout gegenereerd.', - 'status_job_finished' => 'Het importeren is voltooid!', - 'status_running_title' => 'De import is bezig', - 'status_running_placeholder' => 'Wacht even voor een update...', - 'status_finished_title' => 'Importeren is klaar', - 'status_finished_text' => 'De import is klaar.', - 'status_errors_title' => 'Fouten tijdens het importeren', - 'status_errors_single' => 'Er is een niet-fatale fout opgetreden tijdens het importeren.', - 'status_errors_multi' => 'Er zijn een aantal niet-fatale fouten opgetreden tijdens het importeren.', - 'status_bread_crumb' => 'Status van importeren', - 'status_sub_title' => 'Status van importeren', - 'config_sub_title' => 'Instellen van je import', - 'status_finished_job' => 'De geimporteerde transacties kan je vinden onder tag :tag.', - 'import_with_key' => 'Import met code \':key\'', + 'status_wait_title' => 'Momentje...', + 'status_wait_text' => 'Dit vak verdwijnt zometeen.', + 'status_fatal_title' => 'Er is een fatale fout opgetreden', + 'status_fatal_text' => 'Een fatale fout opgetreden, waar de import-routine niet van terug heeft. Zie de uitleg in het rood hieronder.', + 'status_fatal_more' => 'Als de fout een time-out is, zal de import-routine halverwege gestopt zijn. Bij bepaalde serverconfiguraties is het alleen maar de server die gestopt terwijl de import-routine op de achtergrond doorloopt. Controleer de logboekbestanden om te zien wat er aan de hand is. Als het probleem zich blijft voordoen, gebruik dan de command-line opdracht.', + 'status_ready_title' => 'De import is klaar om te beginnen', + 'status_ready_text' => 'De import kan beginnen. Alle configuratie is opgeslagen. Download dit bestand. Het kan schelen als je de import opnieuw moet doen. Om daadwerkelijk te beginnen, gebruik je of het commando in je console, of de website. Afhankelijk van hoe je Firefly III hebt ingesteld, geeft de console-methode meer feedback.', + 'status_ready_noconfig_text' => 'De import kan beginnen. Alle configuratie is opgeslagen. Om daadwerkelijk te beginnen, gebruik je of het commando in je console, of de website. Afhankelijk van hoe je Firefly III hebt ingesteld, geeft de console-methode meer feedback.', + 'status_ready_config' => 'Download importconfiguratie', + 'status_ready_start' => 'Start importeren', + 'status_ready_share' => 'Overweeg om je configuratiebestand te downloaden en te delen op de configuratiebestand-wiki. Hiermee kan je het andere Firefly III gebruikers weer makkelijker maken.', + 'status_job_new' => 'De import is gloednieuw.', + 'status_job_configuring' => 'De import wordt geconfigureerd.', + 'status_job_configured' => 'De import is geconfigureerd.', + 'status_job_running' => 'De import is bezig.. Momentje..', + 'status_job_error' => 'De import heeft een fout gegenereerd.', + 'status_job_finished' => 'Het importeren is voltooid!', + 'status_running_title' => 'De import is bezig', + 'status_running_placeholder' => 'Wacht even voor een update...', + 'status_finished_title' => 'Importeren is klaar', + 'status_finished_text' => 'De import is klaar.', + 'status_errors_title' => 'Fouten tijdens het importeren', + 'status_errors_single' => 'Er is een niet-fatale fout opgetreden tijdens het importeren.', + 'status_errors_multi' => 'Er zijn een aantal niet-fatale fouten opgetreden tijdens het importeren.', + 'status_bread_crumb' => 'Status van importeren', + 'status_sub_title' => 'Status van importeren', + 'config_sub_title' => 'Instellen van je import', + 'status_finished_job' => 'De :count geïmporteerde transacties kan je vinden onder tag :tag.', + 'status_finished_no_tag' => 'Er is niets uit je bestand geïmporteerd.', + 'import_with_key' => 'Import met code \':key\'', // file, upload something - 'file_upload_title' => 'Importinstellingen (1/4) - Upload je bestand', - 'file_upload_text' => 'Deze pagina\'s helpen je bestanden van je bank te importeren in Firefly III. Gebruik de hulp-pagina\'s linksboven voor meer informatie.', - 'file_upload_fields' => 'Velden', - 'file_upload_help' => 'Selecteer je bestand', - 'file_upload_config_help' => 'Als je eerder gegevens hebt geïmporteerd in Firefly III, heb je wellicht een configuratiebestand, dat een aantal zaken alvast voor je kan instellen. Voor bepaalde banken hebben andere gebruikers uit de liefde van hun hart het benodigde configuratiebestand gedeeld', - 'file_upload_type_help' => 'Selecteer het type bestand dat je zal uploaden', - 'file_upload_submit' => 'Bestanden uploaden', + 'file_upload_title' => 'Importinstellingen (1/4) - Upload je bestand', + 'file_upload_text' => 'Deze pagina\'s helpen je bestanden van je bank te importeren in Firefly III. Gebruik de hulp-pagina\'s linksboven voor meer informatie.', + 'file_upload_fields' => 'Velden', + 'file_upload_help' => 'Selecteer je bestand', + 'file_upload_config_help' => 'Als je eerder gegevens hebt geïmporteerd in Firefly III, heb je wellicht een configuratiebestand, dat een aantal zaken alvast voor je kan instellen. Voor bepaalde banken hebben andere gebruikers uit de liefde van hun hart het benodigde configuratiebestand gedeeld', + 'file_upload_type_help' => 'Selecteer het type bestand dat je zal uploaden', + 'file_upload_submit' => 'Bestanden uploaden', // file, upload types - 'import_file_type_csv' => 'CSV (kommagescheiden waardes)', + 'import_file_type_csv' => 'CSV (kommagescheiden waardes)', // file, initial config for CSV - 'csv_initial_title' => 'Importinstellingen (2/4) - Algemene CVS importinstellingen', - 'csv_initial_text' => 'Om je bestand goed te kunnen importeren moet je deze opties verifiëren.', - 'csv_initial_box' => 'Algemene CVS importinstellingen', - 'csv_initial_box_title' => 'Algemene CVS importinstellingen', - 'csv_initial_header_help' => 'Vink hier als de eerste rij kolomtitels bevat.', - 'csv_initial_date_help' => 'Datum/tijd formaat in jouw CSV bestand. Volg het formaat zoals ze het op deze pagina uitleggen. Het standaardformaat ziet er zo uit: :dateExample.', - 'csv_initial_delimiter_help' => 'Kies het veldscheidingsteken dat in jouw bestand wordt gebruikt. Als je het niet zeker weet, is de komma de beste optie.', - 'csv_initial_import_account_help' => 'Als jouw CSV bestand geen referenties bevat naar jouw rekening(en), geef dan hier aan om welke rekening het gaat.', - 'csv_initial_submit' => 'Ga verder met stap 3/4', + 'csv_initial_title' => 'Importinstellingen (2/4) - Algemene CVS importinstellingen', + 'csv_initial_text' => 'Om je bestand goed te kunnen importeren moet je deze opties verifiëren.', + 'csv_initial_box' => 'Algemene CVS importinstellingen', + 'csv_initial_box_title' => 'Algemene CVS importinstellingen', + 'csv_initial_header_help' => 'Vink hier als de eerste rij kolomtitels bevat.', + 'csv_initial_date_help' => 'Datum/tijd formaat in jouw CSV bestand. Volg het formaat zoals ze het op deze pagina uitleggen. Het standaardformaat ziet er zo uit: :dateExample.', + 'csv_initial_delimiter_help' => 'Kies het veldscheidingsteken dat in jouw bestand wordt gebruikt. Als je het niet zeker weet, is de komma de beste optie.', + 'csv_initial_import_account_help' => 'Als jouw CSV bestand geen referenties bevat naar jouw rekening(en), geef dan hier aan om welke rekening het gaat.', + 'csv_initial_submit' => 'Ga verder met stap 3/4', // file, new options: - 'file_apply_rules_title' => 'Regels toepassen', - 'file_apply_rules_description' => 'Past regels toe tijdens de import. Dit vertraagt de import behoorlijk.', - 'file_match_bills_title' => 'Match contracten', - 'file_match_bills_description' => 'Checkt of bestaande contracten matchen met nieuwe uitgaves. Dit vertraagt de import behoorlijk.', + 'file_apply_rules_title' => 'Regels toepassen', + 'file_apply_rules_description' => 'Past regels toe tijdens de import. Dit vertraagt de import behoorlijk.', + 'file_match_bills_title' => 'Match contracten', + 'file_match_bills_description' => 'Checkt of bestaande contracten matchen met nieuwe uitgaves. Dit vertraagt de import behoorlijk.', // file, roles config - 'csv_roles_title' => 'Importinstellingen (3/4) - rol van elke kolom definiëren', - 'csv_roles_text' => 'Elke kolom in je CSV-bestand bevat bepaalde gegevens. Gelieve aan te geven wat voor soort gegevens de import-routine kan verwachten. De optie "maak een link" betekent dat u elke vermelding in die kolom linkt aan een waarde uit je database. Een vaak gelinkte kolom is die met de IBAN-code van de tegenrekening. Die kan je dan linken aan de IBAN in jouw database.', - 'csv_roles_table' => 'Tabel', - 'csv_roles_column_name' => 'Kolomnaam', - 'csv_roles_column_example' => 'Voorbeeldgegevens', - 'csv_roles_column_role' => 'Kolomrol', - 'csv_roles_do_map_value' => 'Maak een link', - 'csv_roles_column' => 'Kolom', - 'csv_roles_no_example_data' => 'Geen voorbeeldgegevens', - 'csv_roles_submit' => 'Ga verder met stap 4/4', + 'csv_roles_title' => 'Importinstellingen (3/4) - rol van elke kolom definiëren', + 'csv_roles_text' => 'Elke kolom in je CSV-bestand bevat bepaalde gegevens. Gelieve aan te geven wat voor soort gegevens de import-routine kan verwachten. De optie "maak een link" betekent dat u elke vermelding in die kolom linkt aan een waarde uit je database. Een vaak gelinkte kolom is die met de IBAN-code van de tegenrekening. Die kan je dan linken aan de IBAN in jouw database.', + 'csv_roles_table' => 'Tabel', + 'csv_roles_column_name' => 'Kolomnaam', + 'csv_roles_column_example' => 'Voorbeeldgegevens', + 'csv_roles_column_role' => 'Kolomrol', + 'csv_roles_do_map_value' => 'Maak een link', + 'csv_roles_column' => 'Kolom', + 'csv_roles_no_example_data' => 'Geen voorbeeldgegevens', + 'csv_roles_submit' => 'Ga verder met stap 4/4', // 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.', - + '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.', - 'file_map_field_value' => 'Veldwaarde', - 'file_map_field_mapped_to' => 'Gelinkt aan', - 'map_do_not_map' => '(niet linken)', - 'file_map_submit' => 'Start importeren', - 'file_nothing_to_map' => 'Je gaat geen gegevens importeren die te mappen zijn. Klik op "Start import" om verder te gaan.', + 'file_map_title' => 'Importinstellingen (4/4) - Link importgegevens aan Firefly III-gegevens', + 'file_map_text' => 'In deze tabellen is de linkerwaarde een waarde uit je CSV bestand. Jij moet de link leggen, als mogelijk, met een waarde uit jouw database. Firefly houdt zich hier aan. Als er geen waarde is, selecteer dan ook niets.', + 'file_map_field_value' => 'Veldwaarde', + 'file_map_field_mapped_to' => 'Gelinkt aan', + 'map_do_not_map' => '(niet linken)', + 'file_map_submit' => 'Start importeren', + 'file_nothing_to_map' => 'Je gaat geen gegevens importeren die te mappen zijn. Klik op "Start import" om verder te gaan.', // map things. - 'column__ignore' => '(negeer deze kolom)', - 'column_account-iban' => 'Betaalrekening (IBAN)', - 'column_account-id' => 'Betaalrekening (ID gelijk aan Firefly)', - 'column_account-name' => 'Betaalrekeningnaam', - 'column_amount' => 'Bedrag', - 'column_amount_debit' => 'Bedrag (debetkolom)', - 'column_amount_credit' => 'Bedrag (creditkolom)', - 'column_amount-comma-separated' => 'Bedrag (komma as decimaalscheidingsteken)', - 'column_bill-id' => 'Contract (ID gelijk aan Firefly)', - 'column_bill-name' => 'Contractnaam', - 'column_budget-id' => 'Budget (ID gelijk aan Firefly)', - 'column_budget-name' => 'Budgetnaam', - 'column_category-id' => 'Categorie (ID gelijk aan Firefly)', - 'column_category-name' => 'Categorienaam', - 'column_currency-code' => 'Valutacode (ISO 4217)', - 'column_currency-id' => 'Valuta (ID gelijk aan Firefly)', - 'column_currency-name' => 'Valutanaam', - 'column_currency-symbol' => 'Valutasymbool', - 'column_date-interest' => 'Datum (renteberekening)', - 'column_date-book' => 'Datum (boeking)', - 'column_date-process' => 'Datum (verwerking)', - 'column_date-transaction' => 'Datum', - 'column_description' => 'Omschrijving', - 'column_opposing-iban' => 'Tegenrekening (IBAN)', - 'column_opposing-id' => 'Tegenrekening (ID gelijk aan Firefly)', - '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_tags-comma' => 'Tags (kommagescheiden)', - 'column_tags-space' => 'Tags (spatiegescheiden)', - 'column_account-number' => 'Betaalrekening (rekeningnummer)', - 'column_opposing-number' => 'Tegenrekening (rekeningnummer)', - 'column_note' => 'Opmerking(en)', + 'column__ignore' => '(negeer deze kolom)', + 'column_account-iban' => 'Betaalrekening (IBAN)', + 'column_account-id' => 'Betaalrekening (ID gelijk aan FF3)', + 'column_account-name' => 'Betaalrekeningnaam', + 'column_amount' => 'Bedrag', + 'column_amount_foreign' => 'Bedrag (in vreemde valuta)', + 'column_amount_debit' => 'Bedrag (debetkolom)', + 'column_amount_credit' => 'Bedrag (creditkolom)', + 'column_amount-comma-separated' => 'Bedrag (komma as decimaalscheidingsteken)', + 'column_bill-id' => 'Contract (ID gelijk aan FF3)', + 'column_bill-name' => 'Contractnaam', + 'column_budget-id' => 'Budget (ID gelijk aan FF3)', + 'column_budget-name' => 'Budgetnaam', + 'column_category-id' => 'Categorie (ID gelijk aan FF3)', + 'column_category-name' => 'Categorienaam', + 'column_currency-code' => 'Valutacode (ISO 4217)', + 'column_foreign-currency-code' => 'Vreemde valutacode (ISO 4217)', + 'column_currency-id' => 'Valuta (ID gelijk aan FF3)', + 'column_currency-name' => 'Valutanaam (gelijk aan FF3)', + 'column_currency-symbol' => 'Valutasymbool', + 'column_date-interest' => 'Datum (renteberekening)', + 'column_date-book' => 'Datum (boeking)', + 'column_date-process' => 'Datum (verwerking)', + 'column_date-transaction' => 'Datum', + 'column_description' => 'Omschrijving', + 'column_opposing-iban' => 'Tegenrekening (IBAN)', + '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_tags-comma' => 'Tags (kommagescheiden)', + 'column_tags-space' => 'Tags (spatiegescheiden)', + 'column_account-number' => 'Betaalrekening (rekeningnummer)', + 'column_opposing-number' => 'Tegenrekening (rekeningnummer)', + 'column_note' => 'Opmerking(en)', // prerequisites - 'prerequisites' => 'Vereisten', + '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_title' => 'Voorwaarden voor een import van bunq', + 'bunq_prerequisites_text' => 'Om transacties bij bunq te importeren heb je een API sleutel nodig. Dit kan via de app.', // Spectre - 'spectre_title' => 'Importeer via Spectre', - 'spectre_prerequisites_title' => 'Voorwaarden voor een import via Spectre', - 'spectre_prerequisites_text' => 'Als je gegevens wilt importeren via de Spectre API, moet je een aantal geheime codes bezitten. Ze zijn te vinden op de secrets pagina.', - 'spectre_enter_pub_key' => 'Het importeren werkt alleen als je deze publieke sleutel op uw security pagina invoert.', + 'spectre_title' => 'Importeer via Spectre', + 'spectre_prerequisites_title' => 'Voorwaarden voor een import via Spectre', + 'spectre_prerequisites_text' => 'Als je gegevens wilt importeren via de Spectre API, moet je een aantal geheime codes bezitten. Ze zijn te vinden op de secrets pagina.', + 'spectre_enter_pub_key' => 'Het importeren werkt alleen als je deze publieke sleutel op uw security pagina invoert.', + 'spectre_accounts_title' => 'Selecteer de accounts waaruit je wilt importeren', + 'spectre_accounts_text' => 'Links staan de rekeningen die zijn gevonden door Spectre. Ze kunnen worden geïmporteerd in Firefly III. Selecteer er de juiste betaalrekening bij. Verwijder het vinkje als je toch niet van een bepaalde rekening wilt importeren.', + 'spectre_do_import' => 'Ja, importeer van deze rekening', + + // keys from "extra" array: + 'spectre_extra_key_iban' => 'IBAN', + 'spectre_extra_key_swift' => 'SWIFT', + 'spectre_extra_key_status' => 'Status', + 'spectre_extra_key_card_type' => 'Kaarttype', + 'spectre_extra_key_account_name' => 'Rekeningnaam', + 'spectre_extra_key_client_name' => 'Klantnaam', + 'spectre_extra_key_account_number' => 'Rekeningnummer', + 'spectre_extra_key_blocked_amount' => 'Gereserveerd bedrag', + 'spectre_extra_key_available_amount' => 'Beschikbaar bedrag', + 'spectre_extra_key_credit_limit' => 'Kredietlimiet', + 'spectre_extra_key_interest_rate' => 'Rente', + 'spectre_extra_key_expiry_date' => 'Vervaldatum', + 'spectre_extra_key_open_date' => 'Openingsdatum', + 'spectre_extra_key_current_time' => 'Huidige tijd', + 'spectre_extra_key_current_date' => 'Huidige datum', + 'spectre_extra_key_cards' => 'Kaarten', + 'spectre_extra_key_units' => 'Eenheden', + 'spectre_extra_key_unit_price' => 'Prijs per eenheid', + 'spectre_extra_key_transactions_count' => 'Transacties', + + // 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 e51c843e37..641c02c212 100644 --- a/resources/lang/nl_NL/intro.php +++ b/resources/lang/nl_NL/intro.php @@ -31,13 +31,13 @@ return [ // create account: 'accounts_create_iban' => 'Geef je rekeningen een geldige IBAN. Dat scheelt met importeren van data.', - 'accounts_create_asset_opening_balance' => 'Betaalrekeningen kunnen een startsaldo hebben, waarmee het begin van deze rekening in Firefly wordt aangegeven.', + 'accounts_create_asset_opening_balance' => 'Betaalrekeningen kunnen een startsaldo hebben, waarmee het begin van deze rekening in Firefly III wordt aangegeven.', 'accounts_create_asset_currency' => 'Firefly III ondersteunt meerdere valuta. Hier stel je de valuta in van je betaalrekening.', 'accounts_create_asset_virtual' => 'Soms is het handig om je betaalrekening een virtueel saldo te geven: een extra bedrag dat altijd bij het daadwerkelijke saldo wordt opgeteld.', // budgets index 'budgets_index_intro' => 'Budgetten worden gebruikt om je financiën te beheren en vormen een van de kernfuncties van Firefly III.', - 'budgets_index_set_budget' => 'Stel je totale budget voor elke periode in, zodat Firefly je kan vertellen of je alle beschikbare geld hebt gebudgetteerd.', + 'budgets_index_set_budget' => 'Stel je totale budget voor elke periode in, zodat Firefly III je kan vertellen of je alle beschikbare geld hebt gebudgetteerd.', 'budgets_index_see_expenses_bar' => 'Het besteden van geld zal deze balk langzaam vullen.', 'budgets_index_navigate_periods' => 'Navigeer door periodes heen om je budget vooraf te bepalen.', 'budgets_index_new_budget' => 'Maak nieuwe budgetten naar wens.', diff --git a/resources/lang/nl_NL/list.php b/resources/lang/nl_NL/list.php index d3e08435cb..32cd02e734 100644 --- a/resources/lang/nl_NL/list.php +++ b/resources/lang/nl_NL/list.php @@ -100,4 +100,6 @@ return [ 'sum_deposits' => 'Som van inkomsten', 'sum_transfers' => 'Som van overschrijvingen', 'reconcile' => 'Afstemmen', + 'account_on_spectre' => 'Rekening (Spectre)', + 'do_import' => 'Importeer van deze rekening', ]; diff --git a/resources/lang/nl_NL/validation.php b/resources/lang/nl_NL/validation.php index f33540d621..f738002932 100644 --- a/resources/lang/nl_NL/validation.php +++ b/resources/lang/nl_NL/validation.php @@ -99,4 +99,38 @@ return [ 'present' => 'Het :attribute veld moet aanwezig zijn.', 'amount_zero' => 'Het totaalbedrag kan niet nul zijn', 'secure_password' => 'Dit is geen sterk wachtwoord. Probeer het nog een keer. Zie ook: https://goo.gl/NCh2tN', + 'attributes' => [ + 'email' => 'e-mailadres', + 'description' => 'omschrijving', + 'amount' => 'bedrag', + 'name' => 'naam', + 'targetamount' => 'doelbedrag', + 'openingBalanceDate' => 'startsaldodatum', + 'openingBalance' => 'startsaldo', + 'match' => 'overeenkomst', + 'amount_min' => 'minimumbedrag', + 'amount_max' => 'maximumbedrag', + 'title' => 'titel', + 'tag' => 'tag', + 'rule-action-value.1' => 'actiewaarde #1', + 'rule-action-value.2' => 'actiewaarde #2', + 'rule-action-value.3' => 'actiewaarde #3', + 'rule-action-value.4' => 'actiewaarde #4', + 'rule-action-value.5' => 'actiewaarde #5', + 'rule-action.1' => 'regelactie #1', + 'rule-action.2' => 'regelactie #2', + 'rule-action.3' => 'regelactie #3', + 'rule-action.4' => 'regelactie #4', + 'rule-action.5' => 'regelactie #5', + 'rule-trigger-value.1' => 'triggerwaarde #1', + 'rule-trigger-value.2' => 'triggerwaarde #2', + 'rule-trigger-value.3' => 'triggerwaarde #3', + 'rule-trigger-value.4' => 'triggerwaarde #4', + 'rule-trigger-value.5' => 'triggerwaarde #5', + 'rule-trigger.1' => 'regeltrigger #1', + 'rule-trigger.2' => 'regeltrigger #2', + 'rule-trigger.3' => 'regeltrigger #3', + 'rule-trigger.4' => 'regeltrigger #4', + 'rule-trigger.5' => 'regeltrigger #5', + ], ]; diff --git a/resources/lang/pl_PL/config.php b/resources/lang/pl_PL/config.php index aaf451e1ca..6df562fa42 100644 --- a/resources/lang/pl_PL/config.php +++ b/resources/lang/pl_PL/config.php @@ -21,6 +21,7 @@ declare(strict_types=1); return [ + 'html_language' => 'pl', 'locale' => 'pl, Polish, polski, pl_PL, pl_PL.utf8, pl_PL.UTF-8', 'month' => '%B %Y', 'month_and_day' => '%e %B %Y', diff --git a/resources/lang/pl_PL/demo.php b/resources/lang/pl_PL/demo.php index 94833ad8f1..c1f584ec26 100644 --- a/resources/lang/pl_PL/demo.php +++ b/resources/lang/pl_PL/demo.php @@ -32,6 +32,4 @@ return [ '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', - 'import-configure-security' => 'Ze względów bezpieczeństwa przesyłanie zostało zastąpione lokalnym plikiem.', - 'import-configure-configuration' => 'Konfiguracja, która widzisz poniżej jest prawidłowa dla lokalnego pliku.', ]; diff --git a/resources/lang/pl_PL/firefly.php b/resources/lang/pl_PL/firefly.php index d0c8af3cda..06066d366a 100644 --- a/resources/lang/pl_PL/firefly.php +++ b/resources/lang/pl_PL/firefly.php @@ -44,8 +44,17 @@ return [ 'Opening balance' => 'Bilans otwarcia', 'create_new_stuff' => 'Utwórz nowe rzeczy', 'new_withdrawal' => 'Nowa wypłata', + 'create_new_transaction' => 'Stwórz nową transakcję', + 'go_to_asset_accounts' => 'Zobacz swoje konta aktywów', + 'go_to_budgets' => 'Przejdź do swoich budżetów', + 'go_to_categories' => 'Przejdź do swoich kategorii', + 'go_to_bills' => 'Przejdź do swoich rachunków', + 'go_to_expense_accounts' => 'Zobacz swoje konta wydatków', + 'go_to_revenue_accounts' => 'Zobacz swoje konta przychodów', + 'go_to_piggies' => 'Przejdź do swoich skarbonek', 'new_deposit' => 'Nowa wpłata', 'new_transfer' => 'Nowy transfer', + 'new_transfers' => 'Nowy transfer', 'new_asset_account' => 'Nowe konto aktywów', 'new_expense_account' => 'Nowe konto wydatków', 'new_revenue_account' => 'Nowe konto przychodów', @@ -60,6 +69,9 @@ return [ 'flash_error_multiple' => 'Jest jeden błąd|Jest :count błędów', 'net_worth' => 'Wartość netto', 'route_has_no_help' => 'Brak pomocy dla tej strony.', + 'help_for_this_page' => 'Pomoc dla tej strony', + 'no_help_could_be_found' => 'Nie znaleziono tekstu pomocy.', + 'no_help_title' => 'Przepraszamy, wystąpił błąd.', 'two_factor_welcome' => 'Witaj, :user!', 'two_factor_enter_code' => 'Aby kontynuować, wprowadź kod uwierzytelniania dwuskładnikowego. Twoja aplikacja może wygenerować go dla Ciebie.', 'two_factor_code_here' => 'Wprowadź tutaj kod', @@ -108,8 +120,14 @@ return [ 'clone_deposit' => 'Zduplikuj tą wpłatę', 'clone_transfer' => 'Zduplikuj ten transfer', 'multi_select_no_selection' => 'Nie wybrano', + 'multi_select_select_all' => 'Zaznacz wszystkie', + 'multi_select_n_selected' => 'wybrane', 'multi_select_all_selected' => 'Wybrano wszystko', 'multi_select_filter_placeholder' => 'Znajdź...', + 'intro_next_label' => 'Dalej', + 'intro_prev_label' => 'Wstecz', + 'intro_skip_label' => 'Pomiń', + 'intro_done_label' => 'Gotowe', 'between_dates_breadcrumb' => 'Pomiędzy :start a :end', 'all_journals_without_budget' => 'Wszystkie transakcje bez budżetu', 'journals_without_budget' => 'Transakcje bez budżetu', @@ -163,7 +181,7 @@ return [ 'admin_update_check_now_title' => 'Sprawdź dostępność aktualizacji', 'admin_update_check_now_explain' => 'Jeśli naciśniesz przycisk, Firefly III sprawdzi, czy używasz najnowszej wersji.', 'check_for_updates_button' => 'Sprawdź teraz!', - 'update_new_version_alert' => 'Dostępna jest nowa wersja. Używasz wersji :your_version, najnowsza wersja to :new_version wydana :date.', + 'update_new_version_alert' => 'Dostępna jest nowa wersja Firefly III. Używasz wersji :your_version, najnowsza wersja to :new_version wydana :date.', 'update_current_version_alert' => 'Używasz wersji :version, która jest najnowszą dostępną wersją.', 'update_newer_version_alert' => 'Używasz wersji :your_version, która jest nowsza niż najnowsza wersja, :new_version.', 'update_check_error' => 'Wystąpił błąd podczas sprawdzania aktualizacji. Przejrzyj pliki dziennika.', @@ -193,8 +211,8 @@ return [ // export data: 'import_and_export' => 'Import / eksport', 'export_data' => 'Eksportuj dane', - 'export_and_backup_data' => 'Eksport i kopia zapasowa', - 'export_data_intro' => 'Do celów tworzenia kopii zapasowych, migracji do innego systemu lub migracji do innej instalacji Firefly III.', + 'export_and_backup_data' => 'Eksportuj dane', + 'export_data_intro' => 'Użyj wyeksportowanych danych, aby przejść do nowej aplikacji finansowej. Należy pamiętać, że te pliki są kopią zapasową. Nie zawierają one wystarczającej ilości metadanych, aby w pełni przywrócić nową instalację Firefly III. Jeśli chcesz wykonać kopię zapasową danych, wykonaj bezpośrednio kopię bazy danych.', 'export_format' => 'Format eksportu', 'export_format_csv' => 'Wartości oddzielone przecinkami (plik CSV)', 'export_format_mt940' => 'Format kompatybilny z MT940', @@ -600,8 +618,8 @@ return [ 'between_amounts' => 'między :low i :high.', 'repeats' => 'Powtarza się', 'connected_journals' => 'Powiązane transakcje', - 'auto_match_on' => 'Automatycznie dopasowane przez Firefly', - 'auto_match_off' => 'Niedopasowane automatycznie przez Firefly', + '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"', @@ -761,7 +779,7 @@ return [ 'notes' => 'Notatki', // new user: - 'welcome' => 'Witaj w Firefly!', + '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.', diff --git a/resources/lang/pl_PL/import.php b/resources/lang/pl_PL/import.php index 80be762ce6..261ec8417d 100644 --- a/resources/lang/pl_PL/import.php +++ b/resources/lang/pl_PL/import.php @@ -22,138 +22,169 @@ declare(strict_types=1); return [ // status of import: - 'status_wait_title' => 'Proszę czekać...', - 'status_wait_text' => 'To pole za chwilę zniknie.', - 'status_fatal_title' => 'Wystąpił błąd krytyczny', - 'status_fatal_text' => 'Wystąpił błąd krytyczny, którego procedura importu nie może naprawić. Zobacz wyjaśnienie na czerwono poniżej.', - 'status_fatal_more' => 'Jeśli przekroczono limit czasu, import zostanie zatrzymany w połowie. W przypadku niektórych konfiguracji serwerów, jedynie serwer przestał odpowiadać podczas gdy importowanie nadal działa w tle. Aby to zweryfikować, należy sprawdzić pliki dziennika. Jeśli problem będzie się powtarzał, należy rozważyć Importowanie poprzez konsolę.', - 'status_ready_title' => 'Import jest gotowy do uruchomienia', - 'status_ready_text' => 'Import jest gotowy do uruchomienia. Cała konfiguracja, którą musisz wykonać, została wykonana. Proszę pobierz plik konfiguracyjny. Pomoże Ci w imporcie, jeśli nie pójdzie zgodnie z planem. Aby faktycznie uruchomić import, możesz wykonać następujące polecenie w konsoli lub uruchomić importowanie przez przeglądarkę www. W zależności od konfiguracji import przez konsolę daje więcej informacji zwrotnych.', - 'status_ready_noconfig_text' => 'Import jest gotowy do uruchomienia. Cała konfiguracja, którą musisz wykonać, została wykonana. Aby faktycznie uruchomić import, możesz wykonać następujące polecenie w konsoli lub uruchomić importowanie przez przeglądarkę www. W zależności od konfiguracji import przez konsolę daje więcej informacji zwrotnych.', - 'status_ready_config' => 'Pobierz konfigurację', - 'status_ready_start' => 'Rozpocznij Importowanie', - 'status_ready_share' => 'Rozważ pobranie konfiguracji i udostępnienie jej w centrum konfiguracyjnym portali. Umożliwi to innym użytkownikom Firefly III łatwiejsze importowanie plików.', - 'status_job_new' => 'Zadanie jest zupełnie nowe.', - 'status_job_configuring' => 'Import jest konfigurowany.', - 'status_job_configured' => 'Import jest skonfigurowany.', - 'status_job_running' => 'Import w toku... Proszę czekać..', - 'status_job_error' => 'Zadanie wygenerowało błąd.', - 'status_job_finished' => 'Importowanie zostało zakończone!', - 'status_running_title' => 'Trwa importowanie', - 'status_running_placeholder' => 'Proszę czekać na aktualizację...', - 'status_finished_title' => 'Zakończono procedurę importu', - 'status_finished_text' => 'Twoje dane zostały zaimportowane.', - 'status_errors_title' => 'Błędy podczas importowania', - 'status_errors_single' => 'Wystąpił błąd podczas importowania. Nie wydaje się być krytyczny.', - 'status_errors_multi' => 'Wystąpiły błędy podczas importowania. Nie wydają się być krytyczne.', - 'status_bread_crumb' => 'Status importu', - 'status_sub_title' => 'Status importu', - 'config_sub_title' => 'Skonfiguruj import', - 'status_finished_job' => 'Zaimportowane transakcje można znaleźć w tagu :tag.', - 'import_with_key' => 'Import z kluczem \':key\'', + 'status_wait_title' => 'Proszę czekać...', + 'status_wait_text' => 'To pole za chwilę zniknie.', + 'status_fatal_title' => 'Wystąpił błąd krytyczny', + 'status_fatal_text' => 'Wystąpił błąd krytyczny, którego procedura importu nie może naprawić. Zobacz wyjaśnienie na czerwono poniżej.', + 'status_fatal_more' => 'Jeśli przekroczono limit czasu, import zostanie zatrzymany w połowie. W przypadku niektórych konfiguracji serwerów, jedynie serwer przestał odpowiadać podczas gdy importowanie nadal działa w tle. Aby to zweryfikować, należy sprawdzić pliki dziennika. Jeśli problem będzie się powtarzał, należy rozważyć Importowanie poprzez konsolę.', + 'status_ready_title' => 'Import jest gotowy do uruchomienia', + 'status_ready_text' => 'Import jest gotowy do uruchomienia. Cała konfiguracja, którą musisz wykonać, została wykonana. Proszę pobierz plik konfiguracyjny. Pomoże Ci w imporcie, jeśli nie pójdzie zgodnie z planem. Aby faktycznie uruchomić import, możesz wykonać następujące polecenie w konsoli lub uruchomić importowanie przez przeglądarkę www. W zależności od konfiguracji import przez konsolę daje więcej informacji zwrotnych.', + 'status_ready_noconfig_text' => 'Import jest gotowy do uruchomienia. Cała konfiguracja, którą musisz wykonać, została wykonana. Aby faktycznie uruchomić import, możesz wykonać następujące polecenie w konsoli lub uruchomić importowanie przez przeglądarkę www. W zależności od konfiguracji import przez konsolę daje więcej informacji zwrotnych.', + 'status_ready_config' => 'Pobierz konfigurację', + 'status_ready_start' => 'Rozpocznij Importowanie', + 'status_ready_share' => 'Rozważ pobranie konfiguracji i udostępnienie jej w centrum konfiguracyjnym portali. Umożliwi to innym użytkownikom Firefly III łatwiejsze importowanie plików.', + 'status_job_new' => 'Zadanie jest zupełnie nowe.', + 'status_job_configuring' => 'Import jest konfigurowany.', + 'status_job_configured' => 'Import jest skonfigurowany.', + 'status_job_running' => 'Import w toku... Proszę czekać..', + 'status_job_error' => 'Zadanie wygenerowało błąd.', + 'status_job_finished' => 'Importowanie zostało zakończone!', + 'status_running_title' => 'Trwa importowanie', + 'status_running_placeholder' => 'Proszę czekać na aktualizację...', + 'status_finished_title' => 'Zakończono procedurę importu', + 'status_finished_text' => 'Twoje dane zostały zaimportowane.', + 'status_errors_title' => 'Błędy podczas importowania', + 'status_errors_single' => 'Wystąpił błąd podczas importowania. Nie wydaje się być krytyczny.', + 'status_errors_multi' => 'Wystąpiły błędy podczas importowania. Nie wydają się być krytyczne.', + 'status_bread_crumb' => 'Status importu', + 'status_sub_title' => 'Status importu', + 'config_sub_title' => 'Skonfiguruj import', + 'status_finished_job' => 'Zaimportowane transakcje (:count) znajdują się w tagu :tag.', + 'status_finished_no_tag' => 'Firefly III nie zaimportował żadnych wpisów z twojego pliku.', + 'import_with_key' => 'Import z kluczem \':key\'', // file, upload something - 'file_upload_title' => 'Konfiguracja importu (1/4) - Prześlij swój plik', - 'file_upload_text' => 'Ta procedura pomoże Ci importować pliki z twojego banku do Firefly III. Sprawdź stronę pomocy w prawym górnym rogu.', - 'file_upload_fields' => 'Pola', - 'file_upload_help' => 'Wybierz swój plik', - 'file_upload_config_help' => 'Jeśli wcześniej importowałeś dane do Firefly III, możesz posiadać plik konfiguracji, który wstępnie ustawi wartości parametrów konfiguracyjnych za Ciebie. Dla niektórych banków, inni użytkownicy uprzejmie dostarczyli swoje pliki konfiguracji', - 'file_upload_type_help' => 'Wybierz typ pliku, który będziesz przesyłać', - 'file_upload_submit' => 'Prześlij pliki', + 'file_upload_title' => 'Konfiguracja importu (1/4) - Prześlij swój plik', + 'file_upload_text' => 'Ta procedura pomoże Ci importować pliki z twojego banku do Firefly III. Sprawdź stronę pomocy w prawym górnym rogu.', + 'file_upload_fields' => 'Pola', + 'file_upload_help' => 'Wybierz swój plik', + 'file_upload_config_help' => 'Jeśli wcześniej importowałeś dane do Firefly III, możesz posiadać plik konfiguracji, który wstępnie ustawi wartości parametrów konfiguracyjnych za Ciebie. Dla niektórych banków, inni użytkownicy uprzejmie dostarczyli swoje pliki konfiguracji', + 'file_upload_type_help' => 'Wybierz typ pliku, który będziesz przesyłać', + 'file_upload_submit' => 'Prześlij pliki', // file, upload types - 'import_file_type_csv' => 'CSV (wartości oddzielone przecinkami)', + 'import_file_type_csv' => 'CSV (wartości oddzielone przecinkami)', // file, initial config for CSV - 'csv_initial_title' => 'Konfiguracja importu (2/4) - Podstawowa konfiguracja importu CSV', - 'csv_initial_text' => 'Aby móc poprawnie zaimportować plik, sprawdź poprawność poniższych opcji.', - 'csv_initial_box' => 'Podstawowa konfiguracja importu CSV', - 'csv_initial_box_title' => 'Podstawowe opcje konfiguracji importu CSV', - 'csv_initial_header_help' => 'Zaznacz to pole, jeśli pierwszy wiersz w pliku CSV to nazwy kolumn.', - 'csv_initial_date_help' => 'Format daty i czasu w pliku CSV. Format powinien być zgodny z opisem na tej stronie. Wartość domyślna będzie analizować daty, które wyglądają następująco: :dateExample.', - 'csv_initial_delimiter_help' => 'Wybierz separator pola, który jest używany w pliku wejściowym. Jeśli nie jesteś pewien, przecinek jest najbezpieczniejszym rozwiązaniem.', - 'csv_initial_import_account_help' => 'Jeśli Twój plik CSV NIE zawiera informacji o Twoich kontach aktywów, użyj tego menu, aby wybrać, do którego konta należą transakcje w pliku CSV.', - 'csv_initial_submit' => 'Przejdź do kroku 3/4', + 'csv_initial_title' => 'Konfiguracja importu (2/4) - Podstawowa konfiguracja importu CSV', + 'csv_initial_text' => 'Aby móc poprawnie zaimportować plik, sprawdź poprawność poniższych opcji.', + 'csv_initial_box' => 'Podstawowa konfiguracja importu CSV', + 'csv_initial_box_title' => 'Podstawowe opcje konfiguracji importu CSV', + 'csv_initial_header_help' => 'Zaznacz to pole, jeśli pierwszy wiersz w pliku CSV to nazwy kolumn.', + 'csv_initial_date_help' => 'Format daty i czasu w pliku CSV. Format powinien być zgodny z opisem na tej stronie. Wartość domyślna będzie analizować daty, które wyglądają następująco: :dateExample.', + 'csv_initial_delimiter_help' => 'Wybierz separator pola, który jest używany w pliku wejściowym. Jeśli nie jesteś pewien, przecinek jest najbezpieczniejszym rozwiązaniem.', + 'csv_initial_import_account_help' => 'Jeśli Twój plik CSV NIE zawiera informacji o Twoich kontach aktywów, użyj tego menu, aby wybrać, do którego konta należą transakcje w pliku CSV.', + 'csv_initial_submit' => 'Przejdź do kroku 3/4', // file, new options: - 'file_apply_rules_title' => 'Zastosuj reguły', - 'file_apply_rules_description' => 'Zastosuj swoje reguły. Zwróć uwagę, że to znacznie spowalnia importowanie.', - 'file_match_bills_title' => 'Dopasuj rachunki', - 'file_match_bills_description' => 'Dopasuj swoje rachunki do nowo utworzonych wypłat. Zwróć uwagę, że to znacznie spowalnia importowanie.', + 'file_apply_rules_title' => 'Zastosuj reguły', + 'file_apply_rules_description' => 'Zastosuj swoje reguły. Zwróć uwagę, że to znacznie spowalnia importowanie.', + 'file_match_bills_title' => 'Dopasuj rachunki', + 'file_match_bills_description' => 'Dopasuj swoje rachunki do nowo utworzonych wypłat. Zwróć uwagę, że to znacznie spowalnia importowanie.', // file, roles config - 'csv_roles_title' => 'Konfiguracja importu (3/4) - Zdefiniuj rolę każdej kolumny', - 'csv_roles_text' => 'Każda kolumna w pliku CSV zawiera określone dane. Proszę wskazać, jakiego rodzaju danych importer powinien oczekiwać. Opcja "mapowania" danych oznacza, że każdy wpis znaleziony w kolumnie zostanie połączony z wartością w bazie danych. Często odwzorowywana kolumna to kolumna zawierająca numer IBAN konta przeciwnego. Można go łatwo dopasować do obecnego numeru IBAN w bazie danych.', - 'csv_roles_table' => 'Tabela', - 'csv_roles_column_name' => 'Nazwa kolumny', - 'csv_roles_column_example' => 'Przykładowe dane kolumny', - 'csv_roles_column_role' => 'Znaczenie danych w kolumnie', - 'csv_roles_do_map_value' => 'Zmapuj te wartości', - 'csv_roles_column' => 'Kolumna', - 'csv_roles_no_example_data' => 'Brak przykładowych danych', - 'csv_roles_submit' => 'Przejdź do kroku 4/4', + 'csv_roles_title' => 'Konfiguracja importu (3/4) - Zdefiniuj rolę każdej kolumny', + 'csv_roles_text' => 'Każda kolumna w pliku CSV zawiera określone dane. Proszę wskazać, jakiego rodzaju danych importer powinien oczekiwać. Opcja "mapowania" danych oznacza, że każdy wpis znaleziony w kolumnie zostanie połączony z wartością w bazie danych. Często odwzorowywana kolumna to kolumna zawierająca numer IBAN konta przeciwnego. Można go łatwo dopasować do obecnego numeru IBAN w bazie danych.', + 'csv_roles_table' => 'Tabela', + 'csv_roles_column_name' => 'Nazwa kolumny', + 'csv_roles_column_example' => 'Przykładowe dane kolumny', + 'csv_roles_column_role' => 'Znaczenie danych w kolumnie', + 'csv_roles_do_map_value' => 'Zmapuj te wartości', + 'csv_roles_column' => 'Kolumna', + 'csv_roles_no_example_data' => 'Brak przykładowych danych', + 'csv_roles_submit' => 'Przejdź do kroku 4/4', // 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.', - + '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.', - 'file_map_field_value' => 'Wartość pola', - 'file_map_field_mapped_to' => 'Zmapowane do', - 'map_do_not_map' => '(nie mapuj)', - 'file_map_submit' => 'Rozpocznij import', - 'file_nothing_to_map' => 'W twoim pliku nie ma danych, które można by odwzorować na istniejące wartości. Naciśnij "Rozpocznij import", aby kontynuować.', + 'file_map_title' => 'Ustawienia importu (4/4) - Połącz dane importu z danymi Firefly III', + 'file_map_text' => 'W poniższych tabelach lewa wartość pokazuje informacje znalezione w przesłanym pliku. Twoim zadaniem jest zamapowanie tej wartości, jeśli to możliwe, na wartość już obecną w bazie danych. Firefly będzie trzymać się tego mapowania. Jeśli nie ma wartości do odwzorowania lub nie chcesz mapować określonej wartości, nie wybieraj niczego.', + 'file_map_field_value' => 'Wartość pola', + 'file_map_field_mapped_to' => 'Zmapowane do', + 'map_do_not_map' => '(nie mapuj)', + 'file_map_submit' => 'Rozpocznij import', + 'file_nothing_to_map' => 'W twoim pliku nie ma danych, które można by odwzorować na istniejące wartości. Naciśnij "Rozpocznij import", aby kontynuować.', // map things. - 'column__ignore' => '(zignoruj tę kolumnę)', - 'column_account-iban' => 'Konto aktywów (IBAN)', - 'column_account-id' => 'ID konta aktywów (taki sam jak w Firefly)', - 'column_account-name' => 'Konto aktywów (nazwa)', - 'column_amount' => 'Kwota', - 'column_amount_debit' => 'Kwota (kolumna debetowa)', - 'column_amount_credit' => 'Kwota (kolumna kredytowa)', - 'column_amount-comma-separated' => 'Kwota (przecinek jako separator dziesiętny)', - 'column_bill-id' => 'ID rachunku (taki sam jak w Firefly)', - 'column_bill-name' => 'Nazwa rachunku', - 'column_budget-id' => 'ID budżetu (taki sam jak w Firefly)', - 'column_budget-name' => 'Nazwa budżetu', - 'column_category-id' => 'ID kategorii (taki sam jak w Firefly)', - 'column_category-name' => 'Nazwa kategorii', - 'column_currency-code' => 'Kod waluty (ISO 4217)', - 'column_currency-id' => 'ID waluty (taki sam jak w Firefly)', - 'column_currency-name' => 'Nazwa waluty (taka sama jak w Firefly)', - 'column_currency-symbol' => 'Symbol waluty (taki sam jak w Firefly)', - 'column_date-interest' => 'Data obliczenia odsetek', - 'column_date-book' => 'Data księgowania transakcji', - 'column_date-process' => 'Data przetworzenia transakcji', - 'column_date-transaction' => 'Data', - 'column_description' => 'Opis', - 'column_opposing-iban' => 'Przeciwstawne konto (IBAN)', - 'column_opposing-id' => 'ID przeciwstawnego konta (takie same jak w Firefly)', - '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_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__ignore' => '(zignoruj tę kolumnę)', + 'column_account-iban' => 'Konto aktywów (IBAN)', + 'column_account-id' => 'ID konta aktywów (z bazy FF3)', + 'column_account-name' => 'Konto aktywów (nazwa)', + 'column_amount' => 'Kwota', + 'column_amount_foreign' => 'Kwota (w obcej walucie)', + 'column_amount_debit' => 'Kwota (kolumna debetowa)', + 'column_amount_credit' => 'Kwota (kolumna kredytowa)', + 'column_amount-comma-separated' => 'Kwota (przecinek jako separator dziesiętny)', + 'column_bill-id' => 'ID rachunku (z bazy FF3)', + 'column_bill-name' => 'Nazwa rachunku', + 'column_budget-id' => 'ID budżetu (z bazy FF3)', + 'column_budget-name' => 'Nazwa budżetu', + 'column_category-id' => 'ID kategorii (z bazy FF3)', + 'column_category-name' => 'Nazwa kategorii', + 'column_currency-code' => 'Kod waluty (ISO 4217)', + 'column_foreign-currency-code' => 'Kod obcej waluty (ISO 4217)', + 'column_currency-id' => 'ID waluty (z bazy FF3)', + 'column_currency-name' => 'Nazwa waluty (z bazy FF3)', + 'column_currency-symbol' => 'Symbol waluty (z bazy FF3)', + 'column_date-interest' => 'Data obliczenia odsetek', + 'column_date-book' => 'Data księgowania transakcji', + 'column_date-process' => 'Data przetworzenia transakcji', + 'column_date-transaction' => 'Data', + 'column_description' => 'Opis', + 'column_opposing-iban' => 'Przeciwstawne konto (IBAN)', + '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_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', // prerequisites - 'prerequisites' => 'Wymagania', + '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_title' => 'Wymagania wstępne dla importu z bunq', + 'bunq_prerequisites_text' => 'Aby zaimportować z bunq, musisz uzyskać klucz API. Możesz to zrobić za pomocą aplikacji.', // Spectre - 'spectre_title' => 'Importuj za pomocą Spectre', - 'spectre_prerequisites_title' => 'Wymagania wstępne do importowania za pomocą Spectre', - 'spectre_prerequisites_text' => 'Aby importować dane za pomocą interfejsu Spectre API, musisz dostarczyć Firefly III dwie sekretne wartości. Można je znaleźć na stronie sekretów.', - 'spectre_enter_pub_key' => 'Importowanie będzie działać tylko po wpisaniu tego klucza publicznego na stronie zabezpieczeń.', + 'spectre_title' => 'Importuj za pomocą Spectre', + 'spectre_prerequisites_title' => 'Wymagania wstępne do importowania za pomocą Spectre', + 'spectre_prerequisites_text' => 'Aby importować dane za pomocą interfejsu Spectre API, musisz dostarczyć Firefly III dwie sekretne wartości. Można je znaleźć na stronie sekretów.', + 'spectre_enter_pub_key' => 'Importowanie będzie działać tylko po wpisaniu tego klucza publicznego na stronie zabezpieczeń.', + 'spectre_accounts_title' => 'Wybierz konta do zaimportowania z', + 'spectre_accounts_text' => 'Każde konto po lewej stronie zostało znalezione przez Spectre i może zostać zaimportowane do Firefly III. Wybierz konto aktywów, które powinno zawierać dane transakcje. Jeśli nie chcesz importować z żadnego konkretnego konta, usuń zaznaczenie z pola wyboru.', + 'spectre_do_import' => 'Tak, importuj z tego konta', + + // keys from "extra" array: + 'spectre_extra_key_iban' => 'IBAN', + 'spectre_extra_key_swift' => 'Kod SWIFT', + 'spectre_extra_key_status' => 'Status', + 'spectre_extra_key_card_type' => 'Typ karty', + 'spectre_extra_key_account_name' => 'Nazwa konta', + 'spectre_extra_key_client_name' => 'Nazwa klienta', + 'spectre_extra_key_account_number' => 'Numer konta', + 'spectre_extra_key_blocked_amount' => 'Zablokowana kwota', + 'spectre_extra_key_available_amount' => 'Dostępna kwota', + 'spectre_extra_key_credit_limit' => 'Limit kredytowy', + 'spectre_extra_key_interest_rate' => 'Oprocentowanie', + 'spectre_extra_key_expiry_date' => 'Data wygaśnięcia', + 'spectre_extra_key_open_date' => 'Data otwarcia', + 'spectre_extra_key_current_time' => 'Aktualny czas', + 'spectre_extra_key_current_date' => 'Aktualna data', + 'spectre_extra_key_cards' => 'Karty', + 'spectre_extra_key_units' => 'Jednostki', + 'spectre_extra_key_unit_price' => 'Cena jednostkowa', + 'spectre_extra_key_transactions_count' => 'Liczba transakcji', + + // 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 93169b8d60..b9099e0e55 100644 --- a/resources/lang/pl_PL/intro.php +++ b/resources/lang/pl_PL/intro.php @@ -31,13 +31,13 @@ return [ // create account: 'accounts_create_iban' => 'Nadaj kontom ważny numer IBAN. Może to ułatwić import danych w przyszłości.', - 'accounts_create_asset_opening_balance' => 'Konta zasobów mogą mieć "bilans otwarcia", wskazując początek historii tego konta w Firefly.', + 'accounts_create_asset_opening_balance' => 'Konta aktywów mogą mieć "bilans otwarcia", wskazujący początek historii tego konta w Firefly III.', 'accounts_create_asset_currency' => 'Firefly III obsługuje wiele walut. Konta aktywów mają jedną główną walutę, który należy ustawić tutaj.', 'accounts_create_asset_virtual' => 'Czasami warto dodać do konta wirtualne saldo: dodatkowa kwota zawsze dodawana lub odejmowana od rzeczywistego salda.', // budgets index 'budgets_index_intro' => 'Budżety są wykorzystywane do zarządzania finansami i stanowią jedną z podstawowych funkcji Firefly III.', - 'budgets_index_set_budget' => 'Ustaw całkowity budżet na każdy okres, aby Firefly mógł Ci powiedzieć, czy wydałeś wszystkie dostępne pieniądze.', + 'budgets_index_set_budget' => 'Ustaw całkowity budżet na każdy okres, aby Firefly III mógł Ci powiedzieć, czy wydałeś wszystkie dostępne pieniądze.', 'budgets_index_see_expenses_bar' => 'Wydawanie pieniędzy powoli wypełnia ten pasek.', 'budgets_index_navigate_periods' => 'Przejrzyj okresy, aby łatwiej ustawić przyszłe budżety.', 'budgets_index_new_budget' => 'Utwórz nowe budżety zgodnie z Twoimi potrzebami.', diff --git a/resources/lang/pl_PL/list.php b/resources/lang/pl_PL/list.php index d9b4b8ece0..25ae2552a0 100644 --- a/resources/lang/pl_PL/list.php +++ b/resources/lang/pl_PL/list.php @@ -100,4 +100,6 @@ return [ 'sum_deposits' => 'Suma wpłat', 'sum_transfers' => 'Suma transferów', 'reconcile' => 'Uzgodnij', + 'account_on_spectre' => 'Konto (Spectre)', + 'do_import' => 'Importuj z tego konta', ]; diff --git a/resources/lang/pl_PL/validation.php b/resources/lang/pl_PL/validation.php index 04c5c453ab..ae1868dd04 100644 --- a/resources/lang/pl_PL/validation.php +++ b/resources/lang/pl_PL/validation.php @@ -99,4 +99,38 @@ return [ 'present' => 'Pole :attribute musi być obecne.', 'amount_zero' => 'Całkowita kwota nie może być zerem', 'secure_password' => 'To nie jest bezpieczne hasło. Proszę spróbować ponownie. Aby uzyskać więcej informacji odwiedź https://goo.gl/NCh2tN', + 'attributes' => [ + 'email' => 'adres e-mail', + 'description' => 'opis', + 'amount' => 'kwota', + 'name' => 'nazwa', + 'targetamount' => 'kwota docelowa', + 'openingBalanceDate' => 'data salda otwarcia', + 'openingBalance' => 'bilans otwarcia', + 'match' => 'dopasowanie', + 'amount_min' => 'minimalna kwota', + 'amount_max' => 'maksymalna kwota', + 'title' => 'tytuł', + 'tag' => 'tag', + 'rule-action-value.1' => 'wartość akcji reguły #1', + 'rule-action-value.2' => 'wartość akcji reguły #2', + 'rule-action-value.3' => 'wartość akcji reguły #3', + 'rule-action-value.4' => 'wartość akcji reguły #4', + 'rule-action-value.5' => 'wartość akcji reguły #5', + 'rule-action.1' => 'akcja reguły #1', + 'rule-action.2' => 'akcja reguły #2', + 'rule-action.3' => 'akcja reguły #3', + 'rule-action.4' => 'akcja reguły #4', + 'rule-action.5' => 'akcja reguły #5', + 'rule-trigger-value.1' => 'wartość wyzwalacza reguły #1', + 'rule-trigger-value.2' => 'wartość wyzwalacza reguły #2', + 'rule-trigger-value.3' => 'wartość wyzwalacza reguły #3', + 'rule-trigger-value.4' => 'wartość wyzwalacza reguły #4', + 'rule-trigger-value.5' => 'wartość wyzwalacza reguły #5', + 'rule-trigger.1' => 'wyzwalacz reguły #1', + 'rule-trigger.2' => 'wyzwalacz reguły #2', + 'rule-trigger.3' => 'wyzwalacz reguły #3', + 'rule-trigger.4' => 'wyzwalacz reguły #4', + 'rule-trigger.5' => 'wyzwalacz reguły #5', + ], ]; diff --git a/resources/lang/pt_BR/auth.php b/resources/lang/pt_BR/auth.php new file mode 100644 index 0000000000..80dc51917e --- /dev/null +++ b/resources/lang/pt_BR/auth.php @@ -0,0 +1,37 @@ +. + */ +declare(strict_types=1); + +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' => 'Essas credenciais não correspondem aos nossos registros.', + 'throttle' => 'Muitas tentativas de login. Por favor, tente novamente em :seconds segundos.', +]; diff --git a/app/Support/SingleCacheProperties.php b/resources/lang/pt_BR/bank.php similarity index 61% rename from app/Support/SingleCacheProperties.php rename to resources/lang/pt_BR/bank.php index 17bddc463f..ef0d636f91 100644 --- a/app/Support/SingleCacheProperties.php +++ b/resources/lang/pt_BR/bank.php @@ -1,6 +1,6 @@ properties = new Collection; - if (auth()->check()) { - $this->addProperty(auth()->user()->id); - $this->addProperty(app('preferences')->lastActivity()); - } - } -} +return [ +]; diff --git a/resources/lang/pt_BR/breadcrumbs.php b/resources/lang/pt_BR/breadcrumbs.php new file mode 100644 index 0000000000..941fca6cd2 --- /dev/null +++ b/resources/lang/pt_BR/breadcrumbs.php @@ -0,0 +1,55 @@ +. + */ +declare(strict_types=1); + +return [ + 'home' => 'Início', + 'edit_currency' => 'Editar moeda ":name"', + 'delete_currency' => 'Excluir moeda ":name"', + 'newPiggyBank' => 'Criar um novo cofrinho', + 'edit_piggyBank' => 'Editar cofrinho ":name"', + 'preferences' => 'Preferências', + 'profile' => 'Perfil', + 'changePassword' => 'Alterar sua senha', + 'change_email' => 'Altere seu endereço de email', + 'bills' => 'Faturas', + 'newBill' => 'Nova fatura', + 'edit_bill' => 'Editar fatura ":name"', + 'delete_bill' => 'Apagar fatura ":name"', + 'reports' => 'Relatórios', + 'search_result' => 'Resultados da busca ":query"', + 'withdrawal_list' => 'Despesas', + 'deposit_list' => 'Receitas, renda e depósitos', + 'transfer_list' => 'Transferências', + 'transfers_list' => 'Transferências', + 'reconciliation_list' => 'Reconciliação', + 'create_withdrawal' => 'Criar uma nova retirada', + 'create_deposit' => 'Criar um novo depósito', + 'create_transfer' => 'Criar nova transferência', + 'edit_journal' => 'Editar transação ":description"', + 'edit_reconciliation' => 'Editar ":description"', + 'delete_journal' => 'Apagar transação ":description"', + 'tags' => 'Etiquetas', + 'createTag' => 'Criar nova etiqueta', + 'edit_tag' => 'Editar etiqueta ":tag"', + 'delete_tag' => 'Apagar etiqueta ":tag"', + 'delete_journal_link' => 'Eliminar ligação entre transações', +]; diff --git a/resources/lang/pt_BR/config.php b/resources/lang/pt_BR/config.php new file mode 100644 index 0000000000..3ab5a29a32 --- /dev/null +++ b/resources/lang/pt_BR/config.php @@ -0,0 +1,33 @@ +. + */ +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_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ü', +]; diff --git a/resources/lang/pt_BR/csv.php b/resources/lang/pt_BR/csv.php new file mode 100644 index 0000000000..d61316b632 --- /dev/null +++ b/resources/lang/pt_BR/csv.php @@ -0,0 +1,24 @@ +. + */ +declare(strict_types=1); + +return [ +]; diff --git a/resources/lang/pt_BR/demo.php b/resources/lang/pt_BR/demo.php new file mode 100644 index 0000000000..4435f65f97 --- /dev/null +++ b/resources/lang/pt_BR/demo.php @@ -0,0 +1,35 @@ +. + */ +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', +]; diff --git a/resources/lang/pt_BR/firefly.php b/resources/lang/pt_BR/firefly.php new file mode 100644 index 0000000000..e14bf54914 --- /dev/null +++ b/resources/lang/pt_BR/firefly.php @@ -0,0 +1,1180 @@ +. + */ +declare(strict_types=1); + +return [ + // general stuff: + 'close' => 'Fechar', + 'actions' => 'Ações', + 'edit' => 'Editar', + 'delete' => 'Apagar', + 'welcomeBack' => 'O que está passando?', + 'everything' => 'Tudo', + 'today' => 'hoje', + 'customRange' => 'Intervalo Personalizado', + 'apply' => 'Aplicar', + 'select_date' => 'Selecione a data..', + 'cancel' => 'Cancelar', + 'from' => 'De', + 'to' => 'Até', + 'showEverything' => 'Mostrar tudo', + 'never' => 'Nunca', + 'no_results_for_empty_search' => 'Sua pesquisa estava vazia, então nada foi encontrado.', + 'removed_amount' => ':amount removido', + 'added_amount' => ':amount adicionada', + 'asset_account_role_help' => 'Quaisquer opções extras resultantes da sua escolha pode ser definido mais tarde.', + 'Opening balance' => 'Saldo inicial', + 'create_new_stuff' => 'Criar novas coisas', + 'new_withdrawal' => 'Nova retirada', + 'create_new_transaction' => 'Criar nova transação', + 'go_to_asset_accounts' => 'Veja suas contas ativas', + 'go_to_budgets' => 'Vá para seus orçamentos', + 'go_to_categories' => 'Vá para suas categorias', + 'go_to_bills' => 'Vá para suas faturas', + 'go_to_expense_accounts' => 'Veja suas despesas', + 'go_to_revenue_accounts' => 'Veja suas receitas', + 'go_to_piggies' => 'Vá para sua poupança', + 'new_deposit' => 'Novo depósito', + 'new_transfer' => 'Nova transferência', + 'new_transfers' => 'Nova transferência', + 'new_asset_account' => 'Nova conta de ativo', + 'new_expense_account' => 'Nova conta de despesa', + 'new_revenue_account' => 'Nova conta de receita', + 'new_budget' => 'Novo orçamento', + 'new_bill' => 'Nova fatura', + 'block_account_logout' => 'Você foi desconectado. Contas bloqueadas não podem usar este site. Você se registrou com um email válido?', + 'flash_success' => 'Sucesso!', + 'flash_info' => 'Mensagem', + 'flash_warning' => 'Atenção!', + 'flash_error' => 'Erro!', + 'flash_info_multiple' => 'Há uma mensagem|Existem :count mensagens', + 'flash_error_multiple' => 'Houve um erro|Houve :count erros', + 'net_worth' => 'Valor Líquido', + 'route_has_no_help' => 'Não existe ajuda para esta rota.', + 'help_for_this_page' => 'Ajuda para esta página', + 'no_help_could_be_found' => 'O texto de ajuda não pode ser encontrado.', + 'no_help_title' => 'Desculpe, ocorreu um erro.', + 'two_factor_welcome' => 'Olá, :user!', + 'two_factor_enter_code' => 'Para continuar, por favor, digite seu código de autenticação em duas etapas. Seu aplicativo pode gerá-lo para você.', + 'two_factor_code_here' => 'Insira o código aqui', + 'two_factor_title' => 'Autenticação em duas etapas', + 'authenticate' => 'Autenticar', + 'two_factor_forgot_title' => 'Perdeu autenticação em duas etapas', + 'two_factor_forgot' => 'Esqueci minha autenticação em duas etapas.', + 'two_factor_lost_header' => 'Perdeu sua autenticação em duas etapas?', + 'two_factor_lost_intro' => 'Infelizmente, isso não é algo que você pode redefinir a partir da interface web. Você tem duas opções.', + 'two_factor_lost_fix_self' => 'Se você executar sua própria instância do Firefly III, verifique os logs no storage/logs para obter instruções.', + 'two_factor_lost_fix_owner' => 'Caso contrário, o proprietário do site :site_owner e peça para redefinir a sua autenticação de duas etapas.', + 'warning_much_data' => ':days dias de dados podem demorar um pouco para carregar.', + 'registered' => 'Você se registrou com sucesso!', + 'Default asset account' => 'Conta padrão', + 'no_budget_pointer' => 'Parece que não há orçamentos ainda. Você deve criar alguns na página orçamentos. Orçamentos podem ajudá-lo a manter o controle de despesas.', + 'Savings account' => 'Conta poupança', + 'Credit card' => 'Cartão de crédito', + 'source_accounts' => 'Conta(s) de origem', + '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.', + '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', + 'expenses_by_budget' => 'Despesas pelo orçamento', + 'income_by_category' => 'Receitas por categoria', + 'expenses_by_asset_account' => 'Despesas por contas ativas', + 'expenses_by_expense_account' => 'Despesas por conta de despesa', + 'cannot_redirect_to_account' => 'Firefly III não pode redirecioná-lo para a página correta. Minhas desculpas.', + 'sum_of_expenses' => 'Soma das despesas', + 'sum_of_income' => 'Soma da renda', + 'spent_in_specific_budget' => 'Gasto no orçamento ":budget"', + 'sum_of_expenses_in_budget' => 'Gasto total no orçamento ":budget"', + 'left_in_budget_limit' => 'Restante para gastar de acordo com o orçamento', + 'current_period' => 'Período atual', + 'show_the_current_period_and_overview' => 'Mostrar o período atual e visão geral', + 'pref_languages_locale' => 'Para que um idioma diferente do inglês funcione corretamente, seu sistema operacional deve estar equipado com as informações locais corretas. Se estas não estiverem presentes, os dados de moeda, as datas e os montantes podem ser formatados incorretamente.', + 'budget_in_period' => 'Todas as transações para orçamento ":name" entre :start e :end', + 'chart_budget_in_period' => 'Gráfico para todas as transações do orçamento ":name" entre :start e :end', + 'chart_account_in_period' => 'Gráfico para todas as transações da conta ":name" entre :start e :end', + 'chart_category_in_period' => 'Gráfico para todas as transações para a categoria ":name" entre :start e :end', + 'chart_category_all' => 'Gráfico para todas as transações para a categoria ":name"', + 'clone_withdrawal' => 'Clonar esta retirada', + 'clone_deposit' => 'Clonar este depósito', + 'clone_transfer' => 'Clonar esta transferência', + 'multi_select_no_selection' => 'Nenhum selecionado', + 'multi_select_select_all' => 'Selecionar tudo', + 'multi_select_n_selected' => 'selecionado', + 'multi_select_all_selected' => 'Todos selecionados', + 'multi_select_filter_placeholder' => 'Encontrar..', + 'intro_next_label' => 'Próximo', + 'intro_prev_label' => 'Anterior', + 'intro_skip_label' => 'Pular', + 'intro_done_label' => 'Concluído', + 'between_dates_breadcrumb' => 'Entre :start e :end', + 'all_journals_without_budget' => 'Todas as transações sem um orçamento', + 'journals_without_budget' => 'Transações sem um orçamento', + 'all_journals_without_category' => 'Todas as transações sem uma categoria', + 'journals_without_category' => 'Transações sem uma categoria', + 'all_journals_for_account' => 'Todas as transações para conta :name', + 'chart_all_journals_for_account' => 'Gráfico de todas as transações para conta :name', + 'journals_in_period_for_account' => 'Todas as transações para conta :name entre :start e :end', + 'transferred' => 'Transferido', + 'all_withdrawal' => 'Todas as despesas', + 'all_transactions' => 'Todas as transações', + 'title_withdrawal_between' => 'Todas as despesas entre :start e :end', + 'all_deposit' => 'Todas as receitas', + 'title_deposit_between' => 'Todas as receitas entre :start e :end', + 'all_transfers' => 'Todas as transferências', + 'title_transfers_between' => 'Todas as transferências entre :start e :end', + 'all_transfer' => 'Todas as transferências', + 'all_journals_for_tag' => 'Todas as transações para tag ":tag"', + 'title_transfer_between' => 'Todas as transferências entre :start e :end', + 'all_journals_for_category' => 'Todas as transações para categoria :name', + 'all_journals_for_budget' => 'Todas as transações para orçamento :name', + 'chart_all_journals_for_budget' => 'Gráfico de todas as transações para orçamento :name', + 'journals_in_period_for_category' => 'Todas as transações para a categoria :name entre :start e :end', + 'journals_in_period_for_tag' => 'Todas as transações para tag :tag entre :start e :end', + 'not_available_demo_user' => 'O recurso que você tenta acessar não está disponível para usuários da demo.', + 'exchange_rate_instructions' => 'A conta ativa "@name" aceita apenas transações em @native_currency. Se você deseja usar @foreign_currency em vez disso, verifique se a quantidade em @native_currency também é conhecida:', + 'transfer_exchange_rate_instructions' => 'A conta ativa de origem "@source_name" aceita apenas transações em @source_currency. A conta ativa de destino "@dest_name" aceita apenas transações em @dest_currency. Você deve fornecer o valor transferido corretamente em ambas as moedas.', + 'transaction_data' => 'Dados de transação', + 'invalid_server_configuration' => 'Configuração do servidor inválida', + 'invalid_locale_settings' => 'O Firefly III não consegue formatar quantidades monetárias porque está faltando os pacotes necessários no seu servidor. Existem instruções de como fazer isso.', + 'quickswitch' => 'Mudança rápida', + 'sign_in_to_start' => 'Faça login para iniciar sua sessão', + 'sign_in' => 'Entrar', + 'register_new_account' => 'Cadastrar uma nova conta', + 'forgot_my_password' => 'Esqueci minha senha', + 'problems_with_input' => 'Houve alguns problemas com a sua entrada.', + 'reset_password' => 'Redefinir sua senha', + 'button_reset_password' => 'Redefinir senha', + 'reset_button' => 'Redefinir', + 'want_to_login' => 'Eu quero fazer o login', + 'button_register' => 'Registrar', + + // check for updates: + 'update_check_title' => 'Verificar Atualizações', + 'admin_update_check_title' => 'Verificar atualização automaticamente', + 'admin_update_check_explain' => 'O Firefly III pode verificar atualizações automaticamente. Quando você habilita essa configuração, contatará Github para ver se uma nova versão do Firefly III está disponível. Quando for, você receberá uma notificação. Você pode testar esta notificação usando o botão à direita. Indique abaixo se você deseja que o Firefly III verifique se há atualizações.', + 'check_for_updates_permission' => 'O Firefly III pode verificar atualizações, mas precisa da sua permissão para fazê-lo. Acesse o administração para indicar se você gostaria que esse recurso fosse ativado.', + 'updates_ask_me_later' => 'Pergunte-me depois', + 'updates_do_not_check' => 'Não verifique se há atualizações', + 'updates_enable_check' => 'Habilitar a verificação de atualizações', + 'admin_update_check_now_title' => 'Verifique se há atualizações agora', + 'admin_update_check_now_explain' => 'Se você pressionar o botão, o Firefly III verá se sua versão atual é a mais recente.', + 'check_for_updates_button' => 'Verifique agora!', + 'update_new_version_alert' => 'Uma nova versão do Firefly III está disponível. Você está executando v:your_version, a versão mais recente é v:new_version que foi lançada em :date.', + 'update_current_version_alert' => 'Você está executando v:version, que é a última versão disponível.', + 'update_newer_version_alert' => 'Você está executando v:your_version, que é mais recente que a versão mais recente, v:new_version.', + 'update_check_error' => 'Ocorreu um erro durante a verificação de atualizações. Por favor veja os arquivos de log.', + + // search + 'search' => 'Pesquisa', + 'search_query' => 'Pedido', + 'search_found_transactions' => 'Número de transações encontradas:', + 'general_search_error' => 'Ocorreu um erro durante a pesquisa. Verifique os arquivos de log para obter mais informações.', + 'search_box' => 'Pesquisar', + 'search_box_intro' => 'Bem-vindo à função de pesquisa do Firefly III. Digite sua consulta de pesquisa na caixa. Certifique-se de verificar o arquivo de ajuda porque a pesquisa é bastante avançada.', + 'search_error' => 'Erro durante a busca', + 'search_searching' => 'Procurando ...', + 'search_results' => 'Resultados da pesquisa', + + // repeat frequencies: + 'repeat_freq_yearly' => 'anual', + 'repeat_freq_half-year' => 'cada semestre', + 'repeat_freq_quarterly' => 'trimestral', + 'repeat_freq_monthly' => 'mensal', + 'repeat_freq_weekly' => 'semanal', + 'weekly' => 'semanal', + 'quarterly' => 'trimestral', + 'half-year' => 'metade de cada ano', + 'yearly' => 'anual', + + // export data: + 'import_and_export' => 'Importar / Exportar', + 'export_data' => 'Exportar dados', + 'export_and_backup_data' => 'Exportar dados', + 'export_data_intro' => 'Use os dados exportados para mover para uma nova aplicação financeira. Observe que esses arquivos não são feitos como um backup. Eles não contêm informações suficientes sobre os dados para restaurar completamente uma nova instalação do Firefly III. Se você quiser fazer um backup de seus dados, faça backup do banco de dados diretamente.', + 'export_format' => 'Formato de exportação', + 'export_format_csv' => 'Valores separados por vírgula (arquivo CSV)', + 'export_format_mt940' => 'Compatível com formato MT940', + 'include_old_uploads_help' => 'O Firefly III não joga fora os arquivos CSV originais que você importou no passado. Você pode incluí-los em sua exportação.', + 'do_export' => 'Exportar', + 'export_status_never_started' => 'A exportação ainda não foi iniciada', + 'export_status_make_exporter' => 'Criar o exportador...', + 'export_status_collecting_journals' => 'Coletando suas transações...', + 'export_status_collected_journals' => 'Suas transações foram coletadas!', + 'export_status_converting_to_export_format' => 'Convertendo suas transações...', + 'export_status_converted_to_export_format' => 'Suas transações foram convertidas!', + 'export_status_creating_journal_file' => 'Criando o arquivo de exportação...', + 'export_status_created_journal_file' => 'Criado o arquivo de exportação!', + 'export_status_collecting_attachments' => 'Recolher todos os seus anexos...', + 'export_status_collected_attachments' => 'Recolhidos todos os seus anexos!', + 'export_status_collecting_old_uploads' => 'Recolher todos os seus envios anteriores...', + 'export_status_collected_old_uploads' => 'Recolhidos todos os seus envios anteriores!', + 'export_status_creating_zip_file' => 'Criando um arquivo zip...', + 'export_status_created_zip_file' => 'Criado um arquivo zip!', + 'export_status_finished' => 'Exportação terminou com sucesso! Yay!', + 'export_data_please_wait' => 'Por favor aguarde...', + + // rules + 'rules' => 'Regras', + 'rule_name' => 'Nome da regra', + 'rule_triggers' => 'Regra dispara quando', + 'rule_actions' => 'Regra será', + 'new_rule' => 'Nova regra', + 'new_rule_group' => 'Novo grupo de regras', + 'rule_priority_up' => 'Dar mais prioridade a regra', + 'rule_priority_down' => 'Dar a regra menos prioridade', + 'make_new_rule_group' => 'Fazer o novo grupo de regras', + 'store_new_rule_group' => 'Gravar novo grupo de regras', + 'created_new_rule_group' => 'Novo grupo de regras ":title" armazenado!', + 'updated_rule_group' => 'Grupo de regras atualizado com sucesso ":title".', + 'edit_rule_group' => 'Editar grupo de regras ":title"', + 'delete_rule_group' => 'Excluir grupo de regra ":title"', + 'deleted_rule_group' => 'Removido grupo de regra ":title"', + 'update_rule_group' => 'Atualizar um grupo de regra', + 'no_rules_in_group' => 'Não existem regras neste grupo', + 'move_rule_group_up' => 'Subir o grupo de regras', + 'move_rule_group_down' => 'Descer grupo de regras', + 'save_rules_by_moving' => 'Salve essas regra(s), movendo-os para outro grupo de regra:', + 'make_new_rule' => 'Fazer nova regra no grupo de regras ":title"', + 'rule_help_stop_processing' => 'Quando você marcar essa caixa, regras posteriores deste grupo não serão executadas.', + 'rule_help_active' => 'Regras inativas nunca serão disparadas.', + 'stored_new_rule' => 'Armazenado a nova regra com o título ":title"', + 'deleted_rule' => 'Regra excluída com o título ":title"', + 'store_new_rule' => 'Armazenar nova regra', + 'updated_rule' => 'Regra atualizada com o título ":title"', + 'default_rule_group_name' => 'Regras padrão', + 'default_rule_group_description' => 'Todas as suas regras, não estão em um grupo específico.', + 'default_rule_name' => 'Sua primeira regra padrão', + 'default_rule_description' => 'Esta regra é um exemplo. Você pode excluí-la com segurança.', + 'default_rule_trigger_description' => 'O homem que vendeu o mundo', + 'default_rule_trigger_from_account' => 'David Bowie', + 'default_rule_action_prepend' => 'Comprei o mundo a partir ', + 'default_rule_action_set_category' => 'Grandes despesas', + 'trigger' => 'Disparo', + 'trigger_value' => 'Disparo no valor', + 'stop_processing_other_triggers' => 'Parar o processamento de outros gatilhos', + 'add_rule_trigger' => 'Adicionar novo disparador', + 'action' => 'Ação', + 'action_value' => 'Valor da ação', + 'stop_executing_other_actions' => 'Parar de executar outras ações', + 'add_rule_action' => 'Adicionar nova ação', + 'edit_rule' => 'Editar regra ":title"', + 'delete_rule' => 'Excluir a regra ":title"', + 'update_rule' => 'Atualizar Regra', + 'test_rule_triggers' => 'Veja transações correspondentes', + 'warning_transaction_subset' => 'Por razões de desempenho esta lista está limitado a :max_num_transactions e só pode mostrar um subconjunto das transações correspondentes', + 'warning_no_matching_transactions' => 'Nenhuma transação correspondente encontrada. Por favor note que por motivos de desempenho, apenas as últimas :num_transactions transações tenham sido verificadas.', + 'warning_no_valid_triggers' => 'Sem gatilhos válidos fornecidos.', + 'apply_rule_selection' => 'Aplicar a regra ":title" para uma seleção de suas transações', + 'apply_rule_selection_intro' => 'As regras como ":title" normalmente são aplicadas apenas a transações novas ou atualizadas, mas você pode informar o Firefly III para executá-lo em uma seleção de suas transações existentes. Isso pode ser útil quando você atualizou uma regra e você precisa das alterações a serem aplicadas a todas as suas outras transações.', + 'include_transactions_from_accounts' => 'Incluir as transações destas contas', + 'applied_rule_selection' => 'Regra ":title" tem sido aplicada para sua seleção.', + 'execute' => 'Executar', + 'apply_rule_group_selection' => 'Aplicar grupo de regras ":title" para uma seleção de suas transações', + 'apply_rule_group_selection_intro' => 'Os grupos de regras como ":title" normalmente são aplicados apenas a transações novas ou atualizadas, mas você pode informar ao Firefly III para executar todas as regras neste grupo em uma seleção de suas transações existentes. Isso pode ser útil quando você atualizou um grupo de regras e você precisa das alterações a serem aplicadas a todas as suas outras transações.', + 'applied_rule_group_selection' => 'Grupo de regras ":title" tem sido aplicada para sua seleção.', + + // actions and triggers + 'rule_trigger_user_action' => 'Ação do usuário é ":trigger_value"', + 'rule_trigger_from_account_starts_choice' => 'Conta de origem começa com..', + 'rule_trigger_from_account_starts' => 'Conta de origem começa com ":trigger_value"', + 'rule_trigger_from_account_ends_choice' => 'Conta de origem termina com..', + 'rule_trigger_from_account_ends' => 'Conta de origem termina com ":trigger_value"', + 'rule_trigger_from_account_is_choice' => 'Conta de origem é..', + 'rule_trigger_from_account_is' => 'É da conta de origem ":trigger_value"', + 'rule_trigger_from_account_contains_choice' => 'Conta de origem contém..', + 'rule_trigger_from_account_contains' => 'Conta de origem contém ":trigger_value"', + 'rule_trigger_to_account_starts_choice' => 'Conta de destino começa com..', + 'rule_trigger_to_account_starts' => 'Conta destino começa com ":trigger_value"', + 'rule_trigger_to_account_ends_choice' => 'Conta de destino termina com..', + 'rule_trigger_to_account_ends' => 'Conta destino termina com ":trigger_value"', + 'rule_trigger_to_account_is_choice' => 'Conta de destino é..', + 'rule_trigger_to_account_is' => 'Conta de destino é ":trigger_value"', + 'rule_trigger_to_account_contains_choice' => 'Conta de destino contém..', + 'rule_trigger_to_account_contains' => 'Conta de destino contém ":trigger_value"', + 'rule_trigger_transaction_type_choice' => 'Transação é do tipo..', + 'rule_trigger_transaction_type' => 'Transação é do tipo ":trigger_value"', + 'rule_trigger_category_is_choice' => 'A categoria é..', + 'rule_trigger_category_is' => 'A categoria é ":trigger_value"', + 'rule_trigger_amount_less_choice' => 'Quantia é inferior a..', + 'rule_trigger_amount_less' => 'Quantia é inferior :trigger_value', + 'rule_trigger_amount_exactly_choice' => 'Quantia é..', + 'rule_trigger_amount_exactly' => 'Quantia é :trigger_value', + 'rule_trigger_amount_more_choice' => 'Quantia é mais do que..', + 'rule_trigger_amount_more' => 'Quantia é mais de :trigger_value', + 'rule_trigger_description_starts_choice' => 'Descrição começa com..', + 'rule_trigger_description_starts' => 'Descrição começa com ":trigger_value"', + 'rule_trigger_description_ends_choice' => 'Descrição termina com..', + 'rule_trigger_description_ends' => 'Descrição termina com ":trigger_value"', + 'rule_trigger_description_contains_choice' => 'Descrição contém..', + 'rule_trigger_description_contains' => 'Descrição contém ":trigger_value"', + 'rule_trigger_description_is_choice' => 'Descrição é..', + 'rule_trigger_description_is' => 'Descrição é ":trigger_value"', + 'rule_trigger_budget_is_choice' => 'O orçamento é..', + 'rule_trigger_budget_is' => 'O orçamento é ":trigger_value"', + 'rule_trigger_tag_is_choice' => '(A) tag é..', + 'rule_trigger_tag_is' => 'A tag é ":trigger_value"', + 'rule_trigger_has_attachments_choice' => 'Tem pelo menos essa quantidade de anexos', + 'rule_trigger_has_attachments' => 'Tem pelo menos :trigger_value anexo(s)', + 'rule_trigger_store_journal' => 'Quando uma transação é criada', + 'rule_trigger_update_journal' => 'Quando uma transação é atualizada', + 'rule_trigger_has_no_category_choice' => 'Não tem categoria', + 'rule_trigger_has_no_category' => 'A transação não tem categoria', + 'rule_trigger_has_any_category_choice' => 'Tem uma categoria (qualquer)', + 'rule_trigger_has_any_category' => 'A transação tem uma categoria (qualquer)', + 'rule_trigger_has_no_budget_choice' => 'Não tem orçamento', + 'rule_trigger_has_no_budget' => 'A transação não possui orçamento', + 'rule_trigger_has_any_budget_choice' => 'Tem um orçamento (qualquer)', + 'rule_trigger_has_any_budget' => 'Transação tem um orçamento (qualquer)', + 'rule_trigger_has_no_tag_choice' => 'Não tem tag(s)', + 'rule_trigger_has_no_tag' => 'A transação não tem tag(s)', + 'rule_trigger_has_any_tag_choice' => 'Tem uma ou mais tags (qualquer)', + 'rule_trigger_has_any_tag' => 'A transação tem uma ou mais tags (qualquer)', + 'rule_trigger_any_notes_choice' => 'Tem notas (qualquer)', + 'rule_trigger_any_notes' => 'A transação tem notas (qualquer)', + 'rule_trigger_no_notes_choice' => 'Não tem notas', + 'rule_trigger_no_notes' => 'A transação não tem notas', + 'rule_trigger_notes_are_choice' => 'As notas são..', + 'rule_trigger_notes_are' => 'As notas são ":trigger_value"', + 'rule_trigger_notes_contain_choice' => 'As notas contêm..', + 'rule_trigger_notes_contain' => 'As notas contêm ":trigger_value"', + 'rule_trigger_notes_start_choice' => 'As notas começam com..', + 'rule_trigger_notes_start' => 'As notas começam com ":trigger_value"', + 'rule_trigger_notes_end_choice' => 'As notas terminam com..', + 'rule_trigger_notes_end' => 'Notas terminam com ":trigger_value"', + 'rule_action_set_category' => 'Definir categoria para ":action_value"', + 'rule_action_clear_category' => 'Limpar categoria', + 'rule_action_set_budget' => 'Definir orçamento para ":action_value"', + 'rule_action_clear_budget' => 'Limpar orçamento', + 'rule_action_add_tag' => 'Adicionar tag ":action_value"', + 'rule_action_remove_tag' => 'Remover tag ":action_value"', + 'rule_action_remove_all_tags' => 'Remover todas as tags', + 'rule_action_set_description' => 'Definir descrição para ":action_value"', + 'rule_action_append_description' => 'Acrescentar a descrição com ":action_value"', + 'rule_action_prepend_description' => 'Preceder a descrição com ":action_value"', + 'rule_action_set_category_choice' => 'Definir a categoria para..', + 'rule_action_clear_category_choice' => 'Limpar qualquer categoria', + 'rule_action_set_budget_choice' => 'Definir orçamento para..', + 'rule_action_clear_budget_choice' => 'Limpar qualquer orçamento', + 'rule_action_add_tag_choice' => 'Adicionar tag..', + 'rule_action_remove_tag_choice' => 'Remover tag..', + 'rule_action_remove_all_tags_choice' => 'Remover todas as tags', + 'rule_action_set_description_choice' => 'Definir descrição para..', + 'rule_action_append_description_choice' => 'Acrescentar a descrição com..', + 'rule_action_prepend_description_choice' => 'Preceder a descrição com..', + 'rule_action_set_source_account_choice' => 'Definir a conta de origem...', + 'rule_action_set_source_account' => 'Definir a conta de origem para :action_value', + 'rule_action_set_destination_account_choice' => 'Definir a conta de destino...', + 'rule_action_set_destination_account' => 'Definir a conta de destino :action_value', + 'rule_action_append_notes_choice' => 'Anexar notas com..', + 'rule_action_append_notes' => 'Anexar notas com ":action_value"', + 'rule_action_prepend_notes_choice' => 'Preceder notas com..', + 'rule_action_prepend_notes' => 'Preceder notas com ":action_value"', + 'rule_action_clear_notes_choice' => 'Remover quaisquer notas', + 'rule_action_clear_notes' => 'Remover quaisquer notas', + '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.', + + // 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', + + // 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', + + // 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.', + 'personal_access_token' => 'Token de acesso de pessoal', + 'explain_access_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ê é paranóico, regenere esse token usando o botão.', + 'regenerate_access_token' => 'Regenerar o token de acesso', + 'token_regenerated' => 'Um novo token foi gerado', + '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', + + // transaction index + '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.', + + // 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', + + // 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', + + // forms: + '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', + + // 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)', + 'not_or_not_yet' => 'Não (ainda)', + 'not_expected_period' => 'Não esperado neste período', + '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 ativas', + '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', + + // 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 ativa padrão', + 'opt_group_savingAsset' => 'Contas de poupança', + 'opt_group_sharedAsset' => 'Contas ativas 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.', + + // 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', + + // 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', + + // 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 ativa padrão', + 'account_role_sharedAsset' => 'Conta ativa 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"', + + // 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.', + + 'remove' => 'Remover', + 'max_amount_add' => 'É a quantidade máxima que você pode adicionar é', + 'max_amount_remove' => 'É a quantidade máxima que você pode remover é', + 'update_piggy_button' => 'Atualizar cofrinho', + 'update_piggy_title' => 'Atualizar cofrinho ":name"', + 'updated_piggy_bank' => 'Cofrinho ":name" atualizado', + 'details' => 'Detalhes', + 'events' => 'Eventos', + 'target_amount' => 'Valor alvo', + 'start_date' => 'Data de Início', + 'target_date' => 'Data Alvo', + 'no_target_date' => 'Nenhum data', + 'table' => 'Tabela', + 'delete_piggy_bank' => 'Apagar cofrinho ":name"', + 'cannot_add_amount_piggy' => 'Não foi possível adicionar :amount a ":name".', + 'cannot_remove_from_piggy' => 'Não foi possível remover :amount de ":name".', + 'deleted_piggy_bank' => 'Apagar cofrinho ":name"', + 'added_amount_to_piggy' => 'Adicionado :amount de ":name"', + 'removed_amount_from_piggy' => 'Removido :amount de ":name"', + + // tags + 'delete_tag' => 'Apagar tag ":tag"', + 'deleted_tag' => 'Apagar tag ":tag"', + 'new_tag' => 'Fazer nova tag', + 'edit_tag' => 'Editar tag ":tag"', + 'updated_tag' => 'Tag atualizada ":tag"', + 'created_tag' => 'Tag ":tag" foi criada!', + + 'transaction_journal_information' => 'Informação da transação', + 'transaction_journal_meta' => 'Meta-informação', + 'total_amount' => 'Valor total', + 'number_of_decimals' => 'Número de casas decimais', + + // administration + 'administration' => 'Administração', + 'user_administration' => 'Administração de usuários', + 'list_all_users' => 'Todos os usuários', + 'all_users' => 'Todos os usuários', + 'instance_configuration' => 'Configuração', + 'firefly_instance_configuration' => 'Opções de configuração para Firefly III', + 'setting_single_user_mode' => 'Modo de usuário único', + 'setting_single_user_mode_explain' => 'Por padrão, o Firefly III aceita apenas um (1) registro: você. Esta é uma medida de segurança, impedindo que outros usem sua instância, a menos que você permita. Os registros futuros estão bloqueados. Quando você desmarca essa caixa, outros podem usar sua instância, assumindo que podem alcançá-la (quando conectados à Internet).', + 'store_configuration' => 'Configuração da Loja', + 'single_user_administration' => 'Administração de usuários para :email', + 'edit_user' => 'Editar usuário :email', + 'hidden_fields_preferences' => 'Nem todos os campos estão visíveis agora. Você deve habilitá-los em suas configurações.', + 'user_data_information' => 'Dados de usuário', + 'user_information' => 'Informações do usuário', + 'total_size' => 'tamanho total', + 'budget_or_budgets' => 'orçamento(s)', + 'budgets_with_limits' => 'budget(s) com quantidade configurada', + 'nr_of_rules_in_total_groups' => ':count_rules regra (s) em :count_groups grupo(s) de regras', + 'tag_or_tags' => 'tag(s)', + 'configuration_updated' => 'A configuração foi atualizada', + 'setting_is_demo_site' => 'Site demo', + 'setting_is_demo_site_explain' => 'Se você marcar esta caixa, esta instalação se comportará como se fosse o site de demonstração, o que pode ter efeitos colaterais estranhos.', + 'block_code_bounced' => 'Mensagem(s) de email ressaltada', + 'block_code_expired' => 'Conta de demonstração expirada', + 'no_block_code' => 'Nenhuma razão para o bloqueio ou o usuário não está bloqueado', + 'block_code_email_changed' => 'O usuário ainda não confirmou o novo endereço de e-mail', + 'admin_update_email' => 'Ao contrário da página de perfil, o usuário NÃO será notificado de que seu endereço de e-mail mudou!', + 'update_user' => 'Atualizar usuário', + 'updated_user' => 'Os dados do usuário foram alterados.', + 'delete_user' => 'Excluir usuário :email', + 'user_deleted' => 'O usuário foi apagado', + 'send_test_email' => 'Enviar e-mail de teste', + 'send_test_email_text' => 'Para ver se a sua instalação é capaz de enviar e-mail, pressione este botão. Você não verá um erro aqui (se houver), os arquivos de log refletirão quaisquer erros. Você pode pressionar este botão quantas vezes quiser. Não há controle de spam. A mensagem será enviada para :email e deverá chegar em breve.', + 'send_message' => 'Enviar mensagem', + 'send_test_triggered' => 'O teste foi desencadeado. Verifique a sua caixa de entrada e os arquivos de log.', + + // links + 'journal_link_configuration' => 'Configuração de ligação de transações', + 'create_new_link_type' => 'Crie um novo tipo de ligação', + 'store_new_link_type' => 'Armazene novo tipo de ligação', + 'update_link_type' => 'Atualize o tipo de ligação', + 'edit_link_type' => 'Excluir tipo de liagação ":name"', + 'updated_link_type' => 'Tipo de ligação ":name" atualizado', + 'delete_link_type' => 'Excluir tipo de ligação ":name"', + 'deleted_link_type' => 'Tipo de ligação ":name" excluída', + 'stored_new_link_type' => 'Armazene novo tipo de ligação ":name"', + 'cannot_edit_link_type' => 'Não é possível editar o tipo de ligação ":name"', + 'link_type_help_name' => 'Ou seja. "Duplicatas"', + 'link_type_help_inward' => 'Ou seja. "duplicatas"', + 'link_type_help_outward' => 'Ou seja. "é duplicado por"', + 'save_connections_by_moving' => 'Salve a ligação entre essas transações movendo-as para outro tipo de ligação:', + 'do_not_save_connection' => '(não salve a conexão)', + 'link_transaction' => 'Ligar transação', + 'link_to_other_transaction' => 'Ligue esta transação a outra transação', + 'select_transaction_to_link' => 'Selecione uma transação para ligar a esta transação', + 'this_transaction' => 'Esta transação', + 'transaction' => 'Transação', + 'comments' => 'Comentários', + 'to_link_not_found' => 'Se a transação para a qual deseja ligar não estiver listada, basta inserir sua ID.', + '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.', + 'journal_links' => 'Transações ligadas', + 'this_withdrawal' => 'Essa retirada', + 'this_deposit' => 'Este depósito', + 'this_transfer' => 'Esta transferência', + 'overview_for_link' => 'Visão geral para o tipo de ligação ":name"', + 'source_transaction' => 'Transação de origem', + 'link_description' => 'Descrição da ligação', + 'destination_transaction' => 'Transação de destino', + 'delete_journal_link' => 'Excluir a ligação entre :source e :destination', + 'deleted_link' => 'Excluir ligação', + + // link translations: + 'relates to_inward' => 'relacionado a', + 'is (partially) refunded by_inward' => 'é (parcialmente) devolvido por', + 'is (partially) paid for by_inward' => 'é (parcialmente) pago por', + 'is (partially) reimbursed by_inward' => 'é (parcialmente) reembolsado por', + 'relates to_outward' => 'relacionado a', + '(partially) refunds_outward' => 'reembolsos (parcialmente)', + '(partially) pays for_outward' => 'paga (parcialmente) por', + '(partially) reimburses_outward' => 'reembolsos (parcialmente)', + + // split a transaction: + 'splits' => 'Divide-se', + 'add_another_split' => 'Adicionar outra divisão', + 'split-transactions' => 'Dividir transações', + 'do_split' => 'Fazer uma divisão', + 'split_this_withdrawal' => 'Dividir esta retirada', + 'split_this_deposit' => 'Dividir este depósito', + 'split_this_transfer' => 'Dividir essa transferência', + 'cannot_edit_multiple_source' => 'Você não pode editar transações parceladas #:id com a descrição ":description" porque ele contém várias contas de origem.', + 'cannot_edit_multiple_dest' => 'Você não pode editar transações parceladas #:id com a descrição ":description" porque ele contém várias contas de destino.', + 'cannot_edit_reconciled' => 'Você não pode editar o #:id da transação com a descrição ":description" porque foi marcado como reconciliado.', + 'cannot_edit_opening_balance' => 'Não é possível editar o saldo de abertura de uma conta.', + 'no_edit_multiple_left' => 'Você não selecionou nenhuma transação válida para editar.', + 'cannot_convert_split_journal' => 'Não é possível converter uma transação dividida', + + // import bread crumbs and titles: + 'import' => 'Importar', + 'import_data' => 'Importar dados', + 'import_general_index_file' => 'Importar um arquivo', + 'import_from_bunq' => 'Importar de bunq', + 'import_using_spectre' => 'Importar usando Spectre', + 'import_using_plaid' => 'Importar usando Plaid', + 'import_config_bread_crumb' => 'Configurar a sua importação', + + // import index page: + 'import_index_title' => 'Importar dados para o Firefly III', + 'import_index_sub_title' => 'Índice', + 'import_general_index_intro' => 'Bem-vindo à rotina de importação do Firefly. Existem algumas maneiras de importar dados no Firefly III, exibidos aqui como botões.', + + // sandstorm.io errors and messages: + 'sandstorm_not_available' => 'Esta função não está disponível quando você está usando o Firefly III dentro de um ambiente Sandstorm.io.', + + // empty lists? no objects? instructions: + 'no_accounts_title_asset' => 'Vamos criar uma conta ativa!', + 'no_accounts_intro_asset' => 'Ainda não possui contas ativas. As contas ativas são suas principais contas: sua conta corrente, conta poupança, conta compartilhada ou mesmo seu cartão de crédito.', + 'no_accounts_imperative_asset' => 'Para começar a usar o Firefly III, você deve criar pelo menos uma conta ativa. Vamos fazer agora:', + 'no_accounts_create_asset' => 'Criar uma conta ativa', + 'no_accounts_title_expense' => 'Vamos criar uma conta de despesas!', + 'no_accounts_intro_expense' => 'Você ainda não possui contas de despesas. As contas de despesas são os lugares onde você gasta dinheiro, como lojas e supermercados.', + 'no_accounts_imperative_expense' => 'As contas de despesas são criadas automaticamente quando você cria transações, mas você também pode criar uma manualmente, se desejar. Vamos criar uma agora:', + 'no_accounts_create_expense' => 'Criar uma conta de despesas', + 'no_accounts_title_revenue' => 'Vamos criar uma conta de receita!', + 'no_accounts_intro_revenue' => 'Você ainda não possui contas de receita. As contas de receita são os locais onde você recebe dinheiro, como o seu empregador.', + 'no_accounts_imperative_revenue' => 'As contas de receita são criadas automaticamente quando você cria transações, mas você também pode criar uma manualmente, se desejar. Vamos criar um agora:', + 'no_accounts_create_revenue' => 'Criar uma conta de receita', + 'no_budgets_title_default' => 'Vamos criar um orçamento', + 'no_budgets_intro_default' => 'Você ainda não tem orçamentos. Os orçamentos são usados ​​para organizar suas despesas em grupos lógicos, o que você pode usar como uma base para limitar suas despesas.', + 'no_budgets_imperative_default' => 'Os orçamentos são as ferramentas básicas de gestão financeira. Vamos criar um agora:', + 'no_budgets_create_default' => 'Criar orçamento', + 'no_categories_title_default' => 'Vamos criar uma categoria!', + 'no_categories_intro_default' => 'Você ainda não possui categorias. As categorias são usadas para ajustar suas transações e rotulá-las com a categoria designada.', + 'no_categories_imperative_default' => 'As categorias são criadas automaticamente quando você cria transações, mas você também pode criar uma manualmente. Vamos criar uma agora:', + 'no_categories_create_default' => 'Criar uma categoria', + 'no_tags_title_default' => 'Vamos criar uma tag!', + 'no_tags_intro_default' => 'Ainda não possui tags. As tags são usadas para ajustar suas transações e rotulá-las com palavras-chave específicas.', + 'no_tags_imperative_default' => 'As tags são criadas automaticamente quando você cria transações, mas você também pode criar uma manualmente. Vamos criar uma agora:', + 'no_tags_create_default' => 'Criar uma tag', + 'no_transactions_title_withdrawal' => 'Vamos criar uma despesa!', + 'no_transactions_intro_withdrawal' => 'Ainda não tem despesas. Você deve criar despesas para começar a gerenciar suas finanças.', + 'no_transactions_imperative_withdrawal' => 'Você gastou algum dinheiro? Então você deve anotá-lo:', + 'no_transactions_create_withdrawal' => 'Crie uma despesa', + 'no_transactions_title_deposit' => 'Vamos criar algum rendimento!', + 'no_transactions_intro_deposit' => 'Você ainda não registrou renda. Você deve criar entradas de renda para começar a gerenciar suas finanças.', + 'no_transactions_imperative_deposit' => 'Você recebeu algum dinheiro? Então você deve anotá-lo:', + 'no_transactions_create_deposit' => 'Criar um depósito', + 'no_transactions_title_transfers' => 'Vamos criar uma transferência!', + 'no_transactions_intro_transfers' => 'Você ainda não tem transferências. Quando você move dinheiro entre contas ativas, ele é registrado como uma transferência.', + 'no_transactions_imperative_transfers' => 'Você moveu algum dinheiro? Então você deve anotá-lo:', + 'no_transactions_create_transfers' => 'Criar uma transferência', + 'no_piggies_title_default' => 'Vamos criar uma poupança!', + 'no_piggies_intro_default' => 'Você ainda não tem poupança. Você pode criar popanças para dividir suas economias e acompanhar para o que você está economizando.', + 'no_piggies_imperative_default' => 'Você tem coisas para as quais você está economizando? Crie uma poupança e acompanhe:', + 'no_piggies_create_default' => 'Criar uma nova poupança', + 'no_bills_title_default' => 'Vamos criar uma fatura!', + 'no_bills_intro_default' => 'Você ainda não possui faturas. Você pode criar faturas para acompanhar as despesas regulares, como sua renda ou seguro.', + 'no_bills_imperative_default' => 'Você tem essas faturas regulares? Crie uma fatura e acompanhe seus pagamentos:', + 'no_bills_create_default' => 'Criar uma fatura', +]; diff --git a/resources/lang/pt_BR/form.php b/resources/lang/pt_BR/form.php new file mode 100644 index 0000000000..6dc6aab56d --- /dev/null +++ b/resources/lang/pt_BR/form.php @@ -0,0 +1,210 @@ +. + */ +declare(strict_types=1); + +return [ + // new user: + 'bank_name' => 'Nome do banco', + 'bank_balance' => 'Saldo', + 'savings_balance' => 'Salda da Poupança', + 'credit_card_limit' => 'Limite do Cartão de Crédito', + 'automatch' => 'Equivale automaticamente', + 'skip' => 'Pular', + 'name' => 'Nome', + 'active' => 'Ativar', + 'amount_min' => 'Valor Mínimo', + 'amount_max' => 'Valor Máximo', + 'match' => 'Corresponde em', + 'repeat_freq' => 'Repetições', + 'journal_currency_id' => 'Moeda', + 'currency_id' => 'Moeda', + 'attachments' => 'Anexos', + 'journal_amount' => 'Quantia', + 'journal_source_account_name' => 'Conta de receita (fonte)', + 'journal_source_account_id' => 'Conta de ativo (fonte)', + 'BIC' => 'BIC', + 'verify_password' => 'Verificação da segurança da senha', + 'source_account' => 'Conta de origem', + 'destination_account' => 'Conta de destino', + 'journal_destination_account_id' => 'Conta de ativo (destino)', + 'asset_destination_account' => 'Conta de ativo (destino)', + 'asset_source_account' => 'Conta de ativo (fonte)', + 'journal_description' => 'Descrição', + 'note' => 'Notas', + 'split_journal' => 'Dividir essa transação', + 'split_journal_explanation' => 'Dividir essa transação em várias partes', + 'currency' => 'Moeda', + 'account_id' => 'Conta de ativo', + 'budget_id' => 'Orçamento', + 'openingBalance' => 'Saldo inicial', + 'tagMode' => 'Modo de tag', + 'tag_position' => 'Localização do indexador', + 'virtualBalance' => 'Saldo virtual', + 'targetamount' => 'Valor alvo', + 'accountRole' => 'Tipo de conta', + 'openingBalanceDate' => 'Data do Saldo inicial', + 'ccType' => 'Plano de pagamento do Cartão de Crédito', + 'ccMonthlyPaymentDate' => 'Data do pagamento mensal do Cartão de Crédito', + 'piggy_bank_id' => 'Cofrinho', + 'returnHere' => 'Retornar aqui', + 'returnHereExplanation' => 'Depois de armazenar, retorne aqui para criar outro.', + 'returnHereUpdateExplanation' => 'Depois da atualização, retorne aqui', + 'description' => 'Descrição', + 'expense_account' => 'Conta de Despesa', + 'revenue_account' => 'Conta de Receita', + 'decimal_places' => 'Casas décimais', + 'exchange_rate_instruction' => 'Moedas estrangeiras', + 'source_amount' => 'Quantidade (fonte)', + 'destination_amount' => 'Quantidade (destino)', + 'native_amount' => 'Montante original', + 'new_email_address' => 'Novo endereço de e-mail', + 'verification' => 'Verificação', + 'api_key' => 'Chave da API', + 'remember_me' => 'Lembrar-me', + + 'source_account_asset' => 'Conta de origem (conta de ativo)', + 'destination_account_expense' => 'Conta de destino (conta de despesa)', + 'destination_account_asset' => 'Conta de destino (conta de ativo)', + 'source_account_revenue' => 'Conta de origem (conta de receita)', + 'type' => 'Tipo', + 'convert_Withdrawal' => 'Converter a retirada', + 'convert_Deposit' => 'Converter o depósito', + 'convert_Transfer' => 'Converter a transferência', + + 'amount' => 'Valor', + 'date' => 'Data', + 'interest_date' => 'Data de interesse', + 'book_date' => 'Data reserva', + 'process_date' => 'Data de processamento', + 'category' => 'Categoria', + 'tags' => 'Etiquetas', + 'deletePermanently' => 'Apagar permanentemente', + 'cancel' => 'Cancelar', + 'targetdate' => 'Data Alvo', + 'startdate' => 'Data de Início', + 'tag' => 'Etiqueta', + 'under' => 'Debaixo', + 'symbol' => 'Símbolo', + 'code' => 'Código', + 'iban' => 'IBAN', + 'accountNumber' => 'Número de conta', + 'creditCardNumber' => 'Número do cartão de crédito', + 'has_headers' => 'Cabeçalhos', + 'date_format' => 'Formato da Data', + 'specifix' => 'Banco- ou arquivo específico corrigídos', + 'attachments[]' => 'Anexos', + 'store_new_withdrawal' => 'Armazenar nova retirada', + 'store_new_deposit' => 'Armazenar novo depósito', + 'store_new_transfer' => 'Armazenar nova transferência', + 'add_new_withdrawal' => 'Adicionar uma nova retirada', + 'add_new_deposit' => 'Adicionar um novo depósito', + 'add_new_transfer' => 'Adicionar uma nova transferência', + 'title' => 'Título', + 'notes' => 'Notas', + 'filename' => 'Nome do arquivo', + 'mime' => 'Tipo do Arquivo (MIME)', + 'size' => 'Tamanho', + 'trigger' => 'Disparo', + 'stop_processing' => 'Parar processamento', + 'start_date' => 'Início do intervalo', + 'end_date' => 'Final do intervalo', + 'export_start_range' => 'Início do intervalo de exportação', + 'export_end_range' => 'Fim do intervalo de exportação', + 'export_format' => 'Formato do arquivo', + 'include_attachments' => 'Incluir anexos enviados', + 'include_old_uploads' => 'Incluir dados importados', + 'accounts' => 'Exportar transações destas contas', + 'delete_account' => 'Apagar conta ":name"', + 'delete_bill' => 'Apagar fatura ":name"', + 'delete_budget' => 'Excluir o orçamento ":name"', + 'delete_category' => 'Excluir categoria ":name"', + 'delete_currency' => 'Excluir moeda ":name"', + 'delete_journal' => 'Excluir a transação com a descrição ":description"', + 'delete_attachment' => 'Apagar anexo ":name"', + 'delete_rule' => 'Excluir regra ":title"', + 'delete_rule_group' => 'Exclua o grupo de regras ":title"', + 'delete_link_type' => 'Excluir tipo de link ":name"', + 'delete_user' => 'Excluir o usuário ":email"', + 'user_areYouSure' => 'Se você excluir o usuário ":email", tudo desaparecerá. Não será possível desfazer a ação. Se excluir você mesmo, você perderá acesso total a essa instância do Firefly III.', + 'attachment_areYouSure' => 'Tem certeza que deseja excluir o anexo denominado ":name"?', + 'account_areYouSure' => 'Tem certeza que deseja excluir a conta denominada ":name"?', + 'bill_areYouSure' => 'Você tem certeza que quer apagar a fatura ":name"?', + 'rule_areYouSure' => 'Tem certeza que deseja excluir a regra intitulada ":title"?', + 'ruleGroup_areYouSure' => 'Tem certeza que deseja excluir o grupo de regras intitulado ":title"?', + 'budget_areYouSure' => 'Tem certeza que deseja excluir o orçamento chamado ":name"?', + 'category_areYouSure' => 'Tem certeza que deseja excluir a categoria com o nome ":name"?', + 'currency_areYouSure' => 'Tem certeza que deseja excluir a moeda chamada ":name"?', + 'piggyBank_areYouSure' => 'Tem certeza que deseja excluir o cofrinho chamado ":name"?', + 'journal_areYouSure' => 'Tem certeza que deseja excluir a transação descrita ":description"?', + 'mass_journal_are_you_sure' => 'Tem a certeza que pretende apagar estas transações?', + 'tag_areYouSure' => 'Você tem certeza que quer apagar a tag ":tag"?', + 'journal_link_areYouSure' => 'Tem certeza que deseja excluir a ligação entre :source e :destination?', + 'linkType_areYouSure' => 'Tem certeza que deseja excluir o tipo de link ":name" (":inward" / ":outward")?', + 'permDeleteWarning' => 'Exclusão de dados do Firely são permanentes e não podem ser desfeitos.', + 'mass_make_selection' => 'Você ainda pode evitar que itens sejam excluídos, removendo a caixa de seleção.', + 'delete_all_permanently' => 'Exclua os selecionados permanentemente', + 'update_all_journals' => 'Atualizar essas transações', + 'also_delete_transactions' => 'A única transação ligada a essa conta será excluída também.|Todas as :count transações ligadas a esta conta serão excluídas também.', + 'also_delete_connections' => 'A única transação relacionada com este tipo de link vai perder a conexão. | Todas as transações de :count ligadas com este tipo de link vão perder sua conexão.', + 'also_delete_rules' => 'A única regra que ligado a este grupo de regras será excluída também.|Todos as :count regras ligadas a este grupo de regras serão excluídas também.', + 'also_delete_piggyBanks' => 'O único cofrinho conectado a essa conta será excluído também.|Todos os :count cofrinhos conectados a esta conta serão excluídos também.', + 'bill_keep_transactions' => 'A única transação a esta conta não será excluída.|Todos as :count transações conectadas a esta fatura não serão excluídos.', + 'budget_keep_transactions' => 'A única transação conectada a este orçamento não será excluída.|Todos :count transações ligadas a este orçamento não serão excluídos.', + 'category_keep_transactions' => 'A única transação ligada a esta categoria não será excluída.|Todos :count transações ligadas a esta categoria não serão excluídos.', + 'tag_keep_transactions' => 'A única transação ligada a essa marca não será excluída.|Todos :count transações ligadas a essa marca não serão excluídos.', + 'check_for_updates' => 'Buscar atualizações', + + 'email' => 'E-mail', + 'password' => 'Senha', + 'password_confirmation' => 'Senha(Confirmar)', + 'blocked' => 'Está bloqueado?', + 'blocked_code' => 'Razão para ser reportado', + + // admin + 'domain' => 'Domínio', + 'single_user_mode' => 'Desabilitar registro de usuários', + 'is_demo_site' => 'É o site de demonstração', + + // import + 'import_file' => 'Importar arquivo', + 'configuration_file' => 'Arquivo de configuração', + 'import_file_type' => 'Tipo de arquivo de importação', + 'csv_comma' => 'Uma vírgula (,)', + 'csv_semicolon' => 'Um ponto e vírgula (;)', + 'csv_tab' => 'Um Tab (invisível)', + 'csv_delimiter' => 'Delimitador de campo CSV', + 'csv_import_account' => 'Conta de importação padrão', + 'csv_config' => 'Importar CSV de configuração', + 'client_id' => 'Id do Cliente', + 'service_secret' => 'Service secret', + 'app_secret' => 'App secret', + 'public_key' => 'Chave pública', + 'country_code' => 'Código do país', + 'provider_code' => 'Banco ou provedor de dados', + + 'due_date' => 'Data de vencimento', + 'payment_date' => 'Data de pagamento', + 'invoice_date' => 'Data da Fatura', + 'internal_reference' => 'Referência interna', + 'inward' => 'Descrição interna', + 'outward' => 'Descrição externa', + 'rule_group_id' => 'Grupo de regras', +]; diff --git a/resources/lang/pt_BR/import.php b/resources/lang/pt_BR/import.php new file mode 100644 index 0000000000..f1ac8ca769 --- /dev/null +++ b/resources/lang/pt_BR/import.php @@ -0,0 +1,190 @@ +. + */ +declare(strict_types=1); + +return [ + // status of import: + 'status_wait_title' => 'Por favor espere...', + 'status_wait_text' => 'Esta caixa desaparecerá em um instante.', + 'status_fatal_title' => 'Ocorreu um erro fatal', + 'status_fatal_text' => 'Ocorreu um erro fatal, cuja rotina de importação não pode se recuperar. Veja a explicação em vermelho abaixo.', + 'status_fatal_more' => 'Se o erro for um tempo limite, a importação terá parado a meio caminho. Para algumas configurações do servidor, é apenas o servidor que parou enquanto a importação continua em execução em segundo plano. Para verificar isso, confira os arquivos de log. Se o problema persistir, considere importação na linha de comando em vez disso.', + 'status_ready_title' => 'A importação está pronta para começar', + 'status_ready_text' => 'A importação está pronta para começar. Toda a configuração que você precisava fazer foi feita. Faça o download do arquivo de configuração. Isso irá ajudá-lo com a importação se não for como planejado. Para realmente executar a importação, você pode executar o seguinte comando no seu console ou executar a importação baseada na web. Dependendo da sua configuração, a importação do console lhe dará mais comentários.', + 'status_ready_noconfig_text' => 'A importação está pronta para começar. Toda a configuração que você precisava fazer foi feita. Para realmente executar a importação, você pode executar o seguinte comando no seu console ou executar a importação baseada na web. Dependendo da sua configuração, a importação do console lhe dará mais comentários.', + 'status_ready_config' => 'Download da configuração', + 'status_ready_start' => 'Iniciar a importação', + 'status_ready_share' => 'Por favor, considere baixar sua configuração e compartilhá-la no centro de configuração de importação. Isso permitirá que outros usuários do Firefly III importem seus arquivos mais facilmente.', + 'status_job_new' => 'O trabalho é novo.', + 'status_job_configuring' => 'A importação está sendo configurada.', + 'status_job_configured' => 'A importação está configurada.', + 'status_job_running' => 'A importação está em execução.. Aguarde..', + 'status_job_error' => 'O trabalho gerou um erro.', + 'status_job_finished' => 'A importação terminou!', + 'status_running_title' => 'A importação está em execução', + 'status_running_placeholder' => 'Por favor, aguarde uma atualização...', + 'status_finished_title' => 'Rotina de importação concluída', + 'status_finished_text' => 'A rotina de importação importou seus dados.', + 'status_errors_title' => 'Erros durante a importação', + 'status_errors_single' => 'Ocorreu um erro durante a importação. Não parece ser fatal.', + 'status_errors_multi' => 'Alguns erros ocorreram durante a importação. Estes não parecem ser fatais.', + 'status_bread_crumb' => 'Status de importação', + 'status_sub_title' => 'Status de importação', + 'config_sub_title' => 'Configurar a sua importação', + 'status_finished_job' => 'As transações de :count importadas podem ser encontradas na tag :tag.', + 'status_finished_no_tag' => 'O Firefly III não coletou nenhum periódico do seu arquivo de importação.', + 'import_with_key' => 'Importar com a chave \':key\'', + + // file, upload something + 'file_upload_title' => 'Configuração de importação (1/4) - Carregar seu arquivo', + 'file_upload_text' => 'Esta rotina irá ajudá-lo a importar arquivos do seu banco para o Firefly III. Por favor, confira as páginas de ajuda no canto superior direito.', + 'file_upload_fields' => 'Campos', + 'file_upload_help' => 'Selecione seu arquivo', + 'file_upload_config_help' => 'Se você já importou dados no Firefly III, você pode ter um arquivo de configuração, que irá predefinir os valores de configuração para você. Para alguns bancos, outros usuários forneceram gentilmente o arquivo arquivo de configuração', + 'file_upload_type_help' => 'Selecione o tipo de arquivo que você fará o upload', + 'file_upload_submit' => 'Upload de arquivos', + + // file, upload types + 'import_file_type_csv' => 'CSV (valores separados por vírgula)', + + // file, initial config for CSV + 'csv_initial_title' => 'Configuração de importação (2/4) - Configuração de importação CSV básica', + 'csv_initial_text' => 'Para ser capaz de importar o arquivo corretamente, por favor valide as opções abaixo.', + 'csv_initial_box' => 'Configuração básica de importação CSV', + 'csv_initial_box_title' => 'Opções básicas de configuração de importação CSV', + 'csv_initial_header_help' => 'Marque esta caixa se a primeira linha do seu arquivo CSV for os títulos das colunas.', + 'csv_initial_date_help' => 'Formato de data e hora em seu CSV. Siga o formato como indica esta página. O valor padrão analisará datas que se parecem com isso: :dateExample.', + 'csv_initial_delimiter_help' => 'Escolha o delimitador de campo que é usado em seu arquivo de entrada. Se não tiver certeza, a vírgula é a opção mais segura.', + 'csv_initial_import_account_help' => 'Se o seu arquivo CSV NÃO contém informações sobre sua(s) conta(s) ativa(s), use este combobox para selecionar para qual conta pertencem as transações no CSV.', + 'csv_initial_submit' => 'Continue com o passo 3/4', + + // file, new options: + 'file_apply_rules_title' => 'Aplicar regras', + 'file_apply_rules_description' => 'Aplique suas regras. Observe que isso reduz significativamente a velocidade da importação.', + 'file_match_bills_title' => 'Correspondência de contas', + 'file_match_bills_description' => 'Combine suas contas para retiradas recém-criadas. Observe que isso diminui significativamente a velocidade de importação.', + + // file, roles config + 'csv_roles_title' => 'Configuração de importação (3/4) - Definir o papel de cada coluna', + 'csv_roles_text' => 'Cada coluna no seu arquivo CSV contém certos dados. Por favor, indique que tipo de dados, o importador deve esperar. A opção "mapear" dados significa que você vai ligar cada entrada encontrada na coluna para um valor em seu banco de dados. Uma coluna mapeada muitas vezes é a coluna que contém o IBAN da conta oposta. Isso pode ser facilmente combinado para o IBAN já presente em seu banco de dados.', + 'csv_roles_table' => 'Tabela', + 'csv_roles_column_name' => 'Nome da coluna', + 'csv_roles_column_example' => 'Dados de exemplo da coluna', + 'csv_roles_column_role' => 'Significado dos dados da coluna', + 'csv_roles_do_map_value' => 'Mapear estes valores', + 'csv_roles_column' => 'Coluna', + 'csv_roles_no_example_data' => 'Não há dados de exemplo disponíveis', + 'csv_roles_submit' => 'Continue com o passo 4/4', + + // 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.', + 'file_map_field_value' => 'Valor do campo', + 'file_map_field_mapped_to' => 'Mapeado para', + 'map_do_not_map' => '(não mapear)', + 'file_map_submit' => 'Iniciar a importação', + 'file_nothing_to_map' => 'Não há dados presentes no seu arquivo que você possa mapear para os valores existentes. Pressione "Iniciar a importação" para continuar.', + + // map things. + 'column__ignore' => '(ignorar esta coluna)', + 'column_account-iban' => 'Conta Ativa (IBAN)', + 'column_account-id' => 'ID da conta ativa (correspondência FF3)', + 'column_account-name' => 'Conta Ativa (nome)', + 'column_amount' => 'Montante', + 'column_amount_foreign' => 'Montante (em moeda estrangeira)', + 'column_amount_debit' => 'Montante (coluna de débito)', + 'column_amount_credit' => 'Montante (coluna de crédito)', + 'column_amount-comma-separated' => 'Montante (vírgula como separador decimal)', + 'column_bill-id' => 'ID da fatura (correspondente FF3)', + 'column_bill-name' => 'Nome da Fatura', + 'column_budget-id' => 'ID do Orçamento (correspondente FF3)', + 'column_budget-name' => 'Nome do Orçamento', + 'column_category-id' => 'ID da Categoria (correspondente FF3)', + 'column_category-name' => 'Nome da Categoria', + 'column_currency-code' => 'Código da Moeda (ISO 4217)', + 'column_foreign-currency-code' => 'Código de moeda estrangeira (ISO 4217)', + 'column_currency-id' => 'ID da Moeda (correspondente FF3)', + 'column_currency-name' => 'Nome da Moeda (correspondente FF3)', + 'column_currency-symbol' => 'Símbolo da Moeda (correspondente FF3)', + 'column_date-interest' => 'Data de cálculo de juros', + 'column_date-book' => 'Data da reserva de transação', + 'column_date-process' => 'Data do processo de transação', + 'column_date-transaction' => 'Data', + 'column_description' => 'Descrição', + 'column_opposing-iban' => 'Conta contrária (IBAN)', + '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_tags-comma' => 'Tags (separadas por vírgula)', + 'column_tags-space' => 'Tags (separadas por espaço)', + 'column_account-number' => 'Conta ativa (número da conta)', + 'column_opposing-number' => 'Conta Contrária (número da conta)', + 'column_note' => 'Nota(s)', + + // 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.', + + // Spectre + 'spectre_title' => 'Importar usando Spectre', + 'spectre_prerequisites_title' => 'Pré-requisitos para uma importação usando Spectre', + 'spectre_prerequisites_text' => 'Para importar dados usando a Spectre API, você deve fornecer ao Firefly III dois valores secretos. Eles podem ser encontrados na página de segredos.', + 'spectre_enter_pub_key' => 'A importação só funcionará quando você inserir essa chave pública em sua página de segurança.', + 'spectre_accounts_title' => 'Selecione as contas a serem importadas', + 'spectre_accounts_text' => 'Cada conta à esquerda abaixo foi encontrada pela Spectre e pode ser importada para Firefly III. Por favor selecione a conta ativa que deve armazenar as transações. Se você não deseja importar de qualquer conta específica, desmarque a caixa de seleção.', + 'spectre_do_import' => 'Sim, importe a partir desta conta', + + // keys from "extra" array: + 'spectre_extra_key_iban' => 'IBAN', + 'spectre_extra_key_swift' => 'SWIFT', + 'spectre_extra_key_status' => 'Status', + 'spectre_extra_key_card_type' => 'Tipo de Cartão', + 'spectre_extra_key_account_name' => 'Nome da Conta', + 'spectre_extra_key_client_name' => 'Nome do cliente', + 'spectre_extra_key_account_number' => 'Número da conta', + 'spectre_extra_key_blocked_amount' => 'Montante bloqueado', + 'spectre_extra_key_available_amount' => 'Montante disponível', + 'spectre_extra_key_credit_limit' => 'Limite de crédito', + 'spectre_extra_key_interest_rate' => 'Taxa de juros', + 'spectre_extra_key_expiry_date' => 'Data de vencimento', + 'spectre_extra_key_open_date' => 'Data de abertura', + 'spectre_extra_key_current_time' => 'Hora atual', + 'spectre_extra_key_current_date' => 'Data atual', + 'spectre_extra_key_cards' => 'Cartões', + 'spectre_extra_key_units' => 'Unidades', + 'spectre_extra_key_unit_price' => 'Preço unitário', + 'spectre_extra_key_transactions_count' => 'Contagem de transações', + + // 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 new file mode 100644 index 0000000000..4ccb1aa010 --- /dev/null +++ b/resources/lang/pt_BR/intro.php @@ -0,0 +1,133 @@ +. + */ +declare(strict_types=1); + +return [ + // index + 'index_intro' => 'Bem-vindo à página de inicial do Firefly III. Por favor, aproveite esta introdução para verificar como funciona o Firefly III.', + 'index_accounts-chart' => 'Este gráfico mostra o saldo atual de suas contas de ativos. Você pode selecionar as contas visíveis aqui nas suas preferências.', + 'index_box_out_holder' => 'Esta pequena caixa e as caixas próximas a esta lhe darão uma rápida visão geral de sua situação financeira.', + 'index_help' => 'Se você precisar de ajuda com uma página ou um formulário, pressione este botão.', + 'index_outro' => 'A maioria das páginas do Firefly III começará com uma pequena turnê como esta. Entre em contato comigo quando tiver dúvidas ou comentários. Vamos lá!', + 'index_sidebar-toggle' => 'Para criar novas transações, contas ou outras coisas, use o menu abaixo deste ícone.', + + // create account: + 'accounts_create_iban' => 'Dê a suas contas um IBAN válido. Isso poderá tornar a importação de dados muito fácil no futuro.', + 'accounts_create_asset_opening_balance' => 'As contas de bens podem ter um "saldo de abertura", indicando o início do histórico desta conta no Firefly III.', + 'accounts_create_asset_currency' => 'Firefly III suporta múltiplas moedas. As contas de ativos têm uma moeda principal, que você deve definir aqui.', + 'accounts_create_asset_virtual' => 'Às vezes, ajuda a dar à sua conta um saldo virtual: um valor extra sempre adicionado ou removido do saldo real.', + + // budgets index + 'budgets_index_intro' => 'Os orçamentos são usados ​​para gerenciar suas finanças e formar uma das principais funções do Firefly III.', + 'budgets_index_set_budget' => 'Defina seu orçamento total para todos os períodos, de modo que o Firefly III possa lhe dizer se você orçou todo o dinheiro disponível.', + 'budgets_index_see_expenses_bar' => 'Gastar dinheiro vai preencher lentamente esta barra.', + 'budgets_index_navigate_periods' => 'Navegue por períodos para definir os orçamentos facilmente antes do tempo.', + 'budgets_index_new_budget' => 'Crie novos orçamentos conforme for entendendo o programa.', + 'budgets_index_list_of_budgets' => 'Use esta tabela para definir os montantes para cada orçamento e veja como você está fazendo.', + 'budgets_index_outro' => 'Para saber mais sobre orçamentação, clique no ícone de ajuda no canto superior direito.', + + // reports (index) + 'reports_index_intro' => 'Use esses relatórios para obter informações detalhadas sobre suas finanças.', + 'reports_index_inputReportType' => 'Escolha um tipo de relatório. Confira as páginas de ajuda para ver o que cada relatório mostra.', + 'reports_index_inputAccountsSelect' => 'Você pode excluir ou incluir contas de ativos de acordo com a sua demanda.', + 'reports_index_inputDateRange' => 'O intervalo de datas selecionado depende inteiramente de você: de um dia a 10 anos.', + 'reports_index_extra-options-box' => 'Dependendo do relatório que você selecionou, você pode usar filtros e opções adicionais aqui. Observe esta caixa quando você altera os tipos de relatórios.', + + // reports (reports) + 'reports_report_default_intro' => 'Este relatório lhe dará uma visão geral rápida e abrangente de suas finanças. Se você deseja ver mais alguma coisa, não hesite em contactar-me!', + 'reports_report_audit_intro' => 'Este relatório fornecerá informações detalhadas sobre suas contas de ativos.', + 'reports_report_audit_optionsBox' => 'Use essas caixas de seleção para mostrar ou ocultar as colunas em que você está interessado.', + + 'reports_report_category_intro' => 'Este relatório lhe dará uma visão em uma ou várias categorias.', + 'reports_report_category_pieCharts' => 'Esses gráficos fornecerão informações sobre despesas e receitas por categoria ou por conta.', + 'reports_report_category_incomeAndExpensesChart' => 'Este gráfico mostra suas despesas e receitas por categoria.', + + 'reports_report_tag_intro' => 'Este relatório lhe dará uma visão de um ou vários indexadores.', + 'reports_report_tag_pieCharts' => 'Esses gráficos fornecerão informações sobre despesas e receitas por indexador, conta, categoria ou orçamento.', + 'reports_report_tag_incomeAndExpensesChart' => 'Este gráfico mostra suas despesas e receita por indexador.', + + 'reports_report_budget_intro' => 'Este relatório lhe dará uma visão em um ou vários orçamentos.', + 'reports_report_budget_pieCharts' => 'Esses gráficos fornecerão informações sobre despesas por orçamento ou por conta.', + 'reports_report_budget_incomeAndExpensesChart' => 'Este gráfico mostra suas despesas por orçamento.', + + // create transaction + 'transactions_create_switch_box' => 'Use esses botões para mudar rapidamente o tipo de transação que deseja salvar.', + 'transactions_create_ffInput_category' => 'Você pode digitar livremente neste campo. As categorias criadas anteriormente serão sugeridas.', + 'transactions_create_withdrawal_ffInput_budget' => 'Vincule sua ;crwdn:gr:0:gr:crwdn; um orçamento para um melhor controle financeiro.', + 'transactions_create_withdrawal_currency_dropdown_amount' => 'Use este menu suspenso quando sua ;crwdn:gr:0:gr:crwdn; for em outra moeda.', + 'transactions_create_deposit_currency_dropdown_amount' => 'Use este menu suspenso quando seu depósito estiver em outra moeda.', + 'transactions_create_transfer_ffInput_piggy_bank_id' => 'Selecione um banco e vincule essa transferência às suas economias.', + + // piggy banks index: + 'piggy-banks_index_saved' => 'Este campo mostra o quanto você salvou em cada banco.', + 'piggy-banks_index_button' => 'Ao lado desta barra de progresso estão dois botões (+ e -) para adicionar ou remover dinheiro de cada banco.', + 'piggy-banks_index_accountStatus' => 'Para cada conta de ativos com pelo menos um banco, o status está listado nesta tabela.', + + // create piggy + 'piggy-banks_create_name' => 'Qual é o teu objetivo? Um novo sofá, uma câmera, dinheiro para emergências?', + 'piggy-banks_create_date' => 'Você pode definir uma data-alvo ou um prazo para seu banco.', + + // show piggy + 'piggy-banks_show_piggyChart' => 'Este gráfico mostrará o histórico desse banco.', + 'piggy-banks_show_piggyDetails' => 'Alguns detalhes sobre o seu banco', + 'piggy-banks_show_piggyEvents' => 'Todas as adições ou remoções também estão listadas aqui.', + + // bill index + 'bills_index_paid_in_period' => 'Este campo indica quando a conta foi paga pela última vez.', + 'bills_index_expected_in_period' => 'Este campo indica, para cada conta, se e quando a próxima fatura é esperada para cair em conta.', + + // show bill + 'bills_show_billInfo' => 'Esta tabela mostra algumas informações gerais sobre este projeto.', + 'bills_show_billButtons' => 'Use este botão para digitalizar novamente transações velhas, então eles serão combinados a este projeto.', + 'bills_show_billChart' => 'Este gráfico mostra as operações vinculadas a este projeto.', + + // create bill + 'bills_create_name' => 'Use um nome descritivo como "Aluguel" ou "Seguro de saúde".', + 'bills_create_match' => 'Para juntar ou combinar transações, use termos ou indexadores dessas transações, você também pode usar a conta de despesas envolvida. Todas as palavras usadas devem ter alguma correspondência.', + 'bills_create_amount_min_holder' => 'Selecione um valor mínimo e máximo para esta conta.', + 'bills_create_repeat_freq_holder' => 'A maioria das contas são repetidas mensalmente, como no caso de pagamentos fixos mensais. Mas você pode definir outra frequência neste menu aqui.', + 'bills_create_skip_holder' => 'Se uma conta se repete a cada 2 semanas, por exemplo, o campo "ignorar" deve ser definido como "1" para ignorar todas as outras semanas.', + + // rules index + 'rules_index_intro' => 'O Firefly III permite que você gerencie as regras, que serão automaticamente aplicadas a qualquer transação que você crie ou edite.', + 'rules_index_new_rule_group' => 'Você pode criar grupos de regras para facilitar o gerenciamento.', + 'rules_index_new_rule' => 'Crie quantas regras desejar.', + 'rules_index_prio_buttons' => 'Você pode ordená-los da maneira que desejar.', + 'rules_index_test_buttons' => 'Você pode testar suas regras ou aplicá-las em transações existentes.', + 'rules_index_rule-triggers' => 'As regras têm "gatilhos/executores/disparadores" e "ações" que você pode encomendar apenas com funções de arrastar e soltar.', + 'rules_index_outro' => 'Certifique-se de verificar as páginas de ajuda usando o ícone (?) No canto superior direito!', + + // create rule: + 'rules_create_mandatory' => 'Escolha um título descritivo e configure quando a regra deve ser executada.', + 'rules_create_ruletriggerholder' => 'Adicione tantos disparadores quanto quiser, mas lembre-se de que TODOS os gatilhos devem ter correspondência antes que qualquer ação seja executada.', + 'rules_create_test_rule_triggers' => 'Use este botão para ver quais transações combinariam com sua regra.', + 'rules_create_actions' => 'Defina todas ações que desejar realizar.', + + // preferences + 'preferences_index_tabs' => 'Mais opções estão disponíveis atrás dessas abas/guias.', + + // currencies + 'currencies_index_intro' => 'Firefly III suporta múltiplas moedas, que você pode alterar nesta página.', + 'currencies_index_default' => 'Firefly III tem uma moeda padrão. Você pode mudar usando esses botões.', + + // create currency + 'currencies_create_code' => 'Este código deve ser compatível com ISO (Google é para sua nova moeda).', +]; diff --git a/resources/lang/pt_BR/list.php b/resources/lang/pt_BR/list.php new file mode 100644 index 0000000000..4b70560e18 --- /dev/null +++ b/resources/lang/pt_BR/list.php @@ -0,0 +1,105 @@ +. + */ +declare(strict_types=1); + +return [ + 'buttons' => 'Botões', + 'icon' => 'Ícone', + 'id' => 'ID', + 'create_date' => 'Criado em', + 'update_date' => 'Atualizado em', + 'updated_at' => 'Atualizado em', + 'balance_before' => 'Saldo Antes', + 'balance_after' => 'Saldo depois', + 'name' => 'Nome', + 'role' => 'Papel', + 'currentBalance' => 'Saldo atual', + 'active' => 'Está ativo?', + 'lastActivity' => 'Última atividade', + 'balanceDiff' => 'Diferença de saldo', + 'matchesOn' => 'Correspondido em', + 'account_type' => 'Tipo de conta', + 'created_at' => 'Criado em', + 'account' => 'Conta', + 'matchingAmount' => 'Total', + 'split_number' => 'Dividir #', + 'destination' => 'Destino', + 'source' => 'Fonte', + 'next_expected_match' => 'Próximo correspondente esperado', + 'automatch' => 'Correspondência automática?', + 'repeat_freq' => 'Repetições', + 'description' => 'Descrição', + 'amount' => 'Total', + 'internal_reference' => 'Referência interna', + 'date' => 'Data', + 'interest_date' => 'Data de interesse', + 'book_date' => 'Data reserva', + 'process_date' => 'Data de processamento', + 'due_date' => 'Prazo', + 'payment_date' => 'Data de pagamento', + 'invoice_date' => 'Data da Fatura', + 'interal_reference' => 'Referência interna', + 'notes' => 'Notas', + 'from' => 'De', + 'piggy_bank' => 'Cofrinho', + 'to' => 'Até', + 'budget' => 'Orçamento', + 'category' => 'Categoria', + 'bill' => 'Fatura', + 'withdrawal' => 'Retirada', + 'deposit' => 'Depósito', + 'transfer' => 'Transferência', + 'type' => 'Tipo', + 'completed' => 'Completo', + 'iban' => 'IBAN', + 'paid_current_period' => 'Pago este período', + 'email' => 'Email', + 'registered_at' => 'Registrado em', + 'is_blocked' => 'Está bloqueado', + 'is_admin' => 'É admin', + 'has_two_factor' => 'Tem 2FA', + 'blocked_code' => 'Bloco de código', + 'source_account' => 'Conta de origem', + 'destination_account' => 'Conta de destino', + 'accounts_count' => 'Número de Contas', + 'journals_count' => 'Número de transações', + 'attachments_count' => 'Número de anexos', + 'bills_count' => 'Número de contas', + 'categories_count' => 'Número de categorias', + 'export_jobs_count' => 'Número de jobs de exportação', + 'import_jobs_count' => 'Número de jobs de importação', + 'budget_count' => 'Número de orçamentos', + 'rule_and_groups_count' => 'Número de regras e grupos de regras', + 'tags_count' => 'Número de tags', + 'tags' => 'Indexadores', + 'inward' => 'Descrição interna', + 'outward' => 'Descrição externa', + 'number_of_transactions' => 'Número de transações', + 'total_amount' => 'Valor total', + 'sum' => 'Soma', + 'sum_excluding_transfers' => 'Soma (excluindo transferências)', + 'sum_withdrawals' => 'Soma de retiradas', + 'sum_deposits' => 'Soma dos depósitos', + 'sum_transfers' => 'Soma das transferências', + 'reconcile' => 'Pago', + 'account_on_spectre' => 'Conta (Spectre)', + 'do_import' => 'Importar desta conta', +]; diff --git a/resources/lang/pt_BR/pagination.php b/resources/lang/pt_BR/pagination.php new file mode 100644 index 0000000000..11723a2a66 --- /dev/null +++ b/resources/lang/pt_BR/pagination.php @@ -0,0 +1,26 @@ +. + */ +declare(strict_types=1); + +return [ + 'previous' => '« Anterior', + 'next' => 'Próximo »', +]; diff --git a/resources/lang/pt_BR/passwords.php b/resources/lang/pt_BR/passwords.php new file mode 100644 index 0000000000..dc8fbf3837 --- /dev/null +++ b/resources/lang/pt_BR/passwords.php @@ -0,0 +1,30 @@ +. + */ +declare(strict_types=1); + +return [ + 'password' => 'A senha precisa ter no mínimo seis caracteres e tem que ser igual à confirmação de senha.', + 'user' => 'Não foi possível encontrar o usuário com este e-mail.', + 'token' => 'Este token de redefinição de senha é inválido.', + 'sent' => 'Nós te enviamos um email com um link para trocar a senha!', + 'reset' => 'Sua senha foi redefinida!', + 'blocked' => 'Boa tentativa.', +]; diff --git a/resources/lang/pt_BR/validation.php b/resources/lang/pt_BR/validation.php new file mode 100644 index 0000000000..211422af55 --- /dev/null +++ b/resources/lang/pt_BR/validation.php @@ -0,0 +1,136 @@ +. + */ +declare(strict_types=1); + +return [ + 'iban' => 'Este não é um válido IBAN.', + 'unique_account_number_for_user' => 'Parece que este número de conta já está em uso.', + 'deleted_user' => 'Devido a restrições de segurança, você não pode registrar usando este endereço de e-mail.', + 'rule_trigger_value' => 'Este valor é inválido para o disparo selecionado.', + 'rule_action_value' => 'Este valor é inválido para a ação selecionada.', + 'file_already_attached' => 'Arquivo ":name" carregado já está anexado para este objeto.', + 'file_attached' => 'Arquivo carregado com sucesso ":name".', + 'file_invalid_mime' => 'Arquivo ":name" é do tipo ":mime" que não é aceito como um novo upload.', + 'file_too_large' => 'Arquivo ":name" é muito grande.', + 'belongs_to_user' => 'O valor de :attribute é desconhecido', + 'accepted' => 'O campo :attribute deve ser aceito.', + 'bic' => 'Este não é um BIC válido.', + 'more' => ':attribute deve ser maior que zero.', + 'active_url' => 'O campo :attribute não contém um URL válido.', + 'after' => 'O campo :attribute deverá conter uma data posterior a :date.', + 'alpha' => 'O campo :attribute deverá conter apenas letras.', + 'alpha_dash' => 'O campo :attribute deverá conter apenas letras, números e traços.', + 'alpha_num' => 'O campo :attribute deverá conter apenas letras e números .', + 'array' => 'O campo :attribute precisa ser um conjunto.', + 'unique_for_user' => 'Já existe uma entrada com este :attribute.', + 'before' => 'O campo :attribute deverá conter uma data anterior a :date.', + 'unique_object_for_user' => 'Este nome já está em uso', + 'unique_account_for_user' => 'Este nome de conta já está em uso', + 'between.numeric' => 'O campo :attribute deverá ter um valor entre :min - :max.', + 'between.file' => 'O campo :attribute deverá ter um tamanho entre :min - :max kilobytes.', + 'between.string' => 'O campo :attribute deverá conter entre :min - :max caracteres.', + 'between.array' => 'O campo :attribute precisar ter entre :min - :max itens.', + 'boolean' => 'O campo :attribute deverá ter o valor verdadeiro ou falso.', + 'confirmed' => 'A confirmação para o campo :attribute não coincide.', + 'date' => 'O campo :attribute não contém uma data válida.', + 'date_format' => 'A data indicada para o campo :attribute não respeita o formato :format.', + 'different' => 'Os campos :attribute e :other deverão conter valores diferentes.', + 'digits' => 'O campo :attribute deverá conter :digits dígitos.', + 'digits_between' => 'O campo :attribute deverá conter entre :min a :max dígitos.', + 'email' => 'O campo :attribute não contém um endereço de email válido.', + 'filled' => 'O campo :attribute é obrigatório.', + 'exists' => 'O valor selecionado para o campo :attribute é inválido.', + 'image' => 'O campo :attribute deverá conter uma imagem.', + 'in' => 'O campo :attribute não contém um valor válido.', + 'integer' => 'O campo :attribute deverá conter um número inteiro.', + 'ip' => 'O campo :attribute deverá conter um IP válido.', + 'json' => 'O campo :attribute deverá conter uma string JSON válida.', + 'max.numeric' => 'O campo :attribute não deverá conter um valor superior a :max.', + 'max.file' => 'O campo :attribute não deverá ter um tamanho superior a :max kilobytes.', + 'max.string' => 'O campo :attribute não deverá conter mais de :max caracteres.', + 'max.array' => 'O campo :attribute deve ter no máximo :max itens.', + 'mimes' => 'O campo :attribute deverá conter um arquivo do tipo: :values.', + 'min.numeric' => 'O campo :attribute deverá ter um valor superior ou igual a :min.', + 'min.file' => 'O campo :attribute deverá ter no mínimo :min kilobytes.', + 'min.string' => 'O campo :attribute deverá conter no mínimo :min caracteres.', + 'min.array' => 'O campo :attribute deve ter no mínimo :min itens.', + 'not_in' => 'O campo :attribute contém um valor inválido.', + 'numeric' => 'O campo :attribute deverá conter um valor numérico.', + 'regex' => 'O formato do valor para o campo :attribute é inválido.', + 'required' => 'O campo :attribute é obrigatório.', + 'required_if' => 'O campo :attribute é obrigatório quando o valor do campo :other é igual a :value.', + 'required_unless' => 'O campo :attribute é obrigatório a menos que :other esteja presente em :values.', + 'required_with' => 'O campo :attribute é obrigatório quando :values está presente.', + 'required_with_all' => 'O campo :attribute é obrigatório quando um dos :values está presente.', + 'required_without' => 'O campo :attribute é obrigatório quanto :values não está presente.', + 'required_without_all' => 'O campo :attribute é obrigatório quando nenhum dos :values está presente.', + 'same' => 'Os campos :attribute e :other deverão conter valores iguais.', + 'size.numeric' => 'O campo :attribute deverá conter o valor :size.', + 'size.file' => 'O campo :attribute deverá ter o tamanho de :size kilobytes.', + 'size.string' => 'O campo :attribute deverá conter :size caracteres.', + 'size.array' => 'O campo :attribute deve ter :size itens.', + 'unique' => 'O valor indicado para o campo :attribute já se encontra utilizado.', + 'string' => 'O campo :attribute deve ser uma string.', + 'url' => 'O formato do URL indicado para o campo :attribute é inválido.', + 'timezone' => 'O campo :attribute deverá ter um fuso horário válido.', + '2fa_code' => 'O campo :attribute é inválido.', + 'dimensions' => 'O campo :attribute tem dimensões de imagem inválido.', + 'distinct' => 'O campo :attribute tem um valor duplicado.', + 'file' => 'O :attribute deve ser um arquivo.', + 'in_array' => 'O campo :attribute não existe em :other.', + 'present' => 'O campo :attribute deve estar presente.', + 'amount_zero' => 'A quantidade total não pode ser zero', + 'secure_password' => 'Esta não é uma senha segura. Por favor, tente novamente. Para mais informações, visite https://goo.gl/NCh2tN', + 'attributes' => [ + 'email' => 'endereço de e-mail', + 'description' => 'descrição', + 'amount' => 'quantidade', + 'name' => 'nome', + 'targetamount' => 'quantidade alvo', + 'openingBalanceDate' => 'data do Saldo inicial', + 'openingBalance' => 'saldo inicial', + 'match' => 'coincidente', + 'amount_min' => 'valor mínimo', + 'amount_max' => 'valor máximo', + 'title' => 'título', + 'tag' => 'identificador', + 'rule-action-value.1' => 'valor de ação de regra #1', + 'rule-action-value.2' => 'valor de ação de regra #2', + 'rule-action-value.3' => 'valor de ação de regra #3', + 'rule-action-value.4' => 'valor de ação de regra #4', + 'rule-action-value.5' => 'valor de ação de regra #5', + 'rule-action.1' => 'regra de ação #1', + 'rule-action.2' => 'regra de ação #2', + 'rule-action.3' => 'regra de ação #3', + 'rule-action.4' => 'regra de ação #4', + 'rule-action.5' => 'regra de ação #5', + 'rule-trigger-value.1' => 'valor do disparador da regra #1', + 'rule-trigger-value.2' => 'valor do disparador da regra #2', + 'rule-trigger-value.3' => 'valor do disparador da regra #3', + 'rule-trigger-value.4' => 'valor do disparador da regra #4', + 'rule-trigger-value.5' => 'valor do disparador da regra #5', + 'rule-trigger.1' => 'disparador da regra #1', + 'rule-trigger.2' => 'disparador da regra #2', + 'rule-trigger.3' => 'disparador da regra #3', + 'rule-trigger.4' => 'disparador da regra #4', + 'rule-trigger.5' => 'disparador da regra #5', + ], +]; diff --git a/resources/lang/ru_RU/auth.php b/resources/lang/ru_RU/auth.php new file mode 100644 index 0000000000..7b2cd9bab2 --- /dev/null +++ b/resources/lang/ru_RU/auth.php @@ -0,0 +1,37 @@ +. + */ +declare(strict_types=1); + +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' => 'Неправильный адрес электронной почты или пароль.', + 'throttle' => 'Слишком много попыток входа. Пожалуйста, попробуйте снова через :seconds секунд.', +]; diff --git a/resources/lang/ru_RU/bank.php b/resources/lang/ru_RU/bank.php new file mode 100644 index 0000000000..ef0d636f91 --- /dev/null +++ b/resources/lang/ru_RU/bank.php @@ -0,0 +1,24 @@ +. + */ +declare(strict_types=1); + +return [ +]; diff --git a/resources/lang/ru_RU/breadcrumbs.php b/resources/lang/ru_RU/breadcrumbs.php new file mode 100644 index 0000000000..92d5f21e5a --- /dev/null +++ b/resources/lang/ru_RU/breadcrumbs.php @@ -0,0 +1,55 @@ +. + */ +declare(strict_types=1); + +return [ + 'home' => 'Главная', + 'edit_currency' => 'Редактирование валюты ":name"', + 'delete_currency' => 'Удаление валюты ":name"', + 'newPiggyBank' => 'Создание новой копилки', + 'edit_piggyBank' => 'Редактирование копилки ":name"', + 'preferences' => 'Настройки', + 'profile' => 'Профиль', + 'changePassword' => 'Изменение вашего пароля', + 'change_email' => 'Изменить адрес электронной почты', + 'bills' => 'Счета к оплате', + 'newBill' => 'Новый счёт к оплате', + 'edit_bill' => 'Редактирование счёта к оплате ":name"', + 'delete_bill' => 'Удаление счёта к оплате ":name"', + 'reports' => 'Отчёты', + 'search_result' => 'Результаты поиска для ":query"', + 'withdrawal_list' => 'Мои расходы', + 'deposit_list' => 'Мои доходы', + 'transfer_list' => 'Переводы', + 'transfers_list' => 'Переводы', + 'reconciliation_list' => 'Сверка', + 'create_withdrawal' => 'Создать новый расход', + 'create_deposit' => 'Создать новый доход', + 'create_transfer' => 'Создать новый перевод', + 'edit_journal' => 'Редактирование транзакции ":description"', + 'edit_reconciliation' => 'Редактировать ":description"', + 'delete_journal' => 'Удаление транзакции ":description"', + 'tags' => 'Метки', + 'createTag' => 'Создать новую метку', + 'edit_tag' => 'Редактирование метки ":tag"', + 'delete_tag' => 'Удаление метки ":tag"', + 'delete_journal_link' => 'Удалить связь между транзакциями', +]; diff --git a/resources/lang/ru_RU/config.php b/resources/lang/ru_RU/config.php new file mode 100644 index 0000000000..96f821b89b --- /dev/null +++ b/resources/lang/ru_RU/config.php @@ -0,0 +1,33 @@ +. + */ +declare(strict_types=1); + +return [ + 'html_language' => 'ru', + 'locale' => 'ru, Russian, ru_RU, ru_RU.utf8, ru_RU.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' => 'Неделя %W, %Y', + 'year' => '%Y', + 'half_year' => '%B %Y', +]; diff --git a/resources/lang/ru_RU/csv.php b/resources/lang/ru_RU/csv.php new file mode 100644 index 0000000000..d61316b632 --- /dev/null +++ b/resources/lang/ru_RU/csv.php @@ -0,0 +1,24 @@ +. + */ +declare(strict_types=1); + +return [ +]; diff --git a/resources/lang/ru_RU/demo.php b/resources/lang/ru_RU/demo.php new file mode 100644 index 0000000000..3cfe83b970 --- /dev/null +++ b/resources/lang/ru_RU/demo.php @@ -0,0 +1,35 @@ +. + */ +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', +]; diff --git a/resources/lang/ru_RU/firefly.php b/resources/lang/ru_RU/firefly.php new file mode 100644 index 0000000000..436fb890ba --- /dev/null +++ b/resources/lang/ru_RU/firefly.php @@ -0,0 +1,1180 @@ +. + */ +declare(strict_types=1); + +return [ + // general stuff: + 'close' => 'Закрыть', + 'actions' => 'Действия', + 'edit' => 'Изменить', + 'delete' => 'Удалить', + 'welcomeBack' => 'Что происходит с моими финансами?', + 'everything' => 'Всё', + 'today' => 'сегодня', + 'customRange' => 'Другой интервал', + 'apply' => 'Применить', + 'select_date' => 'Выбрать дату...', + 'cancel' => 'Отмена', + 'from' => 'От', + 'to' => 'Куда', + 'showEverything' => 'Показать всё', + 'never' => 'Никогда', + 'no_results_for_empty_search' => 'Результатов не найдено.', + 'removed_amount' => 'Снято :amount', + 'added_amount' => 'Добавлено :amount', + 'asset_account_role_help' => 'Вы сможете произвести любые дополнительные настройки позже.', + 'Opening balance' => 'Баланс на момент открытия', + 'create_new_stuff' => 'Создать новый объект', + 'new_withdrawal' => 'Новый расход', + 'create_new_transaction' => 'Создать новую транзакцию', + 'go_to_asset_accounts' => 'Просмотр ваших основных счетов', + 'go_to_budgets' => 'Перейти к вашим бюджетам', + 'go_to_categories' => 'Перейти к вашим категориям', + 'go_to_bills' => 'Перейти к вашим счетам на оплату', + 'go_to_expense_accounts' => 'Перейти к вашим счетам расходов', + 'go_to_revenue_accounts' => 'Перейти к вашим счетам доходов', + 'go_to_piggies' => 'Перейти к вашим копилкам', + 'new_deposit' => 'Новый доход', + 'new_transfer' => 'Новый перевод', + 'new_transfers' => 'Новый перевод', + 'new_asset_account' => 'Новый счет активов', + 'new_expense_account' => 'Новый расходный счет', + 'new_revenue_account' => 'Новый доходный счет', + 'new_budget' => 'Новый бюджет', + 'new_bill' => 'Новый счёт к оплате', + 'block_account_logout' => 'Вы вышли из системы. Заблокированные учётные записи не могут использовать этот сайт. Вы зарегистрировались с действующим адресом электронной почты?', + 'flash_success' => 'Успешно!', + 'flash_info' => 'Сообщение', + 'flash_warning' => 'Предупреждение!', + 'flash_error' => 'Ошибка!', + 'flash_info_multiple' => 'Есть одно сообщение|Есть :count сообщений', + 'flash_error_multiple' => 'Есть одна ошибка|Есть :count ошибок', + 'net_worth' => 'Накопленный капитал', + 'route_has_no_help' => 'К данной странице нет справочной информации.', + 'help_for_this_page' => 'Справка по этой странице', + 'no_help_could_be_found' => 'Невозможно найти текст справки.', + 'no_help_title' => 'Нам очень жаль, но произошла ошибка.', + 'two_factor_welcome' => 'Привет, :user!', + 'two_factor_enter_code' => 'Чтобы продолжить, введите ваш код двухфакторной аутентификации. Ваше приложение может сгенерировать его для вас.', + 'two_factor_code_here' => 'Введите код здесь', + 'two_factor_title' => 'Двухфакторная аутентификация', + 'authenticate' => 'Аутентифицироваться', + 'two_factor_forgot_title' => 'Утерян код для двухфакторной аутентификации', + 'two_factor_forgot' => 'Я забыл свой ключ для двухфакторной авторизации.', + 'two_factor_lost_header' => 'Потеряли вашу двухфакторную аутентификацию?', + 'two_factor_lost_intro' => 'К сожалению, это не то, что вы можете сбросить с помощью веб-интерфейса. У вас есть два варианта.', + 'two_factor_lost_fix_self' => 'Если вы запустили свой собственный сервер Firefly III, ознакомьтесь с лог файлами в storage/logs для получения инструкций.', + 'two_factor_lost_fix_owner' => 'Иначе, свяжитесь по email с владельцем сайта :site_owner и попросите сбросить вашу двухфакторную аутентификацию.', + 'warning_much_data' => 'Загрузка данных за :days дней может занять некоторое время.', + 'registered' => 'Вы зарегистрировались успешно!', + 'Default asset account' => 'Счёт по умолчанию', + 'no_budget_pointer' => 'У вас пока нет бюджетов. Вам следует создать их на странице бюджеты. Бюджеты помогут вам отслеживать расходы.', + 'Savings account' => 'Сберегательный счет', + 'Credit card' => 'Кредитная карта', + 'source_accounts' => 'Исходный счет(а)', + 'destination_accounts' => 'Счет(а) назначения', + 'user_id_is' => 'Ваш id пользователя :user', + 'field_supports_markdown' => 'Это поле поддерживает Markdown.', + 'need_more_help' => 'Если вам нужна дополнительная помощь по использованию Firefly III, пожалуйста, откройте issue на Github (желательно, на английском языке).', + 'reenable_intro_text' => 'Вы также можете повторно включить обучение для начинающих.', + 'intro_boxes_after_refresh' => 'Блоки с подсказками появятся, когда вы обновите страницу.', + 'show_all_no_filter' => 'Показать все транзакции без группировки по датам.', + 'expenses_by_category' => 'Расходы по категориям', + 'expenses_by_budget' => 'Расходы по бюджетам', + 'income_by_category' => 'Доход по категориям', + 'expenses_by_asset_account' => 'Расходы по основному счёту', + 'expenses_by_expense_account' => 'Расходы по счёту расходов', + 'cannot_redirect_to_account' => 'Firefly III не может перенаправить вас на правильную страницу. Приносим извинения.', + 'sum_of_expenses' => 'Сумма расходов', + 'sum_of_income' => 'Сумма дохода', + 'spent_in_specific_budget' => 'Расходы по бюджету ":budget"', + 'sum_of_expenses_in_budget' => 'Сумма расходов по бюджету ":budget"', + 'left_in_budget_limit' => 'Осталось потратить в соответствии с бюджетом', + 'current_period' => 'Текущий период', + 'show_the_current_period_and_overview' => 'Показать текущий период и обзор', + 'pref_languages_locale' => 'Для корректной работы с языками, отличными от английского, ваша операционная система должна отдавать корректную информацию о локали. Если это не так, валюты, даты и суммы могут отображаться некорректно.', + 'budget_in_period' => 'Все транзакции для бюджета ":name" между :start и :end', + 'chart_budget_in_period' => 'Диаграмма всех транзакций для бюджета ":name" между :start и :end', + 'chart_account_in_period' => 'Диаграмма всех транзакций для счёта ":name" между :start и :end', + 'chart_category_in_period' => 'Диаграмма всех транзакций для категории ":name" между :start и :end', + 'chart_category_all' => 'Диаграмма всех транзакций для категории ":name"', + 'clone_withdrawal' => 'Клонировать этот расход', + 'clone_deposit' => 'Клонировать этот доход', + 'clone_transfer' => 'Клонировать этот трансфер', + 'multi_select_no_selection' => 'Ничего не выбрано', + 'multi_select_select_all' => 'Выбрать все', + 'multi_select_n_selected' => 'выбранные', + 'multi_select_all_selected' => 'Все выбранные', + 'multi_select_filter_placeholder' => 'Поиск..', + 'intro_next_label' => 'Далее', + 'intro_prev_label' => 'Назад', + 'intro_skip_label' => 'Пропустить', + 'intro_done_label' => 'Завершить', + 'between_dates_breadcrumb' => 'Между :start и :end', + 'all_journals_without_budget' => 'Все транзакции без бюджета', + 'journals_without_budget' => 'Транзакции без бюджета', + 'all_journals_without_category' => 'Все транзакции без категории', + 'journals_without_category' => 'Транзакции без категории', + 'all_journals_for_account' => 'Все транзакции для счёта :name', + 'chart_all_journals_for_account' => 'Диаграмма всех транзакций для счёта :name', + 'journals_in_period_for_account' => 'Все транзакции для счёта :name между :start и :end', + 'transferred' => 'Переведено', + 'all_withdrawal' => 'Все расходы', + 'all_transactions' => 'Все транзакции', + 'title_withdrawal_between' => 'Все расходы между :start и :end', + 'all_deposit' => 'Все доходы', + 'title_deposit_between' => 'Все доходы между :start и :end', + 'all_transfers' => 'Все переводы', + 'title_transfers_between' => 'Все переводы между :start и :end', + 'all_transfer' => 'Все переводы', + 'all_journals_for_tag' => 'Все транзакции для метки ":tag"', + 'title_transfer_between' => 'Все переводы между :start и :end', + 'all_journals_for_category' => 'Все транзакции для категории :name', + 'all_journals_for_budget' => 'Все транзакции для бюджета :name', + 'chart_all_journals_for_budget' => 'Диаграмма всех транзакций для бюджета :name', + 'journals_in_period_for_category' => 'Все транзакции для категории :name между :start и :end', + 'journals_in_period_for_tag' => 'Все транзакции для метки :tag между :start и :end', + 'not_available_demo_user' => 'Функция, которую вы пытаетесь использовать, недоступна для демо-пользователей.', + 'exchange_rate_instructions' => 'Для счёта "@name" возможны транзакции только в валюте @native_currency. Если вы хотите использовать валюту @foreign_currency, убедитесь, что сумма в @native_currency вам также известна:', + 'transfer_exchange_rate_instructions' => 'Исходный счёт "@source_name" может использовать только транзакции в валюте @source_currency. Счёт назначения "@dest_name" может использовать транзакции только в валюте @dest_currency. Вы должны правильно указать сумму перевода в обеих валютах.', + 'transaction_data' => 'Данные транзакции', + 'invalid_server_configuration' => 'Неправильная конфигурация сервера', + 'invalid_locale_settings' => 'Firefly III не может обеспечить правильный формат денежных сумм, поскольку на вашем сервере отсутствуют необходимые пакеты. Воспользуйтесь инструкцией, объясняющей, как их установить.', + 'quickswitch' => 'Быстрое переключение', + 'sign_in_to_start' => 'Войдите, чтобы начать сессию', + 'sign_in' => 'Войти', + 'register_new_account' => 'Зарегистрировать новый счёт', + 'forgot_my_password' => 'Я забыл пароль', + 'problems_with_input' => 'Есть кое-какие проблемы с введёнными вами данными.', + 'reset_password' => 'Восстановление пароля', + 'button_reset_password' => 'Сбросить пароль', + 'reset_button' => 'Сбросить', + 'want_to_login' => 'Я хочу войти', + 'button_register' => 'Регистрация', + + // check for updates: + 'update_check_title' => 'Проверить обновления', + 'admin_update_check_title' => 'Автоматически проверять наличие обновлений', + 'admin_update_check_explain' => 'Firefly III может автоматически проверять наличие обновлений. После включения опции, он свяжется с Github, чтобы узнать, доступна ли новая версия Firefly III. Когда это произойдет, вы получите уведомление. Вы можете проверить это уведомление, нажав кнопку справа. Пожалуйста, укажите ниже, если вы хотите, чтобы Firefly III проверял наличие обновлений.', + 'check_for_updates_permission' => 'Firefly III может проверять наличие обновлений, но для этого требуется ваше разрешение. Перейдите в администрирование, чтобы указать, хотите ли вы включить эту функцию.', + 'updates_ask_me_later' => 'Спросить меня позже', + 'updates_do_not_check' => 'Не проверять наличие обновлений', + 'updates_enable_check' => 'Включить проверку обновлений', + 'admin_update_check_now_title' => 'Проверить наличие обновлений', + 'admin_update_check_now_explain' => 'Если вы нажмете кнопку, Firefly III посмотрит, является ли ваша текущая версия последней.', + 'check_for_updates_button' => 'Проверить сейчас!', + 'update_new_version_alert' => 'Доступна новая версия Firefly III. Вы используете версию v:your_version, самая свежая версия - v:new_version (выпущена :date).', + 'update_current_version_alert' => 'Вы используете v:version, которая является последним доступным релизом.', + 'update_newer_version_alert' => 'Вы используете версию v:your_version, которая новее последнего релиза (v:new_version).', + 'update_check_error' => 'При проверке обновлений произошла ошибка. Просмотрите файлы логов.', + + // search + 'search' => 'Поиск', + 'search_query' => 'Запрос', + 'search_found_transactions' => 'Количество транзакций найдено:', + 'general_search_error' => 'Произошла ошибка при поиске. Пожалуйста, проверьте файлы журнала для получения дополнительной информации.', + 'search_box' => 'Поиск', + 'search_box_intro' => 'Добро пожаловать в функцию поиска Firefly III. Введите поисковый запрос в поле. Убедитесь, что вы ознакомились с инструкцией, потому что поиск достаточно продвинутый.', + 'search_error' => 'Ошибка при поиске', + 'search_searching' => 'Поиск...', + 'search_results' => 'Результаты поиска', + + // repeat frequencies: + 'repeat_freq_yearly' => 'ежегодно', + 'repeat_freq_half-year' => 'раз в полгода', + 'repeat_freq_quarterly' => 'раз в квартал', + 'repeat_freq_monthly' => 'ежемесячно', + 'repeat_freq_weekly' => 'еженедельно', + 'weekly' => 'еженедельно', + 'quarterly' => 'раз в квартал', + 'half-year' => 'раз в полгода', + 'yearly' => 'ежегодно', + + // export data: + 'import_and_export' => 'Импорт и экспорт', + 'export_data' => 'Экспорт данных', + 'export_and_backup_data' => 'Экспорт данных', + 'export_data_intro' => 'Используйте экспортированные данные для перехода на новое финансовое приложение. Обратите внимание, что эти файлы не предназначены для резервного копирования. Они не содержат достаточного количества данных, чтобы полностью восстановить новую копию Firefly III. Если вы хотите сделать резервную копию своих данных, сделайте резервную копию базы данных напрямую.', + 'export_format' => 'Формат для экспорта', + 'export_format_csv' => 'Значения, разделенные запятыми (CSV)', + 'export_format_mt940' => 'Формат, совместимый с MT940', + 'include_old_uploads_help' => 'Firefly III не выбрасывает исходные CSV-файлы, которые вы импортировали в прошлом. Вы можете включить их в свой экспорт.', + 'do_export' => 'Экспорт', + 'export_status_never_started' => 'Экспорт пока не начался', + 'export_status_make_exporter' => 'Создание задания на экспорт...', + 'export_status_collecting_journals' => 'Сбор ваших транзакций...', + 'export_status_collected_journals' => 'Ваши транзакции собраны!', + 'export_status_converting_to_export_format' => 'Преобразование ваших транзакций...', + 'export_status_converted_to_export_format' => 'Ваши транзакции преобразованы!', + 'export_status_creating_journal_file' => 'Создание файла экспорта...', + 'export_status_created_journal_file' => 'Файл экспорта создан!', + 'export_status_collecting_attachments' => 'Сбор всех ваших вложений...', + 'export_status_collected_attachments' => 'Все ваши вложения собраны!', + 'export_status_collecting_old_uploads' => 'Сбор всех ваших предыдущих загрузок...', + 'export_status_collected_old_uploads' => 'Все ваши предыдущие загрузки собраны!', + 'export_status_creating_zip_file' => 'Создание zip-файла...', + 'export_status_created_zip_file' => 'Создан zip-файл!', + 'export_status_finished' => 'Экспорт успешно завершен! Ура!', + 'export_data_please_wait' => 'Подождите пожалуйста...', + + // rules + 'rules' => 'Правила', + 'rule_name' => 'Название правила', + 'rule_triggers' => 'Правило срабатывает, когда', + 'rule_actions' => 'Правило будет делать', + 'new_rule' => 'Новое правило', + 'new_rule_group' => 'Новая группа правил', + 'rule_priority_up' => 'Задать для правила более высокий приоритет', + 'rule_priority_down' => 'Задать для правила более низкий приоритет', + 'make_new_rule_group' => 'Создать новую группу правил', + 'store_new_rule_group' => 'Сохранить новую группу правил', + 'created_new_rule_group' => 'Новая группа правил ":title" сохранена!', + 'updated_rule_group' => 'Группа правил ":title" успешно обновлена.', + 'edit_rule_group' => 'Изменить группу правил ":title"', + 'delete_rule_group' => 'Удалить группу правил ":title"', + 'deleted_rule_group' => 'Группа правил ":title" удалена', + 'update_rule_group' => 'Обновление группы правил', + 'no_rules_in_group' => 'В этой группе нет правил', + 'move_rule_group_up' => 'Переместить группу правил вверх', + 'move_rule_group_down' => 'Переместить группу правил вниз', + 'save_rules_by_moving' => 'Сохраните эти правила, переместив их в другую группу правил:', + 'make_new_rule' => 'Создать новое правило в группе правил ":title"', + 'rule_help_stop_processing' => 'Когда вы установите этот флажок, более поздние правила в этой группе не будут выполняться.', + 'rule_help_active' => 'Неактивные правила никогда не срабатывают.', + 'stored_new_rule' => 'Сохранено новое правило с названием ":title"', + 'deleted_rule' => 'Удалено правило с названием ":title"', + 'store_new_rule' => 'Сохранить новое правило', + 'updated_rule' => 'Обновлено правило с названием ":title"', + 'default_rule_group_name' => 'Правила по умолчанию', + 'default_rule_group_description' => 'Здесь размещаются правила, которые вы не поместили ни в одну из групп.', + 'default_rule_name' => 'Ваше первое правило по умолчанию', + 'default_rule_description' => 'Это правило - просто пример. Вы можете смело его удалить.', + 'default_rule_trigger_description' => 'Человек, который продал мир', + 'default_rule_trigger_from_account' => 'Дэвид Боуи', + 'default_rule_action_prepend' => 'Купил мир у ', + 'default_rule_action_set_category' => 'Большие расходы', + 'trigger' => 'Условие', + 'trigger_value' => 'Значение условия', + 'stop_processing_other_triggers' => 'Прекратить обработку других условий', + 'add_rule_trigger' => 'Добавить новое условие', + 'action' => 'Действие', + 'action_value' => 'Значение действия', + 'stop_executing_other_actions' => 'Прекратить выполнение других действий', + 'add_rule_action' => 'Добавить новое действие', + 'edit_rule' => 'Изменить правило ":title"', + 'delete_rule' => 'Удалить правило ":title"', + 'update_rule' => 'Обновить правило', + 'test_rule_triggers' => 'Показать подходящие транзакции', + 'warning_transaction_subset' => 'По соображениям производительности этот список ограничен :max_num_transactions и может показывать только часть подходящих транзакций', + 'warning_no_matching_transactions' => 'Подходящие транзакции не найдены. Обратите внимание, что по соображениям производительности проверены только последние :num_transactions транзакций.', + 'warning_no_valid_triggers' => 'Отсутствуют правильные условия.', + 'apply_rule_selection' => 'Применить ":title" к выбранным вами транзакциям', + 'apply_rule_selection_intro' => 'Такие правила, как ":title", обычно применяются только к новым или обновлённым транзакциям, но Firefly III может применить его для выбранных вами существующих транзакций. Это может быть полезно, если вы обновили правило, и вам нужно изменить ранее созданные транзакции в соответствии с новыми условиями.', + 'include_transactions_from_accounts' => 'Включить транзакции с указанных счетов', + 'applied_rule_selection' => 'Правило ":title" было применено к выбранным транзакциям.', + 'execute' => 'Выполнить', + 'apply_rule_group_selection' => 'Применить группу правил":title" к выбранным вами транзакциям', + 'apply_rule_group_selection_intro' => 'Такие группы правил, как ":title", обычно применяются только к новым или обновлённым транзакциям, но Firefly III может применить все правила из этой группы для выбранных вами существующих транзакций. Это может быть полезно, если вы обновили одно или несколько правил в группе и вам нужно изменить ранее созданные транзакции в соответствии с новыми условиями.', + 'applied_rule_group_selection' => 'Группа правил ":title" была применена к выбранным вами транзакциям.', + + // actions and triggers + 'rule_trigger_user_action' => 'Действие пользователя = ":trigger_value"', + 'rule_trigger_from_account_starts_choice' => 'Счёт-источник начинается с...', + 'rule_trigger_from_account_starts' => 'Счёт-источник начинается с ":trigger_value"', + 'rule_trigger_from_account_ends_choice' => 'Счёт-источник заканчивается на...', + 'rule_trigger_from_account_ends' => 'Счёт-источник заканчивается на ":trigger_value"', + 'rule_trigger_from_account_is_choice' => 'Исходный счёт =', + 'rule_trigger_from_account_is' => 'Счёт-источник = ":trigger_value"', + 'rule_trigger_from_account_contains_choice' => 'Счёт-источник содержит...', + 'rule_trigger_from_account_contains' => 'Счёт-источник содержит ":trigger_value"', + 'rule_trigger_to_account_starts_choice' => 'Счёт назначения начинается с...', + 'rule_trigger_to_account_starts' => 'Счёт назначения начинается с ":trigger_value"', + 'rule_trigger_to_account_ends_choice' => 'Счёт назначения заканчивается на...', + 'rule_trigger_to_account_ends' => 'Счёт назначения заканчивается на ":trigger_value"', + 'rule_trigger_to_account_is_choice' => 'Счёт назначения =', + 'rule_trigger_to_account_is' => 'Счёт назначения = ":trigger_value"', + 'rule_trigger_to_account_contains_choice' => 'Счёт назначения содержит...', + 'rule_trigger_to_account_contains' => 'Счёт назначения содержит ":trigger_value"', + 'rule_trigger_transaction_type_choice' => 'Тип транзакции = ', + 'rule_trigger_transaction_type' => 'Тип транзакции = ":trigger_value"', + 'rule_trigger_category_is_choice' => 'Категория =', + 'rule_trigger_category_is' => 'Категория = ":trigger_value"', + 'rule_trigger_amount_less_choice' => 'Сумма меньше, чем...', + 'rule_trigger_amount_less' => 'Сумма меньше, чем ":trigger_value"', + 'rule_trigger_amount_exactly_choice' => 'Сумма =', + 'rule_trigger_amount_exactly' => 'Сумма = ":trigger_value"', + 'rule_trigger_amount_more_choice' => 'Сумма больше, чем...', + 'rule_trigger_amount_more' => 'Сумма больше, чем ":trigger_value"', + 'rule_trigger_description_starts_choice' => 'Описание начинается с...', + 'rule_trigger_description_starts' => 'Описание начинается с ":trigger_value"', + 'rule_trigger_description_ends_choice' => 'Описание заканчивается на...', + 'rule_trigger_description_ends' => 'Описание заканчивается на ":trigger_value"', + 'rule_trigger_description_contains_choice' => 'Описание содержит...', + 'rule_trigger_description_contains' => 'Описание содержит ":trigger_value"', + 'rule_trigger_description_is_choice' => 'Описание =', + 'rule_trigger_description_is' => 'Описание = ":trigger_value"', + 'rule_trigger_budget_is_choice' => 'Бюджет =', + 'rule_trigger_budget_is' => 'Бюджет = ":trigger_value"', + 'rule_trigger_tag_is_choice' => 'Метка =', + 'rule_trigger_tag_is' => 'Метка = ":trigger_value"', + 'rule_trigger_has_attachments_choice' => 'Содержит несколько вложений', + 'rule_trigger_has_attachments' => 'Содержит как минимум :trigger_value вложений', + 'rule_trigger_store_journal' => 'Когда создается транзакция', + 'rule_trigger_update_journal' => 'Когда транзакция обновляется', + 'rule_trigger_has_no_category_choice' => 'Нет связанной категории', + 'rule_trigger_has_no_category' => 'Транзакция не связана ни с одной категорией', + 'rule_trigger_has_any_category_choice' => 'Связана с (любой) категорией', + 'rule_trigger_has_any_category' => 'Транзакция связана с (любой) категорией', + 'rule_trigger_has_no_budget_choice' => 'Нет связанного бюджета', + 'rule_trigger_has_no_budget' => 'Транзакция не связана ни с одним бюджетом', + 'rule_trigger_has_any_budget_choice' => 'Связана с (любым) бюджетом', + 'rule_trigger_has_any_budget' => 'Транзакция связана с (любым) бюджетом', + 'rule_trigger_has_no_tag_choice' => 'Нет меток', + 'rule_trigger_has_no_tag' => 'У транзакции ни одной метки', + 'rule_trigger_has_any_tag_choice' => 'Есть одна или несколько (любых) меток', + 'rule_trigger_has_any_tag' => 'Транзакция имеет одну или более (любые) метки', + 'rule_trigger_any_notes_choice' => 'Содержит (любые) заметки', + 'rule_trigger_any_notes' => 'Транзакция содержит (любые) заметки', + 'rule_trigger_no_notes_choice' => 'Не содержит заметок', + 'rule_trigger_no_notes' => 'Транзакция не содержит заметок', + 'rule_trigger_notes_are_choice' => 'Заметки = ', + 'rule_trigger_notes_are' => 'Заметки = ":trigger_value"', + 'rule_trigger_notes_contain_choice' => 'Заметки содержат...', + 'rule_trigger_notes_contain' => 'Заметки содержат ":trigger_value"', + 'rule_trigger_notes_start_choice' => 'Заметки начинаются с...', + 'rule_trigger_notes_start' => 'Заметки начинаются с ":trigger_value"', + 'rule_trigger_notes_end_choice' => 'Заметки заканчиваются на...', + 'rule_trigger_notes_end' => 'Заметки заканчиваются на ":trigger_value"', + 'rule_action_set_category' => 'Назначить категорию ":action_value"', + 'rule_action_clear_category' => 'Очистить поле "Категория"', + 'rule_action_set_budget' => 'Назначить бюджет ":action_value"', + 'rule_action_clear_budget' => 'Очистить поле "Бюджет"', + 'rule_action_add_tag' => 'Добавить метку ":action_value"', + 'rule_action_remove_tag' => 'Удалить метку ":action_value"', + 'rule_action_remove_all_tags' => 'Удалить все метки', + 'rule_action_set_description' => 'Назначить описание ":action_value"', + 'rule_action_append_description' => 'Добавить в конце описание с ":action_value"', + 'rule_action_prepend_description' => 'Добавить в начале описание с ":action_value"', + 'rule_action_set_category_choice' => 'Назначить рубрику...', + 'rule_action_clear_category_choice' => 'Удалить любую категорию', + 'rule_action_set_budget_choice' => 'Назначить бюджет...', + 'rule_action_clear_budget_choice' => 'Удалить любой бюджет', + 'rule_action_add_tag_choice' => 'Добавить метку...', + 'rule_action_remove_tag_choice' => 'Удалить метку...', + 'rule_action_remove_all_tags_choice' => 'Удалить все метки...', + 'rule_action_set_description_choice' => 'Назначить описание...', + 'rule_action_append_description_choice' => 'Добавить в конце описание с...', + 'rule_action_prepend_description_choice' => 'Добавить в начале описание с...', + 'rule_action_set_source_account_choice' => 'Назначить счёт-источник...', + 'rule_action_set_source_account' => 'Назначить счёт-источник :action_value', + 'rule_action_set_destination_account_choice' => 'Назначить целевой счёт...', + 'rule_action_set_destination_account' => 'Назначить целевой счёт :action_value', + 'rule_action_append_notes_choice' => 'Добавить в конце заметки с...', + 'rule_action_append_notes' => 'Добавить в конце заметки с ":action_value"', + 'rule_action_prepend_notes_choice' => 'Добавить в начале заметки с...', + 'rule_action_prepend_notes' => 'Добавить в начале заметки с ":action_value"', + 'rule_action_clear_notes_choice' => 'Удалить любые заметки', + 'rule_action_clear_notes' => 'Удалить любые заметки', + 'rule_action_set_notes_choice' => 'Назначить примечания...', + 'rule_action_set_notes' => 'Назначить примечания ":action_value"', + + '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' => 'Очистить местоположение', + + // 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' => 'Расширенные данные', + + // 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' => 'Если вы только что ввели пароль, который вы используете на нескольких сайтах: пожалуйста, да.', + 'personal_access_token' => 'Личный токен для доступа', + 'explain_access_token' => 'Этот токен необходим для выполнения операций из командной строки (таких как импорт или экспорт данных). Без него такие чувствительные команды не будут работать. Не показывайте никому свой токен. Никто не попросит у вас эту информацию, даже я. Если вы боитесь, что потеряли этот токен, или у вас паранойя, вы можете сгенерировать новый токен с помощью этой кнопки.', + 'regenerate_access_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', + + // transaction index + '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' => 'Выбранный вами счёт уже используется в этой транзакции или не существует.', + + // 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' => 'Создать новый счёт к оплате', + + // 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' => 'основная', + + // forms: + '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', + + // 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' => 'Средняя сумма счёта на оплату (за всё время)', + 'not_or_not_yet' => 'Нет (пока)', + 'not_expected_period' => 'Не ожидается в данном периоде', + '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"', + + // 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', + + // 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' => 'Заметки', + + // 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' => 'Оплаченные счета', + + // 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' => 'Ошибки', + + // 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' => 'Выберите счёт расходов или доходов', + + // 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', + + // 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' => 'У вас нет денег, чтобы положить в этот копилку.', + + 'remove' => 'Удалить', + 'max_amount_add' => 'Максимальная сумма, которую вы можете добавить:', + 'max_amount_remove' => 'Максимальная сумма, которую вы можете удалить:', + 'update_piggy_button' => 'Обновить копилку', + 'update_piggy_title' => 'Обновить копилку ":name"', + 'updated_piggy_bank' => 'Копилка ":name" обновлена', + 'details' => 'Подробности', + 'events' => 'События', + 'target_amount' => 'Целевая сумма', + 'start_date' => 'Дата начала', + 'target_date' => 'Конечная дата', + 'no_target_date' => 'Нет конечной даты', + 'table' => 'Таблица', + 'delete_piggy_bank' => 'Удалить копилку ":name"', + 'cannot_add_amount_piggy' => 'Невозможно добавить :amount в ":name".', + 'cannot_remove_from_piggy' => 'Невозможно удалить :amount из ":name".', + 'deleted_piggy_bank' => 'Копилка ":name" удалена', + 'added_amount_to_piggy' => 'Добавлено :amount в ":name"', + 'removed_amount_from_piggy' => 'Удалено :amount из ":name"', + + // tags + 'delete_tag' => 'Удалить метку ":tag"', + 'deleted_tag' => 'Метка ":tag" удалена', + 'new_tag' => 'Создать новую метку', + 'edit_tag' => 'Изменить метку ":tag"', + 'updated_tag' => 'Метка ":tag" обновлена', + 'created_tag' => 'Метка ":tag" была создана!', + + 'transaction_journal_information' => 'Информация о транзакции', + 'transaction_journal_meta' => 'Дополнительная информация', + 'total_amount' => 'Итого', + 'number_of_decimals' => 'Количество знаков после запятой', + + // administration + 'administration' => 'Администрирование', + 'user_administration' => 'Управление пользователями', + 'list_all_users' => 'Список пользователей', + 'all_users' => 'Все пользователи', + 'instance_configuration' => 'Конфигурация', + 'firefly_instance_configuration' => 'Базовая конфигурация Firefly III', + 'setting_single_user_mode' => 'Режим одного пользователя', + 'setting_single_user_mode_explain' => 'По умолчанию Firefly III работает только с одним пользователем (это вы). Это сделано с целью обеспечения безопасности, чтобы другие люди не могли использовать ваш Firefly без вашего разрешения. Регистрация других пользователей просто невозможна. Однако, если вы снимите этот флажок, другие смогут использовать ваш Firefly, при условии, что у них есть доступ к нему (например, он доступен через Интернет).', + 'store_configuration' => 'Сохранить конфигурацию', + 'single_user_administration' => 'Управление пользователем :email', + 'edit_user' => 'Редактирование пользователя :email', + 'hidden_fields_preferences' => 'Сейчас видные не все поля. Вы должны включить их в настройках.', + 'user_data_information' => 'Данные пользователя', + 'user_information' => 'Информация о пользователе', + 'total_size' => 'общий размер', + 'budget_or_budgets' => 'бюджет(ы)', + 'budgets_with_limits' => 'бюджет(ы) с установленной суммой', + 'nr_of_rules_in_total_groups' => ':count_rules правил в :count_groups группах', + 'tag_or_tags' => 'метки', + 'configuration_updated' => 'Конфигурация обновлена', + 'setting_is_demo_site' => 'Демо-сайт', + 'setting_is_demo_site_explain' => 'Если вы установите этот флажок, эта копия FireFly будет вести себя как демонстрационный сайт, который может иметь странные побочные эффекты.', + 'block_code_bounced' => 'Отправка письма (писем) с аккаунта', + 'block_code_expired' => 'Срок демо-версии истёк', + 'no_block_code' => 'Нет причины для блокировки или пользователь не заблокирован', + 'block_code_email_changed' => 'Пользователь не подтвердил новый адрес электронной почты', + 'admin_update_email' => 'Внимание! Пользователь НЕ будет уведомлён о смене адреса электронной почты. Новый адрес он увидит только на странице профиля.', + 'update_user' => 'Обновить пользователя', + 'updated_user' => 'Данные пользователя были изменены.', + 'delete_user' => 'Удалить пользователя :email', + 'user_deleted' => 'Пользователь был удален', + 'send_test_email' => 'Отправить тестовое письмо на E-mail пользователя', + 'send_test_email_text' => 'Чтобы узнать, может ли ваша копия FireFly отправлять электронную почту, нажмите эту кнопку. Вы не увидите здесь ошибки (если они возникнут), все ошибки будут зафиксированы в лог-файле. Вы можете нажимать эту кнопку столько раз, сколько хотите. Спам не контролируется. Сообщение будет отправлено на адрес :email и вы сможете получить его в ближайшее время.', + 'send_message' => 'Отправить сообщение', + 'send_test_triggered' => 'Тест был выполнен. Проверьте ваш почтовый ящик и log-файлы.', + + // links + 'journal_link_configuration' => 'Настройка связей между транзакциями', + 'create_new_link_type' => 'Создать новый тип связи', + 'store_new_link_type' => 'Сохранить новый тип связи', + 'update_link_type' => 'Обновить тип связи', + 'edit_link_type' => 'Изменить тип ссылки ":name"', + 'updated_link_type' => 'Тип связи ":name" обновлён', + 'delete_link_type' => 'Удалить тип ссылки ":name"', + 'deleted_link_type' => 'Тип ссылки ":name" удалён', + 'stored_new_link_type' => 'Сохранить новый тип связи ":name"', + 'cannot_edit_link_type' => 'Невозможно изменить тип ссылки ":name"', + 'link_type_help_name' => 'Например, "Дубликаты"', + 'link_type_help_inward' => 'Например, "дубликаты"', + 'link_type_help_outward' => 'Например, "это дублирует..."', + 'save_connections_by_moving' => 'Сохраните связь между этими транзакциями, переместив их в другой тип связи:', + 'do_not_save_connection' => '(не сохранять соединение)', + 'link_transaction' => 'Связать транзакцию', + 'link_to_other_transaction' => 'Связать эту транзакцию с другой транзакцией', + 'select_transaction_to_link' => 'Выберите транзакцию, которую требуется связать с...', + 'this_transaction' => 'Эта транзакция', + 'transaction' => 'Транзакция', + 'comments' => 'Комментарии', + 'to_link_not_found' => 'Если транзакция, с которой вы хотите установить связь, не показана в списке, просто введите её ID.', + 'invalid_link_selection' => 'Невозможно связать эти транзакции', + 'journals_linked' => 'Транзакции были связаны.', + 'journals_error_linked' => 'Эти транзакции уже связаны.', + 'journal_links' => 'Связи транзакции', + 'this_withdrawal' => 'Этот расход', + 'this_deposit' => 'Этот доход', + 'this_transfer' => 'Этот перевод', + 'overview_for_link' => 'Обзор для типа ссылки ":name"', + 'source_transaction' => 'Исходная транзакция', + 'link_description' => 'Описание связи', + 'destination_transaction' => 'Целевая транзакция', + 'delete_journal_link' => 'Удалить связи между :source и :destination', + 'deleted_link' => 'Связь удалена', + + // link translations: + 'relates to_inward' => 'связано с', + 'is (partially) refunded by_inward' => '(частично) возвращён', + 'is (partially) paid for by_inward' => '(частично) оплачен', + 'is (partially) reimbursed by_inward' => '(частично) возмещён', + 'relates to_outward' => 'относится к', + '(partially) refunds_outward' => '(частично) возвращены', + '(partially) pays for_outward' => '(частично) оплачены', + '(partially) reimburses_outward' => '(частично) возмещены', + + // split a transaction: + 'splits' => 'Разделение транзакции', + 'add_another_split' => 'Добавить новую часть', + 'split-transactions' => 'Разделить транзакции', + 'do_split' => 'Разделить транзакцию', + 'split_this_withdrawal' => 'Разделить этот расход', + 'split_this_deposit' => 'Разделить этот доход', + 'split_this_transfer' => 'Разделить этот перевод', + 'cannot_edit_multiple_source' => 'Вы не можете редактировать разделённую транзакцию #:id с описанием ":description", поскольку она содержит несколько счетов-источников.', + 'cannot_edit_multiple_dest' => 'Вы не можете редактировать разделённую транзакцию #:id с описанием ":description", поскольку она содержит несколько счетов назначения.', + 'cannot_edit_reconciled' => 'Вы не можете редактировать разделённую транзакцию #:id с описанием ":description", поскольку она отмечена как прошедшая сверку.', + 'cannot_edit_opening_balance' => 'Вы не можете изменить начальный баланс этого счёта.', + 'no_edit_multiple_left' => 'Вы выбрали для редактирования некорректную транзакцию.', + 'cannot_convert_split_journal' => 'Невозможно преобразовать раздельную транзакцию', + + // import bread crumbs and titles: + 'import' => 'Импорт', + 'import_data' => 'Импорт данных', + 'import_general_index_file' => 'Импортировать файл', + 'import_from_bunq' => 'Импорт из bunq', + 'import_using_spectre' => 'Импорт с использованием Spectre', + 'import_using_plaid' => 'Импорт с использованием Plaid', + 'import_config_bread_crumb' => 'Настройте свой импорт', + + // import index page: + 'import_index_title' => 'Импорт данных в Firefly III', + 'import_index_sub_title' => 'Главная страница', + 'import_general_index_intro' => 'Добро пожаловать в инструмент импорта Firefly. Существует несколько способов импорта данных в Firefly III, отображаемых здесь в виде кнопок.', + + // sandstorm.io errors and messages: + 'sandstorm_not_available' => 'Эта функция недоступна, если вы используете Firefly III в среде Sandstorm.io.', + + // empty lists? no objects? instructions: + 'no_accounts_title_asset' => 'Давайте создадим счёт расхода!', + 'no_accounts_intro_asset' => 'У вас пока нет основных счетов. Основные счета - это ваши денежные активы (наличные, сберегательный счёт, кредитная карта и т. п.).', + 'no_accounts_imperative_asset' => 'Чтобы начать использовать Firefly III, вы должны создать хотя бы один основной счёт. Давайте сделаем это сейчас:', + 'no_accounts_create_asset' => 'Создание расходного счёта', + 'no_accounts_title_expense' => 'Давайте создадим расходный счёт!', + 'no_accounts_intro_expense' => 'Пока у вас нет ни одного расходного счёта. Расходные счета используются для контроля за тем, где именно вы расходуете свои финансы. Например, в магазинах или на оплату коммунальных счетов.', + 'no_accounts_imperative_expense' => 'Расходные счета создаются автоматически, когда вы создаёте транзакции (расходы), но вы можете также создать их вручную, если хотите. Давайте создадим один прямо сейчас:', + 'no_accounts_create_expense' => 'Создать расходный счёт', + 'no_accounts_title_revenue' => 'Давайте создадим счёт дохода!', + 'no_accounts_intro_revenue' => 'У вас ещё нет счетов дохода. Счета дохода - это источники вашего дохода (например, ваш работодатель).', + 'no_accounts_imperative_revenue' => 'Счета дохода создаются автоматически при создании транзакций, но вы можете создать их вручную, если хотите. Давайте создадим один сейчас:', + 'no_accounts_create_revenue' => 'Создать счёт дохода', + 'no_budgets_title_default' => 'Давайте создадим бюджет', + 'no_budgets_intro_default' => 'У вас пока нет бюджетов. Бюджеты используются для упорядочивания ваших расходов в логические группы, с помощью наблюдения за которыми вы можете ограничить свои расходы.', + 'no_budgets_imperative_default' => 'Бюджеты - это основные инструменты управления финансами. Давайте создадим один сейчас:', + 'no_budgets_create_default' => 'Создать бюджет', + 'no_categories_title_default' => 'Давайте создадим категорию!', + 'no_categories_intro_default' => 'У вас пока нет категорий. Категории используются для точной настройки ваших транзакций и их маркировки.', + 'no_categories_imperative_default' => 'Категории создаются автоматически при создании транзакций, но вы также можете создать их вручную. Давайте создадим одну сейчас:', + 'no_categories_create_default' => 'Создать категорию', + 'no_tags_title_default' => 'Давайте создадим метку!', + 'no_tags_intro_default' => 'У вас еще нет меток. Метки используются для точной настройки транзакций и маркировки их конкретными ключевыми словами.', + 'no_tags_imperative_default' => 'Метки создаются автоматически при создании транзакций, но вы также можете создать их вручную. Давайте создадим одну сейчас:', + 'no_tags_create_default' => 'Создать метку', + 'no_transactions_title_withdrawal' => 'Давайте создадим расход!', + 'no_transactions_intro_withdrawal' => 'У вас пока нет расходов. Вы должны создать хотя бы один расход, чтобы начать управлять своими финансами.', + 'no_transactions_imperative_withdrawal' => 'Вы потратили часть своих денег? Это нужно записать:', + 'no_transactions_create_withdrawal' => 'Создать расход', + 'no_transactions_title_deposit' => 'Давайте создадим какой-нибудь доход!', + 'no_transactions_intro_deposit' => 'У вас пока нет учтённых доходов. Вы должны создать запись дохода, чтобы начать управлять своими финансами.', + 'no_transactions_imperative_deposit' => 'Вы получили какие-нибудь деньги? Вам нужно это записать:', + 'no_transactions_create_deposit' => 'Создать доход', + 'no_transactions_title_transfers' => 'Давайте создадим перевод!', + 'no_transactions_intro_transfers' => 'У вас ещё нет переводов. Когда вы перемещаете деньги между счетами, это нужно записывать как перевод.', + 'no_transactions_imperative_transfers' => 'Вы переместили часть своих денег? Это нужно записать:', + 'no_transactions_create_transfers' => 'Создать перевод', + 'no_piggies_title_default' => 'Давайте создадим копилку!', + 'no_piggies_intro_default' => 'У вас пока нет копилок. Вы можете создавать копилки, чтобы разделить свои сбережения и следить за тем, за что вы сберегаете.', + 'no_piggies_imperative_default' => 'Вы хотите накопить денег на что-нибудь? Создайте копилку и следите за своими сбережениями:', + 'no_piggies_create_default' => 'Создать новую копилку', + 'no_bills_title_default' => 'Давайте создадим счёт на оплату!', + 'no_bills_intro_default' => 'У вас пока нет счетов на оплату. Вы можете создавать счета для отслеживания регулярных расходов, таких как арендная плата или страхование.', + 'no_bills_imperative_default' => 'У вас есть такие регулярные платежи? Создайте счёт на оплату и отслеживайте свои платежи:', + 'no_bills_create_default' => 'Создать счет к оплате', +]; diff --git a/resources/lang/ru_RU/form.php b/resources/lang/ru_RU/form.php new file mode 100644 index 0000000000..0a87eefdc7 --- /dev/null +++ b/resources/lang/ru_RU/form.php @@ -0,0 +1,210 @@ +. + */ +declare(strict_types=1); + +return [ + // new user: + 'bank_name' => 'Название банка', + 'bank_balance' => 'Бaлaнc', + 'savings_balance' => 'Сберегательный баланс', + 'credit_card_limit' => 'Лимит кредитной карты', + 'automatch' => 'Автоматическое сопоставление', + 'skip' => 'Пропустить', + 'name' => 'Название', + 'active' => 'Активный', + 'amount_min' => 'Минимальная сумма', + 'amount_max' => 'Максимальная сумма', + 'match' => 'Ключи для связи', + 'repeat_freq' => 'Повторы', + 'journal_currency_id' => 'Валюта', + 'currency_id' => 'Валюта', + 'attachments' => 'Вложения', + 'journal_amount' => 'Сумма', + 'journal_source_account_name' => 'Доходный счет (источник)', + 'journal_source_account_id' => 'Основной счёт (источник)', + 'BIC' => 'BIC', + 'verify_password' => 'Проверка безопасности паролей', + 'source_account' => 'Исходный счёт', + 'destination_account' => 'Счёт назначения', + 'journal_destination_account_id' => 'Основной счёт (назначение)', + 'asset_destination_account' => 'Основной счёт (назначение)', + 'asset_source_account' => 'Основной счёт (источник)', + 'journal_description' => 'Описание', + 'note' => 'Заметки', + 'split_journal' => 'Разделить эту транзакцию', + 'split_journal_explanation' => 'Разделить эту транзакцию на несколько частей', + 'currency' => 'Валюта', + 'account_id' => 'Основной счёт', + 'budget_id' => 'Бюджет', + 'openingBalance' => 'Начальный баланс', + 'tagMode' => 'Режим метки', + 'tag_position' => 'Расположение метки', + 'virtualBalance' => 'Виртуальный баланс', + 'targetamount' => 'Целевая сумма', + 'accountRole' => 'Роль учётной записи', + 'openingBalanceDate' => 'Дата начального баланса', + 'ccType' => 'План оплаты по кредитной карте', + 'ccMonthlyPaymentDate' => 'Дата ежемесячного платежа по кредитной карте', + 'piggy_bank_id' => 'Копилка', + 'returnHere' => 'Вернуться сюда', + 'returnHereExplanation' => 'После сохранения вернуться сюда и создать ещё одну аналогичную запись.', + 'returnHereUpdateExplanation' => 'Вернуться на эту страницу после обновления.', + 'description' => 'Описание', + 'expense_account' => 'Счет расходов', + 'revenue_account' => 'Доходный счет', + 'decimal_places' => 'Количество цифр после точки', + 'exchange_rate_instruction' => 'Иностранные валюты', + 'source_amount' => 'Сумма (источник)', + 'destination_amount' => 'Сумма (назначение)', + 'native_amount' => 'Собственная сумма', + 'new_email_address' => 'Новый адрес электронной почты', + 'verification' => 'Проверка', + 'api_key' => 'API-ключ', + 'remember_me' => 'Запомнить меня', + + 'source_account_asset' => 'Исходный счёт (основной счёт)', + 'destination_account_expense' => 'Счёт назначения (счёт расхода)', + 'destination_account_asset' => 'Счёт назначения (основной счёт)', + 'source_account_revenue' => 'Исходный счёт (счёт доходов)', + 'type' => 'Тип', + 'convert_Withdrawal' => 'Конвертировать расход', + 'convert_Deposit' => 'Конвертировать доход', + 'convert_Transfer' => 'Конвертировать перевод', + + 'amount' => 'Сумма', + 'date' => 'Дата', + 'interest_date' => 'Дата выплаты', + 'book_date' => 'Дата бронирования', + 'process_date' => 'Дата обработки', + 'category' => 'Категория', + 'tags' => 'Метки', + 'deletePermanently' => 'Удалить навсегда', + 'cancel' => 'Отмена', + 'targetdate' => 'Намеченная дата', + 'startdate' => 'Дата начала', + 'tag' => 'Тег', + 'under' => 'Под', + 'symbol' => 'Символ', + 'code' => 'Код', + 'iban' => 'IBAN', + 'accountNumber' => 'Номер счета', + 'creditCardNumber' => 'Номер кредитной карты', + 'has_headers' => 'Заголовки', + 'date_format' => 'Формат даты', + 'specifix' => 'Исправления, специфичные для банка или файла', + 'attachments[]' => 'Вложения', + 'store_new_withdrawal' => 'Сохранить новый расход', + 'store_new_deposit' => 'Сохранить новый доход', + 'store_new_transfer' => 'Сохранить новый перевод', + 'add_new_withdrawal' => 'Добавить новый расход', + 'add_new_deposit' => 'Добавить новый доход', + 'add_new_transfer' => 'Добавить новый перевод', + 'title' => 'Заголовок', + 'notes' => 'Заметки', + 'filename' => 'Имя файла', + 'mime' => 'Тип Mime', + 'size' => 'Размер', + 'trigger' => 'Триггер', + 'stop_processing' => 'Остановить обработку', + 'start_date' => 'Начало диапазона', + 'end_date' => 'Конец диапазона', + 'export_start_range' => 'Начало диапазона для экспорта', + 'export_end_range' => 'Конец диапазона для экспорта', + 'export_format' => 'Формат файла', + 'include_attachments' => 'Включить загруженные вложения', + 'include_old_uploads' => 'Включить импортированные данные', + 'accounts' => 'Экспорт транзакций с этих счетов', + 'delete_account' => 'Удалить счёт ":name"', + 'delete_bill' => 'Удаление счёта к оплате ":name"', + 'delete_budget' => 'Удалить бюджет ":name"', + 'delete_category' => 'Удалить категорию ":name"', + 'delete_currency' => 'Удалить валюту ":name"', + 'delete_journal' => 'Удалить транзакцию с описанием ":description"', + 'delete_attachment' => 'Удалить вложение ":name"', + 'delete_rule' => 'Удалить правило ":title"', + 'delete_rule_group' => 'Удалить группу правил ":title"', + 'delete_link_type' => 'Удалить тип ссылки ":name"', + 'delete_user' => 'Удалить пользователя ":email"', + 'user_areYouSure' => 'Если вы удалите пользователя ":email", все данные будут удалены. Это действие нельзя будет отменить. Если вы удалите себя, вы потеряете доступ к этому экземпляру Firefly III.', + 'attachment_areYouSure' => 'Вы действительно хотите удалить вложение с именем ":name"?', + 'account_areYouSure' => 'Вы действительно хотите удалить счёт с именем ":name"?', + 'bill_areYouSure' => 'Вы действительно хотите удалить счёт на оплату с именем ":name"?', + 'rule_areYouSure' => 'Вы действительно хотите удалить правило с названием ":title"?', + 'ruleGroup_areYouSure' => 'Вы действительно хотите удалить группу правил с названием ":title"?', + 'budget_areYouSure' => 'Вы действительно хотите удалить бюджет с именем ":name"?', + 'category_areYouSure' => 'Вы действительно хотите удалить категорию с именем ":name"?', + 'currency_areYouSure' => 'Вы уверены, что хотите удалить валюту ":name"?', + 'piggyBank_areYouSure' => 'Вы уверены, что хотите удалить копилку с именем ":name"?', + 'journal_areYouSure' => 'Вы действительно хотите удалить транзакцию с описанием ":description"?', + 'mass_journal_are_you_sure' => 'Вы действительно хотите удалить эти транзакции?', + 'tag_areYouSure' => 'Вы действительно хотите удалить метку ":tag"?', + 'journal_link_areYouSure' => 'Вы действительно хотите удалить связь между :source и :destination?', + 'linkType_areYouSure' => 'Вы уверены, что хотите удалить тип ссылки ":name" (":inward" / ":outward")?', + 'permDeleteWarning' => 'Удаление информации из Firefly является постоянным и не может быть отменено.', + 'mass_make_selection' => 'Вы все же можете предотвратить удаление элементов, сняв флажок.', + 'delete_all_permanently' => 'Удалить выбранное навсегда', + 'update_all_journals' => 'Обновить эти транзакции', + 'also_delete_transactions' => 'Будет удалена только транзакция, связанная с этим счётом.|Будут удалены все :count транзакций, связанные с этим счётом.', + 'also_delete_connections' => 'Единственная транзакция, связанная с данным типом ссылки, потеряет это соединение. |Все :count транзакций, связанные с данным типом ссылки, потеряют свои соединения.', + 'also_delete_rules' => 'Единственное правило, связанное с данной группой правил, будет удалено. |Все :count правила, связанные с данной группой правил, будут удалены.', + 'also_delete_piggyBanks' => 'Единственная копилка, связанная с данным счётом, будет удалена.|Все :count копилки, связанные с данным счётом, будут удалены.', + 'bill_keep_transactions' => 'Единственная транзакция, связанная с данным счётом, не будет удалена. |Все :count транзакции, связанные с данным счётом, будут сохранены.', + 'budget_keep_transactions' => 'Единственная транзакция, связанная с данным бюджетом, не будет удалена.|Все :count транзакции, связанные с этим бюджетом, будут сохранены.', + 'category_keep_transactions' => 'Единственная транзакция, связанная с данной категорией, не будет удалена.|Все :count транзакции, связанные с этой категорией, будут сохранены.', + 'tag_keep_transactions' => 'Только транзакция, связанная с этой меткой, будет удалена.|Все :count транзакций, связанные с этой меткой, будут удалены.', + 'check_for_updates' => 'Проверить обновления', + + 'email' => 'Адрес электронной почты', + 'password' => 'Пароль', + 'password_confirmation' => 'Пароль (ещё раз)', + 'blocked' => 'Заблокирован?', + 'blocked_code' => 'Причина блокировки', + + // admin + 'domain' => 'Домен', + 'single_user_mode' => 'Отключить регистрацию пользователей', + 'is_demo_site' => 'Это демо-сайт', + + // import + 'import_file' => 'Файл импорта', + 'configuration_file' => 'Файл конфигурации', + 'import_file_type' => 'Тип файла для импорта', + 'csv_comma' => 'Запятая (,)', + 'csv_semicolon' => 'Точка с запятой (;)', + 'csv_tab' => 'Табулятор (невидимый)', + 'csv_delimiter' => 'Разделитель полей CSV', + 'csv_import_account' => 'Профиль для импорта по умолчанию', + 'csv_config' => 'Параметры импорта CSV', + 'client_id' => 'ID клиента', + 'service_secret' => 'Service secret', + 'app_secret' => 'App secret', + 'public_key' => 'Открытый ключ', + 'country_code' => 'Код страны', + 'provider_code' => 'Банк или поставщик данных', + + 'due_date' => 'Срок', + 'payment_date' => 'Дата платежа', + 'invoice_date' => 'Дата выставления счёта', + 'internal_reference' => 'Внутренняя ссылка', + 'inward' => 'Внутреннее описание', + 'outward' => 'Внешнее описание', + 'rule_group_id' => 'Группа правил', +]; diff --git a/resources/lang/ru_RU/import.php b/resources/lang/ru_RU/import.php new file mode 100644 index 0000000000..09066983f7 --- /dev/null +++ b/resources/lang/ru_RU/import.php @@ -0,0 +1,190 @@ +. + */ +declare(strict_types=1); + +return [ + // status of import: + 'status_wait_title' => 'Пожалуйста, подождите...', + 'status_wait_text' => 'Это сообщение исчезнет через мгновение.', + 'status_fatal_title' => 'Произошла критическая ошибка', + 'status_fatal_text' => 'Произошла фатальная ошибка, из-за которой невозможно восстановить процедуру импорта. Пожалуйста, ознакомьтесь с пояснением в красном блоке ниже.', + 'status_fatal_more' => 'Если ошибка вызывает тайм-аут, импорт остановится на полпути. Для некоторых конфигураций серверов это означает, что сервер остановился, хотя импорт продолжает работать в фоновом режиме. Чтобы проверить, так ли это, проверьте лог-файл. Если проблема не устранена, попробуйте запустить импорт из командной строки.', + 'status_ready_title' => 'Импорт готов к запуску', + 'status_ready_text' => 'Импорт готов к запуску. Все необходимые настройки были сделаны. Пожалуйста, загрузите файл конфигурации. Это поможет повторно запустить импорт, если что-то пойдет не так, как планировалось. Чтобы непосредственно запустить импорт, вы можете либо выполнить следующую команду в консоли, либо запустить веб-импорт. В зависимости от вашей конфигурации импорт с помощью консоли может быть более информативен.', + 'status_ready_noconfig_text' => 'Импорт готов к запуску. Все необходимые настройки были сделаны. Чтобы непосредственно запустить импорт, вы можете либо выполнить следующую команду в консоли, либо запустить веб-импорт. В зависимости от вашей конфигурации импорт с помощью консоли может быть более информативен.', + 'status_ready_config' => 'Загрузить конфигурацию', + 'status_ready_start' => 'Начать импорт', + 'status_ready_share' => 'Пожалуйста, рассмотрите возможность загрузки вашей конфигурации в центр импорта конфигураций. Это позволит другим пользователям Firefly III проще импортировать свои файлы.', + 'status_job_new' => 'Новая задача.', + 'status_job_configuring' => 'Импорт настроен.', + 'status_job_configured' => 'Импорт настроен.', + 'status_job_running' => 'Импорт запущен. Пожалуйста, подождите...', + 'status_job_error' => 'Это задание вызвало ошибку.', + 'status_job_finished' => 'Импорт завершен!', + 'status_running_title' => 'Выполняется импорт', + 'status_running_placeholder' => 'Пожалуйста, дождитесь, пока страница обновится...', + 'status_finished_title' => 'Процедура импорта завершена', + 'status_finished_text' => 'Ваши данные были импортированы.', + 'status_errors_title' => 'Ошибки во время импорта', + 'status_errors_single' => 'Во время импорта произошла ошибка. Однако, она не привела к фатальным последствиям.', + 'status_errors_multi' => 'Во время импорта произошли ошибки. Однако, они не привели к фатальным последствиям.', + 'status_bread_crumb' => 'Статус импорта', + 'status_sub_title' => 'Статус импорта', + 'config_sub_title' => 'Настройте свой импорт', + 'status_finished_job' => 'Всего :count транзакций было импортировано. Они могу быть найдены по метке :tag.', + 'status_finished_no_tag' => 'Firefly III не собрал никаких журналов из вашего файла импорта.', + 'import_with_key' => 'Импорт с ключем \':key\'', + + // file, upload something + 'file_upload_title' => 'Настройка импорта (1/4) - Загрузите ваш файл', + 'file_upload_text' => 'Эта процедура поможет вам импортировать файлы из вашего банка в Firefly III. Пожалуйста, прочитайте справку, доступную в правом верхнем углу этой страницы.', + 'file_upload_fields' => 'Поля', + 'file_upload_help' => 'Выберите файл', + 'file_upload_config_help' => 'Если вы ранее импортировали данные в Firefly III, у вас может быть файл конфигурации, который позволит вам загрузить готовые настойки. Для некоторых банков другие пользователи любезно предоставили свои файлы конфигурации', + 'file_upload_type_help' => 'Выберите тип загружаемого файла', + 'file_upload_submit' => 'Загрузить файлы', + + // file, upload types + 'import_file_type_csv' => 'CSV (значения, разделенные запятыми)', + + // file, initial config for CSV + 'csv_initial_title' => 'Настройка импорта (2/4) - Основные настройки CSV-импорта', + 'csv_initial_text' => 'Чтобы импорт данных прошёл успешно, пожалуйста проверьте несколько параметров.', + 'csv_initial_box' => 'Основные параметры импорта CSV', + 'csv_initial_box_title' => 'Основные параметры импорта CSV', + 'csv_initial_header_help' => 'Установите этот флажок, если первая строка CSV-файла содержит заголовки столбцов.', + 'csv_initial_date_help' => 'Формат даты и времени в вашем CSV-файле. Придерживайтесь формата, описанного на этой странице. По умолчанию дату будут анализироваться на соответствие такому формату: :dateExample.', + 'csv_initial_delimiter_help' => 'Выберите разделитель полей, который используется в вашем файле. Если вы не уверены, помните, что запятая - это самый безопасный вариант.', + 'csv_initial_import_account_help' => 'Если ваш CSV-файл НЕ СОДЕРЖИТ информацию о ваших счетах, используйте этот выпадающий список, чтобы выбрать, к какому счёту относятся транзакции в CVS-файле.', + 'csv_initial_submit' => 'Перейти к шагу 3/4', + + // file, new options: + 'file_apply_rules_title' => 'Применить правила', + 'file_apply_rules_description' => 'Применить ваши правила. Обратите внимание, что это значительно замедляет импорт.', + 'file_match_bills_title' => 'Соответствующие счета к оплате', + 'file_match_bills_description' => 'Сопоставление свои счета к оплате с вновь созданными расходами. Помните, что это может существенно замедлить импорт.', + + // file, roles config + 'csv_roles_title' => 'Настройка импорта (3/4). Определите роль каждого столбца', + 'csv_roles_text' => 'Каждый столбец в файле CSV содержит определённые данные. Укажите, какие данные должен ожидать импортер. Опция «сопоставить» данные привяжет каждую запись, найденную в столбце, к значению в вашей базе данных. Часто отображаемый столбец - это столбец, содержащий IBAN спонсорского счёта. Его можно легко сопоставить с существующим в вашей базе данных IBAN.', + 'csv_roles_table' => 'Таблица', + 'csv_roles_column_name' => 'Название столбца', + 'csv_roles_column_example' => 'Пример данных в столбце', + 'csv_roles_column_role' => 'Значение в столбце', + 'csv_roles_do_map_value' => 'Сопоставьте эти значения', + 'csv_roles_column' => 'Столбец', + 'csv_roles_no_example_data' => 'Нет доступных данных для примера', + 'csv_roles_submit' => 'Перейти к шагу 4/4', + + // not csv, but normal warning + 'roles_warning' => 'Пожалуйста, отметьте хотя бы один столбец как столбец с суммой. Также целесообразно выбрать столбец для описания, даты и спонсорского счёта.', + 'foreign_amount_warning' => 'Если вы пометите этот столбец, как содержащий сумму в иностранной валюте, вы также должны указать столбец, который указывает, какая именно это валюта.', + // file, map data + 'file_map_title' => 'Настройки импорта (4/4) - Сопоставление данных импорта с данными Firefly III', + 'file_map_text' => 'В следующих таблицах значение слева отображает информацию, найденную в загруженном файле. Ваша задача - сопоставить это значение (если это возможно) со значением, уже имеющимся в вашей базе данных. Firefly будет придерживаться этого сопоставления. Если для сопоставления нет значения или вы не хотите отображать определённое значение, ничего не выбирайте.', + 'file_map_field_value' => 'Значение поля', + 'file_map_field_mapped_to' => 'Сопоставлено с', + 'map_do_not_map' => '(не сопоставлено)', + 'file_map_submit' => 'Начать импорт', + 'file_nothing_to_map' => 'В вашем файле нет данных, которые можно сопоставить с существующими значениями. Нажмите «Начать импорт», чтобы продолжить.', + + // map things. + 'column__ignore' => '(игнорировать этот столбец)', + 'column_account-iban' => 'Счет актива (IBAN)', + 'column_account-id' => 'ID основного счёта (соответствующий FF3)', + 'column_account-name' => 'Основной счёт (название)', + 'column_amount' => 'Сумма', + 'column_amount_foreign' => 'Сумма (в иностранной валюте)', + 'column_amount_debit' => 'Сумма (столбец с дебетом)', + 'column_amount_credit' => 'Сумма (столбец с кредитом)', + 'column_amount-comma-separated' => 'Сумма (запятая как десятичный разделитель)', + 'column_bill-id' => 'ID счёта на оплату (соответствующий FF3)', + 'column_bill-name' => 'Название счета', + 'column_budget-id' => 'ID бюджета (соответствующий FF3)', + 'column_budget-name' => 'Название бюджета', + 'column_category-id' => 'ID категории (соответствующий FF3)', + 'column_category-name' => 'Название категории', + 'column_currency-code' => 'Код валюты (ISO 4217)', + 'column_foreign-currency-code' => 'Код иностранной валюты (ISO 4217)', + 'column_currency-id' => 'ID валюты (соответствующий FF3)', + 'column_currency-name' => 'Название валюты (соответствующее FF3)', + 'column_currency-symbol' => 'Символ валюты (соответствующий FF3)', + 'column_date-interest' => 'Дата расчета процентов', + 'column_date-book' => 'Дата записи транзакции', + 'column_date-process' => 'Дата обработки транзакции', + 'column_date-transaction' => 'Дата', + 'column_description' => 'Описание', + 'column_opposing-iban' => 'Спонсорский счёт (IBAN)', + '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_tags-comma' => 'Метки (разделены запятыми)', + 'column_tags-space' => 'Метки (разделены пробелами)', + 'column_account-number' => 'Основной счёт (номер счёта)', + 'column_opposing-number' => 'Спонсорский счёт (номер счёта)', + 'column_note' => 'Примечания', + + // prerequisites + 'prerequisites' => 'Требования', + + // bunq + 'bunq_prerequisites_title' => 'Требования для импорта из bunq', + 'bunq_prerequisites_text' => 'Чтобы импортировать из bunq, вам нужно получить ключ API. Вы можете сделать это через приложение.', + + // Spectre + 'spectre_title' => 'Импорт с использованием Spectre', + 'spectre_prerequisites_title' => 'Требования для импорта с использованием Spectre', + 'spectre_prerequisites_text' => 'Чтобы импортировать данные с помощью API-интерфейса Spectre, вы должны предоставить Firefly III два секретных значения. Их можно найти на странице secrets page.', + 'spectre_enter_pub_key' => 'Импорт будет работать только если вы введёте этот ключ безопасности на своей странице.', + 'spectre_accounts_title' => 'Выберите счёта, с которых будет производиться импорт', + 'spectre_accounts_text' => 'Каждый счёт в списке слева был найден в в Spectre и может быть импортирован в Firefly III. Выберите основной счёт, на котором нужно сохранить импортируемые транзакции. Если вы не хотите импортировать данные с какого-либо конкретного счёта, снимите соответствующий флажок.', + 'spectre_do_import' => 'Да, импортировать с этого счёта', + + // keys from "extra" array: + 'spectre_extra_key_iban' => 'IBAN', + 'spectre_extra_key_swift' => 'SWIFT', + 'spectre_extra_key_status' => 'Статус', + 'spectre_extra_key_card_type' => 'Тип карты', + 'spectre_extra_key_account_name' => 'Название счёта', + 'spectre_extra_key_client_name' => 'Имя клиента', + 'spectre_extra_key_account_number' => 'Номер счёта', + 'spectre_extra_key_blocked_amount' => 'Заблокированная сумма', + 'spectre_extra_key_available_amount' => 'Доступная сумма', + 'spectre_extra_key_credit_limit' => 'Кредитный лимит', + 'spectre_extra_key_interest_rate' => 'Процентная ставка', + 'spectre_extra_key_expiry_date' => 'Дата окончания', + 'spectre_extra_key_open_date' => 'Дата открытия', + 'spectre_extra_key_current_time' => 'Текущее время', + 'spectre_extra_key_current_date' => 'Текущая дата', + 'spectre_extra_key_cards' => 'Карты', + 'spectre_extra_key_units' => 'Единицы', + 'spectre_extra_key_unit_price' => 'Цена за единицу', + 'spectre_extra_key_transactions_count' => 'Количество транзакций', + + // various other strings: + 'imported_from_account' => 'Импортировано со счёта ":account"', +]; + diff --git a/resources/lang/ru_RU/intro.php b/resources/lang/ru_RU/intro.php new file mode 100644 index 0000000000..bd2b105106 --- /dev/null +++ b/resources/lang/ru_RU/intro.php @@ -0,0 +1,133 @@ +. + */ +declare(strict_types=1); + +return [ + // index + 'index_intro' => 'Добро пожаловать на стартовую страницу Firefly III. Пожалуйста, найдите время, чтобы ознакомиться с этим кратким введением в возможности Firefly III.', + 'index_accounts-chart' => 'Эта диаграмма показывает текущий баланс ваших счетов. Вы можете выбрать счета, видимые здесь, в настройках.', + 'index_box_out_holder' => 'Небольшие блоки, собранные на этой странице, показывают общее положение дел с вашими финансами.', + 'index_help' => 'Если вам нужна помощь со страницей или формой - нажмите эту кнопку.', + 'index_outro' => 'Большинство страниц Firefly III начнутся с небольшого тура, подобного этому. Пожалуйста, свяжитесь со мной, если у вас возникнут вопросы или комментарии. Наслаждайтесь!', + 'index_sidebar-toggle' => 'Для создания новый транзакций, счётов или другие элементов, используйте меню под этим значком.', + + // create account: + 'accounts_create_iban' => 'Задайте вашим счетам действующий IBAN. В будущем это может сделать импорт данных очень простым.', + 'accounts_create_asset_opening_balance' => 'У счёта активов всегда есть «начальный баланс», показывающий, какая сумма была на этом счету, когда вы начали работать с ним в Firefly III.', + 'accounts_create_asset_currency' => 'Firefly III поддерживает несколько валют. Каждый счёт связан с одной основной валютой, которую вы должны указать здесь.', + 'accounts_create_asset_virtual' => 'Иногда бывает удобно предоставить вашему счёту виртуальный баланс: дополнительная сумма, всегда добавленная или выведенная из фактического баланса.', + + // budgets index + 'budgets_index_intro' => 'Бюджеты используются для управления финансами и являются одной из основных функций Firefly III.', + 'budgets_index_set_budget' => 'Установите свой общий бюджет на каждый период, чтобы Firefly III мог подсказать вам, если вы потратите все запланированные деньги.', + 'budgets_index_see_expenses_bar' => 'По мере того, как вы будете тратить деньги, эта диаграмма будет заполняться.', + 'budgets_index_navigate_periods' => 'Перемещайтесь между периодами, чтобы планировать бюджеты заранее.', + 'budgets_index_new_budget' => 'Создавайте новые бюджеты по своему усмотрению.', + 'budgets_index_list_of_budgets' => 'Используйте эту таблицу, чтобы установить суммы для каждого бюджета и посмотреть, как у вас дела.', + 'budgets_index_outro' => 'Чтобы узнать больше о бюджете, воспользуйтесь значком справки в верхнем правом углу.', + + // reports (index) + 'reports_index_intro' => 'Используйте эти отчеты, чтобы получить подробные сведения о ваших финансах.', + 'reports_index_inputReportType' => 'Выберите тип отчета. Просмотрите страницу справки, чтобы узнать, что показывает каждый отчёт.', + 'reports_index_inputAccountsSelect' => 'Вы можете исключить или включить основные счета по своему усмотрению.', + 'reports_index_inputDateRange' => 'Выбранный диапазон дат зависит от вас: от одного дня до 10 лет.', + 'reports_index_extra-options-box' => 'В зависимости от выбранного вами отчёта вы можете выбрать здесь дополнительные фильтры и параметры. Посмотрите этот блок, когда вы меняете типы отчётов.', + + // reports (reports) + 'reports_report_default_intro' => 'В этом отчёте вы получите быстрый и исчерпывающий обзор ваших финансов. Если вы хотите увидеть что-нибудь ещё, пожалуйста, не стесняйтесь обращаться ко мне!', + 'reports_report_audit_intro' => 'Этот отчёт покажет вам подробную информацию о ваших активах.', + 'reports_report_audit_optionsBox' => 'Используйте эти флажки, чтобы показать или скрыть интересующие вас столбцы.', + + 'reports_report_category_intro' => 'Этот отчёт даст вам представление об одной или нескольких категориях.', + 'reports_report_category_pieCharts' => 'Эти диаграммы дадут вам представление о расходах и доходах по категориям или счетам.', + 'reports_report_category_incomeAndExpensesChart' => 'На этой диаграмме показаны ваши расходы и доход по каждой категории.', + + 'reports_report_tag_intro' => 'Этот отчёт даст вам представление об одной или нескольких метках.', + 'reports_report_tag_pieCharts' => 'Эти диаграммы дадут вам представление о расходах и доходах по меткам, счетам, категориям или бюджетам.', + 'reports_report_tag_incomeAndExpensesChart' => 'На этой диаграмме показаны ваши расходы и доходы с определенной меткой.', + + 'reports_report_budget_intro' => 'Этот отчёт даст вам представление об одном или нескольких бюджетах.', + 'reports_report_budget_pieCharts' => 'Эти диаграммы дадут вам представление о расходах по выбранному бюджету или счёту.', + 'reports_report_budget_incomeAndExpensesChart' => 'Эта диаграмма показывает ваши расходы с учётом бюджета.', + + // create transaction + 'transactions_create_switch_box' => 'Используйте эти кнопки для быстрого переключения типа транзакции, которую вы хотите сохранить.', + 'transactions_create_ffInput_category' => 'Вы можете свободно вводить название категории в это поле. Вам будут предложены ранее созданные категории.', + 'transactions_create_withdrawal_ffInput_budget' => 'Свяжите ваш расход с одной из статей бюджета для большего контроля над финансами.', + 'transactions_create_withdrawal_currency_dropdown_amount' => 'Используйте этот выпадающий список, если ваш расход был произведён в другой валюте.', + 'transactions_create_deposit_currency_dropdown_amount' => 'Используйте этот выпадающий список, если ваш доход получен в другой валюте.', + 'transactions_create_transfer_ffInput_piggy_bank_id' => 'Выберите копилку и привяжите этот перевод к вашим сбережениям.', + + // piggy banks index: + 'piggy-banks_index_saved' => 'Это поле показывает, сколько вы сохранили в каждой копилке.', + 'piggy-banks_index_button' => 'Рядом с этим индикатором выполнения находятся две кнопки (+ и -) для добавления или удаления денег из каждой копилки.', + 'piggy-banks_index_accountStatus' => 'Для каждого основного счёта, связанного хотя бы с одной копилкой, статус указан в этой таблице.', + + // create piggy + 'piggy-banks_create_name' => 'Какова ваша цель? Новый диван, камера, деньги на "чёрный день"?', + 'piggy-banks_create_date' => 'Вы можете конкретную дату или крайний срок для наполнения своей копилки.', + + // show piggy + 'piggy-banks_show_piggyChart' => 'Диаграмма показывает историю этой копилки.', + 'piggy-banks_show_piggyDetails' => 'Некоторые подробности о вашей копилке', + 'piggy-banks_show_piggyEvents' => 'Все добавления или изъятия денег из копилки показаны здесь.', + + // bill index + 'bills_index_paid_in_period' => 'Это поле показывает, когда счёт был оплачен в последний раз.', + 'bills_index_expected_in_period' => 'Это поле указывает для каждого счета, когда ожидается следующая оплата по нему.', + + // show bill + 'bills_show_billInfo' => 'В этой таблице приведена общая информация об данном счёте.', + 'bills_show_billButtons' => 'Используйте эту кнопку для повторной проверки старых транзакций, чтобы убедиться, что они соответствуют этому счёту.', + 'bills_show_billChart' => 'Эта диаграмма отражает все операции по текущему счёту.', + + // create bill + 'bills_create_name' => 'Используйте понятные названия, например «Аренда» или «Расходы на лечение».', + 'bills_create_match' => 'Чтобы сопоставлять транзакции, используйте поля этих транзакций или счета расходов. Все слова должны совпадать.', + 'bills_create_amount_min_holder' => 'Выберите минимальную и максимальную сумму для этого счета.', + 'bills_create_repeat_freq_holder' => 'Обычно счета к оплате выставляются раз в месяц, но здесь вы можете указать другую периодичность.', + 'bills_create_skip_holder' => 'Если счёт выставляется, например, каждые 2 недели, в поле "пропустить" нужно поставить "1", чтобы пропускать все прочие недели.', + + // rules index + 'rules_index_intro' => 'Firefly III позволяет вам использовать правилами, которые автоматически применяются к любой транзакции, которую вы создаёте или редактируете.', + 'rules_index_new_rule_group' => 'Вы можете комбинировать правила в группы, чтобы упростить управление ими.', + 'rules_index_new_rule' => 'Создайте столько правил, сколько захотите.', + 'rules_index_prio_buttons' => 'Упорядочивайте их так, как вы считаете нужным.', + 'rules_index_test_buttons' => 'Вы можете проверить свои правила или применить их к существующим транзакциям.', + 'rules_index_rule-triggers' => 'Правила имеют «условия» и «действия», которые вы можете упорядочивать путём перетаскивания.', + 'rules_index_outro' => 'Не забудьте ознакомиться со страницами справки, используя значок (?) В правом верхнем углу!', + + // create rule: + 'rules_create_mandatory' => 'Дайте правилу понятное название и укажите, когда оно должно использоваться.', + 'rules_create_ruletriggerholder' => 'Добавьте столько условий, сколько хотите, но помните, что для выполнения действий, должны выполниться ВСЕ условия.', + 'rules_create_test_rule_triggers' => 'Используйте эту кнопку, чтобы узнать, какие транзакции будут соответствовать вашему правилу.', + 'rules_create_actions' => 'Установите столько действий, сколько хотите.', + + // preferences + 'preferences_index_tabs' => 'На этих вкладках доступны дополнительные параметры.', + + // currencies + 'currencies_index_intro' => 'Firefly III поддерживает несколько валют, которые вы можете изменить на этой странице.', + 'currencies_index_default' => 'Firefly III использует одну валюту по умолчанию. Вы всегда можете изменить её, используя эти кнопки.', + + // create currency + 'currencies_create_code' => 'Код должен соответствовать требованиям ISO (для новых валют вы можете найти код с помощью Google).', +]; diff --git a/resources/lang/ru_RU/list.php b/resources/lang/ru_RU/list.php new file mode 100644 index 0000000000..9b7878b2d9 --- /dev/null +++ b/resources/lang/ru_RU/list.php @@ -0,0 +1,105 @@ +. + */ +declare(strict_types=1); + +return [ + 'buttons' => 'Кнопки', + 'icon' => 'Значок', + 'id' => 'ID', + 'create_date' => 'Создан', + 'update_date' => 'Обновлён', + 'updated_at' => 'Последнее изменение', + 'balance_before' => 'Баланс до', + 'balance_after' => 'Баланс после', + 'name' => 'Имя', + 'role' => 'Роль', + 'currentBalance' => 'Текущий баланс', + 'active' => 'Активен?', + 'lastActivity' => 'Последняя активность', + 'balanceDiff' => 'Разность баланса', + 'matchesOn' => 'Совпадает на', + 'account_type' => 'Тип профиля', + 'created_at' => 'Создан', + 'account' => 'Счёт', + 'matchingAmount' => 'Сумма', + 'split_number' => 'Часть №', + 'destination' => 'Получатель', + 'source' => 'Источник', + 'next_expected_match' => 'Следующий ожидаемый результат', + 'automatch' => 'Автоподбор?', + 'repeat_freq' => 'Повторы', + 'description' => 'Описание', + 'amount' => 'Сумма', + 'internal_reference' => 'Внутренняя ссылка', + 'date' => 'Дата', + 'interest_date' => 'Проценты', + 'book_date' => 'Забронировать', + 'process_date' => 'Дата открытия', + 'due_date' => 'Срок', + 'payment_date' => 'Дата платежа', + 'invoice_date' => 'Дата выставления счёта', + 'interal_reference' => 'Внутренняя ссылка', + 'notes' => 'Заметки', + 'from' => 'Откуда', + 'piggy_bank' => 'Копилка', + 'to' => 'Куда', + 'budget' => 'Бюджет', + 'category' => 'Категория', + 'bill' => 'Счет к оплате', + 'withdrawal' => 'Расход', + 'deposit' => 'Доход', + 'transfer' => 'Перевод', + 'type' => 'Тип', + 'completed' => 'Завершено', + 'iban' => 'IBAN', + 'paid_current_period' => 'Оплатить в указанный период', + 'email' => 'E-mail', + 'registered_at' => 'Дата регистрации', + 'is_blocked' => 'Заблокирован?', + 'is_admin' => 'Администратор?', + 'has_two_factor' => 'Защита (2FA)?', + 'blocked_code' => 'Код блокировки', + 'source_account' => 'Исходный счет', + 'destination_account' => 'Счет назначения', + 'accounts_count' => 'Всего счетов', + 'journals_count' => 'Всего транзакций', + 'attachments_count' => 'Всего вложений', + 'bills_count' => 'Всего счетов к оплате', + 'categories_count' => 'Всего категорий', + 'export_jobs_count' => 'Задачи по экспорту', + 'import_jobs_count' => 'Задачи по импорту', + 'budget_count' => 'Всего категорий бюджета', + 'rule_and_groups_count' => 'Всего правил и групп правил', + 'tags_count' => 'Всего меток', + 'tags' => 'Метки', + 'inward' => 'Внутреннее описание', + 'outward' => 'Внешнее описание', + 'number_of_transactions' => 'Всего транзакций', + 'total_amount' => 'Итого', + 'sum' => 'Сумма', + 'sum_excluding_transfers' => 'Сумма (без учета переводов)', + 'sum_withdrawals' => 'Сумма расходов', + 'sum_deposits' => 'Сумма доходов', + 'sum_transfers' => 'Сумма переводов', + 'reconcile' => 'Сверка', + 'account_on_spectre' => 'Счёт (Spectre)', + 'do_import' => 'Импортировать с этого счёта', +]; diff --git a/resources/lang/ru_RU/pagination.php b/resources/lang/ru_RU/pagination.php new file mode 100644 index 0000000000..cf5abe6621 --- /dev/null +++ b/resources/lang/ru_RU/pagination.php @@ -0,0 +1,26 @@ +. + */ +declare(strict_types=1); + +return [ + 'previous' => '« Предыдущие', + 'next' => 'Следующие »', +]; diff --git a/resources/lang/ru_RU/passwords.php b/resources/lang/ru_RU/passwords.php new file mode 100644 index 0000000000..5b97d32fc8 --- /dev/null +++ b/resources/lang/ru_RU/passwords.php @@ -0,0 +1,30 @@ +. + */ +declare(strict_types=1); + +return [ + 'password' => 'Пароль должен содержать не менее 6 символов. Пароль и его подтверждение должны совпадать.', + 'user' => 'Мы не можем найти пользователя с таким e-mail.', + 'token' => 'Это неправильный ключ для сброса пароля.', + 'sent' => 'Мы отправили ссылку для сброса пароля на ваш e-mail!', + 'reset' => 'Ваш пароль был успешно сброшен!', + 'blocked' => 'Это была хорошая попытка.', +]; diff --git a/resources/lang/ru_RU/validation.php b/resources/lang/ru_RU/validation.php new file mode 100644 index 0000000000..e75bf5546b --- /dev/null +++ b/resources/lang/ru_RU/validation.php @@ -0,0 +1,136 @@ +. + */ +declare(strict_types=1); + +return [ + 'iban' => 'Это некорректный IBAN.', + 'unique_account_number_for_user' => 'Этот номер счёта уже используется.', + 'deleted_user' => 'По соображениям безопасности, вы не можете зарегистрироваться, используя этот адрес электронной почты.', + 'rule_trigger_value' => 'Это значение является недопустимым для выбранного триггера.', + 'rule_action_value' => 'Это значение является недопустимым для выбранного действия.', + 'file_already_attached' => 'Загруженный файл ":name" уже прикреплён к этому объекту.', + 'file_attached' => 'Файл ":name". успешно загружен.', + 'file_invalid_mime' => 'Файл ":name" имеет тип ":mime". Загрузка файлов такого типа невозможна.', + 'file_too_large' => 'Файл ":name" слишком большой.', + 'belongs_to_user' => 'Значение :attribute неизвестно', + 'accepted' => 'Необходимо принять :attribute.', + 'bic' => 'Это некорректный BIC.', + 'more' => ':attribute должен быть больше нуля.', + 'active_url' => ':attribute не является допустимым URL-адресом.', + 'after' => ':attribute должна быть позже :date.', + 'alpha' => ':attribute может содержать только буквы.', + 'alpha_dash' => ':attribute может содержать только буквы, числа и дефис.', + 'alpha_num' => ':attribute может содержать только буквы и числа.', + 'array' => ':attribute должен быть массивом.', + 'unique_for_user' => 'Уже существует запись с этим :attribute.', + 'before' => ':attribute должна быть раньше :date.', + 'unique_object_for_user' => 'Это имя уже используется', + 'unique_account_for_user' => 'Имя аккаунта уже используется', + 'between.numeric' => ':attribute должен быть больше :min и меньше :max.', + 'between.file' => ':attribute должен быть размером :min - :max килобайт.', + 'between.string' => ':attribute должен содержать :min - :max символов.', + 'between.array' => ':attribute должен содержать :min - :max элементов.', + 'boolean' => 'Поле :attribute должно быть истинным или ложным.', + 'confirmed' => ':attribute не совпадает с подтверждением.', + 'date' => ':attribute не является верной датой.', + 'date_format' => ':attribute не совпадает с форматом :format.', + 'different' => ':attribute и :other не должны совпадать.', + 'digits' => ':attribute должно содержать :digits цифр.', + 'digits_between' => ':attribute должен содержать :min - :max цифр.', + 'email' => ':attribute не является верным email адресом.', + 'filled' => 'Поле :attribute должно быть заполнено.', + 'exists' => 'Выбран неверный :attribute.', + 'image' => ':attribute должен быть изображением.', + 'in' => 'Выбранный :attribute не верный.', + 'integer' => ':attribute должно быть целым числом.', + 'ip' => ':attribute должен быть верным IP-адресом.', + 'json' => ':attribute должно быть верной JSON строкой.', + 'max.numeric' => 'Значение :attribute не может быть больше :max.', + 'max.file' => 'Значение :attribute не может быть больше :max килобайт.', + 'max.string' => 'Значение :attribute не может быть больше :max символов.', + 'max.array' => 'Значение :attribute не может содержать более :max элементов.', + 'mimes' => ':attribute должен быть файлом типа :values.', + 'min.numeric' => ':attribute должен быть минимум :min.', + 'min.file' => ':attribute должен быть минимум :min килобайт.', + 'min.string' => 'Значение :attribute должно быть не меньше :min символов.', + 'min.array' => 'Значение :attribute должно содержать не меньше :min элементов.', + 'not_in' => 'Выбранный :attribute не верный.', + 'numeric' => ':attribute должен быть числом.', + 'regex' => 'Формат :attribute некорректен.', + 'required' => 'Поле :attribute является обязательным.', + 'required_if' => 'Значение :attribute является обязательным, когда :other равное :value.', + 'required_unless' => 'Поле :attribute является обязательным, если :other не входит в список :values.', + 'required_with' => 'Поле :attribute является обязательным, когда есть :values.', + 'required_with_all' => 'Поле :attribute является обязательным, когда есть :values.', + 'required_without' => 'Поле :attribute является обязательным, когда отсутствует :values.', + 'required_without_all' => ':attribute поле обязательно для заполнения, так как ни одно из :values не существует.', + 'same' => ':attribute и :other должны совпадать.', + 'size.numeric' => ':attribute должен быть размером :size.', + 'size.file' => ':attribute должен быть размером :size килобайт.', + 'size.string' => ':attribute должен состоять из :size символов.', + 'size.array' => ':attribute должен содержать :size элементов.', + 'unique' => ':attribute уже занят.', + 'string' => 'Значение :attribute должно быть строкой.', + 'url' => 'Неверный формат ввода :attribute.', + 'timezone' => ':attribute должен быть в допустимом диапазоне.', + '2fa_code' => ':attribute введен неверно.', + 'dimensions' => 'Недопустимые размеры изображения :attribute.', + 'distinct' => 'Поле :attribute содержит повторяющееся значение.', + 'file' => ':attribute должен быть файлом.', + 'in_array' => 'Поле :attribute не существует в :other.', + 'present' => 'Поле :attribute должно быть заполнено.', + 'amount_zero' => 'Общее количество не может быть равно нулю', + 'secure_password' => 'Это не безопасный пароль. Попробуйте еще раз. Для получения справки посетите https://goo.gl/NCh2tN', + 'attributes' => [ + 'email' => '"Адрес электронной почты"', + 'description' => '"Описание"', + 'amount' => 'Сумма', + 'name' => '"Название"', + 'targetamount' => '"Целевая сумма"', + 'openingBalanceDate' => '"Дата начального баланса"', + 'openingBalance' => '"Начальный баланс"', + 'match' => '"Ключи для связи"', + 'amount_min' => '"Минимальная сумма"', + 'amount_max' => '"Максимальная сумма"', + 'title' => '"Заголовок"', + 'tag' => '"Метка"', + 'rule-action-value.1' => '"Значение действия #1"', + 'rule-action-value.2' => '"Значение действия #2"', + 'rule-action-value.3' => '"Значение действия #3"', + 'rule-action-value.4' => '"Значение действия #4"', + 'rule-action-value.5' => '"Значение действия #5"', + 'rule-action.1' => '"Действие #1"', + 'rule-action.2' => '"Действие #2"', + 'rule-action.3' => '"Действие #3"', + 'rule-action.4' => '"Действие #4"', + 'rule-action.5' => '"Действие #5"', + 'rule-trigger-value.1' => '"Значение условия #1"', + 'rule-trigger-value.2' => '"Значение условия #2"', + 'rule-trigger-value.3' => '"Значение условия #3"', + 'rule-trigger-value.4' => '"Значение условия #4"', + 'rule-trigger-value.5' => '"Значение условия #5"', + 'rule-trigger.1' => '"Условие #1"', + 'rule-trigger.2' => '"Условие #2"', + 'rule-trigger.3' => '"Условие #3"', + 'rule-trigger.4' => '"Условие #4"', + 'rule-trigger.5' => '"Условие #5"', + ], +]; diff --git a/resources/lang/tr_TR/config.php b/resources/lang/tr_TR/config.php index 4f2ceb7fc1..d3812f72e2 100644 --- a/resources/lang/tr_TR/config.php +++ b/resources/lang/tr_TR/config.php @@ -21,6 +21,7 @@ declare(strict_types=1); return [ + 'html_language' => 'tr', 'locale' => 'tr, Turkish, tr_TR, tr_TR.utf8, tr_TR.S.UTF-8', 'month' => '%B %Y', 'month_and_day' => '%e %B %Y', diff --git a/resources/lang/tr_TR/demo.php b/resources/lang/tr_TR/demo.php index f5f05e11c3..f4c344440f 100644 --- a/resources/lang/tr_TR/demo.php +++ b/resources/lang/tr_TR/demo.php @@ -32,6 +32,4 @@ return [ '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', - 'import-configure-security' => 'Güvenlik kaygıları nedeniyle yüklemeniz yerel bir dosya ile değiştirildi.', - 'import-configure-configuration' => 'Aşağıda gördüğünüz yapılandırma, yerel dosya için doğrudur.', ]; diff --git a/resources/lang/tr_TR/firefly.php b/resources/lang/tr_TR/firefly.php index 3b10199561..8ee65ee103 100644 --- a/resources/lang/tr_TR/firefly.php +++ b/resources/lang/tr_TR/firefly.php @@ -44,8 +44,17 @@ return [ 'Opening balance' => 'Açılış bakiyesi', 'create_new_stuff' => 'Yeni bir şey oluştur', 'new_withdrawal' => 'Yeni para çekme', + 'create_new_transaction' => 'Create new transaction', + 'go_to_asset_accounts' => 'View your asset accounts', + 'go_to_budgets' => 'Go to your budgets', + 'go_to_categories' => 'Go to your categories', + 'go_to_bills' => 'Go to your bills', + 'go_to_expense_accounts' => 'See your expense accounts', + 'go_to_revenue_accounts' => 'See your revenue accounts', + 'go_to_piggies' => 'Go to your piggy banks', 'new_deposit' => 'Yeni Depozito', 'new_transfer' => 'Yeni transfer', + 'new_transfers' => 'New transfer', 'new_asset_account' => 'Yeni varlık hesabı', 'new_expense_account' => 'Yeni gider hesabı', 'new_revenue_account' => 'Yeni Gelir Hesabı', @@ -60,6 +69,9 @@ return [ 'flash_error_multiple' => 'Bir hata var|:count hata var', 'net_worth' => 'Net değer', 'route_has_no_help' => 'Bu rota için yardım yok.', + 'help_for_this_page' => 'Help for this page', + 'no_help_could_be_found' => 'No help text could be found.', + 'no_help_title' => 'Apologies, an error occurred.', 'two_factor_welcome' => 'Merhaba, :user!', 'two_factor_enter_code' => 'Devam etmek için lütfen iki faktörlü kimlik doğrulama kodunuzu girin. Uygulamanız sizin için oluşturabilir.', 'two_factor_code_here' => 'Kodu buraya girin', @@ -108,8 +120,14 @@ return [ 'clone_deposit' => 'Bu depozitoyu klonla', 'clone_transfer' => 'Bu transferi kopyala', 'multi_select_no_selection' => 'Hiçbiri seçilmedi', + 'multi_select_select_all' => 'Select all', + 'multi_select_n_selected' => 'selected', 'multi_select_all_selected' => 'Tümü seçildi', 'multi_select_filter_placeholder' => 'Bul..', + 'intro_next_label' => 'Next', + 'intro_prev_label' => 'Previous', + 'intro_skip_label' => 'Skip', + 'intro_done_label' => 'Done', 'between_dates_breadcrumb' => ':start ve :end arasında', 'all_journals_without_budget' => 'Bütçesiz tüm işlemler', 'journals_without_budget' => 'Bütçesiz İşlemler', @@ -163,7 +181,7 @@ return [ 'admin_update_check_now_title' => 'Check for updates now', 'admin_update_check_now_explain' => 'If you press the button, Firefly III will see if your current version is the latest.', 'check_for_updates_button' => 'Check now!', - 'update_new_version_alert' => 'A new version is available. You are running v:your_version, the latest version is v:new_version which was released on :date.', + '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_current_version_alert' => 'You are running v:version, which is the latest available release.', 'update_newer_version_alert' => 'You are running v:your_version, which is newer than the latest release, v:new_version.', 'update_check_error' => 'An error occurred while checking for updates. Please view the log files.', @@ -193,8 +211,8 @@ return [ // export data: 'import_and_export' => 'İçe al ve dışarı aktar', 'export_data' => 'Veriyi dışarı aktar', - 'export_and_backup_data' => 'Dışa aktarma ve yedekleme', - 'export_data_intro' => 'Yedekleme amacıyla, başka bir sisteme geçiş yaparken veya başka bir ateş Firefly III yüklemesine geçerken.', + '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_format' => 'Dışa Aktarma Biçimi', 'export_format_csv' => 'Virgülle ayrılmış değerler (CSV file)', 'export_format_mt940' => 'MT940 uyumlu format', @@ -601,8 +619,8 @@ işlemlerin kontrol edildiğini lütfen unutmayın.', 'between_amounts' => ':low ve :high arasında.', 'repeats' => 'Tekrarlar', 'connected_journals' => 'İlişkili işlemler', - 'auto_match_on' => 'Firefly otomatik olarak eşleştirilir', - 'auto_match_off' => 'Firefly otomatik olarak eşleştirilmez', + '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"', @@ -762,7 +780,7 @@ işlemlerin kontrol edildiğini lütfen unutmayın.', 'notes' => 'Notes', // new user: - 'welcome' => 'Firefly\'a hoş geldiniz!', + '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.', diff --git a/resources/lang/tr_TR/import.php b/resources/lang/tr_TR/import.php index 6d19e9680e..efd498afd2 100644 --- a/resources/lang/tr_TR/import.php +++ b/resources/lang/tr_TR/import.php @@ -22,138 +22,169 @@ declare(strict_types=1); return [ // status of import: - 'status_wait_title' => 'Lütfen bekleyin...', - 'status_wait_text' => 'Bu kutu bir dakika içinde kaybolacak.', - 'status_fatal_title' => 'Önemli bir hata oluştu', - 'status_fatal_text' => 'İçe aktarma rutininin kurtaramadığı önemli bir hata oluştu. Lütfen aşağıdaki kırmızı renkli açıklamaları okuyun.', - 'status_fatal_more' => 'Eğer hata zaman aşımı ise, içe aktarma yarısında durdurulur. Bazı sunucu ayarlarında sadece sunucu durdurulurken içe aktarım arka planda devam eder. Bunu sağlamak için kayıt dosyalarını kontrol edin. Eğer sorun devam ederse komut satırı üzerinden içe aktarımı deneyin.', - 'status_ready_title' => 'İçe aktarım başlamaya hazır', - 'status_ready_text' => 'İçe aktarım başlamaya hazır. Yapmanız gereken tüm ayarlar yapıldı. Lütfen ayar dosyasını indirin. İçe aktarım planlandığı gibi gitmezse size yardım edecektir. İçe aktarımı başlatmak için takip eden komutu konsolunuza girebilir ya da web tabanlı içe aktarımı kullanabilirsiniz. Ayarlarınıza bağlı olarak göre konsol içe aktarımı size daha fazla geri bildirim verecektir.', - 'status_ready_noconfig_text' => 'İçe aktarım başlamaya hazır. Yapmanız gereken tüm ayarlar yapıldı. İçe aktarımı başlatmak için takip eden komutu konsolunuza girebilir ya da web tabanlı içe aktarımı kullanabilirsiniz. Ayarlarınıza bağlı olarak göre konsol içe aktarımı size daha fazla geri bildirim verecektir.', - 'status_ready_config' => 'Yapılandırmayı indir', - 'status_ready_start' => 'İçe aktarmayı başlat', - 'status_ready_share' => 'Lütfen ayarlarınızı indirmeyi ve onu içe aktarım ayarları merkezinde paylaşmayı düşünün. Bu diğer kullanıcılarının Firefly III\'ün dosyalarını daha kolay içe aktarmasına olanak tanır.', - 'status_job_new' => 'Yeni iş.', - 'status_job_configuring' => 'İçe aktarım ayarlanıyor.', - 'status_job_configured' => 'İçe aktarım ayarlandı.', - 'status_job_running' => 'Alma işlemi çalışıyor... Lütfen bekleyin..', - 'status_job_error' => 'İş bir hata üretti.', - 'status_job_finished' => 'Alma işlemi tamamlandı!', - 'status_running_title' => 'İçe aktarma işlemi sürüyor', - 'status_running_placeholder' => 'Güncelleme için lütfen bekleyin...', - 'status_finished_title' => 'İçe aktarma rutini tamamlandı', - 'status_finished_text' => 'İçe aktarma rutini verilerinizi içe aktardı.', - 'status_errors_title' => 'İçe aktarım sırasında hata', - 'status_errors_single' => 'İçe aktarım sırasında bir hata oluştu. Önemli gibi görünmüyor.', - 'status_errors_multi' => 'İçe aktarım sırasında hatalar oluştu. Önemli gibi görünmüyorlar.', - 'status_bread_crumb' => 'Aktarma durumu', - 'status_sub_title' => 'Aktarma durumu', - 'config_sub_title' => 'Hesabınızı oluşturunuz', - 'status_finished_job' => 'İçe aktarılan işlemler etiket etiketinde bulunabilirler.', - 'import_with_key' => '\':key\' ile içe aktarın', + 'status_wait_title' => 'Lütfen bekleyin...', + 'status_wait_text' => 'Bu kutu bir dakika içinde kaybolacak.', + 'status_fatal_title' => 'Önemli bir hata oluştu', + 'status_fatal_text' => 'İçe aktarma rutininin kurtaramadığı önemli bir hata oluştu. Lütfen aşağıdaki kırmızı renkli açıklamaları okuyun.', + 'status_fatal_more' => 'Eğer hata zaman aşımı ise, içe aktarma yarısında durdurulur. Bazı sunucu ayarlarında sadece sunucu durdurulurken içe aktarım arka planda devam eder. Bunu sağlamak için kayıt dosyalarını kontrol edin. Eğer sorun devam ederse komut satırı üzerinden içe aktarımı deneyin.', + 'status_ready_title' => 'İçe aktarım başlamaya hazır', + 'status_ready_text' => 'İçe aktarım başlamaya hazır. Yapmanız gereken tüm ayarlar yapıldı. Lütfen ayar dosyasını indirin. İçe aktarım planlandığı gibi gitmezse size yardım edecektir. İçe aktarımı başlatmak için takip eden komutu konsolunuza girebilir ya da web tabanlı içe aktarımı kullanabilirsiniz. Ayarlarınıza bağlı olarak göre konsol içe aktarımı size daha fazla geri bildirim verecektir.', + 'status_ready_noconfig_text' => 'İçe aktarım başlamaya hazır. Yapmanız gereken tüm ayarlar yapıldı. İçe aktarımı başlatmak için takip eden komutu konsolunuza girebilir ya da web tabanlı içe aktarımı kullanabilirsiniz. Ayarlarınıza bağlı olarak göre konsol içe aktarımı size daha fazla geri bildirim verecektir.', + 'status_ready_config' => 'Yapılandırmayı indir', + 'status_ready_start' => 'İçe aktarmayı başlat', + 'status_ready_share' => 'Lütfen ayarlarınızı indirmeyi ve onu içe aktarım ayarları merkezinde paylaşmayı düşünün. Bu diğer kullanıcılarının Firefly III\'ün dosyalarını daha kolay içe aktarmasına olanak tanır.', + 'status_job_new' => 'Yeni iş.', + 'status_job_configuring' => 'İçe aktarım ayarlanıyor.', + 'status_job_configured' => 'İçe aktarım ayarlandı.', + 'status_job_running' => 'Alma işlemi çalışıyor... Lütfen bekleyin..', + 'status_job_error' => 'İş bir hata üretti.', + 'status_job_finished' => 'Alma işlemi tamamlandı!', + 'status_running_title' => 'İçe aktarma işlemi sürüyor', + 'status_running_placeholder' => 'Güncelleme için lütfen bekleyin...', + 'status_finished_title' => 'İçe aktarma rutini tamamlandı', + 'status_finished_text' => 'İçe aktarma rutini verilerinizi içe aktardı.', + 'status_errors_title' => 'İçe aktarım sırasında hata', + 'status_errors_single' => 'İçe aktarım sırasında bir hata oluştu. Önemli gibi görünmüyor.', + 'status_errors_multi' => 'İçe aktarım sırasında hatalar oluştu. Önemli gibi görünmüyorlar.', + 'status_bread_crumb' => 'Aktarma durumu', + 'status_sub_title' => 'Aktarma durumu', + 'config_sub_title' => 'Hesabınızı oluşturunuz', + 'status_finished_job' => 'The :count transactions imported can be found in tag :tag.', + 'status_finished_no_tag' => 'Firefly III has not collected any journals from your import file.', + 'import_with_key' => '\':key\' ile içe aktarın', // file, upload something - 'file_upload_title' => 'Ayarları aktar (1/4) - Dosyalarınızı yükelyin', - 'file_upload_text' => 'Bu yöntem dosyalarınızı bankanızdan Firefly III\'e aktarmanıza yardımcı olur. Lütfen sağ üst köşedeki yardımı kontrol edin.', - 'file_upload_fields' => 'Alanlar', - 'file_upload_help' => 'Dosyanızı seçin', - 'file_upload_config_help' => 'Eğer Firefly III\'e daha önce veri aktardıysanız, ayarları sizin için önceden ayarlayacak bir ayar dosyasına sahip olabilirsiniz. Diğer kullanıcılar baı bankalar için kendi ayar dosyalarını sağlayabilirler', - 'file_upload_type_help' => 'Yükleyeceğiniz dosya türünü seçin', - 'file_upload_submit' => 'Dosyaları yükle', + 'file_upload_title' => 'Ayarları aktar (1/4) - Dosyalarınızı yükelyin', + 'file_upload_text' => 'Bu yöntem dosyalarınızı bankanızdan Firefly III\'e aktarmanıza yardımcı olur. Lütfen sağ üst köşedeki yardımı kontrol edin.', + 'file_upload_fields' => 'Alanlar', + 'file_upload_help' => 'Dosyanızı seçin', + 'file_upload_config_help' => 'Eğer Firefly III\'e daha önce veri aktardıysanız, ayarları sizin için önceden ayarlayacak bir ayar dosyasına sahip olabilirsiniz. Diğer kullanıcılar baı bankalar için kendi ayar dosyalarını sağlayabilirler', + 'file_upload_type_help' => 'Yükleyeceğiniz dosya türünü seçin', + 'file_upload_submit' => 'Dosyaları yükle', // file, upload types - 'import_file_type_csv' => 'CSV (virgülle ayrılmış değerler)', + 'import_file_type_csv' => 'CSV (virgülle ayrılmış değerler)', // file, initial config for CSV - 'csv_initial_title' => 'Ayarları aktar (2/4) - Temel CSV aktarım ayarları', - 'csv_initial_text' => 'Dosyanızı doğru bir şekilde içe aktarabilmek için lütfen aşağıdaki seçenekleri doğrulayın.', - 'csv_initial_box' => 'Temel CSV aktarım ayarları', - 'csv_initial_box_title' => 'Temel CSV aktarım ayarları seçenekleri', - 'csv_initial_header_help' => 'CSV dosyanızın ilk satırları sütun başlıklarıysa bu kutuyu işaretleyin.', - 'csv_initial_date_help' => 'CSV dosyanızda ki zaman biçimi. Bu sayfanın gösterdiği biçimi kontrol takip edin. Varsayılan değer şu şekilde görülen tarihleri ayrıştırır: :dateExample.', - 'csv_initial_delimiter_help' => 'Gir dosyanızda kullanılan alan sınırlayıcıyı seçin. Emin değilseniz, virgül en güvenli seçenektir.', - 'csv_initial_import_account_help' => 'Eğer CSV dosyanız aktif hesabınızla ilgili bilgi içermiyorsa, CSV\'de bulunan işlemlerin hangi hesaba ait olduğunu bu açılan kutudan seçiniz.', - 'csv_initial_submit' => '3/4 adım ile devam et', + 'csv_initial_title' => 'Ayarları aktar (2/4) - Temel CSV aktarım ayarları', + 'csv_initial_text' => 'Dosyanızı doğru bir şekilde içe aktarabilmek için lütfen aşağıdaki seçenekleri doğrulayın.', + 'csv_initial_box' => 'Temel CSV aktarım ayarları', + 'csv_initial_box_title' => 'Temel CSV aktarım ayarları seçenekleri', + 'csv_initial_header_help' => 'CSV dosyanızın ilk satırları sütun başlıklarıysa bu kutuyu işaretleyin.', + 'csv_initial_date_help' => 'CSV dosyanızda ki zaman biçimi. Bu sayfanın gösterdiği biçimi kontrol takip edin. Varsayılan değer şu şekilde görülen tarihleri ayrıştırır: :dateExample.', + 'csv_initial_delimiter_help' => 'Gir dosyanızda kullanılan alan sınırlayıcıyı seçin. Emin değilseniz, virgül en güvenli seçenektir.', + 'csv_initial_import_account_help' => 'Eğer CSV dosyanız aktif hesabınızla ilgili bilgi içermiyorsa, CSV\'de bulunan işlemlerin hangi hesaba ait olduğunu bu açılan kutudan seçiniz.', + 'csv_initial_submit' => '3/4 adım ile devam et', // file, new options: - 'file_apply_rules_title' => 'Kuralları uygula', - 'file_apply_rules_description' => 'Kurallarınızı kabul ediniz. Bunun önemli ölçüde içe aktarmayı yavaşlattığını unutmayın.', - 'file_match_bills_title' => 'Faturaları eşleştirin', - 'file_match_bills_description' => 'Faturalarınızı yeni oluşturulan çekimlerle eşleştirin. Bunun önemli ölçüde içe aktarmayı yavaşlatacağını unutmayın.', + 'file_apply_rules_title' => 'Kuralları uygula', + 'file_apply_rules_description' => 'Kurallarınızı kabul ediniz. Bunun önemli ölçüde içe aktarmayı yavaşlattığını unutmayın.', + 'file_match_bills_title' => 'Faturaları eşleştirin', + 'file_match_bills_description' => 'Faturalarınızı yeni oluşturulan çekimlerle eşleştirin. Bunun önemli ölçüde içe aktarmayı yavaşlatacağını unutmayın.', // file, roles config - 'csv_roles_title' => 'Ayarları aktar (3/4) - Her sütunun görevini belirleyin', - 'csv_roles_text' => 'CSV dosyanızdaki her sütun belirli verileri içerir. Lütfen aktarıcının ne tür bir veri beklemesi gerektiğini belirtin. Verileri "planla" seçeneği sütunda bulunan her girdinin veri tabanınınızdaki bir değer ile bağlantılanması anlamına gelir. Genellikle planlanan sütun karşı hesabın IBAN numarasının olduğu sütundur. Bu veri tabanınızda bulunan IBAN\'larla kolayca eşleştirilebilir.', - 'csv_roles_table' => 'Tablo', - 'csv_roles_column_name' => 'Sütun adı', - 'csv_roles_column_example' => 'Sütun örneği verileri', - 'csv_roles_column_role' => 'Sütun veri ortalaması', - 'csv_roles_do_map_value' => 'Değerlerin haritası', - 'csv_roles_column' => 'Sütun', - 'csv_roles_no_example_data' => 'Örnek veri yok', - 'csv_roles_submit' => '4/4 adım ile devam et', + 'csv_roles_title' => 'Ayarları aktar (3/4) - Her sütunun görevini belirleyin', + 'csv_roles_text' => 'CSV dosyanızdaki her sütun belirli verileri içerir. Lütfen aktarıcının ne tür bir veri beklemesi gerektiğini belirtin. Verileri "planla" seçeneği sütunda bulunan her girdinin veri tabanınınızdaki bir değer ile bağlantılanması anlamına gelir. Genellikle planlanan sütun karşı hesabın IBAN numarasının olduğu sütundur. Bu veri tabanınızda bulunan IBAN\'larla kolayca eşleştirilebilir.', + 'csv_roles_table' => 'Tablo', + 'csv_roles_column_name' => 'Sütun adı', + 'csv_roles_column_example' => 'Sütun örneği verileri', + 'csv_roles_column_role' => 'Sütun veri ortalaması', + 'csv_roles_do_map_value' => 'Değerlerin haritası', + 'csv_roles_column' => 'Sütun', + 'csv_roles_no_example_data' => 'Örnek veri yok', + 'csv_roles_submit' => '4/4 adım ile devam et', // 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.', - + '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.', - 'file_map_field_value' => 'Alan değeri', - 'file_map_field_mapped_to' => 'Eşleşti', - 'map_do_not_map' => '(eşleştirme)', - 'file_map_submit' => 'İçe aktarmaya başla', - 'file_nothing_to_map' => 'There is no data present in your file that you can map to existing values. Please press "Start the import" to continue.', + '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.', + 'file_map_field_value' => 'Alan değeri', + 'file_map_field_mapped_to' => 'Eşleşti', + 'map_do_not_map' => '(eşleştirme)', + 'file_map_submit' => 'İçe aktarmaya başla', + 'file_nothing_to_map' => 'There is no data present in your file that you can map to existing values. Please press "Start the import" to continue.', // map things. - 'column__ignore' => '(bu sütünu yok say)', - 'column_account-iban' => 'Öğe hesabı (IBAN)', - 'column_account-id' => 'Varlık hesabı kimliği (Firefly ile eşleşen)', - 'column_account-name' => 'Varlık hesabı (isim)', - 'column_amount' => 'Tutar', - 'column_amount_debit' => 'Miktar (borç sütunu)', - 'column_amount_credit' => 'Miktar (kredi sütunu)', - 'column_amount-comma-separated' => 'Miktar (virgül ondalık ayırıcı olarak)', - 'column_bill-id' => 'Fatura Kimliği (Firefly ile eşleşen)', - 'column_bill-name' => 'Fatura adı', - 'column_budget-id' => 'Bütçe kimliği (Firefly ile eşleşen)', - 'column_budget-name' => 'Bütçe adı', - 'column_category-id' => 'Kategori kimliği (Firefly ile eşleşen)', - 'column_category-name' => 'Kategori adı', - 'column_currency-code' => 'Para birimi kodu (ISO 4217)', - 'column_currency-id' => 'Para birimi kimliği (Firefly ile eşleşen)', - 'column_currency-name' => 'Para birimi adı (Firefly ile eşleşen)', - 'column_currency-symbol' => 'Para birimi simgesi (Firefly eşleşen)', - 'column_date-interest' => 'Faiz hesaplama tarihi', - 'column_date-book' => 'İşlem rezervasyon tarihi', - 'column_date-process' => 'İşlem tarihi', - 'column_date-transaction' => 'Tarih', - 'column_description' => 'Açıklama', - 'column_opposing-iban' => 'Karşı hesap (IBAN)', - 'column_opposing-id' => 'Karşı hesap kimliği (Firefly ile eşleşen)', - '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_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__ignore' => '(bu sütünu yok say)', + 'column_account-iban' => 'Öğe hesabı (IBAN)', + 'column_account-id' => 'Asset account ID (matching FF3)', + 'column_account-name' => 'Varlık hesabı (isim)', + 'column_amount' => 'Tutar', + 'column_amount_foreign' => 'Amount (in foreign currency)', + 'column_amount_debit' => 'Miktar (borç sütunu)', + 'column_amount_credit' => 'Miktar (kredi sütunu)', + 'column_amount-comma-separated' => 'Miktar (virgül ondalık ayırıcı olarak)', + 'column_bill-id' => 'Bill ID (matching FF3)', + 'column_bill-name' => 'Fatura adı', + 'column_budget-id' => 'Budget ID (matching FF3)', + 'column_budget-name' => 'Bütçe adı', + 'column_category-id' => 'Category ID (matching FF3)', + 'column_category-name' => 'Kategori adı', + 'column_currency-code' => 'Para birimi kodu (ISO 4217)', + 'column_foreign-currency-code' => 'Foreign currency code (ISO 4217)', + 'column_currency-id' => 'Currency ID (matching FF3)', + 'column_currency-name' => 'Currency name (matching FF3)', + 'column_currency-symbol' => 'Currency symbol (matching FF3)', + 'column_date-interest' => 'Faiz hesaplama tarihi', + 'column_date-book' => 'İşlem rezervasyon tarihi', + 'column_date-process' => 'İşlem tarihi', + 'column_date-transaction' => 'Tarih', + 'column_description' => 'Açıklama', + 'column_opposing-iban' => 'Karşı hesap (IBAN)', + '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_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)', // prerequisites - 'prerequisites' => '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_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.', // Spectre - 'spectre_title' => 'Spectre kullanarak içe aktar', - 'spectre_prerequisites_title' => 'Spectre kullanarak içe aktarma için ön koşullar', - 'spectre_prerequisites_text' => 'In order to import data using the Spectre API, you must provide Firefly III with two secret values. They can be found on the secrets page.', - 'spectre_enter_pub_key' => 'Alma işlemi sadece bu ortak anahtarı güvenlik sayfasına girdiğinizde çalışacaktır.', + 'spectre_title' => 'Spectre kullanarak içe aktar', + 'spectre_prerequisites_title' => 'Spectre kullanarak içe aktarma için ön koşullar', + 'spectre_prerequisites_text' => 'In order to import data using the Spectre API, you must provide Firefly III with two secret values. They can be found on the secrets page.', + 'spectre_enter_pub_key' => 'Alma işlemi sadece bu ortak anahtarı güvenlik sayfasına girdiğinizde çalışacaktır.', + 'spectre_accounts_title' => 'Select accounts to import from', + 'spectre_accounts_text' => 'Each account on the left below has been found by Spectre and can be imported into Firefly III. Please select the asset account that should hold any given transactions. If you do not wish to import from any particular account, remove the check from the checkbox.', + 'spectre_do_import' => 'Yes, import from this account', + + // keys from "extra" array: + 'spectre_extra_key_iban' => 'IBAN', + 'spectre_extra_key_swift' => 'SWIFT', + 'spectre_extra_key_status' => 'Status', + 'spectre_extra_key_card_type' => 'Card type', + 'spectre_extra_key_account_name' => 'Account name', + 'spectre_extra_key_client_name' => 'Client name', + 'spectre_extra_key_account_number' => 'Account number', + 'spectre_extra_key_blocked_amount' => 'Blocked amount', + 'spectre_extra_key_available_amount' => 'Available amount', + 'spectre_extra_key_credit_limit' => 'Credit limit', + 'spectre_extra_key_interest_rate' => 'Interest rate', + 'spectre_extra_key_expiry_date' => 'Expiry date', + 'spectre_extra_key_open_date' => 'Open date', + 'spectre_extra_key_current_time' => 'Current time', + 'spectre_extra_key_current_date' => 'Current date', + 'spectre_extra_key_cards' => 'Cards', + 'spectre_extra_key_units' => 'Units', + 'spectre_extra_key_unit_price' => 'Unit price', + 'spectre_extra_key_transactions_count' => 'Transaction count', + + // 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 3cbd8a607e..99d26d551f 100644 --- a/resources/lang/tr_TR/intro.php +++ b/resources/lang/tr_TR/intro.php @@ -31,13 +31,13 @@ return [ // create account: 'accounts_create_iban' => 'Hesaplarınıza geçerli IBAN girin. Bu, ileride veri aktarma işlemini kolaylaştırabilir.', - 'accounts_create_asset_opening_balance' => 'Aktif hesapların, Firefly\'da bu hesap geçmişinin başlangıcını gösteren bir "açılış bakiyesi" olabilir.', + '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_currency' => 'Firefly III, birden fazla para birimini destekliyor. Varlık hesaplarının bir ana para birimi var, burada ayarlamanız gerekir.', 'accounts_create_asset_virtual' => 'Bazen hesabınıza sanal bir bakiye sağlamanıza yardımcı olabilir: ek bir miktar her zaman gerçek bakiyeye eklenir veya gerçek bakiyeden çıkarılır.', // budgets index 'budgets_index_intro' => 'Bütçeler, finansmanınızı yönetmek ve Firefly III\'nin temel işlevlerinden birini oluşturmak için kullanılır.', - 'budgets_index_set_budget' => 'Toplam bütçenizi her dönem için belirleyin, böylelikle Firefly size mevcut tüm parayı bütçelendirdiğinizde söyleyebilir.', + '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_see_expenses_bar' => 'Para harcamak yavaşça bu çubuğu dolduracaktır.', 'budgets_index_navigate_periods' => 'Bütçeleri önceden kolayca ayarlamak için dönemleri gezinin.', 'budgets_index_new_budget' => 'Uygun gördüğünüz yeni bütçeler oluşturun.', diff --git a/resources/lang/tr_TR/list.php b/resources/lang/tr_TR/list.php index 6c8b6f834d..a853cf23ae 100644 --- a/resources/lang/tr_TR/list.php +++ b/resources/lang/tr_TR/list.php @@ -100,4 +100,6 @@ return [ 'sum_deposits' => 'Toplam para yatırma', 'sum_transfers' => 'Transferlerin toplamı', 'reconcile' => 'Onaylanmış', + 'account_on_spectre' => 'Account (Spectre)', + 'do_import' => 'Import from this account', ]; diff --git a/resources/lang/tr_TR/validation.php b/resources/lang/tr_TR/validation.php index d239a55b4b..7aac8e78db 100644 --- a/resources/lang/tr_TR/validation.php +++ b/resources/lang/tr_TR/validation.php @@ -99,4 +99,38 @@ return [ 'present' => ':attribute alanı mevcut olmalıdır.', 'amount_zero' => 'Toplam tutar sıfır olamaz', 'secure_password' => 'Güvenli bir şifre değildir. Lütfen tekrar deneyin. Daha fazla bilgi için https://goo.gl/NCh2tN adresini ziyaret edin', + 'attributes' => [ + 'email' => 'email address', + 'description' => 'description', + 'amount' => 'amount', + 'name' => 'name', + 'targetamount' => 'target amount', + 'openingBalanceDate' => 'opening balance date', + 'openingBalance' => 'opening balance', + 'match' => 'match', + 'amount_min' => 'minimum amount', + 'amount_max' => 'maximum amount', + 'title' => 'title', + 'tag' => 'tag', + '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-trigger.1' => 'rule trigger #1', + 'rule-trigger.2' => 'rule trigger #2', + 'rule-trigger.3' => 'rule trigger #3', + 'rule-trigger.4' => 'rule trigger #4', + 'rule-trigger.5' => 'rule trigger #5', + ], ]; diff --git a/resources/views/accounts/edit.twig b/resources/views/accounts/edit.twig index 96f13de5a3..b793c6b9d7 100644 --- a/resources/views/accounts/edit.twig +++ b/resources/views/accounts/edit.twig @@ -53,7 +53,7 @@ - + {# panel for credit card options #} {% if preFilled.accountRole == 'ccAsset' %}
    @@ -66,7 +66,7 @@
    {% endif %} - + {# panel for options #}

    {{ 'options'|_ }}

    diff --git a/resources/views/accounts/index.twig b/resources/views/accounts/index.twig index e64c115625..730ee7f369 100644 --- a/resources/views/accounts/index.twig +++ b/resources/views/accounts/index.twig @@ -10,7 +10,9 @@
    -

    {{ subTitle }}

    +

    + {{ subTitle }} +

    @@ -26,9 +28,15 @@
    + + {% include 'list.accounts' %}
    - +
    diff --git a/resources/views/accounts/reconcile/edit.twig b/resources/views/accounts/reconcile/edit.twig index 8eac4a85e4..116fa6f29d 100644 --- a/resources/views/accounts/reconcile/edit.twig +++ b/resources/views/accounts/reconcile/edit.twig @@ -50,15 +50,15 @@

    {{ 'optionalFields'|_ }}

    - - {{ ExpandedForm.text('category',data['category']) }} + {# category always #} + {{ ExpandedForm.text('category',data.category) }} - + {# tags #} {{ ExpandedForm.text('tags') }}
    - + {# box for attachments #} {% if optionalFields.attachments %}
    @@ -66,14 +66,14 @@
    {% if optionalFields.attachments %} - + {# attachments #} {{ ExpandedForm.file('attachments[]', {'multiple': 'multiple','helpText': trans('firefly.upload_max_file_size', {'size': uploadSize|filesize}) }) }} {% endif %}
    {% endif %} - + {# panel for options #}

    {{ 'options'|_ }}

    diff --git a/resources/views/accounts/show.twig b/resources/views/accounts/show.twig index edf3a22fe5..79b34d6243 100644 --- a/resources/views/accounts/show.twig +++ b/resources/views/accounts/show.twig @@ -126,7 +126,7 @@
    {% for period in periods %} {% if (period.spent != 0 or period.earned != 0) %} -
    +

    {{ period.name }}

    diff --git a/resources/views/admin/configuration/index.twig b/resources/views/admin/configuration/index.twig index f04b387783..d950ee5989 100644 --- a/resources/views/admin/configuration/index.twig +++ b/resources/views/admin/configuration/index.twig @@ -40,8 +40,8 @@
    - - + #}
    diff --git a/resources/views/admin/link/create.twig b/resources/views/admin/link/create.twig index 83d7fe947c..45272d6079 100644 --- a/resources/views/admin/link/create.twig +++ b/resources/views/admin/link/create.twig @@ -22,7 +22,7 @@
    - + {# panel for options #}

    {{ 'options'|_ }}

    diff --git a/resources/views/admin/link/edit.twig b/resources/views/admin/link/edit.twig index 80b7833500..560c69188b 100644 --- a/resources/views/admin/link/edit.twig +++ b/resources/views/admin/link/edit.twig @@ -24,7 +24,7 @@
    - + {# panel for options #}

    {{ 'options'|_ }}

    diff --git a/resources/views/admin/users/edit.twig b/resources/views/admin/users/edit.twig index 510bc5ffd1..bd4834c61e 100644 --- a/resources/views/admin/users/edit.twig +++ b/resources/views/admin/users/edit.twig @@ -27,7 +27,7 @@
    - + {# panel for options #}

    {{ 'options'|_ }}

    diff --git a/resources/views/admin/users/show.twig b/resources/views/admin/users/show.twig index a881d96da1..0479a8cc0e 100644 --- a/resources/views/admin/users/show.twig +++ b/resources/views/admin/users/show.twig @@ -99,13 +99,11 @@ {{ trans('list.export_jobs_count') }} - {{ information.export_jobs }}, {{ trans('firefly.successful_count', {count: information.export_jobs_success}) }} - + {{ information.export_jobs }}, {{ trans('firefly.successful_count', {count: information.export_jobs_success}) }} {{ trans('list.import_jobs_count') }} - {{ information.import_jobs }}, {{ trans('firefly.successful_count', {count: information.import_jobs_success}) }} - + {{ information.import_jobs }}, {{ trans('firefly.successful_count', {count: information.import_jobs_success}) }} {{ trans('list.budget_count') }} diff --git a/resources/views/attachments/edit.twig b/resources/views/attachments/edit.twig index deed7522de..affb40ef0f 100644 --- a/resources/views/attachments/edit.twig +++ b/resources/views/attachments/edit.twig @@ -37,7 +37,7 @@
    - + {# panel for options #}

    {{ 'options'|_ }}

    diff --git a/resources/views/auth/login.twig b/resources/views/auth/login.twig index 37493ba6ca..8d0ee18c90 100644 --- a/resources/views/auth/login.twig +++ b/resources/views/auth/login.twig @@ -67,11 +67,9 @@
    -
    -
    {% if allowRegistration %} @@ -79,6 +77,5 @@ {% endif %} {{ 'forgot_my_password'|_ }}
    - {% endblock %} diff --git a/resources/views/auth/passwords/email.twig b/resources/views/auth/passwords/email.twig index 4695a05f4a..7d639bf189 100644 --- a/resources/views/auth/passwords/email.twig +++ b/resources/views/auth/passwords/email.twig @@ -38,11 +38,9 @@
    -
    -
    @@ -53,6 +51,6 @@ {{ 'register_new_account'|_ }}
    {% endif %} -
    +
    {% endblock %} diff --git a/resources/views/auth/passwords/reset.twig b/resources/views/auth/passwords/reset.twig index b56e40189d..f49e6aabd5 100644 --- a/resources/views/auth/passwords/reset.twig +++ b/resources/views/auth/passwords/reset.twig @@ -36,7 +36,6 @@
    -
    @@ -45,6 +44,6 @@ {% if allowRegistration %} {{ 'register_new_account'|_ }}
    {% endif %} -
    +
    {% endblock %} diff --git a/resources/views/auth/register.twig b/resources/views/auth/register.twig index 995251d982..f6c76ce3ec 100644 --- a/resources/views/auth/register.twig +++ b/resources/views/auth/register.twig @@ -42,13 +42,12 @@
    -
    {{ 'want_to_login'|_ }}
    {{ 'forgot_my_password'|_ }} - + {% include 'partials.password-modal' %} diff --git a/resources/views/auth/two-factor.twig b/resources/views/auth/two-factor.twig index a02c30bf56..73fd2998ae 100644 --- a/resources/views/auth/two-factor.twig +++ b/resources/views/auth/two-factor.twig @@ -26,15 +26,12 @@
    -
    -
    {{ 'two_factor_forgot'|_ }} - {% endblock %} diff --git a/resources/views/bills/create.twig b/resources/views/bills/create.twig index 08bc14a318..c7e485ef5b 100644 --- a/resources/views/bills/create.twig +++ b/resources/views/bills/create.twig @@ -41,7 +41,7 @@ - + {# panel for options #}

    {{ 'options'|_ }}

    diff --git a/resources/views/bills/index.twig b/resources/views/bills/index.twig index 5635099605..1fa5e633a7 100644 --- a/resources/views/bills/index.twig +++ b/resources/views/bills/index.twig @@ -13,8 +13,6 @@

    {{ title }}

    - -
    @@ -25,8 +23,14 @@
    + {% include 'list/bills' %}
    +
    diff --git a/resources/views/bills/show.twig b/resources/views/bills/show.twig index afde0b88fe..1742fd3a6c 100644 --- a/resources/views/bills/show.twig +++ b/resources/views/bills/show.twig @@ -89,7 +89,7 @@ - +
    {{ trans('list.notes') }}{{ bill.notes.first.text|markdown }}{{ bill.notes.first.text|markdown }}
    {% endif %} diff --git a/resources/views/budgets/create.twig b/resources/views/budgets/create.twig index 4243a15087..3d6b429805 100644 --- a/resources/views/budgets/create.twig +++ b/resources/views/budgets/create.twig @@ -22,7 +22,7 @@
    - + {# panel for options #}

    {{ 'options'|_ }}

    diff --git a/resources/views/budgets/edit.twig b/resources/views/budgets/edit.twig index 5054c47264..eeaf34244e 100644 --- a/resources/views/budgets/edit.twig +++ b/resources/views/budgets/edit.twig @@ -21,7 +21,7 @@
    - + {# panel for options #}

    {{ 'options'|_ }}

    diff --git a/resources/views/budgets/index.twig b/resources/views/budgets/index.twig index b340a9ef02..6dff1b45c3 100644 --- a/resources/views/budgets/index.twig +++ b/resources/views/budgets/index.twig @@ -134,6 +134,9 @@

    {{ 'budgets'|_ }}

    +
    {{ budgets.render|raw }}
    @@ -197,6 +200,9 @@ {{ budgets.render|raw }}
    +
    diff --git a/resources/views/budgets/show.twig b/resources/views/budgets/show.twig index 4a697a3c6e..21cf15aff2 100644 --- a/resources/views/budgets/show.twig +++ b/resources/views/budgets/show.twig @@ -127,7 +127,7 @@ {% set overspent = limit.amount + limit.spent < 0 %} {% if overspent %} - {% set pct = (limit.spent != 0 ? (limit.amount / (limit.spent*-1))*100 : 0) %} + {% set pct = (limit.spent != 0 ? (limit.amount / (limit.spent*-1))*100 : 0) %} {# must have -1 here #}
    {% else %} - {% set pct = (limit.amount != 0 ? (((limit.spent*-1) / limit.amount)*100) : 0) %} + {% set pct = (limit.amount != 0 ? (((limit.spent*-1) / limit.amount)*100) : 0) %} {# must have -1 here #}
    - + {# panel for options #}

    {{ 'options'|_ }}

    diff --git a/resources/views/categories/edit.twig b/resources/views/categories/edit.twig index f31c402fe0..9c912d9eeb 100644 --- a/resources/views/categories/edit.twig +++ b/resources/views/categories/edit.twig @@ -22,7 +22,7 @@
    - + {# panel for options #}

    {{ 'options'|_ }}

    diff --git a/resources/views/categories/index.twig b/resources/views/categories/index.twig index 743d72eede..940d52a0ea 100644 --- a/resources/views/categories/index.twig +++ b/resources/views/categories/index.twig @@ -11,8 +11,6 @@

    {{ 'categories'|_ }}

    - -
    @@ -24,9 +22,16 @@
    + {% include 'list/categories' %}
    +
    +
    {% else %} diff --git a/resources/views/categories/no-category.twig b/resources/views/categories/no-category.twig index 5eee40e9f6..caefb483b1 100644 --- a/resources/views/categories/no-category.twig +++ b/resources/views/categories/no-category.twig @@ -42,7 +42,7 @@
    {% for period in periods %} {% if period.count > 0 %} -
    +

    {{ period.name }}

    diff --git a/resources/views/categories/show.twig b/resources/views/categories/show.twig index f2e8092a71..e456ed03c4 100644 --- a/resources/views/categories/show.twig +++ b/resources/views/categories/show.twig @@ -88,7 +88,7 @@
    {% for period in periods %} {% if period.spent != 0 or period.earned != 0 or period.sum != 0 %} -
    +

    {{ period.name }}

    diff --git a/resources/views/currencies/create.twig b/resources/views/currencies/create.twig index be786ad691..2524659508 100644 --- a/resources/views/currencies/create.twig +++ b/resources/views/currencies/create.twig @@ -25,7 +25,7 @@
    - + {# panel for options #}

    {{ 'options'|_ }}

    diff --git a/resources/views/currencies/edit.twig b/resources/views/currencies/edit.twig index a9c4c582e3..187375a45b 100644 --- a/resources/views/currencies/edit.twig +++ b/resources/views/currencies/edit.twig @@ -25,7 +25,7 @@
    - + {# panel for options #}

    {{ 'options'|_ }}

    diff --git a/resources/views/debug.twig b/resources/views/debug.twig index 6ac2180e5e..2200e27f0e 100644 --- a/resources/views/debug.twig +++ b/resources/views/debug.twig @@ -6,7 +6,7 @@

    If you are running into problems, you can use the information in this box as debug information. Please copy-and-paste into a new - or existing Github issue. It will generate a beautiful table that can + or existing GitHub issue. It will generate a beautiful table that can be used to quickly diagnose your problem.

    +
    diff --git a/resources/views/transactions/single/edit.twig b/resources/views/transactions/single/edit.twig index 7f36389329..e70e57ca2e 100644 --- a/resources/views/transactions/single/edit.twig +++ b/resources/views/transactions/single/edit.twig @@ -80,23 +80,16 @@

    {{ 'optionalFields'|_ }}

    - {% if what == 'withdrawal' %} {{ ExpandedForm.select('budget_id',budgetList,data['budget_id']) }} {% endif %} - - {{ ExpandedForm.text('category',data['category']) }} - - {{ ExpandedForm.text('tags') }} - {# NO PIGGY BANK #}
    - {% if not optionalFields.interest_date or not optionalFields.book_date or @@ -110,9 +103,6 @@

    {{ trans('firefly.hidden_fields_preferences', {link: route('preferences.index')})|raw }}

    {% endif %} - - - {% if optionalFields.interest_date or optionalFields.book_date or @@ -132,32 +122,26 @@
    {% if optionalFields.interest_date or data['interest_date'] %} - {{ ExpandedForm.date('interest_date',data['interest_date']) }} {% endif %} {% if optionalFields.book_date or data['book_date'] %} - {{ ExpandedForm.date('book_date',data['book_date']) }} {% endif %} {% if optionalFields.process_date or data['process_date'] %} - {{ ExpandedForm.date('process_date',data['process_date']) }} {% endif %} {% if optionalFields.due_date or data['due_date'] %} - {{ ExpandedForm.date('due_date',data['due_date']) }} {% endif %} {% if optionalFields.payment_date or data['payment_date'] %} - {{ ExpandedForm.date('payment_date',data['payment_date']) }} {% endif %} {% if optionalFields.invoice_date or data['invoice_date'] %} - {{ ExpandedForm.date('invoice_date',data['invoice_date']) }} {% endif %} @@ -166,7 +150,6 @@ {% endif %} - {% if optionalFields.internal_reference or optionalFields.notes or @@ -178,12 +161,10 @@
    {% if optionalFields.internal_reference or data['interal_reference'] %} - {{ ExpandedForm.text('internal_reference', data['interal_reference']) }} {% endif %} {% if optionalFields.notes or data['notes'] %} - {{ ExpandedForm.textarea('notes', data['notes'], {helpText: trans('firefly.field_supports_markdown')}) }} {% endif %} @@ -191,7 +172,6 @@
    {% endif %} - {% if optionalFields.attachments %}
    @@ -199,14 +179,13 @@
    {% if optionalFields.attachments %} - {{ ExpandedForm.file('attachments[]', {'multiple': 'multiple','helpText': trans('firefly.upload_max_file_size', {'size': uploadSize|filesize}) }) }} {% endif %}
    {% endif %} - + {# panel for options #}

    {{ 'options'|_ }}

    diff --git a/resources/views/transactions/split/edit.twig b/resources/views/transactions/split/edit.twig index 6573de4cec..5859ec3f6f 100644 --- a/resources/views/transactions/split/edit.twig +++ b/resources/views/transactions/split/edit.twig @@ -230,14 +230,14 @@ {# description #}
    -
    {# destination for withdrawals: #} {% if preFilled.what == 'withdrawal' %}
    -
    {% endif %} @@ -245,7 +245,7 @@ {# source for deposits #} {% if preFilled.what == 'deposit' %}
    -
    {% endif %} @@ -295,7 +295,7 @@ {# category #}
    -
    @@ -311,7 +311,7 @@
    - + {# panel for options #}

    {{ 'options'|_ }}

    diff --git a/routes/breadcrumbs.php b/routes/breadcrumbs.php index 5e29693372..68710be4eb 100644 --- a/routes/breadcrumbs.php +++ b/routes/breadcrumbs.php @@ -42,8 +42,6 @@ use FireflyIII\Models\TransactionType; use FireflyIII\User; use Illuminate\Support\Collection; -//use DaveJamesMiller\Breadcrumbs\Generator as BreadCrumbsGenerator; - // HOME Breadcrumbs::register( 'home', @@ -104,7 +102,7 @@ Breadcrumbs::register( 'accounts.reconcile', function (BreadCrumbsGenerator $breadcrumbs, Account $account) { $breadcrumbs->parent('accounts.show', $account, '(nothing)', new Carbon, new Carbon); - $breadcrumbs->push(trans('firefly.reconcile_account', ['account' => e($account->name)]), route('accounts.reconcile', [$account->id])); + $breadcrumbs->push(trans('firefly.reconcile_account', ['account' =>$account->name]), route('accounts.reconcile', [$account->id])); } ); @@ -121,7 +119,7 @@ Breadcrumbs::register( 'accounts.delete', function (BreadCrumbsGenerator $breadcrumbs, Account $account) { $breadcrumbs->parent('accounts.show', $account, '(nothing)', new Carbon, new Carbon); - $breadcrumbs->push(trans('firefly.delete_account', ['name' => e($account->name)]), route('accounts.delete', [$account->id])); + $breadcrumbs->push(trans('firefly.delete_account', ['name' => $account->name]), route('accounts.delete', [$account->id])); } ); @@ -131,7 +129,7 @@ Breadcrumbs::register( $breadcrumbs->parent('accounts.show', $account, '(nothing)', new Carbon, new Carbon); $what = config('firefly.shortNamesByFullName.' . $account->accountType->type); - $breadcrumbs->push(trans('firefly.edit_' . $what . '_account', ['name' => e($account->name)]), route('accounts.edit', [$account->id])); + $breadcrumbs->push(trans('firefly.edit_' . $what . '_account', ['name' => $account->name]), route('accounts.edit', [$account->id])); } ); @@ -217,7 +215,7 @@ Breadcrumbs::register( 'admin.links.show', function (BreadCrumbsGenerator $breadcrumbs, LinkType $linkType) { $breadcrumbs->parent('admin.links.index'); - $breadcrumbs->push(trans('firefly.overview_for_link', [$linkType->name]), route('admin.links.show', [$linkType->id])); + $breadcrumbs->push(trans('firefly.overview_for_link', ['name' => $linkType->name]), route('admin.links.show', [$linkType->id])); } ); @@ -291,14 +289,14 @@ Breadcrumbs::register( 'bills.edit', function (BreadCrumbsGenerator $breadcrumbs, Bill $bill) { $breadcrumbs->parent('bills.show', $bill); - $breadcrumbs->push(trans('breadcrumbs.edit_bill', ['name' => e($bill->name)]), route('bills.edit', [$bill->id])); + $breadcrumbs->push(trans('breadcrumbs.edit_bill', ['name' => $bill->name]), route('bills.edit', [$bill->id])); } ); Breadcrumbs::register( 'bills.delete', function (BreadCrumbsGenerator $breadcrumbs, Bill $bill) { $breadcrumbs->parent('bills.show', $bill); - $breadcrumbs->push(trans('breadcrumbs.delete_bill', ['name' => e($bill->name)]), route('bills.delete', [$bill->id])); + $breadcrumbs->push(trans('breadcrumbs.delete_bill', ['name' => $bill->name]), route('bills.delete', [$bill->id])); } ); @@ -306,7 +304,7 @@ Breadcrumbs::register( 'bills.show', function (BreadCrumbsGenerator $breadcrumbs, Bill $bill) { $breadcrumbs->parent('bills.index'); - $breadcrumbs->push(e($bill->name), route('bills.show', [$bill->id])); + $breadcrumbs->push($bill->name, route('bills.show', [$bill->id])); } ); @@ -330,14 +328,14 @@ Breadcrumbs::register( 'budgets.edit', function (BreadCrumbsGenerator $breadcrumbs, Budget $budget) { $breadcrumbs->parent('budgets.show', $budget); - $breadcrumbs->push(trans('firefly.edit_budget', ['name' => e($budget->name)]), route('budgets.edit', [$budget->id])); + $breadcrumbs->push(trans('firefly.edit_budget', ['name' => $budget->name]), route('budgets.edit', [$budget->id])); } ); Breadcrumbs::register( 'budgets.delete', function (BreadCrumbsGenerator $breadcrumbs, Budget $budget) { $breadcrumbs->parent('budgets.show', $budget); - $breadcrumbs->push(trans('firefly.delete_budget', ['name' => e($budget->name)]), route('budgets.delete', [$budget->id])); + $breadcrumbs->push(trans('firefly.delete_budget', ['name' => $budget->name]), route('budgets.delete', [$budget->id])); } ); @@ -367,7 +365,7 @@ Breadcrumbs::register( 'budgets.show', function (BreadCrumbsGenerator $breadcrumbs, Budget $budget) { $breadcrumbs->parent('budgets.index'); - $breadcrumbs->push(e($budget->name), route('budgets.show', [$budget->id])); + $breadcrumbs->push($budget->name, route('budgets.show', [$budget->id])); $breadcrumbs->push(trans('firefly.everything'), route('budgets.show', [$budget->id])); } ); @@ -376,7 +374,7 @@ Breadcrumbs::register( 'budgets.show.limit', function (BreadCrumbsGenerator $breadcrumbs, Budget $budget, BudgetLimit $budgetLimit) { $breadcrumbs->parent('budgets.index'); - $breadcrumbs->push(e($budget->name), route('budgets.show', [$budget->id])); + $breadcrumbs->push($budget->name, route('budgets.show', [$budget->id])); $title = trans( 'firefly.between_dates_breadcrumb', @@ -411,14 +409,14 @@ Breadcrumbs::register( 'categories.edit', function (BreadCrumbsGenerator $breadcrumbs, Category $category) { $breadcrumbs->parent('categories.show', $category, '(nothing)', new Carbon, new Carbon); - $breadcrumbs->push(trans('firefly.edit_category', ['name' => e($category->name)]), route('categories.edit', [$category->id])); + $breadcrumbs->push(trans('firefly.edit_category', ['name' => $category->name]), route('categories.edit', [$category->id])); } ); Breadcrumbs::register( 'categories.delete', function (BreadCrumbsGenerator $breadcrumbs, Category $category) { $breadcrumbs->parent('categories.show', $category, '(nothing)', new Carbon, new Carbon); - $breadcrumbs->push(trans('firefly.delete_category', ['name' => e($category->name)]), route('categories.delete', [$category->id])); + $breadcrumbs->push(trans('firefly.delete_category', ['name' => $category->name]), route('categories.delete', [$category->id])); } ); @@ -487,14 +485,14 @@ Breadcrumbs::register( 'currencies.edit', function (BreadCrumbsGenerator $breadcrumbs, TransactionCurrency $currency) { $breadcrumbs->parent('currencies.index'); - $breadcrumbs->push(trans('breadcrumbs.edit_currency', ['name' => e($currency->name)]), route('currencies.edit', [$currency->id])); + $breadcrumbs->push(trans('breadcrumbs.edit_currency', ['name' => $currency->name]), route('currencies.edit', [$currency->id])); } ); Breadcrumbs::register( 'currencies.delete', function (BreadCrumbsGenerator $breadcrumbs, TransactionCurrency $currency) { $breadcrumbs->parent('currencies.index'); - $breadcrumbs->push(trans('breadcrumbs.delete_currency', ['name' => e($currency->name)]), route('currencies.delete', [$currency->id])); + $breadcrumbs->push(trans('breadcrumbs.delete_currency', ['name' => $currency->name]), route('currencies.delete', [$currency->id])); } ); @@ -527,14 +525,14 @@ Breadcrumbs::register( 'piggy-banks.edit', function (BreadCrumbsGenerator $breadcrumbs, PiggyBank $piggyBank) { $breadcrumbs->parent('piggy-banks.show', $piggyBank); - $breadcrumbs->push(trans('breadcrumbs.edit_piggyBank', ['name' => e($piggyBank->name)]), route('piggy-banks.edit', [$piggyBank->id])); + $breadcrumbs->push(trans('breadcrumbs.edit_piggyBank', ['name' => $piggyBank->name]), route('piggy-banks.edit', [$piggyBank->id])); } ); Breadcrumbs::register( 'piggy-banks.delete', function (BreadCrumbsGenerator $breadcrumbs, PiggyBank $piggyBank) { $breadcrumbs->parent('piggy-banks.show', $piggyBank); - $breadcrumbs->push(trans('firefly.delete_piggy_bank', ['name' => e($piggyBank->name)]), route('piggy-banks.delete', [$piggyBank->id])); + $breadcrumbs->push(trans('firefly.delete_piggy_bank', ['name' => $piggyBank->name]), route('piggy-banks.delete', [$piggyBank->id])); } ); @@ -542,7 +540,7 @@ Breadcrumbs::register( 'piggy-banks.show', function (BreadCrumbsGenerator $breadcrumbs, PiggyBank $piggyBank) { $breadcrumbs->parent('piggy-banks.index'); - $breadcrumbs->push(e($piggyBank->name), route('piggy-banks.show', [$piggyBank->id])); + $breadcrumbs->push($piggyBank->name, route('piggy-banks.show', [$piggyBank->id])); } ); @@ -827,7 +825,7 @@ Breadcrumbs::register( 'search.index', function (BreadCrumbsGenerator $breadcrumbs, $query) { $breadcrumbs->parent('home'); - $breadcrumbs->push(trans('breadcrumbs.search_result', ['query' => e($query)]), route('search.index')); + $breadcrumbs->push(trans('breadcrumbs.search_result', ['query' => $query]), route('search.index')); } ); @@ -852,7 +850,7 @@ Breadcrumbs::register( 'tags.edit', function (BreadCrumbsGenerator $breadcrumbs, Tag $tag) { $breadcrumbs->parent('tags.show', $tag, '(nothing)', new Carbon, new Carbon); - $breadcrumbs->push(trans('breadcrumbs.edit_tag', ['tag' => e($tag->tag)]), route('tags.edit', [$tag->id])); + $breadcrumbs->push(trans('breadcrumbs.edit_tag', ['tag' => $tag->tag]), route('tags.edit', [$tag->id])); } ); @@ -860,7 +858,7 @@ Breadcrumbs::register( 'tags.delete', function (BreadCrumbsGenerator $breadcrumbs, Tag $tag) { $breadcrumbs->parent('tags.show', $tag, '(nothing)', new Carbon, new Carbon); - $breadcrumbs->push(trans('breadcrumbs.delete_tag', ['tag' => e($tag->tag)]), route('tags.delete', [$tag->id])); + $breadcrumbs->push(trans('breadcrumbs.delete_tag', ['tag' => $tag->tag]), route('tags.delete', [$tag->id])); } ); @@ -868,7 +866,7 @@ Breadcrumbs::register( 'tags.show', function (BreadCrumbsGenerator $breadcrumbs, Tag $tag, string $moment, Carbon $start, Carbon $end) { $breadcrumbs->parent('tags.index'); - $breadcrumbs->push(e($tag->tag), route('tags.show', [$tag->id, $moment])); + $breadcrumbs->push($tag->tag, route('tags.show', [$tag->id, $moment])); if ('all' === $moment) { $breadcrumbs->push(trans('firefly.everything'), route('tags.show', [$tag->id, $moment])); } @@ -937,7 +935,7 @@ Breadcrumbs::register( 'transactions.delete', function (BreadCrumbsGenerator $breadcrumbs, TransactionJournal $journal) { $breadcrumbs->parent('transactions.show', $journal); - $breadcrumbs->push(trans('breadcrumbs.delete_journal', ['description' => e($journal->description)]), route('transactions.delete', [$journal->id])); + $breadcrumbs->push(trans('breadcrumbs.delete_journal', ['description' => $journal->description]), route('transactions.delete', [$journal->id])); } ); diff --git a/routes/web.php b/routes/web.php index cbc6293852..db5274e68e 100755 --- a/routes/web.php +++ b/routes/web.php @@ -130,8 +130,8 @@ Route::group( ['middleware' => 'user-full-auth', 'prefix' => 'attachments', 'as' => 'attachments.'], function () { Route::get('edit/{attachment}', ['uses' => 'AttachmentController@edit', 'as' => 'edit']); Route::get('delete/{attachment}', ['uses' => 'AttachmentController@delete', 'as' => 'delete']); - Route::get('preview/{attachment}', ['uses' => 'AttachmentController@preview', 'as' => 'preview']); Route::get('download/{attachment}', ['uses' => 'AttachmentController@download', 'as' => 'download']); + Route::get('view/{attachment}', ['uses' => 'AttachmentController@view', 'as' => 'view']); Route::post('update/{attachment}', ['uses' => 'AttachmentController@update', 'as' => 'update']); Route::post('destroy/{attachment}', ['uses' => 'AttachmentController@destroy', 'as' => 'destroy']); @@ -170,7 +170,7 @@ Route::group( Route::get('edit/{budget}', ['uses' => 'BudgetController@edit', 'as' => 'edit']); Route::get('delete/{budget}', ['uses' => 'BudgetController@delete', 'as' => 'delete']); Route::get('show/{budget}', ['uses' => 'BudgetController@show', 'as' => 'show']); - Route::get('show/{budget}/{budgetlimit}', ['uses' => 'BudgetController@showByBudgetLimit', 'as' => 'show.limit']); + Route::get('show/{budget}/{budgetLimit}', ['uses' => 'BudgetController@showByBudgetLimit', 'as' => 'show.limit']); Route::get('list/no-budget/{moment?}', ['uses' => 'BudgetController@noBudget', 'as' => 'no-budget']); Route::get('{moment?}', ['uses' => 'BudgetController@index', 'as' => 'index']); @@ -279,13 +279,13 @@ Route::group( Route::get('frontpage', ['uses' => 'BudgetController@frontpage', 'as' => 'frontpage']); Route::get('period/0/{accountList}/{start_date}/{end_date}', ['uses' => 'BudgetController@periodNoBudget', 'as' => 'period.no-budget']); Route::get('period/{budget}/{accountList}/{start_date}/{end_date}', ['uses' => 'BudgetController@period', 'as' => 'period']); - Route::get('budget/{budget}/{budgetlimit}', ['uses' => 'BudgetController@budgetLimit', 'as' => 'budget-limit']); + Route::get('budget/{budget}/{budgetLimit}', ['uses' => 'BudgetController@budgetLimit', 'as' => 'budget-limit']); Route::get('budget/{budget}', ['uses' => 'BudgetController@budget', 'as' => 'budget']); // these charts are used in budget/show: - Route::get('expense-category/{budget}/{budgetlimit?}', ['uses' => 'BudgetController@expenseCategory', 'as' => 'expense-category']); - Route::get('expense-asset/{budget}/{budgetlimit?}', ['uses' => 'BudgetController@expenseAsset', 'as' => 'expense-asset']); - Route::get('expense-expense/{budget}/{budgetlimit?}', ['uses' => 'BudgetController@expenseExpense', 'as' => 'expense-expense']); + Route::get('expense-category/{budget}/{budgetLimit?}', ['uses' => 'BudgetController@expenseCategory', 'as' => 'expense-category']); + Route::get('expense-asset/{budget}/{budgetLimit?}', ['uses' => 'BudgetController@expenseAsset', 'as' => 'expense-asset']); + Route::get('expense-expense/{budget}/{budgetLimit?}', ['uses' => 'BudgetController@expenseExpense', 'as' => 'expense-expense']); // these charts are used in reports (category reports): Route::get( @@ -784,7 +784,6 @@ Route::group( Route::group( ['middleware' => 'user-full-auth', 'namespace' => 'Transaction', 'prefix' => 'transactions/mass', 'as' => 'transactions.mass.'], function () { Route::get('edit/{journalList}', ['uses' => 'MassController@edit', 'as' => 'edit']); - Route::get('edit/bulk/{journalList}', ['uses' => 'MassController@editBulk', 'as' => 'edit-bulk']); Route::get('delete/{journalList}', ['uses' => 'MassController@delete', 'as' => 'delete']); Route::post('update', ['uses' => 'MassController@update', 'as' => 'update']); Route::post('destroy', ['uses' => 'MassController@destroy', 'as' => 'destroy']); @@ -817,8 +816,8 @@ Route::group( */ Route::group( ['middleware' => 'user-full-auth', 'namespace' => 'Transaction', 'prefix' => 'transactions/convert', 'as' => 'transactions.convert.'], function () { - Route::get('{transaction_type}/{tj}', ['uses' => 'ConvertController@index', 'as' => 'index']); - Route::post('{transaction_type}/{tj}', ['uses' => 'ConvertController@postIndex', 'as' => 'index.post']); + Route::get('{transactionType}/{tj}', ['uses' => 'ConvertController@index', 'as' => 'index']); + Route::post('{transactionType}/{tj}', ['uses' => 'ConvertController@postIndex', 'as' => 'index.post']); } ); diff --git a/tests/Feature/Controllers/AttachmentControllerTest.php b/tests/Feature/Controllers/AttachmentControllerTest.php index c058da5498..34c8282e13 100644 --- a/tests/Feature/Controllers/AttachmentControllerTest.php +++ b/tests/Feature/Controllers/AttachmentControllerTest.php @@ -119,19 +119,6 @@ class AttachmentControllerTest extends TestCase $response->assertSee('