From 87e067d49ce97f4fd2403eb449939e467125446b Mon Sep 17 00:00:00 2001 From: BitSec Date: Thu, 30 Sep 2021 05:01:29 +0200 Subject: [PATCH 01/77] Update LICENSE --- LICENSE | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LICENSE b/LICENSE index acea121c..0ee0d65c 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2021 Arno VIsker +Copyright (c) 2021 ControlPanel.gg Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal From 211319ea98a1af6b3669fe3f86b0b88096239a5a Mon Sep 17 00:00:00 2001 From: Dennis Date: Thu, 14 Oct 2021 09:01:35 +0200 Subject: [PATCH 02/77] HotFix to change Hard-Coded Server-limit-after-irl-purchase This is absolutely not tested. --- app/Http/Controllers/Admin/PaymentController.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/Admin/PaymentController.php b/app/Http/Controllers/Admin/PaymentController.php index 110d2c0d..5b8e3725 100644 --- a/app/Http/Controllers/Admin/PaymentController.php +++ b/app/Http/Controllers/Admin/PaymentController.php @@ -141,9 +141,9 @@ class PaymentController extends Controller $user->increment('credits', $paypalProduct->quantity); //update server limit - if (Configuration::getValueByKey('SERVER_LIMIT_AFTER_IRL_PURCHASE', 10) !== 0) { - if ($user->server_limit < Configuration::getValueByKey('SERVER_LIMIT_AFTER_IRL_PURCHASE', 10)) { - $user->update(['server_limit' => 10]); + if (Configuration::getValueByKey('SERVER_LIMIT_AFTER_IRL_PURCHASE') !== 0) { + if ($user->server_limit < Configuration::getValueByKey('SERVER_LIMIT_AFTER_IRL_PURCHASE')) { + $user->update(['server_limit' => Configuration::getValueByKey('SERVER_LIMIT_AFTER_IRL_PURCHASE')]); } } From b3d73e37862d49aa62391038f23b2726578ba320 Mon Sep 17 00:00:00 2001 From: Dennis Date: Thu, 14 Oct 2021 09:05:59 +0200 Subject: [PATCH 03/77] Reverse Changes. Wrong Commit --- app/Http/Controllers/Admin/PaymentController.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/Admin/PaymentController.php b/app/Http/Controllers/Admin/PaymentController.php index 5b8e3725..110d2c0d 100644 --- a/app/Http/Controllers/Admin/PaymentController.php +++ b/app/Http/Controllers/Admin/PaymentController.php @@ -141,9 +141,9 @@ class PaymentController extends Controller $user->increment('credits', $paypalProduct->quantity); //update server limit - if (Configuration::getValueByKey('SERVER_LIMIT_AFTER_IRL_PURCHASE') !== 0) { - if ($user->server_limit < Configuration::getValueByKey('SERVER_LIMIT_AFTER_IRL_PURCHASE')) { - $user->update(['server_limit' => Configuration::getValueByKey('SERVER_LIMIT_AFTER_IRL_PURCHASE')]); + if (Configuration::getValueByKey('SERVER_LIMIT_AFTER_IRL_PURCHASE', 10) !== 0) { + if ($user->server_limit < Configuration::getValueByKey('SERVER_LIMIT_AFTER_IRL_PURCHASE', 10)) { + $user->update(['server_limit' => 10]); } } From c3a777bdf4f33b470320d5bf6bd6efb0fe24e884 Mon Sep 17 00:00:00 2001 From: 1day2die Date: Fri, 26 Nov 2021 20:42:38 +0100 Subject: [PATCH 04/77] First COmmit --- .../Controllers/Admin/PaymentController.php | 47 ++- composer.json | 1 + composer.lock | 337 ++++++++++++++- config/invoices.php | 97 +++++ public/vendor/invoices/sample-logo.png | Bin 0 -> 44248 bytes resources/lang/vendor/invoices/en/invoice.php | 38 ++ resources/lang/vendor/invoices/nl/invoice.php | 38 ++ .../invoices/templates/default.blade.php | 386 ++++++++++++++++++ 8 files changed, 939 insertions(+), 5 deletions(-) create mode 100644 config/invoices.php create mode 100644 public/vendor/invoices/sample-logo.png create mode 100644 resources/lang/vendor/invoices/en/invoice.php create mode 100644 resources/lang/vendor/invoices/nl/invoice.php create mode 100644 resources/views/vendor/invoices/templates/default.blade.php diff --git a/app/Http/Controllers/Admin/PaymentController.php b/app/Http/Controllers/Admin/PaymentController.php index 4c52a310..b5b68677 100644 --- a/app/Http/Controllers/Admin/PaymentController.php +++ b/app/Http/Controllers/Admin/PaymentController.php @@ -18,12 +18,16 @@ use Illuminate\Http\JsonResponse; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; +use LaravelDaily\Invoices\Classes\Party; use PayPalCheckoutSdk\Core\PayPalHttpClient; use PayPalCheckoutSdk\Core\ProductionEnvironment; use PayPalCheckoutSdk\Core\SandboxEnvironment; use PayPalCheckoutSdk\Orders\OrdersCaptureRequest; use PayPalCheckoutSdk\Orders\OrdersCreateRequest; use PayPalHttp\HttpException; +use LaravelDaily\Invoices\Invoice; +use LaravelDaily\Invoices\Classes\Buyer; +use LaravelDaily\Invoices\Classes\InvoiceItem; class PaymentController extends Controller { @@ -93,7 +97,7 @@ class PaymentController extends Controller 'shipping_preference' => 'NO_SHIPPING' ] - + ]; @@ -164,7 +168,7 @@ class PaymentController extends Controller $user->update(['server_limit' => Configuration::getValueByKey('SERVER_LIMIT_AFTER_IRL_PURCHASE')]); } } - + //update role if ($user->role == 'member') { $user->update(['role' => 'client']); @@ -191,8 +195,45 @@ class PaymentController extends Controller event(new UserUpdateCreditsEvent($user)); + //create invoice + $seller = new Party([ + 'name' => 'Dennis L', + 'phone' => '1234513', + 'address' => 'Deutschlandstr 4, 66666 Hell', + 'custom_fields' => [ + 'UST_ID' => '365#GG', + ], + ]); + + + + $customer = new Buyer([ + 'name' => 'Dennis Leipe', + 'custom_fields' => [ + 'email' => 'dleipe@hafuga.de', + 'order number' => '> 654321 <', + ], + ]); + $item = (new InvoiceItem())->title($paypalProduct->description)->pricePerUnit($paypalProduct->price); + + $invoice = Invoice::make() + ->buyer($customer) + ->seller($seller) + ->discountByPercent(0) + ->taxRate(floatval($paypalProduct->getTaxPercent())) + ->shipping(0) + ->addItem($item) + ->series('BIG') + + ->status(__('invoices::invoice.paid')) + ->sequence(667) + ->serialNumberFormat('{SEQUENCE}/{SERIES}') + + ->save('public'); + + //redirect back to home - return redirect()->route('home')->with('success', 'Your credit balance has been increased!'); + return redirect()->route('home')->with('success', 'Your credit balance has been increased! Invoice: '.$invoice->url()); } // If call returns body in response, you can get the deserialized version from the result attribute of the response diff --git a/composer.json b/composer.json index 8873c2be..0c47b586 100644 --- a/composer.json +++ b/composer.json @@ -19,6 +19,7 @@ "laravel/framework": "^8.12", "laravel/tinker": "^2.5", "laravel/ui": "^3.2", + "laraveldaily/laravel-invoices": "^2.0", "paypal/paypal-checkout-sdk": "^1.0", "paypal/rest-api-sdk-php": "^1.14", "socialiteproviders/discord": "^4.1", diff --git a/composer.lock b/composer.lock index a8ba8147..59eecaf3 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "500346cc4a4a83b162e07bb0071d1602", + "content-hash": "51c5797dc1629fe1f42b1fdc91c6e5d8", "packages": [ { "name": "asm89/stack-cors", @@ -62,6 +62,72 @@ }, "time": "2021-03-11T06:42:03+00:00" }, + { + "name": "barryvdh/laravel-dompdf", + "version": "v0.9.0", + "source": { + "type": "git", + "url": "https://github.com/barryvdh/laravel-dompdf.git", + "reference": "5b99e1f94157d74e450f4c97e8444fcaffa2144b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barryvdh/laravel-dompdf/zipball/5b99e1f94157d74e450f4c97e8444fcaffa2144b", + "reference": "5b99e1f94157d74e450f4c97e8444fcaffa2144b", + "shasum": "" + }, + "require": { + "dompdf/dompdf": "^1", + "illuminate/support": "^5.5|^6|^7|^8", + "php": "^7.1 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.9-dev" + }, + "laravel": { + "providers": [ + "Barryvdh\\DomPDF\\ServiceProvider" + ], + "aliases": { + "PDF": "Barryvdh\\DomPDF\\Facade" + } + } + }, + "autoload": { + "psr-4": { + "Barryvdh\\DomPDF\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "A DOMPDF Wrapper for Laravel", + "keywords": [ + "dompdf", + "laravel", + "pdf" + ], + "support": { + "issues": "https://github.com/barryvdh/laravel-dompdf/issues", + "source": "https://github.com/barryvdh/laravel-dompdf/tree/v0.9.0" + }, + "funding": [ + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2020-12-27T12:05:53+00:00" + }, { "name": "biscolab/laravel-recaptcha", "version": "5.0.1", @@ -780,6 +846,73 @@ ], "time": "2020-05-25T17:44:05+00:00" }, + { + "name": "dompdf/dompdf", + "version": "v1.1.1", + "source": { + "type": "git", + "url": "https://github.com/dompdf/dompdf.git", + "reference": "de4aad040737a89fae2129cdeb0f79c45513128d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/dompdf/dompdf/zipball/de4aad040737a89fae2129cdeb0f79c45513128d", + "reference": "de4aad040737a89fae2129cdeb0f79c45513128d", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "phenx/php-font-lib": "^0.5.2", + "phenx/php-svg-lib": "^0.3.3", + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "mockery/mockery": "^1.3", + "phpunit/phpunit": "^7.5 || ^8 || ^9", + "squizlabs/php_codesniffer": "^3.5" + }, + "suggest": { + "ext-gd": "Needed to process images", + "ext-gmagick": "Improves image processing performance", + "ext-imagick": "Improves image processing performance", + "ext-zlib": "Needed for pdf stream compression" + }, + "type": "library", + "autoload": { + "psr-4": { + "Dompdf\\": "src/" + }, + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-2.1" + ], + "authors": [ + { + "name": "Fabien Ménager", + "email": "fabien.menager@gmail.com" + }, + { + "name": "Brian Sweeney", + "email": "eclecticgeek@gmail.com" + }, + { + "name": "Gabriel Bull", + "email": "me@gabrielbull.com" + } + ], + "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter", + "homepage": "https://github.com/dompdf/dompdf", + "support": { + "issues": "https://github.com/dompdf/dompdf/issues", + "source": "https://github.com/dompdf/dompdf/tree/v1.1.1" + }, + "time": "2021-11-24T00:45:04+00:00" + }, { "name": "dragonmantank/cron-expression", "version": "v3.1.0", @@ -1763,6 +1896,71 @@ }, "time": "2021-05-25T16:45:33+00:00" }, + { + "name": "laraveldaily/laravel-invoices", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/LaravelDaily/laravel-invoices.git", + "reference": "88c472680951acc57ccf179711add7d8dda36821" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/LaravelDaily/laravel-invoices/zipball/88c472680951acc57ccf179711add7d8dda36821", + "reference": "88c472680951acc57ccf179711add7d8dda36821", + "shasum": "" + }, + "require": { + "barryvdh/laravel-dompdf": "^0.9", + "illuminate/http": "^5.5|^6|^7|^8", + "illuminate/support": "^5.5|^6|^7|^8", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^8.4", + "symfony/var-dumper": "^5.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "LaravelDaily\\Invoices\\InvoiceServiceProvider" + ], + "aliases": { + "Invoice": "LaravelDaily\\Invoices\\Facades\\Invoice" + } + } + }, + "autoload": { + "psr-4": { + "LaravelDaily\\Invoices\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-3.0-only" + ], + "authors": [ + { + "name": "David Lun", + "email": "mysticcode@gmail.com", + "homepage": "https://lun.lt", + "role": "Developer" + } + ], + "description": "Missing invoices for Laravel", + "homepage": "https://github.com/LaravelDaily/laravel-invoices", + "keywords": [ + "invoice", + "invoices", + "laravel" + ], + "support": { + "issues": "https://github.com/LaravelDaily/laravel-invoices/issues", + "source": "https://github.com/LaravelDaily/laravel-invoices/tree/2.2.0" + }, + "time": "2021-09-29T08:31:40+00:00" + }, { "name": "league/commonmark", "version": "1.6.2", @@ -2601,6 +2799,92 @@ "abandoned": true, "time": "2019-01-04T20:04:25+00:00" }, + { + "name": "phenx/php-font-lib", + "version": "0.5.2", + "source": { + "type": "git", + "url": "https://github.com/PhenX/php-font-lib.git", + "reference": "ca6ad461f032145fff5971b5985e5af9e7fa88d8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PhenX/php-font-lib/zipball/ca6ad461f032145fff5971b5985e5af9e7fa88d8", + "reference": "ca6ad461f032145fff5971b5985e5af9e7fa88d8", + "shasum": "" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.35 || ^5 || ^6 || ^7" + }, + "type": "library", + "autoload": { + "psr-4": { + "FontLib\\": "src/FontLib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0" + ], + "authors": [ + { + "name": "Fabien Ménager", + "email": "fabien.menager@gmail.com" + } + ], + "description": "A library to read, parse, export and make subsets of different types of font files.", + "homepage": "https://github.com/PhenX/php-font-lib", + "support": { + "issues": "https://github.com/PhenX/php-font-lib/issues", + "source": "https://github.com/PhenX/php-font-lib/tree/0.5.2" + }, + "time": "2020-03-08T15:31:32+00:00" + }, + { + "name": "phenx/php-svg-lib", + "version": "0.3.4", + "source": { + "type": "git", + "url": "https://github.com/PhenX/php-svg-lib.git", + "reference": "f627771eb854aa7f45f80add0f23c6c4d67ea0f2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PhenX/php-svg-lib/zipball/f627771eb854aa7f45f80add0f23c6c4d67ea0f2", + "reference": "f627771eb854aa7f45f80add0f23c6c4d67ea0f2", + "shasum": "" + }, + "require": { + "php": "^7.4 || ^8.0", + "sabberworm/php-css-parser": "^8.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Svg\\": "src/Svg" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "LGPL-3.0" + ], + "authors": [ + { + "name": "Fabien Ménager", + "email": "fabien.menager@gmail.com" + } + ], + "description": "A library to read, parse and export to PDF SVG files.", + "homepage": "https://github.com/PhenX/php-svg-lib", + "support": { + "issues": "https://github.com/PhenX/php-svg-lib/issues", + "source": "https://github.com/PhenX/php-svg-lib/tree/0.3.4" + }, + "time": "2021-10-18T02:13:32+00:00" + }, { "name": "phpoption/phpoption", "version": "1.7.5", @@ -3262,6 +3546,55 @@ ], "time": "2020-08-18T17:17:46+00:00" }, + { + "name": "sabberworm/php-css-parser", + "version": "8.3.1", + "source": { + "type": "git", + "url": "https://github.com/sabberworm/PHP-CSS-Parser.git", + "reference": "d217848e1396ef962fb1997cf3e2421acba7f796" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sabberworm/PHP-CSS-Parser/zipball/d217848e1396ef962fb1997cf3e2421acba7f796", + "reference": "d217848e1396ef962fb1997cf3e2421acba7f796", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "require-dev": { + "codacy/coverage": "^1.4", + "phpunit/phpunit": "~4.8" + }, + "type": "library", + "autoload": { + "psr-0": { + "Sabberworm\\CSS": "lib/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Raphael Schweikert" + } + ], + "description": "Parser for CSS Files written in PHP", + "homepage": "http://www.sabberworm.com/blog/2010/6/10/php-css-parser", + "keywords": [ + "css", + "parser", + "stylesheet" + ], + "support": { + "issues": "https://github.com/sabberworm/PHP-CSS-Parser/issues", + "source": "https://github.com/sabberworm/PHP-CSS-Parser/tree/8.3.1" + }, + "time": "2020-06-01T09:10:00+00:00" + }, { "name": "socialiteproviders/discord", "version": "4.1.1", @@ -8931,5 +9264,5 @@ "ext-intl": "*" }, "platform-dev": [], - "plugin-api-version": "2.0.0" + "plugin-api-version": "2.1.0" } diff --git a/config/invoices.php b/config/invoices.php new file mode 100644 index 00000000..772ef1fd --- /dev/null +++ b/config/invoices.php @@ -0,0 +1,97 @@ + [ + /* + * Carbon date format + */ + 'format' => 'Y-m-d', + /* + * Due date for payment since invoice's date. + */ + 'pay_until_days' => 7, + ], + + 'serial_number' => [ + 'series' => 'AA', + 'sequence' => 1, + /* + * Sequence will be padded accordingly, for ex. 00001 + */ + 'sequence_padding' => 5, + 'delimiter' => '.', + /* + * Supported tags {SERIES}, {DELIMITER}, {SEQUENCE} + * Example: AA.00001 + */ + 'format' => '{SERIES}{DELIMITER}{SEQUENCE}', + ], + + 'currency' => [ + 'code' => 'eur', + /* + * Usually cents + * Used when spelling out the amount and if your currency has decimals. + * + * Example: Amount in words: Eight hundred fifty thousand sixty-eight EUR and fifteen ct. + */ + 'fraction' => 'ct.', + 'symbol' => '€', + /* + * Example: 19.00 + */ + 'decimals' => 2, + /* + * Example: 1.99 + */ + 'decimal_point' => '.', + /* + * By default empty. + * Example: 1,999.00 + */ + 'thousands_separator' => '', + /* + * Supported tags {VALUE}, {SYMBOL}, {CODE} + * Example: 1.99 € + */ + 'format' => '{VALUE} {SYMBOL}', + ], + + 'paper' => [ + // A4 = 210 mm x 297 mm = 595 pt x 842 pt + 'size' => 'a4', + 'orientation' => 'portrait', + ], + + 'disk' => 'local', + + 'seller' => [ + /* + * Class used in templates via $invoice->seller + * + * Must implement LaravelDaily\Invoices\Contracts\PartyContract + * or extend LaravelDaily\Invoices\Classes\Party + */ + 'class' => \LaravelDaily\Invoices\Classes\Seller::class, + + /* + * Default attributes for Seller::class + */ + 'attributes' => [ + 'name' => 'Towne, Smith and Ebert', + 'address' => '89982 Pfeffer Falls Damianstad, CO 66972-8160', + 'code' => '41-1985581', + 'vat' => '123456789', + 'phone' => '760-355-3930', + 'custom_fields' => [ + /* + * Custom attributes for Seller::class + * + * Used to display additional info on Seller section in invoice + * attribute => value + */ + 'SWIFT' => 'BANK101', + ], + ], + ], +]; diff --git a/public/vendor/invoices/sample-logo.png b/public/vendor/invoices/sample-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..6e5fa7c6fcb1db2db80a0fcb2619f65c59feede3 GIT binary patch literal 44248 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 LNkvXXu0mjfk2qcb literal 0 HcmV?d00001 diff --git a/resources/lang/vendor/invoices/en/invoice.php b/resources/lang/vendor/invoices/en/invoice.php new file mode 100644 index 00000000..5bd30fe4 --- /dev/null +++ b/resources/lang/vendor/invoices/en/invoice.php @@ -0,0 +1,38 @@ + 'Invoice', + 'serial' => 'Serial No.', + 'date' => 'Invoice date', + 'seller' => 'Seller', + 'buyer' => 'Buyer', + 'address' => 'Address', + 'code' => 'Code', + 'vat' => 'VAT code', + 'phone' => 'Phone', + 'description' => 'Description', + 'units' => 'Units', + 'quantity' => 'Qty', + 'price' => 'Price', + 'discount' => 'Discount', + 'tax' => 'Tax', + 'sub_total' => 'Sub total', + 'total_discount' => 'Total discount', + 'taxable_amount' => 'Taxable amount', + 'total_taxes' => 'Total taxes', + 'tax_rate' => 'Tax rate', + 'total_amount' => 'Total amount', + 'pay_until' => 'Please pay until', + 'amount_in_words' => 'Amount in words', + 'amount_in_words_format' => '%s %s and %s %s', + 'notes' => 'Notes', + 'shipping' => 'Shipping', + 'paid' => 'Paid', + 'due' => 'Due', +]; diff --git a/resources/lang/vendor/invoices/nl/invoice.php b/resources/lang/vendor/invoices/nl/invoice.php new file mode 100644 index 00000000..1e171c47 --- /dev/null +++ b/resources/lang/vendor/invoices/nl/invoice.php @@ -0,0 +1,38 @@ + 'Factuur', + 'serial' => 'Factuurnummer', + 'date' => 'Factuurdatum', + 'seller' => 'Leverancier', + 'buyer' => 'Afnemer', + 'address' => 'Adres', + 'code' => 'Code', + 'vat' => 'Btw-identificatienummer', + 'phone' => 'Telefoonnummer', + 'description' => 'Omschrijving', + 'units' => 'Eenheid', + 'quantity' => 'Aantal', + 'price' => 'Prijs', + 'discount' => 'Korting', + 'tax' => 'Belasting', + 'sub_total' => 'Subtotaal', + 'total_discount' => 'Totale korting', + 'taxable_amount' => 'Belastbaar bedrag', + 'total_taxes' => 'Totaal belastingen', + 'tax_rate' => 'Belastingtarief', + 'total_amount' => 'Totaalbedrag', + 'pay_until' => 'Gelieve te betalen voor', + 'amount_in_words' => 'Totaalbedrag in woorden', + 'amount_in_words_format' => '%s %s en %s %s', + 'notes' => 'Opmerkingen', + 'shipping' => 'Verzending', + 'paid' => 'Betaald', + 'due' => 'Openstaand', +]; diff --git a/resources/views/vendor/invoices/templates/default.blade.php b/resources/views/vendor/invoices/templates/default.blade.php new file mode 100644 index 00000000..2c4ad699 --- /dev/null +++ b/resources/views/vendor/invoices/templates/default.blade.php @@ -0,0 +1,386 @@ + + + + {{ $invoice->name }} + + + + + + + {{-- Header --}} + @if($invoice->logo) + logo + @endif + + + + + + + + +
+

+ {{ $invoice->name }} +

+
+ @if($invoice->status) +

+ {{ $invoice->status }} +

+ @endif +

{{ __('invoices::invoice.serial') }} {{ $invoice->getSerialNumber() }}

+

{{ __('invoices::invoice.date') }}: {{ $invoice->getDate() }}

+
+ + {{-- Seller - Buyer --}} + + + + + + + + + + + + + + + +
+ {{ __('invoices::invoice.seller') }} + + {{ __('invoices::invoice.buyer') }} +
+ @if($invoice->seller->name) +

+ {{ $invoice->seller->name }} +

+ @endif + + @if($invoice->seller->address) +

+ {{ __('invoices::invoice.address') }}: {{ $invoice->seller->address }} +

+ @endif + + @if($invoice->seller->code) +

+ {{ __('invoices::invoice.code') }}: {{ $invoice->seller->code }} +

+ @endif + + @if($invoice->seller->vat) +

+ {{ __('invoices::invoice.vat') }}: {{ $invoice->seller->vat }} +

+ @endif + + @if($invoice->seller->phone) +

+ {{ __('invoices::invoice.phone') }}: {{ $invoice->seller->phone }} +

+ @endif + + @foreach($invoice->seller->custom_fields as $key => $value) +

+ {{ ucfirst($key) }}: {{ $value }} +

+ @endforeach +
+ @if($invoice->buyer->name) +

+ {{ $invoice->buyer->name }} +

+ @endif + + @if($invoice->buyer->address) +

+ {{ __('invoices::invoice.address') }}: {{ $invoice->buyer->address }} +

+ @endif + + @if($invoice->buyer->code) +

+ {{ __('invoices::invoice.code') }}: {{ $invoice->buyer->code }} +

+ @endif + + @if($invoice->buyer->vat) +

+ {{ __('invoices::invoice.vat') }}: {{ $invoice->buyer->vat }} +

+ @endif + + @if($invoice->buyer->phone) +

+ {{ __('invoices::invoice.phone') }}: {{ $invoice->buyer->phone }} +

+ @endif + + @foreach($invoice->buyer->custom_fields as $key => $value) +

+ {{ ucfirst($key) }}: {{ $value }} +

+ @endforeach +
+ + {{-- Table --}} + + + + + @if($invoice->hasItemUnits) + + @endif + + + @if($invoice->hasItemDiscount) + + @endif + @if($invoice->hasItemTax) + + @endif + + + + + {{-- Items --}} + @foreach($invoice->items as $item) + + + @if($invoice->hasItemUnits) + + @endif + + + @if($invoice->hasItemDiscount) + + @endif + @if($invoice->hasItemTax) + + @endif + + + + @endforeach + {{-- Summary --}} + @if($invoice->hasItemOrInvoiceDiscount()) + + + + + + @endif + @if($invoice->taxable_amount) + + + + + + @endif + @if($invoice->tax_rate) + + + + + + @endif + @if($invoice->hasItemOrInvoiceTax()) + + + + + + @endif + @if($invoice->shipping_amount) + + + + + + @endif + + + + + + +
{{ __('invoices::invoice.description') }}{{ __('invoices::invoice.units') }}{{ __('invoices::invoice.quantity') }}{{ __('invoices::invoice.price') }}{{ __('invoices::invoice.discount') }}{{ __('invoices::invoice.tax') }}{{ __('invoices::invoice.sub_total') }}
+ {{ $item->title }} + + @if($item->description) +

{{ $item->description }}

+ @endif +
{{ $item->units }}{{ $item->quantity }} + {{ $invoice->formatCurrency($item->price_per_unit) }} + + {{ $invoice->formatCurrency($item->discount) }} + + {{ $invoice->formatCurrency($item->tax) }} + + {{ $invoice->formatCurrency($item->sub_total_price) }} +
{{ __('invoices::invoice.total_discount') }} + {{ $invoice->formatCurrency($invoice->total_discount) }} +
{{ __('invoices::invoice.taxable_amount') }} + {{ $invoice->formatCurrency($invoice->taxable_amount) }} +
{{ __('invoices::invoice.tax_rate') }} + {{ $invoice->tax_rate }}% +
{{ __('invoices::invoice.total_taxes') }} + {{ $invoice->formatCurrency($invoice->total_taxes) }} +
{{ __('invoices::invoice.shipping') }} + {{ $invoice->formatCurrency($invoice->shipping_amount) }} +
{{ __('invoices::invoice.total_amount') }} + {{ $invoice->formatCurrency($invoice->total_amount) }} +
+ + @if($invoice->notes) +

+ {{ trans('invoices::invoice.notes') }}: {!! $invoice->notes !!} +

+ @endif + +

+ {{ trans('invoices::invoice.amount_in_words') }}: {{ $invoice->getTotalAmountInWords() }} +

+

+ {{ trans('invoices::invoice.pay_until') }}: {{ $invoice->getPayUntilDate() }} +

+ + + + From bf848f0bcb4f9226c18d2e390730f57640874896 Mon Sep 17 00:00:00 2001 From: 1day2die Date: Fri, 26 Nov 2021 20:46:26 +0100 Subject: [PATCH 05/77] lul --- app/Http/Controllers/Admin/PaymentController.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/Admin/PaymentController.php b/app/Http/Controllers/Admin/PaymentController.php index b5b68677..826c8658 100644 --- a/app/Http/Controllers/Admin/PaymentController.php +++ b/app/Http/Controllers/Admin/PaymentController.php @@ -197,20 +197,21 @@ class PaymentController extends Controller //create invoice $seller = new Party([ - 'name' => 'Dennis L', - 'phone' => '1234513', + 'name' => 'Hafuga Company', + 'phone' => '+49 12346709', 'address' => 'Deutschlandstr 4, 66666 Hell', 'custom_fields' => [ 'UST_ID' => '365#GG', + 'E-Mail' => 'invoice@hafuga.de', ], ]); $customer = new Buyer([ - 'name' => 'Dennis Leipe', + 'name' => 'Not Dennis', 'custom_fields' => [ - 'email' => 'dleipe@hafuga.de', + 'email' => 'customer@google.de', 'order number' => '> 654321 <', ], ]); From 21b9d700355a329022e0c3f2c7937075bb2c9a2d Mon Sep 17 00:00:00 2001 From: 1day2die Date: Sat, 27 Nov 2021 02:47:36 +0100 Subject: [PATCH 06/77] invoice DB, counting up, format stuff --- .gitignore | 1 + .../Controllers/Admin/PaymentController.php | 24 ++++++-- app/Models/Invoice.php | 20 +++++++ app/Notifications/InvoiceNotification.php | 55 +++++++++++++++++++ .../2021_11_27_014226_create_invoices.php | 34 ++++++++++++ .../invoices/templates/default.blade.php | 1 + 6 files changed, 130 insertions(+), 5 deletions(-) create mode 100644 app/Models/Invoice.php create mode 100644 app/Notifications/InvoiceNotification.php create mode 100644 database/migrations/2021_11_27_014226_create_invoices.php diff --git a/.gitignore b/.gitignore index 9dd097b7..7639c9af 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,4 @@ yarn-error.log .gitignore .env.dev .env.testing +public/vendor/invoices/logo.png diff --git a/app/Http/Controllers/Admin/PaymentController.php b/app/Http/Controllers/Admin/PaymentController.php index 826c8658..fb4d0526 100644 --- a/app/Http/Controllers/Admin/PaymentController.php +++ b/app/Http/Controllers/Admin/PaymentController.php @@ -10,6 +10,7 @@ use App\Models\PaypalProduct; use App\Models\Product; use App\Models\User; use App\Notifications\ConfirmPaymentNotification; +use App\Notifications\InvoiceNotification; use Exception; use Illuminate\Contracts\Foundation\Application; use Illuminate\Contracts\View\Factory; @@ -217,6 +218,9 @@ class PaymentController extends Controller ]); $item = (new InvoiceItem())->title($paypalProduct->description)->pricePerUnit($paypalProduct->price); + $lastInvoiceID = \App\Models\invoice::where("invoice_name","like","%".now()->format('M')."%")->max("id"); + $newInvoiceID = $lastInvoiceID + 1; + $invoice = Invoice::make() ->buyer($customer) ->seller($seller) @@ -224,19 +228,29 @@ class PaymentController extends Controller ->taxRate(floatval($paypalProduct->getTaxPercent())) ->shipping(0) ->addItem($item) - ->series('BIG') - ->status(__('invoices::invoice.paid')) - ->sequence(667) - ->serialNumberFormat('{SEQUENCE}/{SERIES}') + + ->series(now()->format('M')) + ->delimiter("-") + ->sequence($newInvoiceID) + ->serialNumberFormat('{SEQUENCE} - {SERIES}') + + ->logo(public_path('vendor/invoices/logo.png')) ->save('public'); + $user->notify(new InvoiceNotification($invoice)); + \App\Models\invoice::create([ + 'invoice_user' => $user->id, + 'invoice_name' => "invoice_".$invoice->series.$invoice->delimiter.$invoice->sequence, + 'payment_id' => $payment->payment_id, + ]); //redirect back to home - return redirect()->route('home')->with('success', 'Your credit balance has been increased! Invoice: '.$invoice->url()); + return redirect()->route('home')->with('success', 'Your credit balance has been increased! Find the invoice in your Notifications'); } + // If call returns body in response, you can get the deserialized version from the result attribute of the response if (env('APP_ENV') == 'local') { dd($response); diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php new file mode 100644 index 00000000..e117b039 --- /dev/null +++ b/app/Models/Invoice.php @@ -0,0 +1,20 @@ +invoice = $invoice; + } + + /** + * Get the notification's delivery channels. + * + * @param mixed $notifiable + * @return array + */ + public function via($notifiable) + { + return ['database']; + } + + /** + * Get the array representation of the notification. + * + * @param mixed $notifiable + * @return array + */ + public function toArray($notifiable) + { + return [ + 'title' => "Invoice Created: Nr.".$this->invoice->sequence, + 'content' => " +

Find it here.

+ ", + ]; + } +} diff --git a/database/migrations/2021_11_27_014226_create_invoices.php b/database/migrations/2021_11_27_014226_create_invoices.php new file mode 100644 index 00000000..f2716c05 --- /dev/null +++ b/database/migrations/2021_11_27_014226_create_invoices.php @@ -0,0 +1,34 @@ +id(); + $table->string('invoice_name'); + $table->string('invoice_user'); + $table->string('payment_id'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('invoices'); + } +} diff --git a/resources/views/vendor/invoices/templates/default.blade.php b/resources/views/vendor/invoices/templates/default.blade.php index 2c4ad699..c288a766 100644 --- a/resources/views/vendor/invoices/templates/default.blade.php +++ b/resources/views/vendor/invoices/templates/default.blade.php @@ -136,6 +136,7 @@ +

From 38f1273d2d8cf80a1cf37964e36e1d9faa419abf Mon Sep 17 00:00:00 2001 From: IceToast Date: Mon, 29 Nov 2021 09:24:18 +0100 Subject: [PATCH 07/77] =?UTF-8?q?fix:=20=F0=9F=9A=91=EF=B8=8F=20swapped=20?= =?UTF-8?q?nodes/eggs=20column=20naming=20->=20now=20correct=20order?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../views/admin/products/index.blade.php | 109 ++++++++++++------ 1 file changed, 71 insertions(+), 38 deletions(-) diff --git a/resources/views/admin/products/index.blade.php b/resources/views/admin/products/index.blade.php index 59b0156b..fdc559c2 100644 --- a/resources/views/admin/products/index.blade.php +++ b/resources/views/admin/products/index.blade.php @@ -10,9 +10,9 @@
@@ -29,7 +29,7 @@
Products
- Create new
@@ -38,22 +38,22 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + @@ -74,30 +74,63 @@ return confirm("Are you sure you wish to delete?") !== false; } - document.addEventListener("DOMContentLoaded", function () { + document.addEventListener("DOMContentLoaded", function() { $('#datatable').DataTable({ processing: true, serverSide: true, stateSave: true, - order: [[ 2, "asc" ]], - ajax: "{{route('admin.products.datatable')}}", - columns: [ - {data: 'disabled'}, - {data: 'name'}, - {data: 'price'}, - {data: 'memory'}, - {data: 'cpu'}, - {data: 'swap'}, - {data: 'disk'}, - {data: 'databases'}, - {data: 'backups'}, - {data: 'nodes', sortable: false}, - {data: 'eggs', sortable: false}, - {data: 'servers', sortable: false}, - {data: 'created_at'}, - {data: 'actions', sortable: false}, + order: [ + [2, "asc"] ], - fnDrawCallback: function( oSettings ) { + ajax: "{{ route('admin.products.datatable') }}", + columns: [{ + data: 'disabled' + }, + { + data: 'name' + }, + { + data: 'price' + }, + { + data: 'memory' + }, + { + data: 'cpu' + }, + { + data: 'swap' + }, + { + data: 'disk' + }, + { + data: 'databases' + }, + { + data: 'backups' + }, + { + data: 'nodes', + sortable: false + }, + { + data: 'eggs', + sortable: false + }, + { + data: 'servers', + sortable: false + }, + { + data: 'created_at' + }, + { + data: 'actions', + sortable: false + }, + ], + fnDrawCallback: function(oSettings) { $('[data-toggle="popover"]').popover(); } }); From 67d0b66091962bb3b1299015e687e517ed141e07 Mon Sep 17 00:00:00 2001 From: WBLKLeipe Date: Tue, 30 Nov 2021 14:09:13 +0100 Subject: [PATCH 08/77] attach mail --- .gitignore | 3 +-- app/Notifications/InvoiceNotification.php | 19 +++++++++--------- .../invoices/{sample-logo.png => logo.png} | Bin 3 files changed, 11 insertions(+), 11 deletions(-) rename public/vendor/invoices/{sample-logo.png => logo.png} (100%) diff --git a/.gitignore b/.gitignore index 7639c9af..74015e4f 100644 --- a/.gitignore +++ b/.gitignore @@ -17,5 +17,4 @@ npm-debug.log yarn-error.log .gitignore .env.dev -.env.testing -public/vendor/invoices/logo.png +.env.testing \ No newline at end of file diff --git a/app/Notifications/InvoiceNotification.php b/app/Notifications/InvoiceNotification.php index d4b504b8..3a3acbde 100644 --- a/app/Notifications/InvoiceNotification.php +++ b/app/Notifications/InvoiceNotification.php @@ -4,6 +4,7 @@ namespace App\Notifications; use App\Models\Server; use Illuminate\Bus\Queueable; +use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Notification; use LaravelDaily\Invoices\Invoice; @@ -34,22 +35,22 @@ class InvoiceNotification extends Notification */ public function via($notifiable) { - return ['database']; + return ['mail']; } /** * Get the array representation of the notification. * * @param mixed $notifiable - * @return array + * @return MailMessage */ - public function toArray($notifiable) + public function toMail($notifiable) { - return [ - 'title' => "Invoice Created: Nr.".$this->invoice->sequence, - 'content' => " -

Find it here.

- ", - ]; + return (new MailMessage) + ->subject('Your Invoice!') + ->greeting('Your invoice is ready') + ->line("Skurr skurr.") + ->line('damn son.') + ->attach($this->invoice->stream()); } } diff --git a/public/vendor/invoices/sample-logo.png b/public/vendor/invoices/logo.png similarity index 100% rename from public/vendor/invoices/sample-logo.png rename to public/vendor/invoices/logo.png From 92f048c4bd87a7485b5d8b369f5223fc9f6a87fa Mon Sep 17 00:00:00 2001 From: WBLKLeipe Date: Tue, 30 Nov 2021 14:52:36 +0100 Subject: [PATCH 09/77] save invoice in correct path --- app/Http/Controllers/Admin/PaymentController.php | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/Admin/PaymentController.php b/app/Http/Controllers/Admin/PaymentController.php index fb4d0526..a24ecbbe 100644 --- a/app/Http/Controllers/Admin/PaymentController.php +++ b/app/Http/Controllers/Admin/PaymentController.php @@ -19,6 +19,7 @@ use Illuminate\Http\JsonResponse; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Storage; use LaravelDaily\Invoices\Classes\Party; use PayPalCheckoutSdk\Core\PayPalHttpClient; use PayPalCheckoutSdk\Core\ProductionEnvironment; @@ -230,16 +231,18 @@ class PaymentController extends Controller ->addItem($item) ->status(__('invoices::invoice.paid')) - ->series(now()->format('M')) + ->series(now()->format('M_Y')) ->delimiter("-") ->sequence($newInvoiceID) ->serialNumberFormat('{SEQUENCE} - {SERIES}') ->logo(public_path('vendor/invoices/logo.png')) + ->save("local"); + //Save the invoice in "storage\app\invoice\USER_ID\YEAR" + $invoice->render(); + Storage::disk("local")->put("invoice/".$user->id."/".now()->format('Y')."/".$invoice->filename, $invoice->output); - ->save('public'); - - $user->notify(new InvoiceNotification($invoice)); + // $user->notify(new InvoiceNotification($invoice)); \App\Models\invoice::create([ 'invoice_user' => $user->id, From 928086953c0d1a98b002fd10f53756baf859cbda Mon Sep 17 00:00:00 2001 From: WBLKLeipe Date: Tue, 30 Nov 2021 15:50:43 +0100 Subject: [PATCH 10/77] Logo, Template and Invoice stuff --- .env.example | 6 ++++ .../Controllers/Admin/PaymentController.php | 27 +++++++++--------- public/vendor/invoices/logo.png | Bin 44248 -> 21607 bytes .../invoices/templates/default.blade.php | 2 +- 4 files changed, 21 insertions(+), 14 deletions(-) diff --git a/.env.example b/.env.example index c7016a83..88982091 100644 --- a/.env.example +++ b/.env.example @@ -23,6 +23,12 @@ PAYPAL_SECRET= PAYPAL_CLIENT_ID= PAYPAL_EMAIL= +#INVOICE RELATED - put every value in quotes "" +COMPANY_PHONE= +COMPANY_ADRESS= +COMPANY_VAT_ID= +INVOICE_PREFIX= + #set-up for extra discord verification DISCORD_CLIENT_ID= DISCORD_CLIENT_SECRET= diff --git a/app/Http/Controllers/Admin/PaymentController.php b/app/Http/Controllers/Admin/PaymentController.php index a24ecbbe..960d720a 100644 --- a/app/Http/Controllers/Admin/PaymentController.php +++ b/app/Http/Controllers/Admin/PaymentController.php @@ -198,30 +198,31 @@ class PaymentController extends Controller event(new UserUpdateCreditsEvent($user)); //create invoice + $lastInvoiceID = \App\Models\invoice::where("invoice_name","like","%".now()->format('mY')."%")->max("id"); + $newInvoiceID = $lastInvoiceID + 1; + $seller = new Party([ - 'name' => 'Hafuga Company', - 'phone' => '+49 12346709', - 'address' => 'Deutschlandstr 4, 66666 Hell', + 'name' => env("APP_NAME", "Controlpanel.gg"), + 'phone' => env("COMPANY_PHONE",""), + 'address' => env("COMPANY_ADRESS",""), 'custom_fields' => [ - 'UST_ID' => '365#GG', - 'E-Mail' => 'invoice@hafuga.de', + 'VAT ID' => env("COMPANY_VAT_ID",""), + 'E-Mail' => env("MAIL_FROM_ADDRESS", "company@mail.com"), + "Web" => env("APP_URL","https://controlpanel.gg") ], ]); $customer = new Buyer([ - 'name' => 'Not Dennis', + 'name' => $user->name, 'custom_fields' => [ - 'email' => 'customer@google.de', - 'order number' => '> 654321 <', + 'E-Mail' => $user->email, + 'Client ID' => $user->id, ], ]); $item = (new InvoiceItem())->title($paypalProduct->description)->pricePerUnit($paypalProduct->price); - $lastInvoiceID = \App\Models\invoice::where("invoice_name","like","%".now()->format('M')."%")->max("id"); - $newInvoiceID = $lastInvoiceID + 1; - $invoice = Invoice::make() ->buyer($customer) ->seller($seller) @@ -231,10 +232,10 @@ class PaymentController extends Controller ->addItem($item) ->status(__('invoices::invoice.paid')) - ->series(now()->format('M_Y')) + ->series(now()->format('mY')) ->delimiter("-") ->sequence($newInvoiceID) - ->serialNumberFormat('{SEQUENCE} - {SERIES}') + ->serialNumberFormat(env("INVOICE_PREFIX","").'-{SERIES}{SEQUENCE}') ->logo(public_path('vendor/invoices/logo.png')) ->save("local"); diff --git a/public/vendor/invoices/logo.png b/public/vendor/invoices/logo.png index 6e5fa7c6fcb1db2db80a0fcb2619f65c59feede3..f2afb9c38ead1439021eafd140119f5be25127fd 100644 GIT binary patch literal 21607 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 C&QV+d literal 44248 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 LNkvXXu0mjfk2qcb diff --git a/resources/views/vendor/invoices/templates/default.blade.php b/resources/views/vendor/invoices/templates/default.blade.php index c288a766..deaaf97a 100644 --- a/resources/views/vendor/invoices/templates/default.blade.php +++ b/resources/views/vendor/invoices/templates/default.blade.php @@ -140,7 +140,7 @@
- + diff --git a/resources/views/vendor/translation-manager/index.php b/resources/views/vendor/translation-manager/index.php deleted file mode 100644 index 65034bdc..00000000 --- a/resources/views/vendor/translation-manager/index.php +++ /dev/null @@ -1,326 +0,0 @@ - - - - - - Translation Manager - - - - - - - - - - - - -
-

Warning, translations are not visible until they are exported back to the app/lang file, using php artisan translation:export command or publish button.

- - - - - -
- -
- -

- -
- -

-
-
- -
-
- -
-
-
- -
-
- - -
- - - -
- - - Back - - -

-
- -
-

Choose a group to display the group translations. If no groups are visisble, make sure you have run the migrations and imported the translations.

- -
-
- - -
-
- -
- - -
- -
- - -
-
- -
- -
-
- Use Auto Translate -
-
- - -
-
-
- - -
-
- - -
- -

- Translating using stichoza/google-translate-php. If you would like to use Google Translate API enter your Google Translate API key to config file laravel_google_translate -

- -
- - - -
-
-
- -
-

Total: , changed:

-
ActiveNamePriceMemoryCpuSwapDiskDatabasesBackupsEggsNodesServersCreated at
ActiveNamePriceMemoryCpuSwapDiskDatabasesBackupsNodesEggsServersCreated at

- {{ $invoice->name }} + {{ $invoice->name }} {{$invoice->getSerialNumber()}}

From 69c41620b863f44f0fbe2664b0b8a2070d1a8c6b Mon Sep 17 00:00:00 2001 From: WBLKLeipe Date: Tue, 30 Nov 2021 16:00:26 +0100 Subject: [PATCH 11/77] remove wrong save --- app/Http/Controllers/Admin/PaymentController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Admin/PaymentController.php b/app/Http/Controllers/Admin/PaymentController.php index 960d720a..7e54fa5a 100644 --- a/app/Http/Controllers/Admin/PaymentController.php +++ b/app/Http/Controllers/Admin/PaymentController.php @@ -237,8 +237,8 @@ class PaymentController extends Controller ->sequence($newInvoiceID) ->serialNumberFormat(env("INVOICE_PREFIX","").'-{SERIES}{SEQUENCE}') - ->logo(public_path('vendor/invoices/logo.png')) - ->save("local"); + ->logo(public_path('vendor/invoices/logo.png')); + //Save the invoice in "storage\app\invoice\USER_ID\YEAR" $invoice->render(); Storage::disk("local")->put("invoice/".$user->id."/".now()->format('Y')."/".$invoice->filename, $invoice->output); From 8cfabf7088f43044987e127eace3cb195bc31a67 Mon Sep 17 00:00:00 2001 From: WBLKLeipe Date: Tue, 30 Nov 2021 16:30:48 +0100 Subject: [PATCH 12/77] small fixes --- .env.example | 2 +- app/Http/Controllers/Admin/PaymentController.php | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.env.example b/.env.example index 88982091..3820a0f6 100644 --- a/.env.example +++ b/.env.example @@ -27,7 +27,7 @@ PAYPAL_EMAIL= COMPANY_PHONE= COMPANY_ADRESS= COMPANY_VAT_ID= -INVOICE_PREFIX= +INVOICE_PREFIX="INV" #set-up for extra discord verification DISCORD_CLIENT_ID= diff --git a/app/Http/Controllers/Admin/PaymentController.php b/app/Http/Controllers/Admin/PaymentController.php index 7e54fa5a..71d08969 100644 --- a/app/Http/Controllers/Admin/PaymentController.php +++ b/app/Http/Controllers/Admin/PaymentController.php @@ -205,8 +205,8 @@ class PaymentController extends Controller 'name' => env("APP_NAME", "Controlpanel.gg"), 'phone' => env("COMPANY_PHONE",""), 'address' => env("COMPANY_ADRESS",""), + 'vat' => env("COMPANY_VAT_ID",""), 'custom_fields' => [ - 'VAT ID' => env("COMPANY_VAT_ID",""), 'E-Mail' => env("MAIL_FROM_ADDRESS", "company@mail.com"), "Web" => env("APP_URL","https://controlpanel.gg") ], @@ -214,6 +214,7 @@ class PaymentController extends Controller + $customer = new Buyer([ 'name' => $user->name, 'custom_fields' => [ @@ -235,10 +236,10 @@ class PaymentController extends Controller ->series(now()->format('mY')) ->delimiter("-") ->sequence($newInvoiceID) - ->serialNumberFormat(env("INVOICE_PREFIX","").'-{SERIES}{SEQUENCE}') + ->serialNumberFormat(env("INVOICE_PREFIX","INV").'{DELIMITER}{SERIES}{SEQUENCE}') ->logo(public_path('vendor/invoices/logo.png')); - + //Save the invoice in "storage\app\invoice\USER_ID\YEAR" $invoice->render(); Storage::disk("local")->put("invoice/".$user->id."/".now()->format('Y')."/".$invoice->filename, $invoice->output); From c12e825b2e9610801aedfdb886485e9b62748536 Mon Sep 17 00:00:00 2001 From: 1day2die Date: Tue, 30 Nov 2021 18:18:15 +0100 Subject: [PATCH 13/77] Attach invoice to mail --- .../Controllers/Admin/PaymentController.php | 15 +++++------ app/Notifications/InvoiceNotification.php | 26 ++++++++++++++----- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/app/Http/Controllers/Admin/PaymentController.php b/app/Http/Controllers/Admin/PaymentController.php index 71d08969..cbed821c 100644 --- a/app/Http/Controllers/Admin/PaymentController.php +++ b/app/Http/Controllers/Admin/PaymentController.php @@ -7,9 +7,7 @@ use App\Http\Controllers\Controller; use App\Models\Configuration; use App\Models\Payment; use App\Models\PaypalProduct; -use App\Models\Product; use App\Models\User; -use App\Notifications\ConfirmPaymentNotification; use App\Notifications\InvoiceNotification; use Exception; use Illuminate\Contracts\Foundation\Application; @@ -192,8 +190,6 @@ class PaymentController extends Controller 'payer' => json_encode($response->result->payer), ]); - //payment notification - $user->notify(new ConfirmPaymentNotification($payment)); event(new UserUpdateCreditsEvent($user)); @@ -237,22 +233,25 @@ class PaymentController extends Controller ->delimiter("-") ->sequence($newInvoiceID) ->serialNumberFormat(env("INVOICE_PREFIX","INV").'{DELIMITER}{SERIES}{SEQUENCE}') - ->logo(public_path('vendor/invoices/logo.png')); //Save the invoice in "storage\app\invoice\USER_ID\YEAR" + $invoice->filename=$invoice->getSerialNumber().'.pdf'; $invoice->render(); Storage::disk("local")->put("invoice/".$user->id."/".now()->format('Y')."/".$invoice->filename, $invoice->output); - // $user->notify(new InvoiceNotification($invoice)); \App\Models\invoice::create([ 'invoice_user' => $user->id, - 'invoice_name' => "invoice_".$invoice->series.$invoice->delimiter.$invoice->sequence, + 'invoice_name' => $invoice->getSerialNumber(), 'payment_id' => $payment->payment_id, ]); + + //Send Invoice per Mail + $user->notify(new InvoiceNotification($invoice,$user, $payment)); + //redirect back to home - return redirect()->route('home')->with('success', 'Your credit balance has been increased! Find the invoice in your Notifications'); + return redirect()->route('home')->with('success', 'Your credit balance has been increased!'); } diff --git a/app/Notifications/InvoiceNotification.php b/app/Notifications/InvoiceNotification.php index 3a3acbde..c905c26a 100644 --- a/app/Notifications/InvoiceNotification.php +++ b/app/Notifications/InvoiceNotification.php @@ -2,10 +2,11 @@ namespace App\Notifications; -use App\Models\Server; +use App\Models\User; use Illuminate\Bus\Queueable; use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Notification; +use App\Models\Payment; use LaravelDaily\Invoices\Invoice; class InvoiceNotification extends Notification @@ -14,17 +15,23 @@ class InvoiceNotification extends Notification use Queueable; /** * @var invoice + * * @var invoice + * * @var invoice */ private $invoice; + private $user; + private $payment; /** * Create a new notification instance. * * @param Invoice $invoice */ - public function __construct(Invoice $invoice) + public function __construct(Invoice $invoice, User $user, Payment $payment) { $this->invoice = $invoice; + $this->user = $user; + $this->payment = $payment; } /** @@ -47,10 +54,15 @@ class InvoiceNotification extends Notification public function toMail($notifiable) { return (new MailMessage) - ->subject('Your Invoice!') - ->greeting('Your invoice is ready') - ->line("Skurr skurr.") - ->line('damn son.') - ->attach($this->invoice->stream()); + ->subject('Your Payment was successful!') + ->greeting('Hello,') + ->line("Your payment was processes!.") + ->line('Status: '.$this->payment->status) + ->line('Price: '.$this->payment->formatToCurrency($this->payment->total_price)) + ->line('Type: '.$this->payment->type) + ->line('Amount: '.$this->payment->amount) + ->line('Balance: '.$this->user->credits) + ->line('User ID: '.$this->payment->user_id) + ->attach(storage_path('app/invoice/'.$this->user->id.'/'.now()->format('Y').'/'.$this->invoice->filename)); } } From ef3cc1e756781069d0178e3b80629f313de75dfb Mon Sep 17 00:00:00 2001 From: 1day2die Date: Tue, 30 Nov 2021 18:40:56 +0100 Subject: [PATCH 14/77] prepare the UI --- .../Controllers/Admin/PaymentController.php | 51 ++++---- .../Controllers/Admin/SettingsController.php | 11 ++ app/Notifications/InvoiceNotification.php | 17 +-- .../views/admin/settings/index.blade.php | 109 +++++++++++++++++- routes/web.php | 1 + 5 files changed, 152 insertions(+), 37 deletions(-) diff --git a/app/Http/Controllers/Admin/PaymentController.php b/app/Http/Controllers/Admin/PaymentController.php index cbed821c..aac2cc4a 100644 --- a/app/Http/Controllers/Admin/PaymentController.php +++ b/app/Http/Controllers/Admin/PaymentController.php @@ -18,16 +18,16 @@ use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Storage; +use LaravelDaily\Invoices\Classes\Buyer; +use LaravelDaily\Invoices\Classes\InvoiceItem; use LaravelDaily\Invoices\Classes\Party; +use LaravelDaily\Invoices\Invoice; use PayPalCheckoutSdk\Core\PayPalHttpClient; use PayPalCheckoutSdk\Core\ProductionEnvironment; use PayPalCheckoutSdk\Core\SandboxEnvironment; use PayPalCheckoutSdk\Orders\OrdersCaptureRequest; use PayPalCheckoutSdk\Orders\OrdersCreateRequest; use PayPalHttp\HttpException; -use LaravelDaily\Invoices\Invoice; -use LaravelDaily\Invoices\Classes\Buyer; -use LaravelDaily\Invoices\Classes\InvoiceItem; class PaymentController extends Controller { @@ -50,10 +50,10 @@ class PaymentController extends Controller public function checkOut(Request $request, PaypalProduct $paypalProduct) { return view('store.checkout')->with([ - 'product' => $paypalProduct, - 'taxvalue' => $paypalProduct->getTaxValue(), - 'taxpercent' => $paypalProduct->getTaxPercent(), - 'total' => $paypalProduct->getTotalPrice() + 'product' => $paypalProduct, + 'taxvalue' => $paypalProduct->getTaxValue(), + 'taxpercent' => $paypalProduct->getTaxPercent(), + 'total' => $paypalProduct->getTotalPrice() ]); } @@ -72,12 +72,12 @@ class PaymentController extends Controller [ "reference_id" => uniqid(), "description" => $paypalProduct->description, - "amount" => [ - "value" => $paypalProduct->getTotalPrice(), + "amount" => [ + "value" => $paypalProduct->getTotalPrice(), 'currency_code' => strtoupper($paypalProduct->currency_code), - 'breakdown' =>[ + 'breakdown' => [ 'item_total' => - [ + [ 'currency_code' => strtoupper($paypalProduct->currency_code), 'value' => $paypalProduct->price, ], @@ -93,8 +93,8 @@ class PaymentController extends Controller "application_context" => [ "cancel_url" => route('payment.cancel'), "return_url" => route('payment.success', ['product' => $paypalProduct->id]), - 'brand_name' => config('app.name', 'Laravel'), - 'shipping_preference' => 'NO_SHIPPING' + 'brand_name' => config('app.name', 'Laravel'), + 'shipping_preference' => 'NO_SHIPPING' ] @@ -194,25 +194,23 @@ class PaymentController extends Controller event(new UserUpdateCreditsEvent($user)); //create invoice - $lastInvoiceID = \App\Models\invoice::where("invoice_name","like","%".now()->format('mY')."%")->max("id"); + $lastInvoiceID = \App\Models\invoice::where("invoice_name", "like", "%" . now()->format('mY') . "%")->max("id"); $newInvoiceID = $lastInvoiceID + 1; $seller = new Party([ - 'name' => env("APP_NAME", "Controlpanel.gg"), - 'phone' => env("COMPANY_PHONE",""), - 'address' => env("COMPANY_ADRESS",""), - 'vat' => env("COMPANY_VAT_ID",""), + 'name' => env("APP_NAME", "Controlpanel.gg"), + 'phone' => env("COMPANY_PHONE", ""), + 'address' => env("COMPANY_ADRESS", ""), + 'vat' => env("COMPANY_VAT_ID", ""), 'custom_fields' => [ 'E-Mail' => env("MAIL_FROM_ADDRESS", "company@mail.com"), - "Web" => env("APP_URL","https://controlpanel.gg") + "Web" => env("APP_URL", "https://controlpanel.gg") ], ]); - - $customer = new Buyer([ - 'name' => $user->name, + 'name' => $user->name, 'custom_fields' => [ 'E-Mail' => $user->email, 'Client ID' => $user->id, @@ -228,17 +226,16 @@ class PaymentController extends Controller ->shipping(0) ->addItem($item) ->status(__('invoices::invoice.paid')) - ->series(now()->format('mY')) ->delimiter("-") ->sequence($newInvoiceID) - ->serialNumberFormat(env("INVOICE_PREFIX","INV").'{DELIMITER}{SERIES}{SEQUENCE}') + ->serialNumberFormat(env("INVOICE_PREFIX", "INV") . '{DELIMITER}{SERIES}{SEQUENCE}') ->logo(public_path('vendor/invoices/logo.png')); //Save the invoice in "storage\app\invoice\USER_ID\YEAR" - $invoice->filename=$invoice->getSerialNumber().'.pdf'; + $invoice->filename = $invoice->getSerialNumber() . '.pdf'; $invoice->render(); - Storage::disk("local")->put("invoice/".$user->id."/".now()->format('Y')."/".$invoice->filename, $invoice->output); + Storage::disk("local")->put("invoice/" . $user->id . "/" . now()->format('Y') . "/" . $invoice->filename, $invoice->output); \App\Models\invoice::create([ @@ -248,7 +245,7 @@ class PaymentController extends Controller ]); //Send Invoice per Mail - $user->notify(new InvoiceNotification($invoice,$user, $payment)); + $user->notify(new InvoiceNotification($invoice, $user, $payment)); //redirect back to home return redirect()->route('home')->with('success', 'Your credit balance has been increased!'); diff --git a/app/Http/Controllers/Admin/SettingsController.php b/app/Http/Controllers/Admin/SettingsController.php index 375c5c0c..5292ba4b 100644 --- a/app/Http/Controllers/Admin/SettingsController.php +++ b/app/Http/Controllers/Admin/SettingsController.php @@ -39,4 +39,15 @@ class SettingsController extends Controller return redirect()->route('admin.settings.index')->with('success', 'Icons updated!'); } + public function updateInvoiceSettings(Request $request) + { + $request->validate([ + 'icon' => 'nullable', + 'favicon' => 'nullable', + ]); + + + return redirect()->route('admin.settings.index')->with('success', 'Invoice settings updated!'); + } + } diff --git a/app/Notifications/InvoiceNotification.php b/app/Notifications/InvoiceNotification.php index c905c26a..78408ae2 100644 --- a/app/Notifications/InvoiceNotification.php +++ b/app/Notifications/InvoiceNotification.php @@ -2,17 +2,18 @@ namespace App\Notifications; +use App\Models\Payment; use App\Models\User; use Illuminate\Bus\Queueable; use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Notification; -use App\Models\Payment; use LaravelDaily\Invoices\Invoice; class InvoiceNotification extends Notification { use Queueable; + /** * @var invoice * * @var invoice @@ -57,12 +58,12 @@ class InvoiceNotification extends Notification ->subject('Your Payment was successful!') ->greeting('Hello,') ->line("Your payment was processes!.") - ->line('Status: '.$this->payment->status) - ->line('Price: '.$this->payment->formatToCurrency($this->payment->total_price)) - ->line('Type: '.$this->payment->type) - ->line('Amount: '.$this->payment->amount) - ->line('Balance: '.$this->user->credits) - ->line('User ID: '.$this->payment->user_id) - ->attach(storage_path('app/invoice/'.$this->user->id.'/'.now()->format('Y').'/'.$this->invoice->filename)); + ->line('Status: ' . $this->payment->status) + ->line('Price: ' . $this->payment->formatToCurrency($this->payment->total_price)) + ->line('Type: ' . $this->payment->type) + ->line('Amount: ' . $this->payment->amount) + ->line('Balance: ' . $this->user->credits) + ->line('User ID: ' . $this->payment->user_id) + ->attach(storage_path('app/invoice/' . $this->user->id . '/' . now()->format('Y') . '/' . $this->invoice->filename)); } } diff --git a/resources/views/admin/settings/index.blade.php b/resources/views/admin/settings/index.blade.php index 55a0150f..683d9e95 100644 --- a/resources/views/admin/settings/index.blade.php +++ b/resources/views/admin/settings/index.blade.php @@ -39,6 +39,9 @@ + @@ -88,14 +91,116 @@ chrome hotkey) to reload without cache to see your changes appear :)

- +
+
+ @csrf + @method('PATCH') + +
+
+ +
+
+ + +
+ @error('company-phone') + + {{$message}} + + @enderror +
+ +
+
+ + +
+ @error('company-name') + + {{$message}} + + @enderror +
+ +
+
+ + +
+ @error('company-vat') + + {{$message}} + + @enderror +
+ + +
+
+ + +
+ @error('company-adress') + + {{$message}} + + @enderror +
+ +
+
+ + +
+ @error('company-mail') + + {{$message}} + + @enderror +
+ +
+
+ + +
+ @error('company-web') + + {{$message}} + + @enderror +
+ +
+
+ + +
+ + +
+ - + diff --git a/routes/web.php b/routes/web.php index 18cadf8d..6def19e0 100644 --- a/routes/web.php +++ b/routes/web.php @@ -123,6 +123,7 @@ Route::middleware(['auth', 'checkSuspended'])->group(function () { Route::resource('configurations', ConfigurationController::class); Route::patch('settings/update/icons', [SettingsController::class, 'updateIcons'])->name('settings.update.icons'); + Route::patch('settings/update/invoice-settings', [SettingsController::class, 'updateInvoiceSettings'])->name('settings.update.invoicesettings'); Route::resource('settings', SettingsController::class)->only('index'); Route::get('usefullinks/datatable', [UsefulLinkController::class, 'datatable'])->name('usefullinks.datatable'); From a11a9cf99ced866cfabf8e0f01d227f094b76d9c Mon Sep 17 00:00:00 2001 From: 1day2die Date: Tue, 30 Nov 2021 18:54:01 +0100 Subject: [PATCH 15/77] garkein bock mehr alter --- .../Controllers/Admin/SettingsController.php | 3 + app/Models/InvoiceSettings.php | 21 +++++ .../2021_11_30_174439_invoice-settings.php | 37 +++++++++ .../views/admin/settings/index.blade.php | 76 ++++++++++++------- 4 files changed, 109 insertions(+), 28 deletions(-) create mode 100644 app/Models/InvoiceSettings.php create mode 100644 database/migrations/2021_11_30_174439_invoice-settings.php diff --git a/app/Http/Controllers/Admin/SettingsController.php b/app/Http/Controllers/Admin/SettingsController.php index 5292ba4b..c4cdc38d 100644 --- a/app/Http/Controllers/Admin/SettingsController.php +++ b/app/Http/Controllers/Admin/SettingsController.php @@ -8,6 +8,7 @@ use Illuminate\Contracts\View\Factory; use Illuminate\Contracts\View\View; use Illuminate\Http\Request; use Illuminate\Http\Response; +use App\Models\invoiceSettings; class SettingsController extends Controller { @@ -47,6 +48,8 @@ class SettingsController extends Controller ]); + + return redirect()->route('admin.settings.index')->with('success', 'Invoice settings updated!'); } diff --git a/app/Models/InvoiceSettings.php b/app/Models/InvoiceSettings.php new file mode 100644 index 00000000..c866c0d7 --- /dev/null +++ b/app/Models/InvoiceSettings.php @@ -0,0 +1,21 @@ +id(); + $table->string('company_name')->nullable(); + $table->string('company_adress')->nullable(); + $table->string('company_phone')->nullable(); + $table->string('company_vat')->nullable(); + $table->string('company_mail')->nullable(); + $table->string('company_web')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('invoice_settings'); + } +} diff --git a/resources/views/admin/settings/index.blade.php b/resources/views/admin/settings/index.blade.php index 683d9e95..aab220e6 100644 --- a/resources/views/admin/settings/index.blade.php +++ b/resources/views/admin/settings/index.blade.php @@ -100,6 +100,34 @@
+ +
+
+ + +
+ @error('company-name') + + {{$message}} + + @enderror +
+ +
+
+ + +
+ @error('company-adress') + + {{$message}} + + @enderror +
@@ -114,20 +142,7 @@ @enderror
- -
-
- - -
- @error('company-name') - - {{$message}} - - @enderror -
+
@@ -143,20 +158,6 @@ @enderror
- -
-
- - -
- @error('company-adress') - - {{$message}} - - @enderror -
@@ -186,6 +187,25 @@ @enderror
+ +
+
+ + +
+ @error('logo') + + {{$message}} + + @enderror +
+
+
+ + +
From 7f4503d228429f295f586c97806d7daaed9e8535 Mon Sep 17 00:00:00 2001 From: WBLKLeipe Date: Wed, 1 Dec 2021 12:19:06 +0100 Subject: [PATCH 16/77] invoice settings via DB and changeable --- .../Controllers/Admin/PaymentController.php | 20 ++++++++------ .../Controllers/Admin/SettingsController.php | 26 ++++++++++++++++-- .../ConfirmPaymentNotification.php | 3 ++ database/seeders/DatabaseSeeder.php | 1 + public/vendor/invoices/logo.png | Bin 21607 -> 0 bytes .../views/admin/settings/index.blade.php | 4 +-- 6 files changed, 41 insertions(+), 13 deletions(-) delete mode 100644 public/vendor/invoices/logo.png diff --git a/app/Http/Controllers/Admin/PaymentController.php b/app/Http/Controllers/Admin/PaymentController.php index aac2cc4a..2f2d44ea 100644 --- a/app/Http/Controllers/Admin/PaymentController.php +++ b/app/Http/Controllers/Admin/PaymentController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers\Admin; use App\Events\UserUpdateCreditsEvent; use App\Http\Controllers\Controller; use App\Models\Configuration; +use App\Models\invoiceSettings; use App\Models\Payment; use App\Models\PaypalProduct; use App\Models\User; @@ -194,17 +195,18 @@ class PaymentController extends Controller event(new UserUpdateCreditsEvent($user)); //create invoice - $lastInvoiceID = \App\Models\invoice::where("invoice_name", "like", "%" . now()->format('mY') . "%")->max("id"); + $lastInvoiceID = \App\Models\invoice::where("invoice_name", "like", "%" . now()->format('mY') . "%")->count("id"); $newInvoiceID = $lastInvoiceID + 1; + $invoiceSettings = invoiceSettings::all()->first(); $seller = new Party([ - 'name' => env("APP_NAME", "Controlpanel.gg"), - 'phone' => env("COMPANY_PHONE", ""), - 'address' => env("COMPANY_ADRESS", ""), - 'vat' => env("COMPANY_VAT_ID", ""), + 'name' => $invoiceSettings->company_name, + 'phone' => $invoiceSettings->company_phone, + 'address' => $invoiceSettings->company_adress, + 'vat' => $invoiceSettings->company_vat, 'custom_fields' => [ - 'E-Mail' => env("MAIL_FROM_ADDRESS", "company@mail.com"), - "Web" => env("APP_URL", "https://controlpanel.gg") + 'E-Mail' => $invoiceSettings->company_mail, + "Web" => $invoiceSettings->company_web ], ]); @@ -230,7 +232,7 @@ class PaymentController extends Controller ->delimiter("-") ->sequence($newInvoiceID) ->serialNumberFormat(env("INVOICE_PREFIX", "INV") . '{DELIMITER}{SERIES}{SEQUENCE}') - ->logo(public_path('vendor/invoices/logo.png')); + ->logo(storage_path('app/public/logo.png')); //Save the invoice in "storage\app\invoice\USER_ID\YEAR" $invoice->filename = $invoice->getSerialNumber() . '.pdf'; @@ -245,7 +247,7 @@ class PaymentController extends Controller ]); //Send Invoice per Mail - $user->notify(new InvoiceNotification($invoice, $user, $payment)); + //$user->notify(new InvoiceNotification($invoice, $user, $payment)); //redirect back to home return redirect()->route('home')->with('success', 'Your credit balance has been increased!'); diff --git a/app/Http/Controllers/Admin/SettingsController.php b/app/Http/Controllers/Admin/SettingsController.php index c4cdc38d..625a1051 100644 --- a/app/Http/Controllers/Admin/SettingsController.php +++ b/app/Http/Controllers/Admin/SettingsController.php @@ -43,12 +43,34 @@ class SettingsController extends Controller public function updateInvoiceSettings(Request $request) { $request->validate([ - 'icon' => 'nullable', - 'favicon' => 'nullable', + 'logo' => 'nullable|max:10000|mimes:jpg,png,jpeg', ]); + if($request->filled('company-name')) { + invoiceSettings::updateOrCreate(['id' => "1"],['company_name' => $request->get('company-name')]); + } + if($request->filled('company-adress')) { + invoiceSettings::updateOrCreate(['id' => "1",],['company_adress' => $request->get('company-adress')]); + } + if($request->filled('company-phone')) { + invoiceSettings::updateOrCreate(['id' => "1",],['company_phone' => $request->get('company-phone')]); + } + if($request->filled('company-vat')) { + invoiceSettings::updateOrCreate(['id' => "1",],['company_vat' => $request->get('company-vat')]); + } + if($request->filled('company-mail')) { + invoiceSettings::updateOrCreate(['id' => "1",],['company_mail' => $request->get('company-mail')]); + } + if($request->filled('company-web')) { + invoiceSettings::updateOrCreate(['id' => "1",],['company_web' => $request->get('company-web')]); + } + if ($request->hasFile('logo')) { + $request->file('logo')->storeAs('public', 'logo.png'); + } + + return redirect()->route('admin.settings.index')->with('success', 'Invoice settings updated!'); } diff --git a/app/Notifications/ConfirmPaymentNotification.php b/app/Notifications/ConfirmPaymentNotification.php index efd133ab..427af6ed 100644 --- a/app/Notifications/ConfirmPaymentNotification.php +++ b/app/Notifications/ConfirmPaymentNotification.php @@ -10,6 +10,9 @@ use Illuminate\Notifications\Notification; class ConfirmPaymentNotification extends Notification implements ShouldQueue { + + //THIS IS BASICALLY NOT USED ANYMORE WITH INVOICENOTIFICATION IN PLACE + use Queueable; private Payment $payment; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 3e532616..f275ede7 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -3,6 +3,7 @@ namespace Database\Seeders; use Database\Seeders\Seeds\ConfigurationSeeder; +use Database\Seeders\Seeds\InvoiceSettingsSeeder; use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder diff --git a/public/vendor/invoices/logo.png b/public/vendor/invoices/logo.png deleted file mode 100644 index f2afb9c38ead1439021eafd140119f5be25127fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21607 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 C&QV+d diff --git a/resources/views/admin/settings/index.blade.php b/resources/views/admin/settings/index.blade.php index aab220e6..ce2bbc59 100644 --- a/resources/views/admin/settings/index.blade.php +++ b/resources/views/admin/settings/index.blade.php @@ -203,13 +203,13 @@
- + - + From a2ab45d28cca65c8982394e5f24f3a85eab3714e Mon Sep 17 00:00:00 2001 From: WBLKLeipe Date: Wed, 1 Dec 2021 12:27:49 +0100 Subject: [PATCH 17/77] fix .env.example and migration --- .env.example | 6 ------ ...gs.php => 2021_12_1_174440_invoice-settings.php} | 13 ++++++++++++- 2 files changed, 12 insertions(+), 7 deletions(-) rename database/migrations/{2021_11_30_174439_invoice-settings.php => 2021_12_1_174440_invoice-settings.php} (67%) diff --git a/.env.example b/.env.example index 3820a0f6..c7016a83 100644 --- a/.env.example +++ b/.env.example @@ -23,12 +23,6 @@ PAYPAL_SECRET= PAYPAL_CLIENT_ID= PAYPAL_EMAIL= -#INVOICE RELATED - put every value in quotes "" -COMPANY_PHONE= -COMPANY_ADRESS= -COMPANY_VAT_ID= -INVOICE_PREFIX="INV" - #set-up for extra discord verification DISCORD_CLIENT_ID= DISCORD_CLIENT_SECRET= diff --git a/database/migrations/2021_11_30_174439_invoice-settings.php b/database/migrations/2021_12_1_174440_invoice-settings.php similarity index 67% rename from database/migrations/2021_11_30_174439_invoice-settings.php rename to database/migrations/2021_12_1_174440_invoice-settings.php index c8eb057e..8615d59b 100644 --- a/database/migrations/2021_11_30_174439_invoice-settings.php +++ b/database/migrations/2021_12_1_174440_invoice-settings.php @@ -2,6 +2,7 @@ use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; +use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Schema; class InvoiceSettings extends Migration @@ -20,9 +21,19 @@ class InvoiceSettings extends Migration $table->string('company_phone')->nullable(); $table->string('company_vat')->nullable(); $table->string('company_mail')->nullable(); - $table->string('company_web')->nullable(); + $table->string('company_web')->nullable()->default(env("APP_URL","")); + $table->string('invoice_prefix')->nullable(); $table->timestamps(); }); + + DB::table('invoice_settings')->insert( + array( + 'company_name' => env("APP_NAME","MyCompany"), + 'company_web' => env("APP_URL",""), + 'invoice_prefix' => "INV" + + ) + ); } /** From 5802dee9d2e30874586656a3323cca5818ab0689 Mon Sep 17 00:00:00 2001 From: WBLKLeipe Date: Wed, 1 Dec 2021 12:30:32 +0100 Subject: [PATCH 18/77] Fix Logo upload --- storage/app/public/.gitignore | 1 + storage/app/public/logo.png | Bin 0 -> 21607 bytes 2 files changed, 1 insertion(+) create mode 100644 storage/app/public/logo.png diff --git a/storage/app/public/.gitignore b/storage/app/public/.gitignore index d6b7ef32..2a984bb3 100755 --- a/storage/app/public/.gitignore +++ b/storage/app/public/.gitignore @@ -1,2 +1,3 @@ * !.gitignore +!logo.png \ No newline at end of file diff --git a/storage/app/public/logo.png b/storage/app/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f2afb9c38ead1439021eafd140119f5be25127fd GIT binary patch literal 21607 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 C&QV+d literal 0 HcmV?d00001 From afd2e2eb21209a6feaea2843a05d3519474e6b14 Mon Sep 17 00:00:00 2001 From: WBLKLeipe Date: Wed, 1 Dec 2021 12:32:46 +0100 Subject: [PATCH 19/77] re-enable email notifications --- app/Http/Controllers/Admin/PaymentController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Admin/PaymentController.php b/app/Http/Controllers/Admin/PaymentController.php index 2f2d44ea..fa181daf 100644 --- a/app/Http/Controllers/Admin/PaymentController.php +++ b/app/Http/Controllers/Admin/PaymentController.php @@ -247,7 +247,7 @@ class PaymentController extends Controller ]); //Send Invoice per Mail - //$user->notify(new InvoiceNotification($invoice, $user, $payment)); + $user->notify(new InvoiceNotification($invoice, $user, $payment)); //redirect back to home return redirect()->route('home')->with('success', 'Your credit balance has been increased!'); From f62583a007e182811b102b9c3574683bf7d04a3a Mon Sep 17 00:00:00 2001 From: WBLKLeipe Date: Wed, 1 Dec 2021 13:30:40 +0100 Subject: [PATCH 20/77] clean UI --- .../Controllers/Admin/SettingsController.php | 38 +++--- app/Models/InvoiceSettings.php | 1 + .../views/admin/settings/index.blade.php | 113 +++++++----------- 3 files changed, 60 insertions(+), 92 deletions(-) diff --git a/app/Http/Controllers/Admin/SettingsController.php b/app/Http/Controllers/Admin/SettingsController.php index 625a1051..a38dec4f 100644 --- a/app/Http/Controllers/Admin/SettingsController.php +++ b/app/Http/Controllers/Admin/SettingsController.php @@ -3,12 +3,12 @@ namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; +use App\Models\invoiceSettings; use Illuminate\Contracts\Foundation\Application; use Illuminate\Contracts\View\Factory; use Illuminate\Contracts\View\View; use Illuminate\Http\Request; use Illuminate\Http\Response; -use App\Models\invoiceSettings; class SettingsController extends Controller { @@ -19,7 +19,15 @@ class SettingsController extends Controller */ public function index() { - return view('admin.settings.index'); + return view('admin.settings.index', + [ + 'company_name' => invoiceSettings::get()->first()->company_name, + 'company_adress' => invoiceSettings::get()->first()->company_adress, + 'company_phone' => invoiceSettings::get()->first()->company_phone, + 'company_vat' => invoiceSettings::get()->first()->company_vat, + 'company_mail' => invoiceSettings::get()->first()->company_mail, + 'company_web' => invoiceSettings::get()->first()->company_web + ]); } public function updateIcons(Request $request) @@ -46,32 +54,18 @@ class SettingsController extends Controller 'logo' => 'nullable|max:10000|mimes:jpg,png,jpeg', ]); + invoiceSettings::updateOrCreate(['id' => "1"], ['company_name' => $request->get('company-name')]); + invoiceSettings::updateOrCreate(['id' => "1",], ['company_adress' => $request->get('company-adress')]); + invoiceSettings::updateOrCreate(['id' => "1",], ['company_phone' => $request->get('company-phone')]); + invoiceSettings::updateOrCreate(['id' => "1",], ['company_mail' => $request->get('company-email')]); + invoiceSettings::updateOrCreate(['id' => "1",], ['company_vat' => $request->get('company-vat')]); + invoiceSettings::updateOrCreate(['id' => "1",], ['company_web' => $request->get('company-web')]); - - if($request->filled('company-name')) { - invoiceSettings::updateOrCreate(['id' => "1"],['company_name' => $request->get('company-name')]); - } - if($request->filled('company-adress')) { - invoiceSettings::updateOrCreate(['id' => "1",],['company_adress' => $request->get('company-adress')]); - } - if($request->filled('company-phone')) { - invoiceSettings::updateOrCreate(['id' => "1",],['company_phone' => $request->get('company-phone')]); - } - if($request->filled('company-vat')) { - invoiceSettings::updateOrCreate(['id' => "1",],['company_vat' => $request->get('company-vat')]); - } - if($request->filled('company-mail')) { - invoiceSettings::updateOrCreate(['id' => "1",],['company_mail' => $request->get('company-mail')]); - } - if($request->filled('company-web')) { - invoiceSettings::updateOrCreate(['id' => "1",],['company_web' => $request->get('company-web')]); - } if ($request->hasFile('logo')) { $request->file('logo')->storeAs('public', 'logo.png'); } - return redirect()->route('admin.settings.index')->with('success', 'Invoice settings updated!'); } diff --git a/app/Models/InvoiceSettings.php b/app/Models/InvoiceSettings.php index c866c0d7..5bcaf3dc 100644 --- a/app/Models/InvoiceSettings.php +++ b/app/Models/InvoiceSettings.php @@ -15,6 +15,7 @@ class invoiceSettings extends Model 'company_name', 'company_adress', 'company_phone', + 'company_mail', 'company_vat', 'company_web' ]; diff --git a/resources/views/admin/settings/index.blade.php b/resources/views/admin/settings/index.blade.php index ce2bbc59..c2414bb3 100644 --- a/resources/views/admin/settings/index.blade.php +++ b/resources/views/admin/settings/index.blade.php @@ -92,7 +92,7 @@ -
+
@csrf @@ -102,89 +102,63 @@
-
- - +
+ +
- @error('company-name') - - {{$message}} - - @enderror
-
- - +
+ +
- @error('company-adress') - - {{$message}} - - @enderror
-
- - +
+ +
- @error('company-phone') - - {{$message}} - - @enderror
-
- - +
+ +
- @error('company-vat') - - {{$message}} - - @enderror
-
- - +
+ +
- @error('company-mail') - - {{$message}} - - @enderror
-
- - +
+ +
- @error('company-web') - - {{$message}} - - @enderror
@@ -204,21 +178,20 @@
- - -
-
- - - - +
+ + + +
+
+ @@ -228,7 +201,7 @@ diff --git a/resources/views/admin/products/index.blade.php b/resources/views/admin/products/index.blade.php index 59b0156b..b27ee378 100644 --- a/resources/views/admin/products/index.blade.php +++ b/resources/views/admin/products/index.blade.php @@ -6,13 +6,13 @@
-

Products

+

{{__('Products')}}

@@ -28,9 +28,9 @@
-
Products
+
{{__('Products')}}
Create new + class="fas fa-plus mr-1">{{__('Create new')}}
@@ -39,19 +39,19 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + @@ -71,7 +71,7 @@ + + + function setRandomCode() { + let element = document.getElementById('code') + element.value = getRandomCode(36) + } + + function getRandomCode(length) { + let result = ''; + let characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-'; + let charactersLength = characters.length; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * + charactersLength)); + } + return result; + } + @endsection diff --git a/resources/views/admin/vouchers/edit.blade.php b/resources/views/admin/vouchers/edit.blade.php index 7447f237..df7d945b 100644 --- a/resources/views/admin/vouchers/edit.blade.php +++ b/resources/views/admin/vouchers/edit.blade.php @@ -1,170 +1,193 @@ @extends('layouts.main') @section('content') - -
-
-
-
-

Vouchers

-
-
- + +
+
+
+
+

{{__('Vouchers')}}

+
+
-
-
- + + - -
-
+ +
+
-
-
-
-
-
- Voucher details -
-
-
-
- @csrf - @method('PATCH') +
+
+
+
+
+ {{__('Voucher details')}} +
+
+
+ + @csrf + @method('PATCH') -
- - - @error('memo') -
- {{$message}} +
+ + + @error('memo') +
+ {{$message}} +
+ @enderror
- @enderror -
-
- - - @error('credits') -
- {{$message}} +
+ + + @error('credits') +
+ {{$message}} +
+ @enderror
- @enderror -
-
- -
- -
-
@error('code')
{{$message}} -
- @enderror -
- -
- -
- -
-
+ @enderror
- @error('uses') -
- {{$message}} -
- @enderror -
-
- -
- -
-
+
+ +
+ +
+ +
+ @error('uses') +
+ {{$message}} +
+ @enderror
- @error('expires_at') -
- {{$message}} + +
+ +
+ +
+
+
+
+ @error('expires_at') +
+ {{$message}} +
+ @enderror
- @enderror -
-
- -
- +
+ +
+ +
+
- -
-
- +
+ - + + + function setRandomCode() { + let element = document.getElementById('code') + element.value = getRandomCode(36) + } + + function getRandomCode(length) { + let result = ''; + let characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-'; + let charactersLength = characters.length; + for (let i = 0; i < length; i++) { + result += characters.charAt(Math.floor(Math.random() * + charactersLength)); + } + return result; + } + @endsection diff --git a/resources/views/admin/vouchers/index.blade.php b/resources/views/admin/vouchers/index.blade.php index 3b8b604a..ba99e1f3 100644 --- a/resources/views/admin/vouchers/index.blade.php +++ b/resources/views/admin/vouchers/index.blade.php @@ -6,13 +6,13 @@
-

Vouchers

+

{{__('Vouchers')}}

@@ -28,9 +28,9 @@
-
Vouchers
+
{{__('Vouchers')}}
Create new + class="fas fa-plus mr-1">{{__('Create new')}}
@@ -39,12 +39,12 @@
ActiveNamePriceMemoryCpuSwapDiskDatabasesBackupsEggsNodesServersCreated at{{__('Active')}}{{__('Name')}}{{__('Price')}}{{__('Memory')}}{{__('Cpu')}}{{__('Swap')}}{{__('Disk')}}{{__('Databases')}}{{__('Backups')}}{{__('Eggs')}}{{__('Nodes')}}{{__('Servers')}}{{__('Created at')}}
- - - + + + - - + + @@ -64,7 +64,7 @@ @endsection diff --git a/resources/views/store/checkout.blade.php b/resources/views/store/checkout.blade.php index f2bce40a..6baa4c7d 100644 --- a/resources/views/store/checkout.blade.php +++ b/resources/views/store/checkout.blade.php @@ -6,12 +6,12 @@
-

Store

+

{{__('Store')}}

@@ -34,7 +34,7 @@

{{ config('app.name', 'Laravel') }} - Date: {{Carbon\Carbon::now()->isoFormat('LL')}} + {{__('Date')}}: {{Carbon\Carbon::now()->isoFormat('LL')}}

@@ -42,24 +42,24 @@
- To + {{__('To')}}
{{config('app.name' , 'Laravel')}}
- Email: {{env('PAYPAL_EMAIL' , env('MAIL_FROM_NAME'))}} + {{__('Email')}}: {{env('PAYPAL_EMAIL' , env('MAIL_FROM_NAME'))}}
- From + {{__('From')}}
{{Auth::user()->name}}
- Email: {{Auth::user()->email}} + {{__('Email')}}: {{Auth::user()->email}}
- Status
- Pending
+ {{__('Status')}}
+ {{__('Pending')}}
{{-- Order ID: 4F3S8J
--}}
@@ -72,10 +72,10 @@
StatusCodeMemo{{__('Status')}}{{__('Code')}}{{__('Memo')}} {{CREDITS_DISPLAY_NAME}}Used / UsesExpires{{__('Used / Uses')}}{{__('Expires')}}
- - - - + + + + @@ -95,34 +95,34 @@
-

Payment Methods:

+

{{__('Payment Methods')}}:

Paypal

- By purchasing this product you agree and accept our terms of service + {{__('By purchasing this product you agree and accept our terms of service')}}

-

Amount Due {{Carbon\Carbon::now()->isoFormat('LL')}}

+

{{__('Amount Due')}} {{Carbon\Carbon::now()->isoFormat('LL')}}

QuantityProductDescriptionSubtotal{{__('Quantity')}}{{__('Product')}}{{__('Description')}}{{__('Subtotal')}}
- + - + - + - +
Subtotal:{{__('Subtotal')}}: {{$product->formatToCurrency($product->price)}}
Tax ({{$taxpercent}}%){{__('Tax')}} ({{$taxpercent}}%) {{$product->formatToCurrency($taxvalue)}}
Quantity:{{__('Quantity')}}: 1
Total:{{__('Total')}}: {{$product->formatToCurrency($total)}}
@@ -135,8 +135,8 @@ diff --git a/resources/views/store/index.blade.php b/resources/views/store/index.blade.php index 880d83a4..24d1fdb9 100644 --- a/resources/views/store/index.blade.php +++ b/resources/views/store/index.blade.php @@ -7,12 +7,12 @@
-

Store

+

{{__('Store')}}

@@ -26,7 +26,7 @@
@@ -40,9 +40,9 @@ - - - + + + @@ -65,7 +65,7 @@ @else
-

@if($products->count() == 0) There are no store products! @else The store is not correctly configured! @endif +

@if($products->count() == 0) {{__('There are no store products!')}} @else {{__('The store is not correctly configured!')}} @endif

From 7ef8fdff4ea7534e38dc84a7c9ff31dc03e5886f Mon Sep 17 00:00:00 2001 From: 1Day Date: Mon, 13 Dec 2021 11:47:35 +0100 Subject: [PATCH 42/77] guess im done? --- .../Admin/ApplicationApiController.php | 6 +-- .../Admin/ConfigurationController.php | 2 +- .../Controllers/Admin/PaymentController.php | 8 +-- .../Admin/PaypalProductController.php | 8 +-- .../Controllers/Admin/ProductController.php | 6 +-- .../Controllers/Admin/ServerController.php | 6 +-- .../Controllers/Admin/SettingsController.php | 2 +- .../Admin/UsefulLinkController.php | 6 +-- app/Http/Controllers/Admin/UserController.php | 8 +-- .../Controllers/Admin/VoucherController.php | 14 ++--- app/Http/Controllers/HomeController.php | 9 ++-- app/Http/Controllers/ProfileController.php | 2 +- app/Http/Controllers/ServerController.php | 14 ++--- app/Http/Controllers/StoreController.php | 4 +- resources/lang/de.json | 52 ++++++++++++++++++- resources/views/admin/api/create.blade.php | 14 ++--- resources/views/admin/api/edit.blade.php | 14 ++--- resources/views/admin/api/index.blade.php | 18 +++---- resources/views/layouts/main.blade.php | 5 +- resources/views/profile/index.blade.php | 3 +- 20 files changed, 126 insertions(+), 75 deletions(-) diff --git a/app/Http/Controllers/Admin/ApplicationApiController.php b/app/Http/Controllers/Admin/ApplicationApiController.php index e091605a..9918dcbb 100644 --- a/app/Http/Controllers/Admin/ApplicationApiController.php +++ b/app/Http/Controllers/Admin/ApplicationApiController.php @@ -52,7 +52,7 @@ class ApplicationApiController extends Controller 'memo' => $request->input('memo') ]); - return redirect()->route('admin.api.index')->with('success', 'api key created!'); + return redirect()->route('admin.api.index')->with('success', __('api key created!')); } /** @@ -94,7 +94,7 @@ class ApplicationApiController extends Controller $applicationApi->update($request->all()); - return redirect()->route('admin.api.index')->with('success', 'api key updated!'); + return redirect()->route('admin.api.index')->with('success', __('api key updated!')); } /** @@ -106,7 +106,7 @@ class ApplicationApiController extends Controller public function destroy(ApplicationApi $applicationApi) { $applicationApi->delete(); - return redirect()->back()->with('success', 'api key has been removed!'); + return redirect()->back()->with('success', __('api key has been removed!')); } /** diff --git a/app/Http/Controllers/Admin/ConfigurationController.php b/app/Http/Controllers/Admin/ConfigurationController.php index d16a765e..4eb84868 100644 --- a/app/Http/Controllers/Admin/ConfigurationController.php +++ b/app/Http/Controllers/Admin/ConfigurationController.php @@ -92,7 +92,7 @@ class ConfigurationController extends Controller $configuration->update($request->all()); - return redirect()->route('admin.configurations.index')->with('success', 'configuration has been updated!'); + return redirect()->route('admin.configurations.index')->with('success', __('configuration has been updated!')); } /** diff --git a/app/Http/Controllers/Admin/PaymentController.php b/app/Http/Controllers/Admin/PaymentController.php index 4c52a310..4ce1ac88 100644 --- a/app/Http/Controllers/Admin/PaymentController.php +++ b/app/Http/Controllers/Admin/PaymentController.php @@ -93,7 +93,7 @@ class PaymentController extends Controller 'shipping_preference' => 'NO_SHIPPING' ] - + ]; @@ -164,7 +164,7 @@ class PaymentController extends Controller $user->update(['server_limit' => Configuration::getValueByKey('SERVER_LIMIT_AFTER_IRL_PURCHASE')]); } } - + //update role if ($user->role == 'member') { $user->update(['role' => 'client']); @@ -192,7 +192,7 @@ class PaymentController extends Controller event(new UserUpdateCreditsEvent($user)); //redirect back to home - return redirect()->route('home')->with('success', 'Your credit balance has been increased!'); + return redirect()->route('home')->with('success', __('Your credit balance has been increased!')); } // If call returns body in response, you can get the deserialized version from the result attribute of the response @@ -220,7 +220,7 @@ class PaymentController extends Controller */ public function cancel(Request $request) { - return redirect()->route('store.index')->with('success', 'Payment was Canceled'); + return redirect()->route('store.index')->with('success', __('Payment was Canceled')); } diff --git a/app/Http/Controllers/Admin/PaypalProductController.php b/app/Http/Controllers/Admin/PaypalProductController.php index ee4764e4..51120f44 100644 --- a/app/Http/Controllers/Admin/PaypalProductController.php +++ b/app/Http/Controllers/Admin/PaypalProductController.php @@ -62,7 +62,7 @@ class PaypalProductController extends Controller $disabled = !is_null($request->input('disabled')); PaypalProduct::create(array_merge($request->all(), ['disabled' => $disabled])); - return redirect()->route('admin.store.index')->with('success', 'Store item has been created!'); + return redirect()->route('admin.store.index')->with('success', __('Store item has been created!')); } /** @@ -112,7 +112,7 @@ class PaypalProductController extends Controller $disabled = !is_null($request->input('disabled')); $paypalProduct->update(array_merge($request->all(), ['disabled' => $disabled])); - return redirect()->route('admin.store.index')->with('success', 'Store item has been updated!'); + return redirect()->route('admin.store.index')->with('success', __('Store item has been updated!')); } /** @@ -124,7 +124,7 @@ class PaypalProductController extends Controller { $paypalProduct->update(['disabled' => !$paypalProduct->disabled]); - return redirect()->route('admin.store.index')->with('success', 'Product has been updated!'); + return redirect()->route('admin.store.index')->with('success', __('Product has been updated!')); } /** @@ -136,7 +136,7 @@ class PaypalProductController extends Controller public function destroy(PaypalProduct $paypalProduct) { $paypalProduct->delete(); - return redirect()->back()->with('success', 'Store item has been removed!'); + return redirect()->back()->with('success', __('Store item has been removed!')); } diff --git a/app/Http/Controllers/Admin/ProductController.php b/app/Http/Controllers/Admin/ProductController.php index a71f81da..353327b4 100644 --- a/app/Http/Controllers/Admin/ProductController.php +++ b/app/Http/Controllers/Admin/ProductController.php @@ -84,7 +84,7 @@ class ProductController extends Controller $product->eggs()->attach($request->input('eggs')); $product->nodes()->attach($request->input('nodes')); - return redirect()->route('admin.products.index')->with('success', 'Product has been created!'); + return redirect()->route('admin.products.index')->with('success', __('Product has been created!')); } /** @@ -152,7 +152,7 @@ class ProductController extends Controller $product->eggs()->attach($request->input('eggs')); $product->nodes()->attach($request->input('nodes')); - return redirect()->route('admin.products.index')->with('success', 'Product has been updated!'); + return redirect()->route('admin.products.index')->with('success', __('Product has been updated!')); } /** @@ -181,7 +181,7 @@ class ProductController extends Controller } $product->delete(); - return redirect()->back()->with('success', 'Product has been removed!'); + return redirect()->back()->with('success', __('Product has been removed!')); } diff --git a/app/Http/Controllers/Admin/ServerController.php b/app/Http/Controllers/Admin/ServerController.php index 493993d8..f53cf49d 100644 --- a/app/Http/Controllers/Admin/ServerController.php +++ b/app/Http/Controllers/Admin/ServerController.php @@ -92,9 +92,9 @@ class ServerController extends Controller { try { $server->delete(); - return redirect()->route('admin.servers.index')->with('success', 'Server removed'); + return redirect()->route('admin.servers.index')->with('success', __('Server removed')); } catch (Exception $e) { - return redirect()->route('admin.servers.index')->with('error', 'An exception has occurred while trying to remove a resource "' . $e->getMessage() . '"'); + return redirect()->route('admin.servers.index')->with('error', __('An exception has occurred while trying to remove a resource "') . $e->getMessage() . '"'); } } @@ -109,7 +109,7 @@ class ServerController extends Controller return redirect()->back()->with('error', $exception->getMessage()); } - return redirect()->back()->with('success', 'Server has been updated!'); + return redirect()->back()->with('success', __('Server has been updated!')); } /** diff --git a/app/Http/Controllers/Admin/SettingsController.php b/app/Http/Controllers/Admin/SettingsController.php index 375c5c0c..d4d82fbe 100644 --- a/app/Http/Controllers/Admin/SettingsController.php +++ b/app/Http/Controllers/Admin/SettingsController.php @@ -36,7 +36,7 @@ class SettingsController extends Controller $request->file('favicon')->storeAs('public', 'favicon.ico'); } - return redirect()->route('admin.settings.index')->with('success', 'Icons updated!'); + return redirect()->route('admin.settings.index')->with('success', __('Icons updated!')); } } diff --git a/app/Http/Controllers/Admin/UsefulLinkController.php b/app/Http/Controllers/Admin/UsefulLinkController.php index f2e94694..92671677 100644 --- a/app/Http/Controllers/Admin/UsefulLinkController.php +++ b/app/Http/Controllers/Admin/UsefulLinkController.php @@ -50,7 +50,7 @@ class UsefulLinkController extends Controller ]); UsefulLink::create($request->all()); - return redirect()->route('admin.usefullinks.index')->with('success', 'link has been created!'); + return redirect()->route('admin.usefullinks.index')->with('success', __('link has been created!')); } /** @@ -94,7 +94,7 @@ class UsefulLinkController extends Controller ]); $usefullink->update($request->all()); - return redirect()->route('admin.usefullinks.index')->with('success', 'link has been updated!'); + return redirect()->route('admin.usefullinks.index')->with('success', __('link has been updated!')); } /** @@ -106,7 +106,7 @@ class UsefulLinkController extends Controller public function destroy(UsefulLink $usefullink) { $usefullink->delete(); - return redirect()->back()->with('success', 'product has been removed!'); + return redirect()->back()->with('success', __('product has been removed!')); } public function dataTable() diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index 4c9f9ba0..1872a295 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -115,7 +115,7 @@ class UserController extends Controller if (isset($this->pterodactyl->getUser($request->input('pterodactyl_id'))['errors'])) { throw ValidationException::withMessages([ - 'pterodactyl_id' => ["User does not exists on pterodactyl's panel"] + 'pterodactyl_id' => [__("User does not exists on pterodactyl's panel")] ]); } @@ -145,7 +145,7 @@ class UserController extends Controller public function destroy(User $user) { $user->delete(); - return redirect()->back()->with('success', 'user has been removed!'); + return redirect()->back()->with('success', __('user has been removed!')); } /** @@ -218,7 +218,7 @@ class UserController extends Controller $all = $data["all"] ?? false; $users = $all ? User::all() : User::whereIn("id", $data["users"])->get(); Notification::send($users, new DynamicNotification($data["via"], $database, $mail)); - return redirect()->route('admin.users.notifications')->with('success', 'Notification sent!'); + return redirect()->route('admin.users.notifications')->with('success', __('Notification sent!')); } /** @@ -232,7 +232,7 @@ class UserController extends Controller return redirect()->back()->with('error', $exception->getMessage()); } - return redirect()->back()->with('success', 'User has been updated!'); + return redirect()->back()->with('success', __('User has been updated!')); } /** diff --git a/app/Http/Controllers/Admin/VoucherController.php b/app/Http/Controllers/Admin/VoucherController.php index 31947dbd..d3f772e9 100644 --- a/app/Http/Controllers/Admin/VoucherController.php +++ b/app/Http/Controllers/Admin/VoucherController.php @@ -55,7 +55,7 @@ class VoucherController extends Controller Voucher::create($request->except('_token')); - return redirect()->route('admin.vouchers.index')->with('success', 'voucher has been created!'); + return redirect()->route('admin.vouchers.index')->with('success', __('voucher has been created!')); } /** @@ -101,7 +101,7 @@ class VoucherController extends Controller $voucher->update($request->except('_token')); - return redirect()->route('admin.vouchers.index')->with('success', 'voucher has been updated!'); + return redirect()->route('admin.vouchers.index')->with('success', __('voucher has been updated!')); } /** @@ -113,7 +113,7 @@ class VoucherController extends Controller public function destroy(Voucher $voucher) { $voucher->delete(); - return redirect()->back()->with('success', 'voucher has been removed!'); + return redirect()->back()->with('success', __('voucher has been removed!')); } public function users(Voucher $voucher) @@ -140,19 +140,19 @@ class VoucherController extends Controller #extra validations if ($voucher->getStatus() == 'USES_LIMIT_REACHED') throw ValidationException::withMessages([ - 'code' => 'This voucher has reached the maximum amount of uses' + 'code' => __('This voucher has reached the maximum amount of uses') ]); if ($voucher->getStatus() == 'EXPIRED') throw ValidationException::withMessages([ - 'code' => 'This voucher has expired' + 'code' => __('This voucher has expired') ]); if (!$request->user()->vouchers()->where('id', '=', $voucher->id)->get()->isEmpty()) throw ValidationException::withMessages([ - 'code' => 'You already redeemed this voucher code' + 'code' => __('You already redeemed this voucher code') ]); if ($request->user()->credits + $voucher->credits >= 99999999) throw ValidationException::withMessages([ - 'code' => "You can't redeem this voucher because you would exceed the " . CREDITS_DISPLAY_NAME . " limit" + 'code' => "You can't redeem this voucher because you would exceed the limit of " . CREDITS_DISPLAY_NAME ]); #redeem voucher diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index f287aa5e..965bcdea 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -15,7 +15,6 @@ class HomeController extends Controller const TIME_LEFT_BG_SUCCESS = "bg-success"; const TIME_LEFT_BG_WARNING = "bg-warning"; const TIME_LEFT_BG_DANGER = "bg-danger"; - const TIME_LEFT_OUT_OF_CREDITS_TEXT = "You ran out of Credits"; public function __construct() { @@ -51,8 +50,8 @@ class HomeController extends Controller */ public function getTimeLeftBoxUnit(float $daysLeft, float $hoursLeft) { - if ($daysLeft > 1) return 'days'; - return $hoursLeft < 1 ? null : "hours"; + if ($daysLeft > 1) return __('days'); + return $hoursLeft < 1 ? null : __("hours"); } /** @@ -66,7 +65,7 @@ class HomeController extends Controller public function getTimeLeftBoxText(float $daysLeft, float $hoursLeft) { if ($daysLeft > 1) return strval(number_format($daysLeft, 0)); - return ($hoursLeft < 1 ? $this::TIME_LEFT_OUT_OF_CREDITS_TEXT : strval($hoursLeft)); + return ($hoursLeft < 1 ? __("You ran out of Credits") : strval($hoursLeft)); } /** Show the application dashboard. */ @@ -85,7 +84,7 @@ class HomeController extends Controller $bg = $this->getTimeLeftBoxBackground($daysLeft); $boxText = $this->getTimeLeftBoxText($daysLeft, $hoursLeft); - $unit = $daysLeft < 1 ? ($hoursLeft < 1 ? null : "hours") : "days"; + $unit = $daysLeft < 1 ? ($hoursLeft < 1 ? null : __("hours")) : __("days"); } diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php index 00ec4b1c..3ddc1655 100644 --- a/app/Http/Controllers/ProfileController.php +++ b/app/Http/Controllers/ProfileController.php @@ -86,6 +86,6 @@ class ProfileController extends Controller 'email' => $request->input('email'), ]); - return redirect()->route('profile.index')->with('success' , 'Profile updated'); + return redirect()->route('profile.index')->with('success' , __('Profile updated')); } } diff --git a/app/Http/Controllers/ServerController.php b/app/Http/Controllers/ServerController.php index 484c2e4a..5944480b 100644 --- a/app/Http/Controllers/ServerController.php +++ b/app/Http/Controllers/ServerController.php @@ -71,7 +71,7 @@ class ServerController extends Controller { //limit validation if (Auth::user()->servers()->count() >= Auth::user()->server_limit) { - return redirect()->route('servers.index')->with('error', 'Server limit reached!'); + return redirect()->route('servers.index')->with('error', __('Server limit reached!')); } // minimum credits @@ -89,12 +89,12 @@ class ServerController extends Controller //Required Verification for creating an server if (Configuration::getValueByKey('FORCE_EMAIL_VERIFICATION', 'false') === 'true' && !Auth::user()->hasVerifiedEmail()) { - return redirect()->route('profile.index')->with('error', "You are required to verify your email address before you can create a server."); + return redirect()->route('profile.index')->with('error', __("You are required to verify your email address before you can create a server.")); } //Required Verification for creating an server if (Configuration::getValueByKey('FORCE_DISCORD_VERIFICATION', 'false') === 'true' && !Auth::user()->discordUser) { - return redirect()->route('profile.index')->with('error', "You are required to link your discord account before you can create a server."); + return redirect()->route('profile.index')->with('error', __("You are required to link your discord account before you can create a server.")); } return null; @@ -146,7 +146,7 @@ class ServerController extends Controller } } - return redirect()->route('servers.index')->with('success', 'Server created'); + return redirect()->route('servers.index')->with('success', __('Server created')); } /** @@ -159,7 +159,7 @@ class ServerController extends Controller $server->delete(); Auth::user()->notify(new ServerCreationError($server)); - return redirect()->route('servers.index')->with('error', 'No allocations satisfying the requirements for automatic deployment on this node were found.'); + return redirect()->route('servers.index')->with('error', __('No allocations satisfying the requirements for automatic deployment on this node were found.')); } /** @@ -180,9 +180,9 @@ class ServerController extends Controller { try { $server->delete(); - return redirect()->route('servers.index')->with('success', 'Server removed'); + return redirect()->route('servers.index')->with('success', __('Server removed')); } catch (Exception $e) { - return redirect()->route('servers.index')->with('error', 'An exception has occurred while trying to remove a resource "' . $e->getMessage() . '"'); + return redirect()->route('servers.index')->with('error', __('An exception has occurred while trying to remove a resource "') . $e->getMessage() . '"'); } } } diff --git a/app/Http/Controllers/StoreController.php b/app/Http/Controllers/StoreController.php index 1b23d305..52181856 100644 --- a/app/Http/Controllers/StoreController.php +++ b/app/Http/Controllers/StoreController.php @@ -18,12 +18,12 @@ class StoreController extends Controller //Required Verification for creating an server if (Configuration::getValueByKey('FORCE_EMAIL_VERIFICATION', false) === 'true' && !Auth::user()->hasVerifiedEmail()) { - return redirect()->route('profile.index')->with('error', "You are required to verify your email address before you can purchase credits."); + return redirect()->route('profile.index')->with('error', __("You are required to verify your email address before you can purchase credits.")); } //Required Verification for creating an server if (Configuration::getValueByKey('FORCE_DISCORD_VERIFICATION', false) === 'true' && !Auth::user()->discordUser) { - return redirect()->route('profile.index')->with('error', "You are required to link your discord account before you can purchase ".CREDITS_DISPLAY_NAME."."); + return redirect()->route('profile.index')->with('error', __("You are required to link your discord account before you can purchase Credits")); } return view('store.index')->with([ diff --git a/resources/lang/de.json b/resources/lang/de.json index 351269fe..fec8eb4e 100644 --- a/resources/lang/de.json +++ b/resources/lang/de.json @@ -91,6 +91,9 @@ "Select panel icon": "Icon auswählen", "Select panel favicon": "Favicon auswählen", + "Token": "Token", + "Last used": "Zuletzt benutzt", + "Store": "Laden", "Currency code": "Währungscode", "Checkout the paypal docs to select the appropriate code": "Siehe Paypal für die entsprechenden Codes", @@ -254,9 +257,56 @@ "By purchasing this product you agree and accept our terms of service": "Mit dem kauf akzeptierst du unsere TOS", "There are no store products!": "Es gibt keine Produkte", "The store is not correctly configured!": "Der Laden wurde nicht richtig konfiguriert", - "Out of Credits in": "Keine :credits mehr in" + "Out of Credits in": "Keine :credits mehr in", + "days": "Tage", + "hours": "Stunden", + "You ran out of Credits": "Keine Credits übrig!", + "Profile updated": "Profile updated", + "Server limit reached!": "Server limit erreicht", + + "You are required to verify your email address before you can create a server.": "Du musst deine E-Mail verifizieren bevor du einen Server erstellen kannst", + "You are required to link your discord account before you can create a server.": "Du musst dein Discord verifizieren bevor du einen Server erstellen kannst", + "No allocations satisfying the requirements for automatic deployment on this node were found.": "Keine automatischen Portzuweisungen für dieses Node vorhanden", + "Server removed": "Server gelöscht", + "Server created": "Server erstellt!", + "An exception has occurred while trying to remove a resource \"": "Folgender Fehler ist aufgetreten: ", + "You are required to verify your email address before you can purchase credits.": "Vor dem Kauf musst du deine E-Mail verifizieren", + "You are required to link your discord account before you can purchase ": "Vor dem Kauf musst du dein Discord verlinken!", + + "Warning!": "Warnung!", + + "api key created!": "API Key erstellt", + "api key updated!": "API Key updated", + "api key has been removed!": "API Key gelöscht", + "configuration has been updated!": "Konfig updated", + "Pterodactyl synced": "Pterodactyl synced", + "Your credit balance has been increased!": "Dein Kontostand wurde updated", + "Payment was Canceled": "Zahlung abgebrochen", + + "Store item has been created!": "Item wurde erstellt!", + "Store item has been updated!": "Item updated", + "Product has been updated!": "Product updated", + "Store item has been removed!":"Item gelöscht", + "Product has been created!": "Produkt erstellt", + "Product has been removed!": "Produkt gelöscht", + "Server has been updated!": "Server updated", + "Icons updated!": "Icons Updated", + "link has been created!": "Link erstellt!", + "link has been updated!": "Link updated!", + "user has been removed!": "User gelöscht", + "Notification sent!": "Nachricht gesendet", + "User has been updated!": "User updated!", + "User does not exists on pterodactyl's panel": "User existiert nicht in Pterodactyl", + "voucher has been created!": "Gutschein erstellt", + "voucher has been updated!": "Gutschein Updated", + "voucher has been removed!": "Gutschein gelöscht", + "This voucher has reached the maximum amount of uses": "Maximale Anzahl an Einlösungen erreicht", + "This voucher has expired": "Gutschein abgelaufen", + "You already redeemed this voucher code": "Du hast diesen Gutschein bereits eingelöst", + "You can't redeem this voucher because you would exceed the limit of ": "Du kannst diesen Gutschein nicht einlösen sonst hast du zu viele ", + " have been added to your balance!": "Wurden deinem Konto hinzugefügt" diff --git a/resources/views/admin/api/create.blade.php b/resources/views/admin/api/create.blade.php index 300d0754..e0025e85 100644 --- a/resources/views/admin/api/create.blade.php +++ b/resources/views/admin/api/create.blade.php @@ -6,13 +6,15 @@
-

Application API

+

{{__('Application API')}}

@@ -33,7 +35,7 @@ @csrf
- + @error('memo') @@ -45,7 +47,7 @@
diff --git a/resources/views/admin/api/edit.blade.php b/resources/views/admin/api/edit.blade.php index 62f82d02..f99e0b27 100644 --- a/resources/views/admin/api/edit.blade.php +++ b/resources/views/admin/api/edit.blade.php @@ -6,13 +6,15 @@
-

Application API

+

{{__('Application API')}}

@@ -34,7 +36,7 @@ @method('PATCH')
- + @error('memo') @@ -46,7 +48,7 @@
diff --git a/resources/views/admin/api/index.blade.php b/resources/views/admin/api/index.blade.php index 6c56fcf8..694f3473 100644 --- a/resources/views/admin/api/index.blade.php +++ b/resources/views/admin/api/index.blade.php @@ -6,12 +6,12 @@
-

Application API

+

{{__('Application API')}}

@@ -27,9 +27,9 @@
-
Application API
+
{{__('Application API')}}
Create new + class="fas fa-plus mr-1">{{__('Create new')}}
@@ -38,9 +38,9 @@
PriceTypeDescription{{__('Price')}}{{__('Type')}}{{__('Description')}}
- - - + + + @@ -59,7 +59,7 @@ + + From 3411418d1589dced5eaf9f2040bcb8ca0f831cd5 Mon Sep 17 00:00:00 2001 From: 1Day Date: Mon, 13 Dec 2021 13:28:37 +0100 Subject: [PATCH 48/77] Updated for invoices --- resources/lang/de.json | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/resources/lang/de.json b/resources/lang/de.json index a776a1d4..64789aaf 100644 --- a/resources/lang/de.json +++ b/resources/lang/de.json @@ -306,5 +306,28 @@ "This voucher has expired": "Gutschein abgelaufen", "You already redeemed this voucher code": "Du hast diesen Gutschein bereits eingelöst", "You can't redeem this voucher because you would exceed the limit of ": "Du kannst diesen Gutschein nicht einlösen sonst hast du zu viele ", - " have been added to your balance!": "Wurden deinem Konto hinzugefügt" + " have been added to your balance!": "Wurden deinem Konto hinzugefügt", + "Invoice": "Rechnung", + "Serial No.": "Rechnungsnr.", + "Invoice date": "Rechnungsdatum", + "Seller": "Verkäufer", + "Buyer": "Käufer", + "Address": "Adresse", + "VAT code": "Steuerid", + "Phone": "Telefon", + "Units": "Einheiten", + "Qty": "Menge", + "Discount": "Rabatt", + "Sub total": "Zwischensumme", + "Total discount": "Gesamtrabatt", + "Taxable amount": "Steuerbetrag", + "Total taxes": "Steuerngesamt", + "Tax rate": "Steuerrate", + "Total amount": "Gesamtbetrag", + "Please pay until": "Zahlbar bis", + "Amount in words": "Betrag in Worten", + "Notes": "Notizen", + "Shipping": "Lieferbedingung", + "Paid": "Bezahlt", + "Due:": "Fällig" } From 1b6e059c99f0d9a7ef26c9aa4a0dd007c1a4688a Mon Sep 17 00:00:00 2001 From: 1Day Date: Mon, 13 Dec 2021 13:29:18 +0100 Subject: [PATCH 49/77] removed multilines --- resources/lang/de.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/resources/lang/de.json b/resources/lang/de.json index 64789aaf..474ae418 100644 --- a/resources/lang/de.json +++ b/resources/lang/de.json @@ -155,7 +155,6 @@ "Please confirm your password before continuing.": "Bitte bestätige dein Passwort bevor du fortfährst", "Password": "Passwort", - "Confirm Password": "Passwort bestätigen", "Forgot Your Password?": "Passwort vergessen?", "Sign in to start your session": "Melde dich an um das Dashboard zu benutzen", "Remember Me": "Login Speichern", @@ -264,7 +263,6 @@ "You ran out of Credits": "Keine Credits übrig!", "Profile updated": "Profile updated", - "Server limit reached!": "Server limit erreicht", "You are required to verify your email address before you can create a server.": "Du musst deine E-Mail verifizieren bevor du einen Server erstellen kannst", "You are required to link your discord account before you can create a server.": "Du musst dein Discord verifizieren bevor du einen Server erstellen kannst", From 60ad5fcd6b0d211464950a8f194aaa69d4279455 Mon Sep 17 00:00:00 2001 From: 1Day Date: Mon, 13 Dec 2021 14:22:34 +0100 Subject: [PATCH 50/77] update localization file --- resources/lang/de.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/resources/lang/de.json b/resources/lang/de.json index 474ae418..29493eab 100644 --- a/resources/lang/de.json +++ b/resources/lang/de.json @@ -327,5 +327,15 @@ "Notes": "Notizen", "Shipping": "Lieferbedingung", "Paid": "Bezahlt", - "Due:": "Fällig" + "Due:": "Fällig", + "Invoice Settings":"Rechnungsoptionen", + "Download all Invoices":"Alle Rechnungen runterladen", + "Enter your companys name":"Firmenname", + "Enter your companys adress":"Firmenadresse", + "Enter your companys phone number":"Telefonnummer", + "Enter your companys VAT id":"SteuerID Nummer", + "Enter your companys email adress":"Firmen E-Mail", + "Enter your companys website":"Firmenwebsite", + "Enter your custom invoice prefix":"Rechnungsprefix", + "Select Invoice Logo":"Firmenlogo auswählen" } From f54bed1c4ab448274250c33405f10821b0261d5d Mon Sep 17 00:00:00 2001 From: 1Day Date: Mon, 13 Dec 2021 15:46:04 +0100 Subject: [PATCH 51/77] notification translations --- .../ConfirmPaymentNotification.php | 6 +++--- app/Notifications/ServerCreationError.php | 2 +- .../ServersSuspendedNotification.php | 20 +++++++++---------- app/Notifications/WelcomeMessage.php | 2 +- resources/lang/de.json | 14 ++++++++++++- 5 files changed, 28 insertions(+), 16 deletions(-) diff --git a/app/Notifications/ConfirmPaymentNotification.php b/app/Notifications/ConfirmPaymentNotification.php index efd133ab..6e7d5bcf 100644 --- a/app/Notifications/ConfirmPaymentNotification.php +++ b/app/Notifications/ConfirmPaymentNotification.php @@ -44,7 +44,7 @@ class ConfirmPaymentNotification extends Notification implements ShouldQueue public function toMail($notifiable) { return (new MailMessage) - ->subject('Payment Confirmation') + ->subject(__('Payment Confirmation')) ->markdown('mail.payment.confirmed' , ['payment' => $this->payment]); } @@ -57,8 +57,8 @@ class ConfirmPaymentNotification extends Notification implements ShouldQueue public function toArray($notifiable) { return [ - 'title' => "Payment Confirmed!", - 'content' => "Payment Confirmed!", + 'title' => __("Payment Confirmed!"), + 'content' => __("Payment Confirmed!"), ]; } } diff --git a/app/Notifications/ServerCreationError.php b/app/Notifications/ServerCreationError.php index 9555f86a..8c24c8c0 100644 --- a/app/Notifications/ServerCreationError.php +++ b/app/Notifications/ServerCreationError.php @@ -46,7 +46,7 @@ class ServerCreationError extends Notification public function toArray($notifiable) { return [ - 'title' => "Server Creation Error", + 'title' => __("Server Creation Error"), 'content' => "

Hello {$this->server->User->name}, An unexpected error has occurred...

There was a problem creating your server on our pterodactyl panel. There are likely no allocations or rooms left on the selected node. Please contact one of our support members through our discord server to get this resolved asap!

diff --git a/app/Notifications/ServersSuspendedNotification.php b/app/Notifications/ServersSuspendedNotification.php index 7a399cf2..c73f8c0d 100644 --- a/app/Notifications/ServersSuspendedNotification.php +++ b/app/Notifications/ServersSuspendedNotification.php @@ -42,11 +42,11 @@ class ServersSuspendedNotification extends Notification implements ShouldQueue public function toMail($notifiable) { return (new MailMessage) - ->subject('Your servers have been suspended!') - ->greeting('Your servers have been suspended!') - ->line("To automatically re-enable your server/s, you need to purchase more credits.") - ->action('Purchase credits', route('store.index')) - ->line('If you have any questions please let us know.'); + ->subject(__('Your servers have been suspended!')) + ->greeting(__('Your servers have been suspended!')) + ->line(__("To automatically re-enable your server/s, you need to purchase more credits.")) + ->action(__('Purchase credits'), route('store.index')) + ->line(__('If you have any questions please let us know.')); } /** @@ -58,12 +58,12 @@ class ServersSuspendedNotification extends Notification implements ShouldQueue public function toArray($notifiable) { return [ - 'title' => "Servers suspended!", + 'title' => __('Your servers have been suspended!'), 'content' => " -
Your servers have been suspended!
-

To automatically re-enable your server/s, you need to purchase more credits.

-

If you have any questions please let us know.

-

Regards,
" . config('app.name', 'Laravel') . "

+
". __('Your servers have been suspended!')."
+

". __("To automatically re-enable your server/s, you need to purchase more credits.")."

+

". __('If you have any questions please let us know.')."

+

". __('Regards').",
" . config('app.name', 'Laravel') . "

", ]; } diff --git a/app/Notifications/WelcomeMessage.php b/app/Notifications/WelcomeMessage.php index 5e21542e..3c730486 100644 --- a/app/Notifications/WelcomeMessage.php +++ b/app/Notifications/WelcomeMessage.php @@ -66,7 +66,7 @@ class WelcomeMessage extends Notification implements ShouldQueue public function toArray($notifiable) { return [ - 'title' => "Getting started!", + 'title' => __("Getting started!"), 'content' => "

Hello {$this->user->name}, Welcome to our dashboard!

Verification
diff --git a/resources/lang/de.json b/resources/lang/de.json index 29493eab..e54300b8 100644 --- a/resources/lang/de.json +++ b/resources/lang/de.json @@ -337,5 +337,17 @@ "Enter your companys email adress":"Firmen E-Mail", "Enter your companys website":"Firmenwebsite", "Enter your custom invoice prefix":"Rechnungsprefix", - "Select Invoice Logo":"Firmenlogo auswählen" + "Select Invoice Logo":"Firmenlogo auswählen", + + "Payment Confirmation": "Zahlungsbestätigung", + "Payment Confirmed!": "Zahlung bestätigt!", + "Server Creation Error": "Fehler beim erstellen des Servers", + "Your servers have been suspended!": "Deine Server wurden pausiert", + "To automatically re-enable your server/s, you need to purchase more credits.": "Um deine Server zu reaktivieren, musst du mehr Credits kaufen!", + "Purchase credits": "Credits kaufen", + "If you have any questions please let us know.": "Solltest du weiter fragen haben, melde dich gerne beim Support!", + "Regards": "mit freundlichen Grüßen", + + "Getting started!": "Den Anfang machen!" + } From ae67bd9a425f266874368d7b74d8dbc0ad950504 Mon Sep 17 00:00:00 2001 From: 1Day Date: Mon, 13 Dec 2021 16:27:56 +0100 Subject: [PATCH 52/77] fix vouchers --- app/Http/Controllers/Admin/VoucherController.php | 4 ++-- app/Models/Voucher.php | 4 ++-- resources/lang/de.json | 6 ++++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/Http/Controllers/Admin/VoucherController.php b/app/Http/Controllers/Admin/VoucherController.php index d3f772e9..878ab0fb 100644 --- a/app/Http/Controllers/Admin/VoucherController.php +++ b/app/Http/Controllers/Admin/VoucherController.php @@ -161,7 +161,7 @@ class VoucherController extends Controller event(new UserUpdateCreditsEvent($request->user())); return response()->json([ - 'success' => "{$voucher->credits} " . CREDITS_DISPLAY_NAME . " have been added to your balance!" + 'success' => "{$voucher->credits} " . CREDITS_DISPLAY_NAME ." ". __("have been added to your balance!") ]); } @@ -201,7 +201,7 @@ class VoucherController extends Controller }) ->addColumn('status', function (Voucher $voucher) { $color = 'success'; - if ($voucher->getStatus() != 'VALID') $color = 'danger'; + if ($voucher->getStatus() != __('VALID')) $color = 'danger'; return '' . $voucher->getStatus() . ''; }) ->editColumn('uses', function (Voucher $voucher) { diff --git a/app/Models/Voucher.php b/app/Models/Voucher.php index 81fe635a..17548c4f 100644 --- a/app/Models/Voucher.php +++ b/app/Models/Voucher.php @@ -86,10 +86,10 @@ class Voucher extends Model { if ($this->users()->count() >= $this->uses) return 'USES_LIMIT_REACHED'; if (!is_null($this->expires_at)) { - if ($this->expires_at->isPast()) return 'EXPIRED'; + if ($this->expires_at->isPast()) return __('EXPIRED'); } - return 'VALID'; + return __('VALID'); } /** diff --git a/resources/lang/de.json b/resources/lang/de.json index e54300b8..a43f5c0a 100644 --- a/resources/lang/de.json +++ b/resources/lang/de.json @@ -304,7 +304,7 @@ "This voucher has expired": "Gutschein abgelaufen", "You already redeemed this voucher code": "Du hast diesen Gutschein bereits eingelöst", "You can't redeem this voucher because you would exceed the limit of ": "Du kannst diesen Gutschein nicht einlösen sonst hast du zu viele ", - " have been added to your balance!": "Wurden deinem Konto hinzugefügt", + "have been added to your balance!": "wurden deinem Konto hinzugefügt", "Invoice": "Rechnung", "Serial No.": "Rechnungsnr.", "Invoice date": "Rechnungsdatum", @@ -348,6 +348,8 @@ "If you have any questions please let us know.": "Solltest du weiter fragen haben, melde dich gerne beim Support!", "Regards": "mit freundlichen Grüßen", - "Getting started!": "Den Anfang machen!" + "Getting started!": "Den Anfang machen!", + "EXPIRED": "ABGELAUFEN", + "VALID": "GÜLTIG" } From e2328cb3282b1ea17288bd0280fd459aa988a91e Mon Sep 17 00:00:00 2001 From: 1day2die Date: Mon, 13 Dec 2021 22:39:40 +0100 Subject: [PATCH 53/77] Translate Datatables --- .env.example | 1 + config/app.php | 13 +++++++++++++ resources/views/admin/api/index.blade.php | 3 +++ .../views/admin/configurations/index.blade.php | 3 +++ resources/views/admin/nests/index.blade.php | 3 +++ resources/views/admin/nodes/index.blade.php | 3 +++ resources/views/admin/payments/index.blade.php | 3 +++ resources/views/admin/products/index.blade.php | 3 +++ resources/views/admin/servers/table.blade.php | 3 +++ resources/views/admin/store/index.blade.php | 3 +++ resources/views/admin/usefullinks/index.blade.php | 3 +++ resources/views/admin/users/index.blade.php | 3 +++ resources/views/admin/vouchers/index.blade.php | 3 +++ resources/views/admin/vouchers/users.blade.php | 3 +++ 14 files changed, 50 insertions(+) diff --git a/.env.example b/.env.example index eb484cbc..fb2772a4 100644 --- a/.env.example +++ b/.env.example @@ -6,6 +6,7 @@ APP_URL=http://localhost #list with timezones https://www.php.net/manual/en/timezones.php APP_TIMEZONE=UTC LOCALE=en +DATATABLE_LOCALE=en-gb DB_CONNECTION=mysql DB_HOST=127.0.0.1 diff --git a/config/app.php b/config/app.php index 7ca6180b..13384bb3 100644 --- a/config/app.php +++ b/config/app.php @@ -83,6 +83,19 @@ return [ 'locale' => env('LOCALE', 'en'), + /* + |-------------------------------------------------------------------------- + | Datatable Language Setting + |-------------------------------------------------------------------------- + | + | This is the Language-Code used on the Datatables. + | You can grab the Language-Codes from this Website + | https://datatables.net/plug-ins/i18n/ + | + */ + + 'datatable_locale' => env('DATATABLE_LOCALE', 'en-gb'), + /* |-------------------------------------------------------------------------- | Application Fallback Locale diff --git a/resources/views/admin/api/index.blade.php b/resources/views/admin/api/index.blade.php index 694f3473..6eaf5fba 100644 --- a/resources/views/admin/api/index.blade.php +++ b/resources/views/admin/api/index.blade.php @@ -64,6 +64,9 @@ document.addEventListener("DOMContentLoaded", function () { $('#datatable').DataTable({ + language: { + url: '//cdn.datatables.net/plug-ins/1.11.3/i18n/{{config("app.datatable_locale")}}.json' + }, processing: true, serverSide: true, stateSave: true, diff --git a/resources/views/admin/configurations/index.blade.php b/resources/views/admin/configurations/index.blade.php index e8fc8623..bed5435f 100644 --- a/resources/views/admin/configurations/index.blade.php +++ b/resources/views/admin/configurations/index.blade.php @@ -64,6 +64,9 @@ + + + + + + + + + + +
+

Warning, translations are not visible until they are exported back to the app/lang file, using php artisan translation:export command or publish button.

+ + + + + +
+ +
+ +

+ +
+ +

+
+
+ +
+
+ +
+
+
+ +
+
+ + +
+ + + +
+ + + Back + + +

+
+ +
+

Choose a group to display the group translations. If no groups are visisble, make sure you have run the migrations and imported the translations.

+ +
+
+ + +
+
+ +
+ + +
+ +
+ + +
+
+ +
+ +
+
+ Use Auto Translate +
+
+ + +
+
+
+ + +
+
+ + +
+ +

+ Translating using stichoza/google-translate-php. If you would like to use Google Translate API enter your Google Translate API key to config file laravel_google_translate +

+ +
+ + + +
+
+
+ +
+

Total: , changed:

+
TokenMemoLast used{{__('Token')}}{{__('Memo')}}{{__('Last used')}}
+ + + + + + + + + + + + + + $translation): ?> + + + + + + + + + + + + + +
Key 
+ " + id="username" data-type="textarea" data-pk="id : 0 ?>" + data-url="" + data-title="Enter translation">value, ENT_QUOTES, 'UTF-8', false) : '' ?> + + +
+ +
+ Supported locales +

+ Current supported locales: +

+
+ +
    + +
  • +
    + + + +
    +
  • + +
+
+
+ +
+

+ Enter new locale key: +

+
+
+ +
+
+ +
+
+
+
+
+
+ Export all translations +
+ + +
+
+ + +
+ + + From 9ebca3aec308ae6a2cbcfd07b040c553e0a8315c Mon Sep 17 00:00:00 2001 From: AVMG20 Date: Tue, 14 Dec 2021 19:36:44 +0100 Subject: [PATCH 64/77] logo padding fix --- resources/views/admin/settings/index.blade.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/resources/views/admin/settings/index.blade.php b/resources/views/admin/settings/index.blade.php index bdb040ff..197c5005 100644 --- a/resources/views/admin/settings/index.blade.php +++ b/resources/views/admin/settings/index.blade.php @@ -178,12 +178,15 @@
+
+
+
@error('logo') {{$message}} From c6cfa6cd2f2a174686bfba1cb392d27200f72684 Mon Sep 17 00:00:00 2001 From: AVMG20 Date: Tue, 14 Dec 2021 19:50:36 +0100 Subject: [PATCH 65/77] cleanup --- .../Controllers/Admin/PaymentController.php | 2 +- .../Controllers/Admin/SettingsController.php | 32 +++++++++---------- 2 files changed, 16 insertions(+), 18 deletions(-) diff --git a/app/Http/Controllers/Admin/PaymentController.php b/app/Http/Controllers/Admin/PaymentController.php index 6d48de09..013eee29 100644 --- a/app/Http/Controllers/Admin/PaymentController.php +++ b/app/Http/Controllers/Admin/PaymentController.php @@ -197,7 +197,7 @@ class PaymentController extends Controller //create invoice $lastInvoiceID = \App\Models\Invoice::where("invoice_name", "like", "%" . now()->format('mY') . "%")->count("id"); $newInvoiceID = $lastInvoiceID + 1; - $InvoiceSettings = InvoiceSettings::all()->first(); + $InvoiceSettings = InvoiceSettings::query()->first(); $logoPath = storage_path('app/public/logo.png'); $seller = new Party([ diff --git a/app/Http/Controllers/Admin/SettingsController.php b/app/Http/Controllers/Admin/SettingsController.php index 94875bd1..8eb46fab 100644 --- a/app/Http/Controllers/Admin/SettingsController.php +++ b/app/Http/Controllers/Admin/SettingsController.php @@ -20,16 +20,10 @@ class SettingsController extends Controller */ public function index() { - return view('admin.settings.index', - [ - 'company_name' => InvoiceSettings::get()->first()->company_name, - 'company_adress' => InvoiceSettings::get()->first()->company_adress, - 'company_phone' => InvoiceSettings::get()->first()->company_phone, - 'company_vat' => InvoiceSettings::get()->first()->company_vat, - 'company_mail' => InvoiceSettings::get()->first()->company_mail, - 'company_web' => InvoiceSettings::get()->first()->company_web, - 'invoice_prefix' => InvoiceSettings::get()->first()->invoice_prefix - ]); + /** @var InvoiceSettings $invoiceSettings */ + $invoiceSettings = InvoiceSettings::first(); + + return view('admin.settings.index', $invoiceSettings->toArray()); } public function updateIcons(Request $request) @@ -56,13 +50,17 @@ class SettingsController extends Controller 'logo' => 'nullable|max:10000|mimes:jpg,png,jpeg', ]); - InvoiceSettings::updateOrCreate(['id' => "1"], ['company_name' => $request->get('company-name')]); - InvoiceSettings::updateOrCreate(['id' => "1",], ['company_adress' => $request->get('company-adress')]); - InvoiceSettings::updateOrCreate(['id' => "1",], ['company_phone' => $request->get('company-phone')]); - InvoiceSettings::updateOrCreate(['id' => "1",], ['company_mail' => $request->get('company-mail')]); - InvoiceSettings::updateOrCreate(['id' => "1",], ['company_vat' => $request->get('company-vat')]); - InvoiceSettings::updateOrCreate(['id' => "1",], ['company_web' => $request->get('company-web')]); - InvoiceSettings::updateOrCreate(['id' => "1",], ['invoice_prefix' => $request->get('invoice-prefix')]); + InvoiceSettings::updateOrCreate([ + 'id' => "1" + ], [ + 'company_name' => $request->get('company-name'), + 'company_adress' => $request->get('company-adress'), + 'company_phone' => $request->get('company-phone'), + 'company_mail' => $request->get('company-mail'), + 'company_vat' => $request->get('company-vat'), + 'company_web' => $request->get('company-web'), + 'invoice_prefix' => $request->get('invoice-prefix'), + ]); if ($request->hasFile('logo')) { $request->file('logo')->storeAs('public', 'logo.png'); From 49f32c174ad74e36a62c7c7ee9ad6f3813592ff9 Mon Sep 17 00:00:00 2001 From: Dennis Date: Wed, 15 Dec 2021 10:25:08 +0100 Subject: [PATCH 66/77] adding some base languages French Italian Spanish Dutch Polish Czech --- resources/lang/cs/auth.php | 18 ++++ resources/lang/cs/pagination.php | 17 ++++ resources/lang/cs/passwords.php | 20 +++++ resources/lang/cs/validation.php | 135 ++++++++++++++++++++++++++++++ resources/lang/es/auth.php | 18 ++++ resources/lang/es/pagination.php | 17 ++++ resources/lang/es/passwords.php | 20 +++++ resources/lang/es/validation.php | 138 +++++++++++++++++++++++++++++++ resources/lang/fr/auth.php | 18 ++++ resources/lang/fr/pagination.php | 17 ++++ resources/lang/fr/passwords.php | 20 +++++ resources/lang/fr/validation.php | 135 ++++++++++++++++++++++++++++++ resources/lang/it/auth.php | 18 ++++ resources/lang/it/pagination.php | 17 ++++ resources/lang/it/passwords.php | 20 +++++ resources/lang/it/validation.php | 135 ++++++++++++++++++++++++++++++ resources/lang/nl/auth.php | 18 ++++ resources/lang/nl/pagination.php | 17 ++++ resources/lang/nl/passwords.php | 20 +++++ resources/lang/nl/validation.php | 135 ++++++++++++++++++++++++++++++ resources/lang/pl/auth.php | 18 ++++ resources/lang/pl/pagination.php | 17 ++++ resources/lang/pl/passwords.php | 20 +++++ resources/lang/pl/validation.php | 135 ++++++++++++++++++++++++++++++ 24 files changed, 1143 insertions(+) create mode 100644 resources/lang/cs/auth.php create mode 100644 resources/lang/cs/pagination.php create mode 100644 resources/lang/cs/passwords.php create mode 100644 resources/lang/cs/validation.php create mode 100644 resources/lang/es/auth.php create mode 100644 resources/lang/es/pagination.php create mode 100644 resources/lang/es/passwords.php create mode 100644 resources/lang/es/validation.php create mode 100644 resources/lang/fr/auth.php create mode 100644 resources/lang/fr/pagination.php create mode 100644 resources/lang/fr/passwords.php create mode 100644 resources/lang/fr/validation.php create mode 100644 resources/lang/it/auth.php create mode 100644 resources/lang/it/pagination.php create mode 100644 resources/lang/it/passwords.php create mode 100644 resources/lang/it/validation.php create mode 100644 resources/lang/nl/auth.php create mode 100644 resources/lang/nl/pagination.php create mode 100644 resources/lang/nl/passwords.php create mode 100644 resources/lang/nl/validation.php create mode 100644 resources/lang/pl/auth.php create mode 100644 resources/lang/pl/pagination.php create mode 100644 resources/lang/pl/passwords.php create mode 100644 resources/lang/pl/validation.php diff --git a/resources/lang/cs/auth.php b/resources/lang/cs/auth.php new file mode 100644 index 00000000..a5ad7d09 --- /dev/null +++ b/resources/lang/cs/auth.php @@ -0,0 +1,18 @@ + 'Tyto přihlašovací údaje neodpovídají žadnému záznamu.', + 'password' => 'Zadané heslo je neplatné.', + 'throttle' => 'Příliš mnoho pokusů o přihlášení. Zkuste to prosím znovu za :seconds sekund.', +]; diff --git a/resources/lang/cs/pagination.php b/resources/lang/cs/pagination.php new file mode 100644 index 00000000..356b3189 --- /dev/null +++ b/resources/lang/cs/pagination.php @@ -0,0 +1,17 @@ + 'další »', + 'previous' => '« předchozí', +]; diff --git a/resources/lang/cs/passwords.php b/resources/lang/cs/passwords.php new file mode 100644 index 00000000..75ca9852 --- /dev/null +++ b/resources/lang/cs/passwords.php @@ -0,0 +1,20 @@ + 'Heslo bylo obnoveno!', + 'sent' => 'E-mail s instrukcemi k obnovení hesla byl odeslán!', + 'throttled' => 'Počkejte prosím a zkuste to znovu.', + 'token' => 'Klíč pro obnovu hesla je nesprávný.', + 'user' => 'Nepodařilo se najít uživatele s touto e-mailovou adresou.', +]; diff --git a/resources/lang/cs/validation.php b/resources/lang/cs/validation.php new file mode 100644 index 00000000..533be708 --- /dev/null +++ b/resources/lang/cs/validation.php @@ -0,0 +1,135 @@ + ':attribute musí být přijat.', + 'accepted_if' => 'The :attribute must be accepted when :other is :value.', + 'active_url' => ':attribute není platnou URL adresou.', + 'after' => ':attribute musí být datum po :date.', + 'after_or_equal' => ':attribute musí být datum :date nebo pozdější.', + 'alpha' => ':attribute může obsahovat pouze písmena.', + 'alpha_dash' => ':attribute může obsahovat pouze písmena, číslice, pomlčky a podtržítka. České znaky (á, é, í, ó, ú, ů, ž, š, č, ř, ď, ť, ň) nejsou podporovány.', + 'alpha_num' => ':attribute může obsahovat pouze písmena a číslice.', + 'array' => ':attribute musí být pole.', + 'attached' => 'Tento :attribute je již připojen.', + 'before' => ':attribute musí být datum před :date.', + 'before_or_equal' => 'Datum :attribute musí být před nebo rovno :date.', + 'between' => [ + 'array' => ':attribute musí obsahovat nejméně :min a nesmí obsahovat více než :max prvků.', + 'file' => ':attribute musí být větší než :min a menší než :max Kilobytů.', + 'numeric' => ':attribute musí být hodnota mezi :min a :max.', + 'string' => ':attribute musí být delší než :min a kratší než :max znaků.', + ], + 'boolean' => ':attribute musí být true nebo false', + 'confirmed' => ':attribute nesouhlasí.', + 'current_password' => 'Současné heslo není spravné.', + 'date' => ':attribute musí být platné datum.', + 'date_equals' => ':attribute musí být datum shodné s :date.', + 'date_format' => ':attribute není platný formát data podle :format.', + 'declined' => 'The :attribute must be declined.', + 'declined_if' => 'The :attribute must be declined when :other is :value.', + 'different' => ':attribute a :other se musí lišit.', + 'digits' => ':attribute musí být :digits pozic dlouhé.', + 'digits_between' => ':attribute musí být dlouhé nejméně :min a nejvíce :max pozic.', + 'dimensions' => ':attribute má neplatné rozměry.', + 'distinct' => ':attribute má duplicitní hodnotu.', + 'email' => ':attribute není platný formát.', + 'ends_with' => ':attribute musí končit jednou z následujících hodnot: :values', + 'exists' => 'Zvolená hodnota pro :attribute není platná.', + 'file' => ':attribute musí být soubor.', + 'filled' => ':attribute musí být vyplněno.', + 'gt' => [ + 'array' => 'Pole :attribute musí mít více prvků než :value.', + 'file' => 'Velikost souboru :attribute musí být větší než :value kB.', + 'numeric' => ':attribute musí být větší než :value.', + 'string' => 'Počet znaků :attribute musí být větší :value.', + ], + 'gte' => [ + 'array' => 'Pole :attribute musí mít :value prvků nebo více.', + 'file' => 'Velikost souboru :attribute musí být větší nebo rovno :value kB.', + 'numeric' => ':attribute musí být větší nebo rovno :value.', + 'string' => 'Počet znaků :attribute musí být větší nebo rovno :value.', + ], + 'image' => ':attribute musí být obrázek.', + 'in' => 'Zvolená hodnota pro :attribute je neplatná.', + 'in_array' => ':attribute není obsažen v :other.', + 'integer' => ':attribute musí být celé číslo.', + 'ip' => ':attribute musí být platnou IP adresou.', + 'ipv4' => ':attribute musí být platná IPv4 adresa.', + 'ipv6' => ':attribute musí být platná IPv6 adresa.', + 'json' => ':attribute musí být platný JSON řetězec.', + 'lt' => [ + 'array' => ':attribute by měl obsahovat méně než :value položek.', + 'file' => 'Velikost souboru :attribute musí být menší než :value kB.', + 'numeric' => ':attribute musí být menší než :value.', + 'string' => ':attribute musí obsahovat méně než :value znaků.', + ], + 'lte' => [ + 'array' => ':attribute by měl obsahovat maximálně :value položek.', + 'file' => 'Velikost souboru :attribute musí být menší než :value kB.', + 'numeric' => ':attribute musí být menší nebo rovno než :value.', + 'string' => ':attribute nesmí být delší než :value znaků.', + ], + 'max' => [ + 'array' => ':attribute nemůže obsahovat více než :max prvků.', + 'file' => 'Velikost souboru :attribute musí být menší než :value kB.', + 'numeric' => ':attribute nemůže být větší než :max.', + 'string' => ':attribute nemůže být delší než :max znaků.', + ], + 'mimes' => ':attribute musí být jeden z následujících datových typů :values.', + 'mimetypes' => ':attribute musí být jeden z následujících datových typů :values.', + 'min' => [ + 'array' => ':attribute musí obsahovat více než :min prvků.', + 'file' => ':attribute musí být větší než :min kB.', + 'numeric' => ':attribute musí být větší než :min.', + 'string' => ':attribute musí být delší než :min znaků.', + ], + 'multiple_of' => ':attribute musí být násobkem :value', + 'not_in' => 'Zvolená hodnota pro :attribute je neplatná.', + 'not_regex' => ':attribute musí být regulární výraz.', + 'numeric' => ':attribute musí být číslo.', + 'password' => 'Heslo je nesprávné.', + 'present' => ':attribute musí být vyplněno.', + 'prohibited' => 'Pole :attribute je zakázáno.', + 'prohibited_if' => 'Pole :attribute je zakázáno, když je :other :value.', + 'prohibited_unless' => 'Pole :attribute je zakázáno, pokud není rok :other v roce :values.', + 'prohibits' => 'The :attribute field prohibits :other from being present.', + 'regex' => ':attribute nemá správný formát.', + 'relatable' => 'Tento :attribute nemusí být spojen s tímto zdrojem.', + 'required' => ':attribute musí být vyplněno.', + 'required_if' => ':attribute musí být vyplněno pokud :other je :value.', + 'required_unless' => ':attribute musí být vyplněno dokud :other je v :values.', + 'required_with' => ':attribute musí být vyplněno pokud :values je vyplněno.', + 'required_with_all' => ':attribute musí být vyplněno pokud :values je zvoleno.', + 'required_without' => ':attribute musí být vyplněno pokud :values není vyplněno.', + 'required_without_all' => ':attribute musí být vyplněno pokud není žádné z :values zvoleno.', + 'same' => ':attribute a :other se musí shodovat.', + 'size' => [ + 'array' => ':attribute musí obsahovat právě :size prvků.', + 'file' => ':attribute musí mít přesně :size Kilobytů.', + 'numeric' => ':attribute musí být přesně :size.', + 'string' => ':attribute musí být přesně :size znaků dlouhý.', + ], + 'starts_with' => ':attribute musí začínat jednou z následujících hodnot: :values', + 'string' => ':attribute musí být řetězec znaků.', + 'timezone' => ':attribute musí být platná časová zóna.', + 'unique' => ':attribute musí být unikátní.', + 'uploaded' => 'Nahrávání :attribute se nezdařilo.', + 'url' => 'Formát :attribute je neplatný.', + 'uuid' => ':attribute musí být validní UUID.', + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], +]; diff --git a/resources/lang/es/auth.php b/resources/lang/es/auth.php new file mode 100644 index 00000000..b8452475 --- /dev/null +++ b/resources/lang/es/auth.php @@ -0,0 +1,18 @@ + 'Estas credenciales no coinciden con nuestros registros.', + 'password' => 'La contraseña ingresada no es correcta.', + 'throttle' => 'Demasiados intentos de acceso. Por favor intente nuevamente en :seconds segundos.', +]; diff --git a/resources/lang/es/pagination.php b/resources/lang/es/pagination.php new file mode 100644 index 00000000..d8f0d194 --- /dev/null +++ b/resources/lang/es/pagination.php @@ -0,0 +1,17 @@ + 'Siguiente »', + 'previous' => '« Anterior', +]; diff --git a/resources/lang/es/passwords.php b/resources/lang/es/passwords.php new file mode 100644 index 00000000..7745e646 --- /dev/null +++ b/resources/lang/es/passwords.php @@ -0,0 +1,20 @@ + '¡Su contraseña ha sido restablecida!', + 'sent' => '¡Le hemos enviado por correo electrónico el enlace para restablecer su contraseña!', + 'throttled' => 'Por favor espere antes de intentar de nuevo.', + 'token' => 'El token de restablecimiento de contraseña es inválido.', + 'user' => 'No encontramos ningún usuario con ese correo electrónico.', +]; diff --git a/resources/lang/es/validation.php b/resources/lang/es/validation.php new file mode 100644 index 00000000..cfcd8e77 --- /dev/null +++ b/resources/lang/es/validation.php @@ -0,0 +1,138 @@ + ':attribute debe ser aceptado.', + 'accepted_if' => ':attribute debe ser aceptado cuando :other sea :value.', + 'active_url' => ':attribute no es una URL válida.', + 'after' => ':attribute debe ser una fecha posterior a :date.', + 'after_or_equal' => ':attribute debe ser una fecha posterior o igual a :date.', + 'alpha' => ':attribute sólo debe contener letras.', + 'alpha_dash' => ':attribute sólo debe contener letras, números, guiones y guiones bajos.', + 'alpha_num' => ':attribute sólo debe contener letras y números.', + 'array' => ':attribute debe ser un conjunto.', + 'attached' => 'Este :attribute ya se adjuntó.', + 'before' => ':attribute debe ser una fecha anterior a :date.', + 'before_or_equal' => ':attribute debe ser una fecha anterior o igual a :date.', + 'between' => [ + 'array' => ':attribute tiene que tener entre :min - :max elementos.', + 'file' => ':attribute debe pesar entre :min - :max kilobytes.', + 'numeric' => ':attribute tiene que estar entre :min - :max.', + 'string' => ':attribute tiene que tener entre :min - :max caracteres.', + ], + 'boolean' => 'El campo :attribute debe tener un valor verdadero o falso.', + 'confirmed' => 'La confirmación de :attribute no coincide.', + 'current_password' => 'La contraseña es incorrecta.', + 'date' => ':attribute no es una fecha válida.', + 'date_equals' => ':attribute debe ser una fecha igual a :date.', + 'date_format' => ':attribute no corresponde al formato :format.', + 'declined' => ':attribute debe ser rechazado.', + 'declined_if' => ':attribute debe ser rechazado cuando :other sea :value.', + 'different' => ':attribute y :other deben ser diferentes.', + 'digits' => ':attribute debe tener :digits dígitos.', + 'digits_between' => ':attribute debe tener entre :min y :max dígitos.', + 'dimensions' => 'Las dimensiones de la imagen :attribute no son válidas.', + 'distinct' => 'El campo :attribute contiene un valor duplicado.', + 'email' => ':attribute no es un correo válido.', + 'ends_with' => 'El campo :attribute debe finalizar con uno de los siguientes valores: :values', + 'exists' => ':attribute es inválido.', + 'file' => 'El campo :attribute debe ser un archivo.', + 'filled' => 'El campo :attribute es obligatorio.', + 'gt' => [ + 'array' => 'El campo :attribute debe tener más de :value elementos.', + 'file' => 'El campo :attribute debe tener más de :value kilobytes.', + 'numeric' => 'El campo :attribute debe ser mayor que :value.', + 'string' => 'El campo :attribute debe tener más de :value caracteres.', + ], + 'gte' => [ + 'array' => 'El campo :attribute debe tener como mínimo :value elementos.', + 'file' => 'El campo :attribute debe tener como mínimo :value kilobytes.', + 'numeric' => 'El campo :attribute debe ser como mínimo :value.', + 'string' => 'El campo :attribute debe tener como mínimo :value caracteres.', + ], + 'image' => ':attribute debe ser una imagen.', + 'in' => ':attribute es inválido.', + 'in_array' => 'El campo :attribute no existe en :other.', + 'integer' => ':attribute debe ser un número entero.', + 'ip' => ':attribute debe ser una dirección IP válida.', + 'ipv4' => ':attribute debe ser una dirección IPv4 válida.', + 'ipv6' => ':attribute debe ser una dirección IPv6 válida.', + 'json' => 'El campo :attribute debe ser una cadena JSON válida.', + 'lt' => [ + 'array' => 'El campo :attribute debe tener menos de :value elementos.', + 'file' => 'El campo :attribute debe tener menos de :value kilobytes.', + 'numeric' => 'El campo :attribute debe ser menor que :value.', + 'string' => 'El campo :attribute debe tener menos de :value caracteres.', + ], + 'lte' => [ + 'array' => 'El campo :attribute debe tener como máximo :value elementos.', + 'file' => 'El campo :attribute debe tener como máximo :value kilobytes.', + 'numeric' => 'El campo :attribute debe ser como máximo :value.', + 'string' => 'El campo :attribute debe tener como máximo :value caracteres.', + ], + 'max' => [ + 'array' => ':attribute no debe tener más de :max elementos.', + 'file' => ':attribute no debe ser mayor que :max kilobytes.', + 'numeric' => ':attribute no debe ser mayor que :max.', + 'string' => ':attribute no debe ser mayor que :max caracteres.', + ], + 'mimes' => ':attribute debe ser un archivo con formato: :values.', + 'mimetypes' => ':attribute debe ser un archivo con formato: :values.', + 'min' => [ + 'array' => ':attribute debe tener al menos :min elementos.', + 'file' => 'El tamaño de :attribute debe ser de al menos :min kilobytes.', + 'numeric' => 'El tamaño de :attribute debe ser de al menos :min.', + 'string' => ':attribute debe contener al menos :min caracteres.', + ], + 'multiple_of' => 'El campo :attribute debe ser múltiplo de :value', + 'not_in' => ':attribute es inválido.', + 'not_regex' => 'El formato del campo :attribute no es válido.', + 'numeric' => ':attribute debe ser numérico.', + 'password' => 'La contraseña es incorrecta.', + 'present' => 'El campo :attribute debe estar presente.', + 'prohibited' => 'El campo :attribute está prohibido.', + 'prohibited_if' => 'El campo :attribute está prohibido cuando :other es :value.', + 'prohibited_unless' => 'El campo :attribute está prohibido a menos que :other sea :values.', + 'prohibits' => 'El campo :attribute prohibe que :other esté presente.', + 'regex' => 'El formato de :attribute es inválido.', + 'relatable' => 'Este :attribute no se puede asociar con este recurso', + 'required' => 'El campo :attribute es obligatorio.', + 'required_if' => 'El campo :attribute es obligatorio cuando :other es :value.', + 'required_unless' => 'El campo :attribute es obligatorio a menos que :other esté en :values.', + 'required_with' => 'El campo :attribute es obligatorio cuando :values está presente.', + 'required_with_all' => 'El campo :attribute es obligatorio cuando :values están presentes.', + 'required_without' => 'El campo :attribute es obligatorio cuando :values no está presente.', + 'required_without_all' => 'El campo :attribute es obligatorio cuando ninguno de :values está presente.', + 'same' => ':attribute y :other deben coincidir.', + 'size' => [ + 'array' => ':attribute debe contener :size elementos.', + 'file' => 'El tamaño de :attribute debe ser :size kilobytes.', + 'numeric' => 'El tamaño de :attribute debe ser :size.', + 'string' => ':attribute debe contener :size caracteres.', + ], + 'starts_with' => 'El campo :attribute debe comenzar con uno de los siguientes valores: :values', + 'string' => 'El campo :attribute debe ser una cadena de caracteres.', + 'timezone' => ':Attribute debe ser una zona horaria válida.', + 'unique' => 'El campo :attribute ya ha sido registrado.', + 'uploaded' => 'Subir :attribute ha fallado.', + 'url' => ':Attribute debe ser una URL válida.', + 'uuid' => 'El campo :attribute debe ser un UUID válido.', + 'custom' => [ + 'email' => [ + 'unique' => 'El :attribute ya ha sido registrado.', + ], + 'password' => [ + 'min' => 'La :attribute debe contener más de :min caracteres', + ], + ], +]; diff --git a/resources/lang/fr/auth.php b/resources/lang/fr/auth.php new file mode 100644 index 00000000..e808c61b --- /dev/null +++ b/resources/lang/fr/auth.php @@ -0,0 +1,18 @@ + 'Ces identifiants ne correspondent pas à nos enregistrements.', + 'password' => 'Le mot de passe fourni est incorrect.', + 'throttle' => 'Tentatives de connexion trop nombreuses. Veuillez essayer de nouveau dans :seconds secondes.', +]; diff --git a/resources/lang/fr/pagination.php b/resources/lang/fr/pagination.php new file mode 100644 index 00000000..efa11ec1 --- /dev/null +++ b/resources/lang/fr/pagination.php @@ -0,0 +1,17 @@ + 'Suivant »', + 'previous' => '« Précédent', +]; diff --git a/resources/lang/fr/passwords.php b/resources/lang/fr/passwords.php new file mode 100644 index 00000000..dd068186 --- /dev/null +++ b/resources/lang/fr/passwords.php @@ -0,0 +1,20 @@ + 'Votre mot de passe a été réinitialisé !', + 'sent' => 'Nous vous avons envoyé par email le lien de réinitialisation du mot de passe !', + 'throttled' => 'Veuillez patienter avant de réessayer.', + 'token' => 'Ce jeton de réinitialisation du mot de passe n\'est pas valide.', + 'user' => 'Aucun utilisateur n\'a été trouvé avec cette adresse email.', +]; diff --git a/resources/lang/fr/validation.php b/resources/lang/fr/validation.php new file mode 100644 index 00000000..3dde6837 --- /dev/null +++ b/resources/lang/fr/validation.php @@ -0,0 +1,135 @@ + 'Le champ :attribute doit être accepté.', + 'accepted_if' => 'Le champ :attribute doit être accepté quand :other a la valeur :value.', + 'active_url' => 'Le champ :attribute n\'est pas une URL valide.', + 'after' => 'Le champ :attribute doit être une date postérieure au :date.', + 'after_or_equal' => 'Le champ :attribute doit être une date postérieure ou égale au :date.', + 'alpha' => 'Le champ :attribute doit contenir uniquement des lettres.', + 'alpha_dash' => 'Le champ :attribute doit contenir uniquement des lettres, des chiffres et des tirets.', + 'alpha_num' => 'Le champ :attribute doit contenir uniquement des chiffres et des lettres.', + 'array' => 'Le champ :attribute doit être un tableau.', + 'attached' => ':attribute est déjà attaché(e).', + 'before' => 'Le champ :attribute doit être une date antérieure au :date.', + 'before_or_equal' => 'Le champ :attribute doit être une date antérieure ou égale au :date.', + 'between' => [ + 'array' => 'Le tableau :attribute doit contenir entre :min et :max éléments.', + 'file' => 'La taille du fichier de :attribute doit être comprise entre :min et :max kilo-octets.', + 'numeric' => 'La valeur de :attribute doit être comprise entre :min et :max.', + 'string' => 'Le texte :attribute doit contenir entre :min et :max caractères.', + ], + 'boolean' => 'Le champ :attribute doit être vrai ou faux.', + 'confirmed' => 'Le champ de confirmation :attribute ne correspond pas.', + 'current_password' => 'Le mot de passe est incorrect.', + 'date' => 'Le champ :attribute n\'est pas une date valide.', + 'date_equals' => 'Le champ :attribute doit être une date égale à :date.', + 'date_format' => 'Le champ :attribute ne correspond pas au format :format.', + 'declined' => 'Le champ :attribute doit être décliné.', + 'declined_if' => 'Le champ :attribute doit être décliné quand :other a la valeur :value.', + 'different' => 'Les champs :attribute et :other doivent être différents.', + 'digits' => 'Le champ :attribute doit contenir :digits chiffres.', + 'digits_between' => 'Le champ :attribute doit contenir entre :min et :max chiffres.', + 'dimensions' => 'La taille de l\'image :attribute n\'est pas conforme.', + 'distinct' => 'Le champ :attribute a une valeur en double.', + 'email' => 'Le champ :attribute doit être une adresse e-mail valide.', + 'ends_with' => 'Le champ :attribute doit se terminer par une des valeurs suivantes : :values', + 'exists' => 'Le champ :attribute sélectionné est invalide.', + 'file' => 'Le champ :attribute doit être un fichier.', + 'filled' => 'Le champ :attribute doit avoir une valeur.', + 'gt' => [ + 'array' => 'Le tableau :attribute doit contenir plus de :value éléments.', + 'file' => 'La taille du fichier de :attribute doit être supérieure à :value kilo-octets.', + 'numeric' => 'La valeur de :attribute doit être supérieure à :value.', + 'string' => 'Le texte :attribute doit contenir plus de :value caractères.', + ], + 'gte' => [ + 'array' => 'Le tableau :attribute doit contenir au moins :value éléments.', + 'file' => 'La taille du fichier de :attribute doit être supérieure ou égale à :value kilo-octets.', + 'numeric' => 'La valeur de :attribute doit être supérieure ou égale à :value.', + 'string' => 'Le texte :attribute doit contenir au moins :value caractères.', + ], + 'image' => 'Le champ :attribute doit être une image.', + 'in' => 'Le champ :attribute est invalide.', + 'in_array' => 'Le champ :attribute n\'existe pas dans :other.', + 'integer' => 'Le champ :attribute doit être un entier.', + 'ip' => 'Le champ :attribute doit être une adresse IP valide.', + 'ipv4' => 'Le champ :attribute doit être une adresse IPv4 valide.', + 'ipv6' => 'Le champ :attribute doit être une adresse IPv6 valide.', + 'json' => 'Le champ :attribute doit être un document JSON valide.', + 'lt' => [ + 'array' => 'Le tableau :attribute doit contenir moins de :value éléments.', + 'file' => 'La taille du fichier de :attribute doit être inférieure à :value kilo-octets.', + 'numeric' => 'La valeur de :attribute doit être inférieure à :value.', + 'string' => 'Le texte :attribute doit contenir moins de :value caractères.', + ], + 'lte' => [ + 'array' => 'Le tableau :attribute doit contenir au plus :value éléments.', + 'file' => 'La taille du fichier de :attribute doit être inférieure ou égale à :value kilo-octets.', + 'numeric' => 'La valeur de :attribute doit être inférieure ou égale à :value.', + 'string' => 'Le texte :attribute doit contenir au plus :value caractères.', + ], + 'max' => [ + 'array' => 'Le tableau :attribute ne peut contenir plus de :max éléments.', + 'file' => 'La taille du fichier de :attribute ne peut pas dépasser :max kilo-octets.', + 'numeric' => 'La valeur de :attribute ne peut être supérieure à :max.', + 'string' => 'Le texte de :attribute ne peut contenir plus de :max caractères.', + ], + 'mimes' => 'Le champ :attribute doit être un fichier de type : :values.', + 'mimetypes' => 'Le champ :attribute doit être un fichier de type : :values.', + 'min' => [ + 'array' => 'Le tableau :attribute doit contenir au moins :min éléments.', + 'file' => 'La taille du fichier de :attribute doit être supérieure à :min kilo-octets.', + 'numeric' => 'La valeur de :attribute doit être supérieure ou égale à :min.', + 'string' => 'Le texte :attribute doit contenir au moins :min caractères.', + ], + 'multiple_of' => 'La valeur de :attribute doit être un multiple de :value', + 'not_in' => 'Le champ :attribute sélectionné n\'est pas valide.', + 'not_regex' => 'Le format du champ :attribute n\'est pas valide.', + 'numeric' => 'Le champ :attribute doit contenir un nombre.', + 'password' => 'Le mot de passe est incorrect', + 'present' => 'Le champ :attribute doit être présent.', + 'prohibited' => 'Le champ :attribute est interdit.', + 'prohibited_if' => 'Le champ :attribute est interdit quand :other a la valeur :value.', + 'prohibited_unless' => 'Le champ :attribute est interdit à moins que :other est l\'une des valeurs :values.', + 'prohibits' => 'Le champ :attribute interdit :other d\'être présent.', + 'regex' => 'Le format du champ :attribute est invalide.', + 'relatable' => ':attribute n\'est sans doute pas associé(e) avec cette donnée.', + 'required' => 'Le champ :attribute est obligatoire.', + 'required_if' => 'Le champ :attribute est obligatoire quand la valeur de :other est :value.', + 'required_unless' => 'Le champ :attribute est obligatoire sauf si :other est :values.', + 'required_with' => 'Le champ :attribute est obligatoire quand :values est présent.', + 'required_with_all' => 'Le champ :attribute est obligatoire quand :values sont présents.', + 'required_without' => 'Le champ :attribute est obligatoire quand :values n\'est pas présent.', + 'required_without_all' => 'Le champ :attribute est requis quand aucun de :values n\'est présent.', + 'same' => 'Les champs :attribute et :other doivent être identiques.', + 'size' => [ + 'array' => 'Le tableau :attribute doit contenir :size éléments.', + 'file' => 'La taille du fichier de :attribute doit être de :size kilo-octets.', + 'numeric' => 'La valeur de :attribute doit être :size.', + 'string' => 'Le texte de :attribute doit contenir :size caractères.', + ], + 'starts_with' => 'Le champ :attribute doit commencer avec une des valeurs suivantes : :values', + 'string' => 'Le champ :attribute doit être une chaîne de caractères.', + 'timezone' => 'Le champ :attribute doit être un fuseau horaire valide.', + 'unique' => 'La valeur du champ :attribute est déjà utilisée.', + 'uploaded' => 'Le fichier du champ :attribute n\'a pu être téléversé.', + 'url' => 'Le format de l\'URL de :attribute n\'est pas valide.', + 'uuid' => 'Le champ :attribute doit être un UUID valide', + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], +]; diff --git a/resources/lang/it/auth.php b/resources/lang/it/auth.php new file mode 100644 index 00000000..ff58e131 --- /dev/null +++ b/resources/lang/it/auth.php @@ -0,0 +1,18 @@ + 'Credenziali non valide.', + 'password' => 'La password non è valida.', + 'throttle' => 'Troppi tentativi di accesso. Riprova tra :seconds secondi.', +]; diff --git a/resources/lang/it/pagination.php b/resources/lang/it/pagination.php new file mode 100644 index 00000000..371ac01a --- /dev/null +++ b/resources/lang/it/pagination.php @@ -0,0 +1,17 @@ + 'Successivo »', + 'previous' => '« Precedente', +]; diff --git a/resources/lang/it/passwords.php b/resources/lang/it/passwords.php new file mode 100644 index 00000000..4aa5b412 --- /dev/null +++ b/resources/lang/it/passwords.php @@ -0,0 +1,20 @@ + 'La password è stata reimpostata!', + 'sent' => 'Ti abbiamo inviato una email con il link per il reset della password!', + 'throttled' => 'Per favore, attendi prima di riprovare.', + 'token' => 'Questo token di reset della password non è valido.', + 'user' => 'Non riusciamo a trovare un utente con questo indirizzo email.', +]; diff --git a/resources/lang/it/validation.php b/resources/lang/it/validation.php new file mode 100644 index 00000000..22c4e085 --- /dev/null +++ b/resources/lang/it/validation.php @@ -0,0 +1,135 @@ + ':attribute deve essere accettato.', + 'accepted_if' => ':attribute deve essere accettato quando :other è :value.', + 'active_url' => ':attribute non è un URL valido.', + 'after' => ':attribute deve essere una data successiva al :date.', + 'after_or_equal' => ':attribute deve essere una data successiva o uguale al :date.', + 'alpha' => ':attribute può contenere solo lettere.', + 'alpha_dash' => ':attribute può contenere solo lettere, numeri e trattini.', + 'alpha_num' => ':attribute può contenere solo lettere e numeri.', + 'array' => ':attribute deve essere un array.', + 'attached' => ':attribute è già associato.', + 'before' => ':attribute deve essere una data precedente al :date.', + 'before_or_equal' => ':attribute deve essere una data precedente o uguale al :date.', + 'between' => [ + 'array' => ':attribute deve avere tra :min - :max elementi.', + 'file' => ':attribute deve trovarsi tra :min - :max kilobyte.', + 'numeric' => ':attribute deve trovarsi tra :min - :max.', + 'string' => ':attribute deve trovarsi tra :min - :max caratteri.', + ], + 'boolean' => 'Il campo :attribute deve essere vero o falso.', + 'confirmed' => 'Il campo di conferma per :attribute non coincide.', + 'current_password' => 'Password non valida.', + 'date' => ':attribute non è una data valida.', + 'date_equals' => ':attribute deve essere una data e uguale a :date.', + 'date_format' => ':attribute non coincide con il formato :format.', + 'declined' => ':attribute deve essere rifiutato.', + 'declined_if' => ':attribute deve essere rifiutato quando :other è :value.', + 'different' => ':attribute e :other devono essere differenti.', + 'digits' => ':attribute deve essere di :digits cifre.', + 'digits_between' => ':attribute deve essere tra :min e :max cifre.', + 'dimensions' => 'Le dimensioni dell\'immagine di :attribute non sono valide.', + 'distinct' => ':attribute contiene un valore duplicato.', + 'email' => ':attribute non è valido.', + 'ends_with' => ':attribute deve finire con uno dei seguenti valori: :values', + 'exists' => ':attribute selezionato non è valido.', + 'file' => ':attribute deve essere un file.', + 'filled' => 'Il campo :attribute deve contenere un valore.', + 'gt' => [ + 'array' => ':attribute deve contenere più di :value elementi.', + 'file' => ':attribute deve essere maggiore di :value kilobyte.', + 'numeric' => ':attribute deve essere maggiore di :value.', + 'string' => ':attribute deve contenere più di :value caratteri.', + ], + 'gte' => [ + 'array' => ':attribute deve contenere un numero di elementi uguale o maggiore di :value.', + 'file' => ':attribute deve essere uguale o maggiore di :value kilobyte.', + 'numeric' => ':attribute deve essere uguale o maggiore di :value.', + 'string' => ':attribute deve contenere un numero di caratteri uguale o maggiore di :value.', + ], + 'image' => ':attribute deve essere un\'immagine.', + 'in' => ':attribute selezionato non è valido.', + 'in_array' => 'Il valore del campo :attribute non esiste in :other.', + 'integer' => ':attribute deve essere un numero intero.', + 'ip' => ':attribute deve essere un indirizzo IP valido.', + 'ipv4' => ':attribute deve essere un indirizzo IPv4 valido.', + 'ipv6' => ':attribute deve essere un indirizzo IPv6 valido.', + 'json' => ':attribute deve essere una stringa JSON valida.', + 'lt' => [ + 'array' => ':attribute deve contenere meno di :value elementi.', + 'file' => ':attribute deve essere minore di :value kilobyte.', + 'numeric' => ':attribute deve essere minore di :value.', + 'string' => ':attribute deve contenere meno di :value caratteri.', + ], + 'lte' => [ + 'array' => ':attribute deve contenere un numero di elementi minore o uguale a :value.', + 'file' => ':attribute deve essere minore o uguale a :value kilobyte.', + 'numeric' => ':attribute deve essere minore o uguale a :value.', + 'string' => ':attribute deve contenere un numero di caratteri minore o uguale a :value.', + ], + 'max' => [ + 'array' => ':attribute non può avere più di :max elementi.', + 'file' => ':attribute non può essere superiore a :max kilobyte.', + 'numeric' => ':attribute non può essere superiore a :max.', + 'string' => ':attribute non può contenere più di :max caratteri.', + ], + 'mimes' => ':attribute deve essere del tipo: :values.', + 'mimetypes' => ':attribute deve essere del tipo: :values.', + 'min' => [ + 'array' => ':attribute deve avere almeno :min elementi.', + 'file' => ':attribute deve essere almeno di :min kilobyte.', + 'numeric' => ':attribute deve essere almeno :min.', + 'string' => ':attribute deve contenere almeno :min caratteri.', + ], + 'multiple_of' => ':attribute deve essere un multiplo di :value', + 'not_in' => 'Il valore selezionato per :attribute non è valido.', + 'not_regex' => 'Il formato di :attribute non è valido.', + 'numeric' => ':attribute deve essere un numero.', + 'password' => 'Il campo :attribute non è corretto.', + 'present' => 'Il campo :attribute deve essere presente.', + 'prohibited' => ':attribute non consentito.', + 'prohibited_if' => ':attribute non consentito quando :other è :value.', + 'prohibited_unless' => ':attribute non consentito a meno che :other sia contenuto in :values.', + 'prohibits' => ':attribute impedisce a :other di essere presente.', + 'regex' => 'Il formato del campo :attribute non è valido.', + 'relatable' => ':attribute non può essere associato a questa risorsa.', + 'required' => 'Il campo :attribute è richiesto.', + 'required_if' => 'Il campo :attribute è richiesto quando :other è :value.', + 'required_unless' => 'Il campo :attribute è richiesto a meno che :other sia in :values.', + 'required_with' => 'Il campo :attribute è richiesto quando :values è presente.', + 'required_with_all' => 'Il campo :attribute è richiesto quando :values sono presenti.', + 'required_without' => 'Il campo :attribute è richiesto quando :values non è presente.', + 'required_without_all' => 'Il campo :attribute è richiesto quando nessuno di :values è presente.', + 'same' => ':attribute e :other devono coincidere.', + 'size' => [ + 'array' => ':attribute deve contenere :size elementi.', + 'file' => ':attribute deve essere :size kilobyte.', + 'numeric' => ':attribute deve essere :size.', + 'string' => ':attribute deve contenere :size caratteri.', + ], + 'starts_with' => ':attribute deve iniziare con uno dei seguenti: :values', + 'string' => ':attribute deve essere una stringa.', + 'timezone' => ':attribute deve essere una zona valida.', + 'unique' => ':attribute è stato già utilizzato.', + 'uploaded' => ':attribute non è stato caricato.', + 'url' => 'Il formato del campo :attribute non è valido.', + 'uuid' => ':attribute deve essere un UUID valido.', + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], +]; diff --git a/resources/lang/nl/auth.php b/resources/lang/nl/auth.php new file mode 100644 index 00000000..062343fb --- /dev/null +++ b/resources/lang/nl/auth.php @@ -0,0 +1,18 @@ + 'Deze combinatie van e-mailadres en wachtwoord is niet geldig.', + 'password' => 'Het opgegeven wachtwoord is onjuist.', + 'throttle' => 'Te veel mislukte loginpogingen. Probeer het over :seconds seconden nogmaals.', +]; diff --git a/resources/lang/nl/pagination.php b/resources/lang/nl/pagination.php new file mode 100644 index 00000000..1381d2b7 --- /dev/null +++ b/resources/lang/nl/pagination.php @@ -0,0 +1,17 @@ + 'Volgende »', + 'previous' => '« Vorige', +]; diff --git a/resources/lang/nl/passwords.php b/resources/lang/nl/passwords.php new file mode 100644 index 00000000..c9a7a843 --- /dev/null +++ b/resources/lang/nl/passwords.php @@ -0,0 +1,20 @@ + 'Het wachtwoord van uw account is gewijzigd.', + 'sent' => 'We hebben een e-mail verstuurd met instructies om een nieuw wachtwoord in te stellen.', + 'throttled' => 'Gelieve even te wachten voor u het opnieuw probeert.', + 'token' => 'Dit wachtwoordhersteltoken is niet geldig.', + 'user' => 'Geen gebruiker bekend met het e-mailadres.', +]; diff --git a/resources/lang/nl/validation.php b/resources/lang/nl/validation.php new file mode 100644 index 00000000..715e57c1 --- /dev/null +++ b/resources/lang/nl/validation.php @@ -0,0 +1,135 @@ + ':Attribute moet geaccepteerd zijn.', + 'accepted_if' => ':Attribute moet worden geaccepteerd als :other :value is.', + 'active_url' => ':Attribute is geen geldige URL.', + 'after' => ':Attribute moet een datum na :date zijn.', + 'after_or_equal' => ':Attribute moet een datum na of gelijk aan :date zijn.', + 'alpha' => ':Attribute mag alleen letters bevatten.', + 'alpha_dash' => ':Attribute mag alleen letters, nummers, underscores (_) en streepjes (-) bevatten.', + 'alpha_num' => ':Attribute mag alleen letters en nummers bevatten.', + 'array' => ':Attribute moet geselecteerde elementen bevatten.', + 'attached' => ':Attribute is reeds gekoppeld.', + 'before' => ':Attribute moet een datum voor :date zijn.', + 'before_or_equal' => ':Attribute moet een datum voor of gelijk aan :date zijn.', + 'between' => [ + 'array' => ':Attribute moet tussen :min en :max items bevatten.', + 'file' => ':Attribute moet tussen :min en :max kilobytes zijn.', + 'numeric' => ':Attribute moet tussen :min en :max zijn.', + 'string' => ':Attribute moet tussen :min en :max karakters zijn.', + ], + 'boolean' => ':Attribute moet ja of nee zijn.', + 'confirmed' => ':Attribute bevestiging komt niet overeen.', + 'current_password' => 'Huidig wachtwoord is onjuist.', + 'date' => ':Attribute moet een datum bevatten.', + 'date_equals' => ':Attribute moet een datum gelijk aan :date zijn.', + 'date_format' => ':Attribute moet een geldig datum formaat bevatten.', + 'declined' => ':attribute moet afgewezen worden.', + 'declined_if' => ':attribute moet afgewezen worden wanneer :other gelijk is aan :value.', + 'different' => ':Attribute en :other moeten verschillend zijn.', + 'digits' => ':Attribute moet bestaan uit :digits cijfers.', + 'digits_between' => ':Attribute moet bestaan uit minimaal :min en maximaal :max cijfers.', + 'dimensions' => ':Attribute heeft geen geldige afmetingen voor afbeeldingen.', + 'distinct' => ':Attribute heeft een dubbele waarde.', + 'email' => ':Attribute is geen geldig e-mailadres.', + 'ends_with' => ':Attribute moet met één van de volgende waarden eindigen: :values.', + 'exists' => ':Attribute bestaat niet.', + 'file' => ':Attribute moet een bestand zijn.', + 'filled' => ':Attribute is verplicht.', + 'gt' => [ + 'array' => 'De :attribute moet meer dan :value waardes bevatten.', + 'file' => 'De :attribute moet groter zijn dan :value kilobytes.', + 'numeric' => 'De :attribute moet groter zijn dan :value.', + 'string' => 'De :attribute moet meer dan :value tekens bevatten.', + ], + 'gte' => [ + 'array' => 'De :attribute moet :value waardes of meer bevatten.', + 'file' => 'De :attribute moet groter of gelijk zijn aan :value kilobytes.', + 'numeric' => 'De :attribute moet groter of gelijk zijn aan :value.', + 'string' => 'De :attribute moet minimaal :value tekens bevatten.', + ], + 'image' => ':Attribute moet een afbeelding zijn.', + 'in' => ':Attribute is ongeldig.', + 'in_array' => ':Attribute bestaat niet in :other.', + 'integer' => ':Attribute moet een getal zijn.', + 'ip' => ':Attribute moet een geldig IP-adres zijn.', + 'ipv4' => ':Attribute moet een geldig IPv4-adres zijn.', + 'ipv6' => ':Attribute moet een geldig IPv6-adres zijn.', + 'json' => ':Attribute moet een geldige JSON-string zijn.', + 'lt' => [ + 'array' => 'De :attribute moet minder dan :value waardes bevatten.', + 'file' => 'De :attribute moet kleiner zijn dan :value kilobytes.', + 'numeric' => 'De :attribute moet kleiner zijn dan :value.', + 'string' => 'De :attribute moet minder dan :value tekens bevatten.', + ], + 'lte' => [ + 'array' => 'De :attribute moet :value waardes of minder bevatten.', + 'file' => 'De :attribute moet kleiner of gelijk zijn aan :value kilobytes.', + 'numeric' => 'De :attribute moet kleiner of gelijk zijn aan :value.', + 'string' => 'De :attribute moet maximaal :value tekens bevatten.', + ], + 'max' => [ + 'array' => ':Attribute mag niet meer dan :max items bevatten.', + 'file' => ':Attribute mag niet meer dan :max kilobytes zijn.', + 'numeric' => ':Attribute mag niet hoger dan :max zijn.', + 'string' => ':Attribute mag niet uit meer dan :max tekens bestaan.', + ], + 'mimes' => ':Attribute moet een bestand zijn van het bestandstype :values.', + 'mimetypes' => ':Attribute moet een bestand zijn van het bestandstype :values.', + 'min' => [ + 'array' => ':Attribute moet minimaal :min items bevatten.', + 'file' => ':Attribute moet minimaal :min kilobytes zijn.', + 'numeric' => ':Attribute moet minimaal :min zijn.', + 'string' => ':Attribute moet minimaal :min tekens zijn.', + ], + 'multiple_of' => ':Attribute moet een veelvoud van :value zijn.', + 'not_in' => 'Het formaat van :attribute is ongeldig.', + 'not_regex' => 'De :attribute formaat is ongeldig.', + 'numeric' => ':Attribute moet een nummer zijn.', + 'password' => 'Wachtwoord is onjuist.', + 'present' => ':Attribute moet bestaan.', + 'prohibited' => ':Attribute veld is verboden.', + 'prohibited_if' => ':Attribute veld is verboden indien :other gelijk is aan :value.', + 'prohibited_unless' => ':Attribute veld is verboden tenzij :other gelijk is aan :values.', + 'prohibits' => 'Het veld :attribute verbiedt de aanwezigheid van :other.', + 'regex' => ':Attribute formaat is ongeldig.', + 'relatable' => ':Attribute mag niet gekoppeld worden aan deze bron.', + 'required' => ':Attribute is verplicht.', + 'required_if' => ':Attribute is verplicht indien :other gelijk is aan :value.', + 'required_unless' => ':Attribute is verplicht tenzij :other gelijk is aan :values.', + 'required_with' => ':Attribute is verplicht i.c.m. :values', + 'required_with_all' => ':Attribute is verplicht i.c.m. :values', + 'required_without' => ':Attribute is verplicht als :values niet ingevuld is.', + 'required_without_all' => ':Attribute is verplicht als :values niet ingevuld zijn.', + 'same' => ':Attribute en :other moeten overeenkomen.', + 'size' => [ + 'array' => ':Attribute moet :size items bevatten.', + 'file' => ':Attribute moet :size kilobyte zijn.', + 'numeric' => ':Attribute moet :size zijn.', + 'string' => ':Attribute moet :size tekens zijn.', + ], + 'starts_with' => ':Attribute moet starten met een van de volgende: :values.', + 'string' => ':Attribute moet een tekst zijn.', + 'timezone' => ':Attribute moet een geldige tijdzone zijn.', + 'unique' => ':Attribute is al in gebruik.', + 'uploaded' => 'Het uploaden van :attribute is mislukt.', + 'url' => ':Attribute moet een geldig URL zijn.', + 'uuid' => ':Attribute moet een geldig UUID zijn.', + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], +]; diff --git a/resources/lang/pl/auth.php b/resources/lang/pl/auth.php new file mode 100644 index 00000000..162be3c3 --- /dev/null +++ b/resources/lang/pl/auth.php @@ -0,0 +1,18 @@ + 'Błędny login lub hasło.', + 'password' => 'Podane hasło jest nieprawidłowe.', + 'throttle' => 'Za dużo nieudanych prób logowania. Proszę spróbować za :seconds sekund.', +]; diff --git a/resources/lang/pl/pagination.php b/resources/lang/pl/pagination.php new file mode 100644 index 00000000..831b8ff6 --- /dev/null +++ b/resources/lang/pl/pagination.php @@ -0,0 +1,17 @@ + 'Następna »', + 'previous' => '« Poprzednia', +]; diff --git a/resources/lang/pl/passwords.php b/resources/lang/pl/passwords.php new file mode 100644 index 00000000..3ea9171e --- /dev/null +++ b/resources/lang/pl/passwords.php @@ -0,0 +1,20 @@ + 'Hasło zostało zresetowane!', + 'sent' => 'Przypomnienie hasła zostało wysłane!', + 'throttled' => 'Proszę zaczekać zanim spróbujesz ponownie.', + 'token' => 'Token resetowania hasła jest nieprawidłowy.', + 'user' => 'Nie znaleziono użytkownika z takim adresem e-mail.', +]; diff --git a/resources/lang/pl/validation.php b/resources/lang/pl/validation.php new file mode 100644 index 00000000..cb47d24e --- /dev/null +++ b/resources/lang/pl/validation.php @@ -0,0 +1,135 @@ + 'Pole :attribute musi zostać zaakceptowane.', + 'accepted_if' => 'Pole :attribute musi zostać zaakceptowane gdy :other ma wartość :value.', + 'active_url' => 'Pole :attribute jest nieprawidłowym adresem URL.', + 'after' => 'Pole :attribute musi być datą późniejszą od :date.', + 'after_or_equal' => 'Pole :attribute musi być datą nie wcześniejszą niż :date.', + 'alpha' => 'Pole :attribute może zawierać jedynie litery.', + 'alpha_dash' => 'Pole :attribute może zawierać jedynie litery, cyfry i myślniki.', + 'alpha_num' => 'Pole :attribute może zawierać jedynie litery i cyfry.', + 'array' => 'Pole :attribute musi być tablicą.', + 'attached' => 'Ten :attribute jest już dołączony.', + 'before' => 'Pole :attribute musi być datą wcześniejszą od :date.', + 'before_or_equal' => 'Pole :attribute musi być datą nie późniejszą niż :date.', + 'between' => [ + 'array' => 'Pole :attribute musi składać się z :min - :max elementów.', + 'file' => 'Pole :attribute musi zawierać się w granicach :min - :max kilobajtów.', + 'numeric' => 'Pole :attribute musi zawierać się w granicach :min - :max.', + 'string' => 'Pole :attribute musi zawierać się w granicach :min - :max znaków.', + ], + 'boolean' => 'Pole :attribute musi mieć wartość logiczną prawda albo fałsz.', + 'confirmed' => 'Potwierdzenie pola :attribute nie zgadza się.', + 'current_password' => 'Hasło jest nieprawidłowe.', + 'date' => 'Pole :attribute nie jest prawidłową datą.', + 'date_equals' => 'Pole :attribute musi być datą równą :date.', + 'date_format' => 'Pole :attribute nie jest w formacie :format.', + 'declined' => 'Pole :attribute musi zostać odrzucony.', + 'declined_if' => 'Pole :attribute musi zostać odrzucony, gdy :other ma wartość :value.', + 'different' => 'Pole :attribute oraz :other muszą się różnić.', + 'digits' => 'Pole :attribute musi składać się z :digits cyfr.', + 'digits_between' => 'Pole :attribute musi mieć od :min do :max cyfr.', + 'dimensions' => 'Pole :attribute ma niepoprawne wymiary.', + 'distinct' => 'Pole :attribute ma zduplikowane wartości.', + 'email' => 'Pole :attribute nie jest poprawnym adresem e-mail.', + 'ends_with' => 'Pole :attribute musi kończyć się jedną z następujących wartości: :values.', + 'exists' => 'Zaznaczone pole :attribute jest nieprawidłowe.', + 'file' => 'Pole :attribute musi być plikiem.', + 'filled' => 'Pole :attribute nie może być puste.', + 'gt' => [ + 'array' => 'Pole :attribute musi mieć więcej niż :value elementów.', + 'file' => 'Pole :attribute musi być większe niż :value kilobajtów.', + 'numeric' => 'Pole :attribute musi być większe niż :value.', + 'string' => 'Pole :attribute musi być dłuższe niż :value znaków.', + ], + 'gte' => [ + 'array' => 'Pole :attribute musi mieć :value lub więcej elementów.', + 'file' => 'Pole :attribute musi być większe lub równe :value kilobajtów.', + 'numeric' => 'Pole :attribute musi być większe lub równe :value.', + 'string' => 'Pole :attribute musi być dłuższe lub równe :value znaków.', + ], + 'image' => 'Pole :attribute musi być obrazkiem.', + 'in' => 'Zaznaczony element :attribute jest nieprawidłowy.', + 'in_array' => 'Pole :attribute nie znajduje się w :other.', + 'integer' => 'Pole :attribute musi być liczbą całkowitą.', + 'ip' => 'Pole :attribute musi być prawidłowym adresem IP.', + 'ipv4' => 'Pole :attribute musi być prawidłowym adresem IPv4.', + 'ipv6' => 'Pole :attribute musi być prawidłowym adresem IPv6.', + 'json' => 'Pole :attribute musi być poprawnym ciągiem znaków JSON.', + 'lt' => [ + 'array' => 'Pole :attribute musi mieć mniej niż :value elementów.', + 'file' => 'Pole :attribute musi być mniejsze niż :value kilobajtów.', + 'numeric' => 'Pole :attribute musi być mniejsze niż :value.', + 'string' => 'Pole :attribute musi być krótsze niż :value znaków.', + ], + 'lte' => [ + 'array' => 'Pole :attribute musi mieć :value lub mniej elementów.', + 'file' => 'Pole :attribute musi być mniejsze lub równe :value kilobajtów.', + 'numeric' => 'Pole :attribute musi być mniejsze lub równe :value.', + 'string' => 'Pole :attribute musi być krótsze lub równe :value znaków.', + ], + 'max' => [ + 'array' => 'Pole :attribute nie może mieć więcej niż :max elementów.', + 'file' => 'Pole :attribute nie może być większe niż :max kilobajtów.', + 'numeric' => 'Pole :attribute nie może być większe niż :max.', + 'string' => 'Pole :attribute nie może być dłuższe niż :max znaków.', + ], + 'mimes' => 'Pole :attribute musi być plikiem typu :values.', + 'mimetypes' => 'Pole :attribute musi być plikiem typu :values.', + 'min' => [ + 'array' => 'Pole :attribute musi mieć przynajmniej :min elementów.', + 'file' => 'Pole :attribute musi mieć przynajmniej :min kilobajtów.', + 'numeric' => 'Pole :attribute musi być nie mniejsze od :min.', + 'string' => 'Pole :attribute musi mieć przynajmniej :min znaków.', + ], + 'multiple_of' => 'Pole :attribute musi być wielokrotnością wartości :value', + 'not_in' => 'Zaznaczony :attribute jest nieprawidłowy.', + 'not_regex' => 'Format pola :attribute jest nieprawidłowy.', + 'numeric' => 'Pole :attribute musi być liczbą.', + 'password' => 'Hasło jest nieprawidłowe.', + 'present' => 'Pole :attribute musi być obecne.', + 'prohibited' => 'Pole :attribute jest zabronione.', + 'prohibited_if' => 'Pole :attribute jest zabronione, gdy :other to :value.', + 'prohibited_unless' => 'Pole :attribute jest zabronione, chyba że :other jest w :values.', + 'prohibits' => 'Pole :attribute zabrania obecności :other.', + 'regex' => 'Format pola :attribute jest nieprawidłowy.', + 'relatable' => 'Ten :attribute może nie być powiązany z tym zasobem.', + 'required' => 'Pole :attribute jest wymagane.', + 'required_if' => 'Pole :attribute jest wymagane gdy :other ma wartość :value.', + 'required_unless' => 'Pole :attribute jest wymagane jeżeli :other nie znajduje się w :values.', + 'required_with' => 'Pole :attribute jest wymagane gdy :values jest obecny.', + 'required_with_all' => 'Pole :attribute jest wymagane gdy wszystkie :values są obecne.', + 'required_without' => 'Pole :attribute jest wymagane gdy :values nie jest obecny.', + 'required_without_all' => 'Pole :attribute jest wymagane gdy żadne z :values nie są obecne.', + 'same' => 'Pole :attribute i :other muszą być takie same.', + 'size' => [ + 'array' => 'Pole :attribute musi zawierać :size elementów.', + 'file' => 'Pole :attribute musi mieć :size kilobajtów.', + 'numeric' => 'Pole :attribute musi mieć :size.', + 'string' => 'Pole :attribute musi mieć :size znaków.', + ], + 'starts_with' => 'Pole :attribute musi zaczynać się jedną z następujących wartości: :values.', + 'string' => 'Pole :attribute musi być ciągiem znaków.', + 'timezone' => 'Pole :attribute musi być prawidłową strefą czasową.', + 'unique' => 'Taki :attribute już występuje.', + 'uploaded' => 'Nie udało się wgrać pliku :attribute.', + 'url' => 'Format pola :attribute jest nieprawidłowy.', + 'uuid' => 'Pole :attribute musi być poprawnym identyfikatorem UUID.', + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], +]; From 53bc9b8051cada69333e857be458ac0403438e27 Mon Sep 17 00:00:00 2001 From: 1Day Date: Wed, 15 Dec 2021 11:10:27 +0100 Subject: [PATCH 67/77] remove translation manager --- composer.json | 1 - composer.lock | 792 ------------------------------------------------- config/app.php | 1 - 3 files changed, 794 deletions(-) diff --git a/composer.json b/composer.json index adee2497..0c47b586 100644 --- a/composer.json +++ b/composer.json @@ -30,7 +30,6 @@ }, "require-dev": { "barryvdh/laravel-debugbar": "^3.6", - "barryvdh/laravel-translation-manager": "^0.5.10", "facade/ignition": "^2.5", "fakerphp/faker": "^1.9.1", "laravel/sail": "^1.0.1", diff --git a/composer.lock b/composer.lock index 08e79a9d..59eecaf3 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,6 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "51c5797dc1629fe1f42b1fdc91c6e5d8", "packages": [ { @@ -6621,65 +6620,6 @@ ], "time": "2021-10-21T10:57:31+00:00" }, - { - "name": "barryvdh/laravel-translation-manager", - "version": "v0.5.10", - "source": { - "type": "git", - "url": "https://github.com/barryvdh/laravel-translation-manager.git", - "reference": "18ed550eb74f9e61d2fc72d06dfa576296d0d5cb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-translation-manager/zipball/18ed550eb74f9e61d2fc72d06dfa576296d0d5cb", - "reference": "18ed550eb74f9e61d2fc72d06dfa576296d0d5cb", - "shasum": "" - }, - "require": { - "illuminate/support": "^5.5|^6|^7|^8", - "illuminate/translation": "^5.5|^6|^7|^8", - "php": ">=7", - "symfony/finder": "^3|^4|^5", - "tanmuhittin/laravel-google-translate": "^2.0.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "0.5-dev" - }, - "laravel": { - "providers": [ - "Barryvdh\\TranslationManager\\ManagerServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Barryvdh\\TranslationManager\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Barry vd. Heuvel", - "email": "barryvdh@gmail.com" - } - ], - "description": "Manage Laravel Translations", - "keywords": [ - "laravel", - "translations", - "translator" - ], - "support": { - "issues": "https://github.com/barryvdh/laravel-translation-manager/issues", - "source": "https://github.com/barryvdh/laravel-translation-manager/tree/v0.5.10" - }, - "time": "2021-01-25T20:11:29+00:00" - }, { "name": "doctrine/instantiator", "version": "1.4.0", @@ -7080,466 +7020,6 @@ ], "time": "2021-06-04T12:00:00+00:00" }, - { - "name": "firebase/php-jwt", - "version": "v5.5.1", - "source": { - "type": "git", - "url": "https://github.com/firebase/php-jwt.git", - "reference": "83b609028194aa042ea33b5af2d41a7427de80e6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/83b609028194aa042ea33b5af2d41a7427de80e6", - "reference": "83b609028194aa042ea33b5af2d41a7427de80e6", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": ">=4.8 <=9" - }, - "suggest": { - "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" - }, - "type": "library", - "autoload": { - "psr-4": { - "Firebase\\JWT\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Neuman Vong", - "email": "neuman+pear@twilio.com", - "role": "Developer" - }, - { - "name": "Anant Narayanan", - "email": "anant@php.net", - "role": "Developer" - } - ], - "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", - "homepage": "https://github.com/firebase/php-jwt", - "keywords": [ - "jwt", - "php" - ], - "support": { - "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v5.5.1" - }, - "time": "2021-11-08T20:18:51+00:00" - }, - { - "name": "google/auth", - "version": "v1.18.0", - "source": { - "type": "git", - "url": "https://github.com/googleapis/google-auth-library-php.git", - "reference": "21dd478e77b0634ed9e3a68613f74ed250ca9347" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/21dd478e77b0634ed9e3a68613f74ed250ca9347", - "reference": "21dd478e77b0634ed9e3a68613f74ed250ca9347", - "shasum": "" - }, - "require": { - "firebase/php-jwt": "~2.0|~3.0|~4.0|~5.0", - "guzzlehttp/guzzle": "^5.3.1|^6.2.1|^7.0", - "guzzlehttp/psr7": "^1.7|^2.0", - "php": ">=5.4", - "psr/cache": "^1.0|^2.0", - "psr/http-message": "^1.0" - }, - "require-dev": { - "guzzlehttp/promises": "0.1.1|^1.3", - "kelvinmo/simplejwt": "^0.2.5|^0.5.1", - "phpseclib/phpseclib": "^2.0.31", - "phpunit/phpunit": "^4.8.36|^5.7", - "sebastian/comparator": ">=1.2.3" - }, - "suggest": { - "phpseclib/phpseclib": "May be used in place of OpenSSL for signing strings or for token management. Please require version ^2." - }, - "type": "library", - "autoload": { - "psr-4": { - "Google\\Auth\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "description": "Google Auth Library for PHP", - "homepage": "http://github.com/google/google-auth-library-php", - "keywords": [ - "Authentication", - "google", - "oauth2" - ], - "support": { - "docs": "https://googleapis.github.io/google-auth-library-php/master/", - "issues": "https://github.com/googleapis/google-auth-library-php/issues", - "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.18.0" - }, - "time": "2021-08-24T18:03:18+00:00" - }, - { - "name": "google/cloud-core", - "version": "v1.43.1", - "source": { - "type": "git", - "url": "https://github.com/googleapis/google-cloud-php-core.git", - "reference": "60b47793e0c83f0e02a8197ef11ab1f599c348da" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-cloud-php-core/zipball/60b47793e0c83f0e02a8197ef11ab1f599c348da", - "reference": "60b47793e0c83f0e02a8197ef11ab1f599c348da", - "shasum": "" - }, - "require": { - "google/auth": "^1.18", - "guzzlehttp/guzzle": "^5.3|^6.0|^7.0", - "guzzlehttp/promises": "^1.3", - "guzzlehttp/psr7": "^1.7|^2.0", - "monolog/monolog": "^1.1|^2.0", - "php": ">=5.5", - "psr/http-message": "1.0.*", - "rize/uri-template": "~0.3" - }, - "require-dev": { - "erusev/parsedown": "^1.6", - "google/common-protos": "^1.0", - "google/gax": "^1.9", - "opis/closure": "^3", - "phpdocumentor/reflection": "^3.0", - "phpunit/phpunit": "^4.8|^5.0", - "squizlabs/php_codesniffer": "2.*" - }, - "suggest": { - "opis/closure": "May be used to serialize closures to process jobs in the batch daemon. Please require version ^3.", - "symfony/lock": "Required for the Spanner cached based session pool. Please require the following commit: 3.3.x-dev#1ba6ac9" - }, - "bin": [ - "bin/google-cloud-batch" - ], - "type": "library", - "extra": { - "component": { - "id": "cloud-core", - "target": "googleapis/google-cloud-php-core.git", - "path": "Core", - "entry": "src/ServiceBuilder.php" - } - }, - "autoload": { - "psr-4": { - "Google\\Cloud\\Core\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "description": "Google Cloud PHP shared dependency, providing functionality useful to all components.", - "support": { - "source": "https://github.com/googleapis/google-cloud-php-core/tree/v1.43.1" - }, - "time": "2021-10-20T17:52:15+00:00" - }, - { - "name": "google/cloud-translate", - "version": "v1.12.2", - "source": { - "type": "git", - "url": "https://github.com/googleapis/google-cloud-php-translate.git", - "reference": "58b3d2b0abc586035c9272eb8d45dfee0a39562a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-cloud-php-translate/zipball/58b3d2b0abc586035c9272eb8d45dfee0a39562a", - "reference": "58b3d2b0abc586035c9272eb8d45dfee0a39562a", - "shasum": "" - }, - "require": { - "google/cloud-core": "^1.39", - "google/gax": "^1.1" - }, - "require-dev": { - "erusev/parsedown": "^1.6", - "phpdocumentor/reflection": "^3.0", - "phpunit/phpunit": "^4.8|^5.0", - "squizlabs/php_codesniffer": "2.*" - }, - "suggest": { - "ext-grpc": "The gRPC extension enables use of the performant gRPC transport", - "ext-protobuf": "Provides a significant increase in throughput over the pure PHP protobuf implementation. See https://cloud.google.com/php/grpc for installation instructions." - }, - "type": "library", - "extra": { - "component": { - "id": "cloud-translate", - "target": "googleapis/google-cloud-php-translate.git", - "path": "Translate", - "entry": "src/TranslateClient.php" - } - }, - "autoload": { - "psr-4": { - "Google\\Cloud\\Translate\\": "src", - "GPBMetadata\\Google\\Cloud\\Translate\\": "metadata" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "description": "Cloud Translation Client for PHP", - "support": { - "source": "https://github.com/googleapis/google-cloud-php-translate/tree/v1.12.2" - }, - "time": "2021-12-10T17:55:49+00:00" - }, - { - "name": "google/common-protos", - "version": "1.4.0", - "source": { - "type": "git", - "url": "https://github.com/googleapis/common-protos-php.git", - "reference": "b1ee63636d94fe88f6cff600a0f23fae06b6fa2e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/googleapis/common-protos-php/zipball/b1ee63636d94fe88f6cff600a0f23fae06b6fa2e", - "reference": "b1ee63636d94fe88f6cff600a0f23fae06b6fa2e", - "shasum": "" - }, - "require": { - "google/protobuf": "^3.6.1" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.36", - "sami/sami": "*" - }, - "type": "library", - "autoload": { - "psr-4": { - "Google\\": "src", - "GPBMetadata\\Google\\": "metadata" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "description": "Google API Common Protos for PHP", - "homepage": "https://github.com/googleapis/common-protos-php", - "keywords": [ - "google" - ], - "support": { - "issues": "https://github.com/googleapis/common-protos-php/issues", - "source": "https://github.com/googleapis/common-protos-php/tree/1.4.0" - }, - "time": "2021-11-18T21:49:24+00:00" - }, - { - "name": "google/gax", - "version": "v1.10.0", - "source": { - "type": "git", - "url": "https://github.com/googleapis/gax-php.git", - "reference": "5222f7712e73d266490c742dc9bc602602ae00a5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/googleapis/gax-php/zipball/5222f7712e73d266490c742dc9bc602602ae00a5", - "reference": "5222f7712e73d266490c742dc9bc602602ae00a5", - "shasum": "" - }, - "require": { - "google/auth": "^1.18.0", - "google/common-protos": "^1.0", - "google/grpc-gcp": "^0.2", - "google/protobuf": "^3.12.2", - "grpc/grpc": "^1.13", - "guzzlehttp/promises": "^1.3", - "guzzlehttp/psr7": "^1.7.0|^2", - "php": ">=5.5" - }, - "conflict": { - "ext-protobuf": "<3.7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.36", - "squizlabs/php_codesniffer": "3.*" - }, - "type": "library", - "autoload": { - "psr-4": { - "Google\\ApiCore\\": "src", - "GPBMetadata\\ApiCore\\": "metadata/ApiCore" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "Google API Core for PHP", - "homepage": "https://github.com/googleapis/gax-php", - "keywords": [ - "google" - ], - "support": { - "issues": "https://github.com/googleapis/gax-php/issues", - "source": "https://github.com/googleapis/gax-php/tree/v1.10.0" - }, - "time": "2021-10-27T17:33:04+00:00" - }, - { - "name": "google/grpc-gcp", - "version": "v0.2.0", - "source": { - "type": "git", - "url": "https://github.com/GoogleCloudPlatform/grpc-gcp-php.git", - "reference": "2465c2273e11ada1e95155aa1e209f3b8f03c314" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/GoogleCloudPlatform/grpc-gcp-php/zipball/2465c2273e11ada1e95155aa1e209f3b8f03c314", - "reference": "2465c2273e11ada1e95155aa1e209f3b8f03c314", - "shasum": "" - }, - "require": { - "google/auth": "^1.3", - "google/protobuf": "^v3.3.0", - "grpc/grpc": "^v1.13.0", - "php": ">=5.5.0", - "psr/cache": "^1.0.1||^2.0.0||^3.0.0" - }, - "require-dev": { - "google/cloud-spanner": "^1.7", - "phpunit/phpunit": "4.8.36" - }, - "type": "library", - "autoload": { - "psr-4": { - "Grpc\\Gcp\\": "src/" - }, - "classmap": [ - "src/generated/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "description": "gRPC GCP library for channel management", - "support": { - "issues": "https://github.com/GoogleCloudPlatform/grpc-gcp-php/issues", - "source": "https://github.com/GoogleCloudPlatform/grpc-gcp-php/tree/v0.2.0" - }, - "time": "2021-09-27T22:57:18+00:00" - }, - { - "name": "google/protobuf", - "version": "v3.19.1", - "source": { - "type": "git", - "url": "https://github.com/protocolbuffers/protobuf-php.git", - "reference": "83fe8edf7469ffdd83cb4b4e62249c154f961b9b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/83fe8edf7469ffdd83cb4b4e62249c154f961b9b", - "reference": "83fe8edf7469ffdd83cb4b4e62249c154f961b9b", - "shasum": "" - }, - "require": { - "php": ">=5.5.0" - }, - "require-dev": { - "phpunit/phpunit": ">=4.8.0" - }, - "suggest": { - "ext-bcmath": "Need to support JSON deserialization" - }, - "type": "library", - "autoload": { - "psr-4": { - "Google\\Protobuf\\": "src/Google/Protobuf", - "GPBMetadata\\Google\\Protobuf\\": "src/GPBMetadata/Google/Protobuf" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "description": "proto library for PHP", - "homepage": "https://developers.google.com/protocol-buffers/", - "keywords": [ - "proto" - ], - "support": { - "issues": "https://github.com/protocolbuffers/protobuf-php/issues", - "source": "https://github.com/protocolbuffers/protobuf-php/tree/v3.19.1" - }, - "time": "2021-10-29T00:36:13+00:00" - }, - { - "name": "grpc/grpc", - "version": "1.42.0", - "source": { - "type": "git", - "url": "https://github.com/grpc/grpc-php.git", - "reference": "9fa44f104cb92e924d4da547323a97f3d8aca6d4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/grpc/grpc-php/zipball/9fa44f104cb92e924d4da547323a97f3d8aca6d4", - "reference": "9fa44f104cb92e924d4da547323a97f3d8aca6d4", - "shasum": "" - }, - "require": { - "php": ">=7.0.0" - }, - "require-dev": { - "google/auth": "^v1.3.0" - }, - "suggest": { - "ext-protobuf": "For better performance, install the protobuf C extension.", - "google/protobuf": "To get started using grpc quickly, install the native protobuf library." - }, - "type": "library", - "autoload": { - "psr-4": { - "Grpc\\": "src/lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "Apache-2.0" - ], - "description": "gRPC library for PHP", - "homepage": "https://grpc.io", - "keywords": [ - "rpc" - ], - "support": { - "source": "https://github.com/grpc/grpc-php/tree/v1.42.0" - }, - "time": "2021-11-19T08:13:51+00:00" - }, { "name": "hamcrest/hamcrest-php", "version": "v2.0.1", @@ -8691,113 +8171,6 @@ ], "time": "2021-06-05T04:49:07+00:00" }, - { - "name": "psr/cache", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/php-fig/cache.git", - "reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/cache/zipball/213f9dbc5b9bfbc4f8db86d2838dc968752ce13b", - "reference": "213f9dbc5b9bfbc4f8db86d2838dc968752ce13b", - "shasum": "" - }, - "require": { - "php": ">=8.0.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Cache\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "https://www.php-fig.org/" - } - ], - "description": "Common interface for caching libraries", - "keywords": [ - "cache", - "psr", - "psr-6" - ], - "support": { - "source": "https://github.com/php-fig/cache/tree/2.0.0" - }, - "time": "2021-02-03T23:23:37+00:00" - }, - { - "name": "rize/uri-template", - "version": "0.3.4", - "source": { - "type": "git", - "url": "https://github.com/rize/UriTemplate.git", - "reference": "2a874863c48d643b9e2e254ab288ec203060a0b8" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/rize/UriTemplate/zipball/2a874863c48d643b9e2e254ab288ec203060a0b8", - "reference": "2a874863c48d643b9e2e254ab288ec203060a0b8", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.8.36" - }, - "type": "library", - "autoload": { - "psr-4": { - "Rize\\": "src/Rize" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marut K", - "homepage": "http://twitter.com/rezigned" - } - ], - "description": "PHP URI Template (RFC 6570) supports both expansion & extraction", - "keywords": [ - "RFC 6570", - "template", - "uri" - ], - "support": { - "issues": "https://github.com/rize/UriTemplate/issues", - "source": "https://github.com/rize/UriTemplate/tree/0.3.4" - }, - "funding": [ - { - "url": "https://www.paypal.me/rezigned", - "type": "custom" - }, - { - "url": "https://opencollective.com/rize-uri-template", - "type": "open_collective" - } - ], - "time": "2021-10-09T06:30:16+00:00" - }, { "name": "sebastian/cli-parser", "version": "1.0.1", @@ -9762,69 +9135,6 @@ ], "time": "2020-09-28T06:39:44+00:00" }, - { - "name": "stichoza/google-translate-php", - "version": "v4.1.5", - "source": { - "type": "git", - "url": "https://github.com/Stichoza/google-translate-php.git", - "reference": "85039e0af473e58cc9f42d58e36d9d534a6a6431" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Stichoza/google-translate-php/zipball/85039e0af473e58cc9f42d58e36d9d534a6a6431", - "reference": "85039e0af473e58cc9f42d58e36d9d534a6a6431", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-mbstring": "*", - "guzzlehttp/guzzle": "~6.0|~7.0", - "php": "^7.1|^8" - }, - "require-dev": { - "phpunit/phpunit": "^7.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Stichoza\\GoogleTranslate\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Levan Velijanashvili", - "email": "me@stichoza.com" - } - ], - "description": "Free Google Translate API PHP Package", - "homepage": "http://github.com/Stichoza/google-translate-php", - "keywords": [ - "google", - "php", - "translate", - "translator" - ], - "support": { - "issues": "https://github.com/Stichoza/google-translate-php/issues", - "source": "https://github.com/Stichoza/google-translate-php/tree/v4.1.5" - }, - "funding": [ - { - "url": "https://www.paypal.me/stichoza", - "type": "custom" - }, - { - "url": "https://www.patreon.com/stichoza", - "type": "patreon" - } - ], - "time": "2021-08-05T11:03:52+00:00" - }, { "name": "symfony/debug", "version": "v4.4.31", @@ -9893,67 +9203,6 @@ ], "time": "2021-09-24T13:30:14+00:00" }, - { - "name": "tanmuhittin/laravel-google-translate", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/tanmuhittin/laravel-google-translate.git", - "reference": "2f2d97b7cf0a1296b92a1aeb8cb965bac683c118" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/tanmuhittin/laravel-google-translate/zipball/2f2d97b7cf0a1296b92a1aeb8cb965bac683c118", - "reference": "2f2d97b7cf0a1296b92a1aeb8cb965bac683c118", - "shasum": "" - }, - "require": { - "ext-json": "*", - "google/cloud-translate": "^1.7.4", - "illuminate/console": ">=5.1", - "illuminate/support": "^5.5|^6|^7|^8", - "illuminate/translation": "^5.5|^6|^7|^8", - "php": ">=7.0.0", - "stichoza/google-translate-php": "^4.0", - "yandex/translate-api": "^1.5.2" - }, - "require-dev": { - "orchestra/testbench": "5.x-dev|6.x-dev", - "phpunit/phpunit": "^8.3" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Tanmuhittin\\LaravelGoogleTranslate\\LaravelGoogleTranslateServiceProvider" - ] - } - }, - "autoload": { - "psr-4": { - "Tanmuhittin\\LaravelGoogleTranslate\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "authors": [ - { - "name": "Muhittin Tan", - "email": "tanmuhittin@gmail.com" - } - ], - "description": "Translate translation files to other languages using google translate api", - "support": { - "issues": "https://github.com/tanmuhittin/laravel-google-translate/issues", - "source": "https://github.com/tanmuhittin/laravel-google-translate/tree/2.0.4" - }, - "funding": [ - { - "url": "https://www.patreon.com/tanmuhittin", - "type": "patreon" - } - ], - "time": "2020-09-30T18:04:10+00:00" - }, { "name": "theseer/tokenizer", "version": "1.2.0", @@ -10003,47 +9252,6 @@ } ], "time": "2020-07-12T23:59:07+00:00" - }, - { - "name": "yandex/translate-api", - "version": "1.5.2", - "source": { - "type": "git", - "url": "https://github.com/yandex-php/translate-api.git", - "reference": "c99e69cde3e688fc0f99c4d8a21585226a8e1938" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/yandex-php/translate-api/zipball/c99e69cde3e688fc0f99c4d8a21585226a8e1938", - "reference": "c99e69cde3e688fc0f99c4d8a21585226a8e1938", - "shasum": "" - }, - "require": { - "ext-curl": "*", - "php": ">=5.3" - }, - "type": "library", - "autoload": { - "psr-4": { - "Yandex\\Translate\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nikita Gusakov", - "email": "dev@nkt.me" - } - ], - "description": "Client for Yandex.Translate API", - "support": { - "issues": "https://github.com/yandex-php/translate-api/issues", - "source": "https://github.com/yandex-php/translate-api/tree/1.5.2" - }, - "time": "2015-07-27T15:00:45+00:00" } ], "aliases": [], diff --git a/config/app.php b/config/app.php index f9cca409..5a9b94c2 100644 --- a/config/app.php +++ b/config/app.php @@ -192,7 +192,6 @@ return [ App\Providers\EventServiceProvider::class, App\Providers\RouteServiceProvider::class, Yajra\DataTables\DataTablesServiceProvider::class, - Barryvdh\TranslationManager\ManagerServiceProvider::class, ], From 1d8e0e22ddfe6ff1a76db2130c5a77467924ad71 Mon Sep 17 00:00:00 2001 From: 1Day Date: Wed, 15 Dec 2021 11:25:37 +0100 Subject: [PATCH 68/77] Fully translate invoices --- .../Controllers/Admin/PaymentController.php | 3 +- .../invoices/templates/controlpanel.blade.php | 2 +- .../vendor/translation-manager/index.php | 326 ------------------ 3 files changed, 3 insertions(+), 328 deletions(-) delete mode 100644 resources/views/vendor/translation-manager/index.php diff --git a/app/Http/Controllers/Admin/PaymentController.php b/app/Http/Controllers/Admin/PaymentController.php index 013eee29..74fd780f 100644 --- a/app/Http/Controllers/Admin/PaymentController.php +++ b/app/Http/Controllers/Admin/PaymentController.php @@ -225,13 +225,14 @@ class PaymentController extends Controller $invoice = Invoice::make() ->template('controlpanel') + ->name(__("Invoice")) ->buyer($customer) ->seller($seller) ->discountByPercent(0) ->taxRate(floatval($paypalProduct->getTaxPercent())) ->shipping(0) ->addItem($item) - ->status(__('invoices::invoice.paid')) + ->status(__('Paid')) ->series(now()->format('mY')) ->delimiter("-") ->sequence($newInvoiceID) diff --git a/resources/views/vendor/invoices/templates/controlpanel.blade.php b/resources/views/vendor/invoices/templates/controlpanel.blade.php index 39e98a10..af143df5 100644 --- a/resources/views/vendor/invoices/templates/controlpanel.blade.php +++ b/resources/views/vendor/invoices/templates/controlpanel.blade.php @@ -310,7 +310,7 @@ @if($invoice->hasItemOrInvoiceDiscount())
{{ __('Total Discount') }}{{ __('Total discount') }} {{ $invoice->formatCurrency($invoice->total_discount) }}
- - - - - - - - - - - - - - $translation): ?> - - - - - - - - - - - - - -
Key 
- " - id="username" data-type="textarea" data-pk="id : 0 ?>" - data-url="" - data-title="Enter translation">value, ENT_QUOTES, 'UTF-8', false) : '' ?> - - -
- -
- Supported locales -

- Current supported locales: -

-
- -
    - -
  • -
    - - - -
    -
  • - -
-
-
- -
-

- Enter new locale key: -

-
-
- -
-
- -
-
-
-
-
-
- Export all translations -
- - -
-
- - - - - - From 3b5b01f8629e4ce25af0ca3e6f26965637c2c518 Mon Sep 17 00:00:00 2001 From: 1Day Date: Wed, 15 Dec 2021 11:37:25 +0100 Subject: [PATCH 69/77] Delete .gitkeep --- resources/views/vendor/translation-manager/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 resources/views/vendor/translation-manager/.gitkeep diff --git a/resources/views/vendor/translation-manager/.gitkeep b/resources/views/vendor/translation-manager/.gitkeep deleted file mode 100644 index e69de29b..00000000 From 2dd7997d28f7c3010a70800ba20a2b83416999bf Mon Sep 17 00:00:00 2001 From: 1Day Date: Wed, 15 Dec 2021 11:50:04 +0100 Subject: [PATCH 70/77] Updated Translations --- resources/lang/de.json | 4 +++- resources/lang/en.json | 4 +++- resources/views/store/checkout.blade.php | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/resources/lang/de.json b/resources/lang/de.json index 367d1e24..4f84010f 100644 --- a/resources/lang/de.json +++ b/resources/lang/de.json @@ -356,6 +356,8 @@ "Suspend": "Deaktivieren", "Delete": "Löschen", "Login as User": "Als User anmelden", - "Clone": "Klonen" + "Clone": "Klonen", + + "Amount due": "Zahlung fällig am" } diff --git a/resources/lang/en.json b/resources/lang/en.json index 78f16711..c6c66e9e 100644 --- a/resources/lang/en.json +++ b/resources/lang/en.json @@ -357,6 +357,8 @@ "Suspend": "Suspend", "Delete": "Delete", "Login as User": "Login as User", - "Clone": "Clone" + "Clone": "Clone", + + "Amount due": "Amount due" } diff --git a/resources/views/store/checkout.blade.php b/resources/views/store/checkout.blade.php index 4decf8c7..05680ab1 100644 --- a/resources/views/store/checkout.blade.php +++ b/resources/views/store/checkout.blade.php @@ -105,7 +105,7 @@
-

{{__('Amount Due')}} {{Carbon\Carbon::now()->isoFormat('LL')}}

+

{{__('Amount due')}} {{Carbon\Carbon::now()->isoFormat('LL')}}

From b46d52e17d81ec94c6edeb5aedf45fffee0edc21 Mon Sep 17 00:00:00 2001 From: Dennis Date: Wed, 15 Dec 2021 13:59:57 +0100 Subject: [PATCH 71/77] Hindi Language support --- resources/lang/hi/auth.php | 18 +++++ resources/lang/hi/pagination.php | 17 ++++ resources/lang/hi/passwords.php | 20 +++++ resources/lang/hi/validation.php | 135 +++++++++++++++++++++++++++++++ 4 files changed, 190 insertions(+) create mode 100644 resources/lang/hi/auth.php create mode 100644 resources/lang/hi/pagination.php create mode 100644 resources/lang/hi/passwords.php create mode 100644 resources/lang/hi/validation.php diff --git a/resources/lang/hi/auth.php b/resources/lang/hi/auth.php new file mode 100644 index 00000000..25c616e7 --- /dev/null +++ b/resources/lang/hi/auth.php @@ -0,0 +1,18 @@ + 'ये साख हमारे रिकॉर्ड से मेल नहीं खा रहे हैं।', + 'password' => 'The provided password is incorrect.', + 'throttle' => 'बहुत सारे लॉगिन प्रयास। :seconds सेकंड में फिर से कोशिश करें।', +]; diff --git a/resources/lang/hi/pagination.php b/resources/lang/hi/pagination.php new file mode 100644 index 00000000..2f71e275 --- /dev/null +++ b/resources/lang/hi/pagination.php @@ -0,0 +1,17 @@ + 'अगला »', + 'previous' => '« पिछला', +]; diff --git a/resources/lang/hi/passwords.php b/resources/lang/hi/passwords.php new file mode 100644 index 00000000..b37ae7e3 --- /dev/null +++ b/resources/lang/hi/passwords.php @@ -0,0 +1,20 @@ + 'आपका पासवर्ड रीसेट कर दिया गया है!', + 'sent' => 'हमने आपको एक पासवर्ड रीसेट लिंक ई-मेल किया है!', + 'throttled' => 'कृपया पुन: प्रयास करने से पहले प्रतीक्षा करें । ', + 'token' => 'यह पासवर्ड रीसेट टोकन अमान्य है।', + 'user' => 'हमें उस ई-मेल पते के साथ एक उपयोगकर्ता नहीं मिल सकता है।', +]; diff --git a/resources/lang/hi/validation.php b/resources/lang/hi/validation.php new file mode 100644 index 00000000..cc5db580 --- /dev/null +++ b/resources/lang/hi/validation.php @@ -0,0 +1,135 @@ + ':attribute को स्वीकार किया जाना चाहिए।', + 'accepted_if' => 'The :attribute must be accepted when :other is :value.', + 'active_url' => ':attribute एक मान्य URL नहीं है।', + 'after' => ':attribute, :date के बाद की एक तारीख होनी चाहिए।', + 'after_or_equal' => ':attribute, :date के बाद या उसके बराबर की तारीख होनी चाहिए।', + 'alpha' => ':attribute में केवल अक्षर हो सकते हैं।', + 'alpha_dash' => ':attribute में केवल अक्षर, संख्या, और डैश हो सकते हैं।', + 'alpha_num' => ':attribute में केवल अक्षर और संख्याएं हो सकती हैं।', + 'array' => ':attribute एक सरणी होनी चाहिए।', + 'attached' => 'यह :attribute पहले से ही संलग्न है । ', + 'before' => ':attribute, :date से पहले की एक तारीख होनी चाहिए।', + 'before_or_equal' => ':attribute, :date इससे पहले या उसके बराबर की तारीख होनी चाहिए।', + 'between' => [ + 'array' => ':attribute, :min और :max आइटमों के बीच होनी चाहिए।', + 'file' => ':attribute, :min और :max किलोबाइट के बीच होना चाहिए।', + 'numeric' => ':attribute, :min और :max के बीच होना चाहिए।', + 'string' => ':attribute, :min और :max वर्णों के बीच होना चाहिए।', + ], + 'boolean' => ':attribute फील्ड सही या गलत होना चाहिए।', + 'confirmed' => ':attribute पुष्टिकरण मेल नहीं खा रहा है।', + 'current_password' => 'The password is incorrect.', + 'date' => ':attribute एक मान्य दिनांक नहीं है।', + 'date_equals' => ':attribute, :date के बराबर तारीख होनी चाहिए।', + 'date_format' => ':attribute फॉर्मेट :format से मेल नहीं खा रहा है।', + 'declined' => 'The :attribute must be declined.', + 'declined_if' => 'The :attribute must be declined when :other is :value.', + 'different' => ':attribute और :other अलग होना चाहिए।', + 'digits' => ':attribute, :digits अंक होना चाहिए।', + 'digits_between' => ':attribute, :min और :max अंकों के बीच होना चाहिए।', + 'dimensions' => ':attribute का अमान्य चित्त माप है।', + 'distinct' => ':attribute फील्ड का एक डुप्लिकेट मान होता है।', + 'email' => ':attribute एक मान्य ईमेल पता होना चाहिए।', + 'ends_with' => ':attribute को निम्नलिखित में से एक के साथ समाप्त होना चाहिए: :values । ', + 'exists' => 'चुना गया :attribute अमान्य है।', + 'file' => ':attribute एक फ़ाइल होनी चाहिए।', + 'filled' => ':attribute फील्ड आवश्यक होता है।', + 'gt' => [ + 'array' => ':attribute, :value मद से अधिक होना चाहिए।', + 'file' => ':attribute, :value kilobytes से अधिक होना चाहिए।', + 'numeric' => ':attribute, :value से अधिक होना चाहिए।', + 'string' => ':attribute, :value characters से अधिक होना चाहिए।', + ], + 'gte' => [ + 'array' => 'The :attribute must have :value items or more.', + 'file' => 'The :attribute must be greater than or equal :value kilobytes.', + 'numeric' => 'The :attribute must be greater than or equal :value.', + 'string' => 'The :attribute must be greater than or equal :value characters.', + ], + 'image' => ':attribute एक छवि होनी चाहिए।', + 'in' => 'चुना गया :attribute अमान्य है।', + 'in_array' => ':attribute फील्ड, :other में मौजूद नहीं है।', + 'integer' => ':attribute एक पूर्णांक होना चाहिए।', + 'ip' => ':attribute एक मान्य IP address होना चाहिए।', + 'ipv4' => ':attribute एक वैध IPv4 address होना चाहिए।', + 'ipv6' => ':attribute एक वैध IPv6 address होना चाहिए।', + 'json' => ':attribute एक मान्य JSON स्ट्रिंग होना चाहिए।', + 'lt' => [ + 'array' => 'The :attribute must have less than :value items.', + 'file' => 'The :attribute must be less than :value kilobytes.', + 'numeric' => 'The :attribute must be less than :value.', + 'string' => 'The :attribute must be less than :value characters.', + ], + 'lte' => [ + 'array' => 'The :attribute must not have more than :value items.', + 'file' => 'The :attribute must be less than or equal :value kilobytes.', + 'numeric' => 'The :attribute must be less than or equal :value.', + 'string' => 'The :attribute must be less than or equal :value characters.', + ], + 'max' => [ + 'array' => ':attribute, :max आइटमों से अधिक नहीं हो सकता है।', + 'file' => ':attribute :max किलोबाइट से बड़ा नहीं हो सकता है।', + 'numeric' => ':attribute, :max से बड़ा नहीं हो सकता है।', + 'string' => ':attribute, :max वर्णों से बड़ा नहीं हो सकता है।', + ], + 'mimes' => ':attribute एक प्रकार की फ़ाइल: :values होना चाहिए।', + 'mimetypes' => ':attribute एक प्रकार की फ़ाइल: :values होना चाहिए।', + 'min' => [ + 'array' => ':attribute कम से कम :min आइटम होना चाहिए।', + 'file' => ':attribute कम से कम :min किलोबाइट होना चाहिए।', + 'numeric' => ':attribute कम से कम :min होना चाहिए।', + 'string' => ':attribute कम से कम :min वर्ण होना चाहिए।', + ], + 'multiple_of' => ':attribute :value का एक बहु होना चाहिए', + 'not_in' => 'चुना गया :attribute अमान्य है।', + 'not_regex' => ':attribute प्रारूप अमान्य है।', + 'numeric' => ':attribute एक संख्या होनी चाहिए।', + 'password' => 'पासवर्ड गलत है । ', + 'present' => ':attribute फील्ड मौजूद होना चाहिए।', + 'prohibited' => ':attribute क्षेत्र निषिद्ध है । ', + 'prohibited_if' => ':attribute क्षेत्र निषिद्ध है जब :other :value है । ', + 'prohibited_unless' => ':attribute क्षेत्र तब तक निषिद्ध है जब तक कि :other :values में न हो । ', + 'prohibits' => 'The :attribute field prohibits :other from being present.', + 'regex' => ':attribute फॉर्मेट अमान्य है।', + 'relatable' => 'यह :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' => [ + 'array' => ':attribute में :size आइटम होने चाहिए।', + 'file' => ':attribute, :size किलोबाइट होना चाहिए।', + 'numeric' => ':attribute, :size होना चाहिए।', + 'string' => ':attribute, :size वर्ण होना चाहिए।', + ], + 'starts_with' => ':attribute निम्नलिखित में से किसी एक से शुरू करना चाहिए: :values', + 'string' => ':attribute एक स्ट्रिंग होनी चाहिए।', + 'timezone' => ':attribute एक मान्य क्षेत्र होना चाहिए।', + 'unique' => ':attribute को पहले ही ले लिया गया है।', + 'uploaded' => ':attribute अपलोड करने में विफल।', + 'url' => ':attribute फॉर्मेट अमान्य है।', + 'uuid' => ':attribute एक वैध UUID होना चाहिए।', + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'अनुकूल-संदेश', + ], + ], +]; From 09bee5ac727a5833282d2efcf83d7ff3184a822a Mon Sep 17 00:00:00 2001 From: Dennis Date: Wed, 15 Dec 2021 14:55:57 +0100 Subject: [PATCH 72/77] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index fa0690e2..26f5f27e 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ ![controlpanel](https://user-images.githubusercontent.com/45005889/123518824-06b05000-d6a8-11eb-91b9-d1ed36bd2317.png) ![](https://img.shields.io/github/stars/ControlPanel-gg/dashboard) ![](https://img.shields.io/github/forks/ControlPanel-gg/dashboard) ![](https://img.shields.io/github/tag/ControlPanel-gg/dashboard) ![](https://img.shields.io/github/issues/ControlPanel-gg/dashboard) ![](https://img.shields.io/github/license/ControlPanel-gg/dashboard) ![](https://img.shields.io/discord/787829714483019826) +[![Crowdin](https://badges.crowdin.net/controlpanelgg/localized.svg)](https://crowdin.com/project/controlpanelgg) ## About ControlPanel's Dashboard is a dashboard application designed to offer clients a management tool to manage their pterodactyl servers. This dashboard comes with a credit-based billing solution that credits users hourly for each server they have and suspends them if they run out of credits. From 9213cb593d148aaf605bfe431e82ec4eef33319b Mon Sep 17 00:00:00 2001 From: Dennis Date: Wed, 15 Dec 2021 14:57:27 +0100 Subject: [PATCH 73/77] Update README.md --- README.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.md b/README.md index 26f5f27e..37d58e01 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,7 @@ # ControlPanel-gg ![controlpanel](https://user-images.githubusercontent.com/45005889/123518824-06b05000-d6a8-11eb-91b9-d1ed36bd2317.png) -![](https://img.shields.io/github/stars/ControlPanel-gg/dashboard) ![](https://img.shields.io/github/forks/ControlPanel-gg/dashboard) ![](https://img.shields.io/github/tag/ControlPanel-gg/dashboard) ![](https://img.shields.io/github/issues/ControlPanel-gg/dashboard) ![](https://img.shields.io/github/license/ControlPanel-gg/dashboard) ![](https://img.shields.io/discord/787829714483019826) -[![Crowdin](https://badges.crowdin.net/controlpanelgg/localized.svg)](https://crowdin.com/project/controlpanelgg) - +![](https://img.shields.io/github/stars/ControlPanel-gg/dashboard) ![](https://img.shields.io/github/forks/ControlPanel-gg/dashboard) ![](https://img.shields.io/github/tag/ControlPanel-gg/dashboard) ![](https://img.shields.io/github/issues/ControlPanel-gg/dashboard)[![Crowdin](https://badges.crowdin.net/controlpanelgg/localized.svg)](https://crowdin.com/project/controlpanelgg) ![](https://img.shields.io/github/license/ControlPanel-gg/dashboard) ![](https://img.shields.io/discord/787829714483019826) ## About ControlPanel's Dashboard is a dashboard application designed to offer clients a management tool to manage their pterodactyl servers. This dashboard comes with a credit-based billing solution that credits users hourly for each server they have and suspends them if they run out of credits. From b42c11ca259bea5eda4c30ecdb704383bbb2255a Mon Sep 17 00:00:00 2001 From: Dennis Date: Wed, 15 Dec 2021 14:57:52 +0100 Subject: [PATCH 74/77] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 37d58e01..654a3adc 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ # ControlPanel-gg ![controlpanel](https://user-images.githubusercontent.com/45005889/123518824-06b05000-d6a8-11eb-91b9-d1ed36bd2317.png) -![](https://img.shields.io/github/stars/ControlPanel-gg/dashboard) ![](https://img.shields.io/github/forks/ControlPanel-gg/dashboard) ![](https://img.shields.io/github/tag/ControlPanel-gg/dashboard) ![](https://img.shields.io/github/issues/ControlPanel-gg/dashboard)[![Crowdin](https://badges.crowdin.net/controlpanelgg/localized.svg)](https://crowdin.com/project/controlpanelgg) ![](https://img.shields.io/github/license/ControlPanel-gg/dashboard) ![](https://img.shields.io/discord/787829714483019826) +![](https://img.shields.io/github/stars/ControlPanel-gg/dashboard) ![](https://img.shields.io/github/forks/ControlPanel-gg/dashboard) ![](https://img.shields.io/github/tag/ControlPanel-gg/dashboard) [![Crowdin](https://badges.crowdin.net/controlpanelgg/localized.svg)](https://crowdin.com/project/controlpanelgg) ![](https://img.shields.io/github/issues/ControlPanel-gg/dashboard) ![](https://img.shields.io/github/license/ControlPanel-gg/dashboard) ![](https://img.shields.io/discord/787829714483019826) ## About ControlPanel's Dashboard is a dashboard application designed to offer clients a management tool to manage their pterodactyl servers. This dashboard comes with a credit-based billing solution that credits users hourly for each server they have and suspends them if they run out of credits. From 586bea87950ecbf9ee8cfc6ea50233a451c7eeea Mon Sep 17 00:00:00 2001 From: 1day2die Date: Thu, 16 Dec 2021 19:38:25 +0100 Subject: [PATCH 75/77] Translate Invoice-Email. Fix Typo --- .../Controllers/Admin/SettingsController.php | 2 +- app/Notifications/InvoiceNotification.php | 18 ++--- resources/lang/de.json | 69 +++++-------------- resources/lang/en.json | 14 ++-- .../views/admin/settings/index.blade.php | 12 ++-- .../invoices/templates/controlpanel.blade.php | 6 +- 6 files changed, 46 insertions(+), 75 deletions(-) diff --git a/app/Http/Controllers/Admin/SettingsController.php b/app/Http/Controllers/Admin/SettingsController.php index 8eb46fab..aeabd3d5 100644 --- a/app/Http/Controllers/Admin/SettingsController.php +++ b/app/Http/Controllers/Admin/SettingsController.php @@ -54,7 +54,7 @@ class SettingsController extends Controller 'id' => "1" ], [ 'company_name' => $request->get('company-name'), - 'company_adress' => $request->get('company-adress'), + 'company_adress' => $request->get('company-address'), 'company_phone' => $request->get('company-phone'), 'company_mail' => $request->get('company-mail'), 'company_vat' => $request->get('company-vat'), diff --git a/app/Notifications/InvoiceNotification.php b/app/Notifications/InvoiceNotification.php index 2e76a7f5..75fcd5ac 100644 --- a/app/Notifications/InvoiceNotification.php +++ b/app/Notifications/InvoiceNotification.php @@ -55,15 +55,15 @@ class InvoiceNotification extends Notification public function toMail($notifiable) { return (new MailMessage) - ->subject('Your Payment was successful!') - ->greeting('Hello,') - ->line("Your payment was processed successfully!") - ->line('Status: ' . $this->payment->status) - ->line('Price: ' . $this->payment->formatToCurrency($this->payment->total_price)) - ->line('Type: ' . $this->payment->type) - ->line('Amount: ' . $this->payment->amount) - ->line('Balance: ' . number_format($this->user->credits,2)) - ->line('User ID: ' . $this->payment->user_id) + ->subject(__('Your Payment was successful!')) + ->greeting(__('Hello').',') + ->line(__("Your payment was processed successfully!")) + ->line(__('Status').': ' . $this->payment->status) + ->line(__('Price').': ' . $this->payment->formatToCurrency($this->payment->total_price)) + ->line(__('Type').': ' . $this->payment->type) + ->line(__('Amount').': ' . $this->payment->amount) + ->line(__('Balance').': ' . number_format($this->user->credits,2)) + ->line(__('User ID').': ' . $this->payment->user_id) ->attach(storage_path('app/invoice/' . $this->user->id . '/' . now()->format('Y') . '/' . $this->invoice->filename)); } } diff --git a/resources/lang/de.json b/resources/lang/de.json index 4f84010f..83d7e933 100644 --- a/resources/lang/de.json +++ b/resources/lang/de.json @@ -6,7 +6,6 @@ "Causer": "Verursacher", "Description": "Beschreibung", "Created at": "Erstellt am", - "Edit Configuration": "Einstellungen bearbeiten", "Text Field": "Textfeld", "Cancel": "Abbrechen", @@ -14,13 +13,11 @@ "Save": "Speichern", "true": "wahr", "false": "falsch", - "Configurations": "Einstellungen", "Dashboard": "Dashboard", "Key": "Schlüssel", "Value": "Wert", "Type": "Typ", - "Admin Overview": "Admin Übersicht", "Support server": "Discord Server", "Documentation": "Dokumentation", @@ -41,7 +38,6 @@ "Eggs": "Eggs", "Last updated :date": "Zuletzt aktualisiert :date", "Purchase": "Kaufen", - "ID": "ID", "User": "Benutzer", "Amount": "Anzahl", @@ -50,13 +46,11 @@ "Total Price": "Gesamtpreis", "Payment_ID": "Zahlungs-ID", "Payer_ID": "Käufer-ID", - "Product": "Produkt", "Products": "Produkte", "Create": "Erstellen", "Product Details": "Produktdetails", "Server Details": "Serverdetails", - "Product Linking": "Produktbeziehungen", "Name": "Name", "Price in": "Preis in ", @@ -79,22 +73,18 @@ "Setting to -1 will use the value from configuration.": "Benutzt den Standard, wenn der Wert auf -1 gesetzt wird", "This is what the users sees": "Das wird der Benutzer sehen", "Edit": "Bearbeiten", - "Price": "Preis", "Are you sure you wish to delete?": "Sicher, dass du dies löschen möchtest?", "Create new": "Neu erstellen", "Show": "Zeige", "Updated at": "Aktualisiert", "Suspended at": "Suspendiert", - "Settings": "Einstellungen", "Dashboard icons": "Dashboard Icons", "Select panel icon": "Icon auswählen", "Select panel favicon": "Favicon auswählen", - "Token": "Token", "Last used": "Zuletzt benutzt", - "Store": "Laden", "Currency code": "Währungscode", "Checkout the paypal docs to select the appropriate code": "Siehe Paypal für die entsprechenden Codes", @@ -104,17 +94,14 @@ "This is what the user sees at store and checkout": "Dies ist die 'Anzahl' welche der User beim Kaufen sieht", "This is what the user sees at checkout": "Dies ist die Beschreibung auf der Rechnung und was der Kunde beim kauf sieht", "Adds 1000 credits to your account": "Fügt deinem Account 1000 Credits hinzu", - "Active": "Aktiv", "Paypal is not configured.": "Paypal ist nicht konfiguriert!", "To configure PayPal, head to the .env and add your PayPal’s client id and secret.": "Um Paypal zu konfigurieren, füge deine Paypal client ID und Secretkey in deine .env-Datei hinzu", - "Useful Links": "Nützliche Links", "Icon class name": "Icon Klassen-Name", "You can find available free icons": "Hier gibt es kostenlose Icons", "Title": "Titel", "Link": "Link", - "Username": "Username", "Email": "E-Mail", "Pterodactly ID": "Pterodactyl ID", @@ -127,20 +114,15 @@ "Confirm Password": "Passwort bestätigen", "This ID refers to the user account created on pterodactyls panel.": "Die ist die Pterodactyl-ID des Users", "Only edit this if you know what youre doing :)": "Bearbeite dies nur, wenn du weißt, was du tust :)", - "Verified": "Verifiziert", "Last seen": "Zuletzt online", "Notify": "Benachrichtigen", - "All": "Alle", "Send via": "Senden via", "Content": "Inhalt", "Notifications": "Benachrichtigungen", - "Usage": "Nutzung", - "Config": "Konfiguration", - "Vouchers": "Gutscheine", "Voucher details": "Gutschein details", "Memo": "Name", @@ -149,11 +131,9 @@ "Expires at": "Läuft ab am", "Max": "Max", "Random": "Zufällig", - "Status": "Status", "Used / Uses": "Benutzungen", "Expires": "Ablauf", - "Please confirm your password before continuing.": "Bitte bestätige dein Passwort bevor du fortfährst", "Password": "Passwort", "Forgot Your Password?": "Passwort vergessen?", @@ -164,7 +144,7 @@ "You forgot your password? Here you can easily retrieve a new password.": "Passwort vergessen? Hier kannst du ganz leicht ein neues anfordern", "Request new password": "Neues Passwort anfordern", "Login": "Anmelden", - "You are only one step a way from your new password, recover your password now.":"Du bist nurnoch einen Schritt von deinem Passwort entfernt.", + "You are only one step a way from your new password, recover your password now.": "Du bist nurnoch einen Schritt von deinem Passwort entfernt.", "Retype password": "Passwort bestätigen", "Change password": "Passwort ändern", "I already have a membership": "Ich habe bereits einen Account", @@ -174,8 +154,8 @@ "Before proceeding, please check your email for a verification link.": "Bitte überprüfe dein E-Mail Postfach nach einem Verifizierungslink", "If you did not receive the email": "Solltest du keine E-Mail erhalten haben", "click here to request another": "Klicke hier um eine neue zu erhalten", - "Home": "Startseite", + "Languages": "Sprachen", "See all Notifications": "Alle Nachrichten anzeigen", "Profile": "Profil", "Log back in": "Zurück anmelden", @@ -187,24 +167,18 @@ "Other": "Anderes", "Logs": "Logs", "Redeem code": "Code einlösen", - "You have not yet verified your email address": "Deine E-Mail Adresse ist nicht bestätigt", "Click here to resend verification email": "Klicke hier, um eine neue Bestätigungsmail zu senden", "Please contact support If you didnt receive your verification email.": "Wende dich an den Kundensupport wenn du keine E-Mail erhalten hast", - "Thank you for your purchase!": "Vielen Dank für deinen Einkauf!", "Your payment has been confirmed; Your credit balance has been updated.": "Deine Zahlung wurde bestätigt und deine Credits angepasst", - "Payment ID": "Zahlungs-ID", "Balance": "Stand", "User ID": "User-ID", "Thanks": "Vielen Dank", - "Redeem voucher code": "Gutscheincode einlösen", "Redeem": "Einlösen", - "All notifications": "Alle Nachrichten", - "Required Email verification!": "E-Mail verifizierung nötig!", "Required Discord verification!": "Discord verifizierung nötig!", "You have not yet verified your discord account": "Du hast deinen Discord Account noch nicht bestätigt", @@ -212,7 +186,6 @@ "Please contact support If you face any issues.": "Melde dich beim Support, solltest du Probleme haben", "Due to system settings you are required to verify your discord account!": "Um das System zu benutzten, musst du deinen Discord Account bestätigen", "It looks like this hasnt been set-up correctly! Please contact support.": "Es scheint so, als wäre dies nicht richtig Konfiguriert. Bitte melde dich beim Support", - "Change Password": "Passwort ändern", "Current Password": "Momentanes Passwort", "Save Changes": "Änderungen speichern", @@ -246,7 +219,6 @@ "Delete server": "Server löschen", "Price per Hour": "Preis pro Stunde", "Price per Month": "Preis pro Monat", - "Date": "Datum", "To": "Zu", "From": "Von", @@ -258,13 +230,10 @@ "There are no store products!": "Es gibt keine Produkte", "The store is not correctly configured!": "Der Laden wurde nicht richtig konfiguriert", "Out of Credits in": "Keine :credits mehr in", - "days": "Tage", "hours": "Stunden", "You ran out of Credits": "Keine Credits übrig!", - "Profile updated": "Profile updated", - "You are required to verify your email address before you can create a server.": "Du musst deine E-Mail verifizieren bevor du einen Server erstellen kannst", "You are required to link your discord account before you can create a server.": "Du musst dein Discord verifizieren bevor du einen Server erstellen kannst", "No allocations satisfying the requirements for automatic deployment on this node were found.": "Keine automatischen Portzuweisungen für dieses Node vorhanden", @@ -273,9 +242,7 @@ "An exception has occurred while trying to remove a resource \"": "Folgender Fehler ist aufgetreten: ", "You are required to verify your email address before you can purchase credits.": "Vor dem Kauf musst du deine E-Mail verifizieren", "You are required to link your discord account before you can purchase ": "Vor dem Kauf musst du dein Discord verlinken!", - "Warning!": "Warnung!", - "api key created!": "API Key erstellt", "api key updated!": "API Key updated", "api key has been removed!": "API Key gelöscht", @@ -283,11 +250,10 @@ "Pterodactyl synced": "Pterodactyl synced", "Your credit balance has been increased!": "Dein Kontostand wurde updated", "Payment was Canceled": "Zahlung abgebrochen", - "Store item has been created!": "Item wurde erstellt!", "Store item has been updated!": "Item updated", "Product has been updated!": "Product updated", - "Store item has been removed!":"Item gelöscht", + "Store item has been removed!": "Item gelöscht", "Product has been created!": "Produkt erstellt", "Product has been removed!": "Produkt gelöscht", "Server has been updated!": "Server updated", @@ -329,17 +295,16 @@ "Shipping": "Lieferbedingung", "Paid": "Bezahlt", "Due:": "Fällig", - "Invoice Settings":"Rechnungsoptionen", - "Download all Invoices":"Alle Rechnungen runterladen", - "Enter your companys name":"Firmenname", - "Enter your companys adress":"Firmenadresse", - "Enter your companys phone number":"Telefonnummer", - "Enter your companys VAT id":"SteuerID Nummer", - "Enter your companys email adress":"Firmen E-Mail", - "Enter your companys website":"Firmenwebsite", - "Enter your custom invoice prefix":"Rechnungsprefix", - "Select Invoice Logo":"Firmenlogo auswählen", - + "Invoice Settings": "Rechnungsoptionen", + "Download all Invoices": "Alle Rechnungen runterladen", + "Enter your companys name": "Firmenname", + "Enter your companys address": "Firmenadresse", + "Enter your companys phone number": "Telefonnummer", + "Enter your companys VAT id": "SteuerID Nummer", + "Enter your companys email address": "Firmen E-Mail", + "Enter your companys website": "Firmenwebsite", + "Enter your custom invoice prefix": "Rechnungsprefix", + "Select Invoice Logo": "Firmenlogo auswählen", "Payment Confirmation": "Zahlungsbestätigung", "Payment Confirmed!": "Zahlung bestätigt!", "Server Creation Error": "Fehler beim erstellen des Servers", @@ -348,7 +313,6 @@ "Purchase credits": "Credits kaufen", "If you have any questions please let us know.": "Solltest du weiter fragen haben, melde dich gerne beim Support!", "Regards": "mit freundlichen Grüßen", - "Getting started!": "Den Anfang machen!", "EXPIRED": "ABGELAUFEN", "VALID": "GÜLTIG", @@ -357,7 +321,8 @@ "Delete": "Löschen", "Login as User": "Als User anmelden", "Clone": "Klonen", - - "Amount due": "Zahlung fällig am" - + "Amount due": "Zahlung fällig am", + "Your Payment was successful!": "Deine Zahlung ist erfolgreich bei uns eingegangen!", + "Hello": "Hallo", + "Your payment was processed successfully!": "Deine Zahlung wurde erfolgreich verarbeitet!" } diff --git a/resources/lang/en.json b/resources/lang/en.json index c6c66e9e..0dbebc01 100644 --- a/resources/lang/en.json +++ b/resources/lang/en.json @@ -164,7 +164,7 @@ "You forgot your password? Here you can easily retrieve a new password.": "You forgot your password? Here you can easily retrieve a new password.", "Request new password": "Request new password", "Login": "Login", - "You are only one step a way from your new password, recover your password now.":"Du bist nurnoch einen Schritt von deinem Passwort entfernt.", + "You are only one step a way from your new password, recover your password now.":"You are only one step a way from your new password, recover your password now.", "Retype password": "Retype password", "Change password": "Change password", "I already have a membership": "I already have a membership", @@ -176,6 +176,7 @@ "click here to request another": "click here to request another", "Home": "Home", + "Languages": "Languages", "See all Notifications": "See all Notifications", "Profile": "Profile", "Log back in": "Log back in", @@ -332,10 +333,10 @@ "Invoice Settings": "Invoice Settings", "Download all Invoices": "Download all Invoices", "Enter your companys name": "Enter your companys name", - "Enter your companys adress": "Enter your companys adress", + "Enter your companys address": "Enter your companys address", "Enter your companys phone number": "Enter your companys phone number", "Enter your companys VAT id": "Enter your companys VAT id", - "Enter your companys email adress": "Enter your companys email adress", + "Enter your companys email address": "Enter your companys email address", "Enter your companys website": "Enter your companys website", "Enter your custom invoice prefix": "Enter your custom invoice prefix", "Select Invoice Logo": "Select Invoice Logo", @@ -359,6 +360,11 @@ "Login as User": "Login as User", "Clone": "Clone", - "Amount due": "Amount due" + "Amount due": "Amount due", + + "Your Payment was successful!": "Your Payment was successful!", + "Hello":"Hello", + "Your payment was processed successfully!":"Your payment was processed successfully!" + } diff --git a/resources/views/admin/settings/index.blade.php b/resources/views/admin/settings/index.blade.php index 197c5005..e3ecb1c3 100644 --- a/resources/views/admin/settings/index.blade.php +++ b/resources/views/admin/settings/index.blade.php @@ -113,14 +113,14 @@ class="form-control @error('company-name') is-invalid @enderror"> - +
- + for="company-address">{{__('Enter your companys address' )}} +
@@ -148,7 +148,7 @@
+ for="company-mail">{{__('Enter your companys email address' )}} diff --git a/resources/views/vendor/invoices/templates/controlpanel.blade.php b/resources/views/vendor/invoices/templates/controlpanel.blade.php index af143df5..e6a99fa0 100644 --- a/resources/views/vendor/invoices/templates/controlpanel.blade.php +++ b/resources/views/vendor/invoices/templates/controlpanel.blade.php @@ -183,7 +183,7 @@ @if($invoice->seller->address)

- {{ __('Adress') }}: {{ $invoice->seller->address }} + {{ __('Address') }}: {{ $invoice->seller->address }}

@endif @@ -219,9 +219,9 @@

@endif - @if($invoice->buyer->address) + @if($invoice->buyer->adress)

- {{ __('Adress') }}: {{ $invoice->buyer->address }} + {{ __('Address') }}: {{ $invoice->buyer->address }}

@endif From 3992000a682888d735cd945967a497dccea6a2e8 Mon Sep 17 00:00:00 2001 From: Dennis Date: Thu, 16 Dec 2021 22:37:03 +0100 Subject: [PATCH 76/77] Newest language files --- resources/lang/es.json | 328 +++++++++++++++++++++++++++++++++++++++++ resources/lang/fr.json | 328 +++++++++++++++++++++++++++++++++++++++++ resources/lang/hi.json | 328 +++++++++++++++++++++++++++++++++++++++++ resources/lang/it.json | 328 +++++++++++++++++++++++++++++++++++++++++ resources/lang/zh.json | 328 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 1640 insertions(+) create mode 100644 resources/lang/es.json create mode 100644 resources/lang/fr.json create mode 100644 resources/lang/hi.json create mode 100644 resources/lang/it.json create mode 100644 resources/lang/zh.json diff --git a/resources/lang/es.json b/resources/lang/es.json new file mode 100644 index 00000000..52e550b7 --- /dev/null +++ b/resources/lang/es.json @@ -0,0 +1,328 @@ +{ + "Activity Logs": "Registros de Actividad", + "No recent activity from cronjobs": "No hay actividad reciente de cronjobs", + "Check the docs for it here": "Consulte la documentación aquí", + "Are cronjobs running?": "¿Se están ejecutando los cronjobs?", + "Causer": "Causante", + "Description": "Descripción", + "Created at": "Creado a", + "Edit Configuration": "Editar Configuración", + "Text Field": "Campo de texto", + "Cancel": "Cancelar", + "Close": "Cerrar", + "Save": "Guardar", + "true": "verdadero", + "false": "falso", + "Configurations": "Configuración", + "Dashboard": "Panel de control", + "Key": "Clave", + "Value": "Valor", + "Type": "Tipo", + "Admin Overview": "Vista de Administrador", + "Support server": "Servidor de Ayuda", + "Documentation": "Documentación", + "Github": "Github", + "Support ControlPanel": "Apoya ControlPanel", + "Servers": "Servidores", + "Users": "Usuarios", + "Total": "Total", + "Payments": "Pagos", + "Pterodactyl": "Pterodactyl", + "Sync": "Sincronizar Ahora", + "Resources": "Recursos", + "Count": "Cuenta", + "Locations": "Localizaciones", + "Node": "Nodo", + "Nodes": "Nodos", + "Nests": "Nidos", + "Eggs": "Huevos", + "Last updated :date": "Ultima vez actualizado :date", + "Purchase": "Compra", + "ID": "ID", + "User": "Usuario", + "Amount": "Cantidad", + "Product Price": "Precio del producto", + "Tax": "Impuesto", + "Total Price": "Precio Total", + "Payment_ID": "Payment_ID", + "Payer_ID": "Payer_ID", + "Product": "Producto", + "Products": "Productos", + "Create": "Crear", + "Product Details": "Detalles del Producto", + "Server Details": "Detalles del Servidor", + "Product Linking": "Vinculación de Productos", + "Name": "Nombre", + "Price in": "Precio en", + "Memory": "Ram", + "Cpu": "Cpu", + "Swap": "Swap", + "Disk": "Disco", + "Minimum": "Mínimo", + "IO": "IO", + "Databases": "Bases de Datos", + "Database": "Base de Datos", + "Backups": "Copias de Seguridad", + "Allocations": "Asignaciones", + "Disabled": "Deshabilitado", + "Submit": "Enviar", + "This product will only be available for these nodes": "Este producto solo está disponible para estos nodos", + "This product will only be available for these eggs": "Este producto solo esta disponible para estos huevos", + "Will hide this option from being selected": "Ocultará esta opción para que no se seleccione", + "Link your products to nodes and eggs to create dynamic pricing for each option": "Vincula tus productos a nodos y huevos para crear precios dinámicos para cada opción", + "Setting to -1 will use the value from configuration.": "Si se establece en -1, se utilizará el valor de la configuración.", + "This is what the users sees": "Esto es lo que ven los usuarios", + "Edit": "Editar", + "Price": "Precio", + "Are you sure you wish to delete?": "¿Está seguro que desea borrarlo?", + "Create new": "Crear nuevo", + "Show": "Mostrar", + "Updated at": "Última Actualización", + "Suspended at": "Suspendido en", + "Settings": "Configuraciones", + "Dashboard icons": "Iconos del panel", + "Select panel icon": "Seleccionar icono de panel", + "Select panel favicon": "Seleccionar favicon del panel", + "Token": "Token", + "Last used": "Último Uso", + "Store": "Tienda", + "Currency code": "Código de divisa/moneda", + "Checkout the paypal docs to select the appropriate code": "Consulte los documentos de PayPal para seleccionar el código apropiado", + "Quantity": "Cantidad", + "Amount given to the user after purchasing": "Importe dado al usuario después de la compra", + "Display": "Mostrar", + "This is what the user sees at store and checkout": "Esto es lo que ve el usuario en la tienda y al finalizar la compra", + "This is what the user sees at checkout": "Esto es lo que ve el usuario al finalizar la compra", + "Adds 1000 credits to your account": "Agrega 1000 créditos a su cuenta", + "Active": "Activo", + "Paypal is not configured.": "Paypal no esta configurado.", + "To configure PayPal, head to the .env and add your PayPal’s client id and secret.": "Para configurar PayPal, diríjase a .env y agregue la identificación de cliente y el secreto de PayPal.", + "Useful Links": "Enlaces útiles", + "Icon class name": "Nombre de la clase de icono", + "You can find available free icons": "Puedes encontrar iconos gratuitos disponibles", + "Title": "Titulo", + "Link": "Enlace", + "Username": "Nombre de usuario", + "Email": "Email", + "Pterodactly ID": "Pterodactly ID", + "Server Limit": "Limite Servidor", + "Role": "Rol", + "Administrator": "Administrador", + "Client": "Cliente", + "Member": "Miembro", + "New Password": "Nueva Contraseña", + "Confirm Password": "Confirmar Contraseña", + "This ID refers to the user account created on pterodactyls panel.": "Esta ID se refiere a la cuenta de usuario creada en el panel de pterodactyl.", + "Only edit this if you know what youre doing :)": "Edite esto solo si sabe lo que está haciendo :)", + "Verified": "Verificado", + "Last seen": "Visto por ùltima vez", + "Notify": "Notificar", + "All": "Todos", + "Send via": "Enviar vía", + "Content": "Contenido", + "Notifications": "Notificaciones", + "Usage": "Uso", + "Config": "Configuración", + "Vouchers": "Descuentos", + "Voucher details": "Detalles del vale", + "Memo": "Memo", + "Code": "Código", + "Uses": "Usos", + "Expires at": "Expira el", + "Max": "Máx", + "Random": "Aleatorio", + "Status": "Estado", + "Used / Uses": "Usado / Usos", + "Expires": "Expira", + "Please confirm your password before continuing.": "Por favor confirme su contraseña antes de continuar.", + "Password": "Contraseña", + "Forgot Your Password?": "¿Olvidó su contraseña?", + "Sign in to start your session": "Iniciar sesión para comenzar", + "Remember Me": "Recuérdame", + "Sign In": "Iniciar sesión", + "Register a new membership": "Registrar un nuevo miembro", + "You forgot your password? Here you can easily retrieve a new password.": "¿Olvidaste tu contraseña? Aquí puede recuperar fácilmente una nueva contraseña.", + "Request new password": "Solicitar nueva contraseña", + "Login": "Iniciar sesión", + "You are only one step a way from your new password, recover your password now.": "Está a solo un paso de su nueva contraseña, recupere su contraseña ahora.", + "Retype password": "Vuelva a escribir la contraseña", + "Change password": "Cambiar contraseña", + "I already have a membership": "Ya soy miembro", + "Register": "Registrar", + "Verify Your Email Address": "Verifica Tu Email", + "A fresh verification link has been sent to your email address.": "Se ha enviado un nuevo enlace de verificación a su correo electrónico.", + "Before proceeding, please check your email for a verification link.": "Antes de continuar, por favor, confirme su correo electrónico con el enlace de verificación que le fue enviado.", + "If you did not receive the email": "Si no ha recibido el correo electrónico", + "click here to request another": "haga clic aquí para solicitar otro", + "Home": "Inicio", + "Languages": "Idiomas", + "See all Notifications": "Ver todas las notificaciones", + "Profile": "Perfil", + "Log back in": "Volver a iniciar sesión", + "Logout": "Cerrar sesión", + "Administration": "‫Administración", + "Overview": "Resumen", + "Application API": "Aplicación API", + "Management": "Gestión", + "Other": "Otro", + "Logs": "Logs", + "Redeem code": "Canjear código", + "You have not yet verified your email address": "No has verificado tu correo electrónico", + "Click here to resend verification email": "Haz click aquí para reenviar tu correo electrónico de activación", + "Please contact support If you didnt receive your verification email.": "Contacte con el soporte si no recibió su correo electrónico de verificación.", + "Thank you for your purchase!": "¡Gracias por su compra!", + "Your payment has been confirmed; Your credit balance has been updated.": "Su pago ha sido confirmado; Se actualizó su saldo de crédito.", + "Payment ID": "ID del pago", + "Balance": "Saldo", + "User ID": "ID Usuario", + "Thanks": "Gracias", + "Redeem voucher code": "Canjear código de descuento", + "Redeem": "Canjear", + "All notifications": "Todas las notificaciones", + "Required Email verification!": "¡Se requiere verificación de correo electrónico!", + "Required Discord verification!": "¡Se requiere verificación de Discord!", + "You have not yet verified your discord account": "Aún no has verificado tu cuenta de discord", + "Login with discord": "Acceder con Discord", + "Please contact support If you face any issues.": "Póngase en contacto con soporte si tiene algún problema.", + "Due to system settings you are required to verify your discord account!": "¡Debido a la configuración del sistema, debe verificar su cuenta de discord!", + "It looks like this hasnt been set-up correctly! Please contact support.": "¡Parece que esto no se ha configurado correctamente! Comuníquese con el soporte.", + "Change Password": "Cambiar Contraseña", + "Current Password": "Contraseña Actual", + "Save Changes": "Guardar Cambios", + "Re-Sync Discord": "Re-Sincronizar Discord", + "You are verified!": "¡Estás verificado!", + "By verifying your discord account, you receive extra Credits and increased Server amounts": "Al verificar su cuenta de discord, recibe créditos adicionales y aumenta su limite de cantidad de servidores", + "Server configuration": "Configuración del servidor", + "Error!": "Error!", + "Make sure to link your products to nodes and eggs.": "Asegúrese de vincular sus productos a nodos y huevos.", + "There has to be at least 1 valid product for server creation": "Tiene que haber al menos 1 producto válido para la creación del servidor", + "No products available!": "¡No hay productos disponibles!", + "No nodes have been linked!": "¡No se han vinculado nodos!", + "No nests available!": "¡No hay nidos disponibles!", + "No eggs have been linked!": "¡No se han vinculado huevos!", + "Software / Games": "Software / Juegos", + "Please select software ...": "Seleccione el software ...", + "Specification": "Especificaciones", + "No selection": "Sin selección", + "per month": "al mes", + "Not enough credits!": "¡No tiene suficientes créditos!", + "Please select a configuration ...": "Por favor elija su configuración...", + "No resources found matching current configuration": "No se encontraron recursos que coincidan con la configuración actual", + "No nodes found matching current configuration": "No se encontraron nodos que coincidan con la configuración actual", + "Please select a node ...": "Por favor, seleccione un nodo...", + "Create server": "Crear Servidor", + "Use your servers on our": "Usa tus servidores en nuestro", + "pterodactyl panel": "pterodactyl panel", + "Server limit reached!": "¡Se alcanzó el límite de servidores!", + "Create Server": "Crear Servidor", + "Manage": "Gestionar", + "Delete server": "Eliminar servidor", + "Price per Hour": "Precio por hora", + "Price per Month": "Precio por mes", + "Date": "Fecha", + "To": "A", + "From": "Desde", + "Pending": "Pendiente", + "Subtotal": "Subtotal", + "Submit Payment": "Proceder al Pago", + "Payment Methods": "Métodos de Pago", + "By purchasing this product you agree and accept our terms of service": "Al comprar este producto, está de acuerdo y acepta nuestros términos de servicio", + "There are no store products!": "¡No hay productos de la tienda!", + "The store is not correctly configured!": "¡La tienda no está configurada correctamente!", + "Out of Credits in": "Sin créditos en", + "days": "días", + "hours": "horas", + "You ran out of Credits": "Te has quedado sin créditos", + "Profile updated": "Perfil actualizado", + "You are required to verify your email address before you can create a server.": "Debe verificar su dirección de correo electrónico antes de poder crear un servidor.", + "You are required to link your discord account before you can create a server.": "Debe vincular su cuenta de discord antes de poder crear un servidor.", + "No allocations satisfying the requirements for automatic deployment on this node were found.": "No se encontraron asignaciones que satisfagan los requisitos para la implementación automática en este nodo.", + "Server removed": "Servidor eliminado", + "Server created": "Servidor creado", + "An exception has occurred while trying to remove a resource \"": "Se produjo una excepción al intentar eliminar un recurso \"", + "You are required to verify your email address before you can purchase credits.": "Debe verificar su dirección de correo electrónico antes de poder comprar créditos.", + "You are required to link your discord account before you can purchase ": "Debes vincular tu cuenta de discord antes de poder comprar ", + "Warning!": "¡Advertencia!", + "api key created!": "¡API Key creada!", + "api key updated!": "¡API Key actualizada!", + "api key has been removed!": "¡La API Key a sido eliminada!", + "configuration has been updated!": "¡La configuración ha sido actualizada!", + "Pterodactyl synced": "Pterodactyl sincronizado", + "Your credit balance has been increased!": "¡Su saldo de crédito ha aumentado!", + "Payment was Canceled": "Pago Cancelado", + "Store item has been created!": "¡Se ha creado el artículo en la tienda!", + "Store item has been updated!": "¡El artículo de la tienda ha sido actualizado!", + "Product has been updated!": "¡El producto ha sido actualizado!", + "Store item has been removed!": "¡El artículo de la tienda ha sido eliminado!", + "Product has been created!": "¡El producto ha sido creado!", + "Product has been removed!": "¡El producto ha sido eliminado!", + "Server has been updated!": "¡El servidor ha sido actualizado!", + "Icons updated!": "¡Iconos actualizados!", + "link has been created!": "¡Se ha creado el enlace!", + "link has been updated!": "¡El enlace ha sido actualizado!", + "user has been removed!": "¡El usuario ha sido eliminado!", + "Notification sent!": "¡Notificación enviada!", + "User has been updated!": "¡El usuario ha sido actualizado!", + "User does not exists on pterodactyl's panel": "El usuario no existe en el panel pterodactyl", + "voucher has been created!": "¡Se a creado un cupón!", + "voucher has been updated!": "¡El cupón ha sido actualizado!", + "voucher has been removed!": "¡El cupón a sido eliminado!", + "This voucher has reached the maximum amount of uses": "Este cupón ha alcanzado la cantidad máxima de usos", + "This voucher has expired": "Este cupón a expirado", + "You already redeemed this voucher code": "Ya has usado este cupón", + "You can't redeem this voucher because you would exceed the limit of ": "No puede canjear este cupón porque excedería el límite de ", + "have been added to your balance!": "se han añadido a tu saldo!", + "Invoice": "Factura", + "Serial No.": "Nº Serie.", + "Invoice date": "Fecha de Factura", + "Seller": "Vendedor", + "Buyer": "Comprador", + "Address": "Dirección", + "VAT code": "Código de IVA", + "Phone": "Teléfono", + "Units": "Unidades", + "Qty": "Cantidad", + "Discount": "Descuento", + "Sub total": "Subtotal", + "Total discount": "Descuento total", + "Taxable amount": "Base imponible", + "Total taxes": "Total de impuestos", + "Tax rate": "Tasa de impuestos", + "Total amount": "Cantidad total", + "Please pay until": "Por favor pague hasta", + "Amount in words": "Cantidad en palabras", + "Notes": "Notas", + "Shipping": "Envío", + "Paid": "Pagado", + "Due:": "Vencimiento:", + "Invoice Settings": "Configuración de facturación", + "Download all Invoices": "Descargar todas las facturas", + "Enter your companys name": "Introduce el nombre de tu empresa", + "Enter your companys address": "Ingrese la dirección de su empresa", + "Enter your companys phone number": "Ingrese el número de teléfono de su empresa", + "Enter your companys VAT id": "Ingrese el ID de IVA de su empresa", + "Enter your companys email address": "Ingrese la dirección de correo electrónico de su empresa", + "Enter your companys website": "Ingrese el sitio web de su empresa", + "Enter your custom invoice prefix": "Ingrese su prefijo de factura personalizado", + "Select Invoice Logo": "Seleccione el logotipo de la factura", + "Payment Confirmation": "Confirmación de Pago", + "Payment Confirmed!": "¡Pago Confirmado!", + "Server Creation Error": "Error de creación del servidor", + "Your servers have been suspended!": "¡Sus servidores han sido suspendidos!", + "To automatically re-enable your server/s, you need to purchase more credits.": "Para volver a habilitar automáticamente sus servidores, debe comprar más créditos.", + "Purchase credits": "Comprar Créditos", + "If you have any questions please let us know.": "Si tienes más preguntas, por favor háznoslas saber.", + "Regards": "Atentamente", + "Getting started!": "¡Empezando!", + "EXPIRED": "CADUCADO", + "VALID": "VÁLIDO", + "Unsuspend": "Quitar suspensión", + "Suspend": "Suspender", + "Delete": "Eliminar", + "Login as User": "Iniciar sesión como usuario", + "Clone": "Clonar", + "Amount due": "Importe a pagar", + "Your Payment was successful!": "¡El pago se ha realizado correctamente!", + "Hello": "Hola", + "Your payment was processed successfully!": "¡Su pago se procesó correctamente!" +} diff --git a/resources/lang/fr.json b/resources/lang/fr.json new file mode 100644 index 00000000..f3c19b95 --- /dev/null +++ b/resources/lang/fr.json @@ -0,0 +1,328 @@ +{ + "Activity Logs": "Journal des activités", + "No recent activity from cronjobs": "Aucune activité récente de cronjobs", + "Check the docs for it here": "Consultez la documentation ici", + "Are cronjobs running?": "Les tâches cron sont-elles en cours d'exécution ?", + "Causer": "Cause", + "Description": "Description", + "Created at": "Créé à", + "Edit Configuration": "Modifier la configuration", + "Text Field": "Champ de texte", + "Cancel": "Annuler", + "Close": "Fermer", + "Save": "Sauvegarder", + "true": "vrai", + "false": "faux", + "Configurations": "Configuration", + "Dashboard": "Tableau de bord", + "Key": "Clé", + "Value": "Valeur", + "Type": "Type", + "Admin Overview": "Vue administrateur", + "Support server": "Serveur de support", + "Documentation": "Documentation", + "Github": "Github", + "Support ControlPanel": "ControlPanel Support", + "Servers": "Serveurs", + "Users": "Utilisateurs", + "Total": "Total", + "Payments": "Paiments", + "Pterodactyl": "Pterodactyl", + "Sync": "Synchroniser", + "Resources": "Ressources", + "Count": "Nombre", + "Locations": "Emplacements", + "Node": "Node", + "Nodes": "Nœuds", + "Nests": "Nids", + "Eggs": "Œufs", + "Last updated :date": "Dernière mise à jour", + "Purchase": "Acheter", + "ID": "IDENTIFIANT", + "User": "Utilisateur", + "Amount": "Montant ", + "Product Price": "Prix du produit", + "Tax": "Tva & autres taxes", + "Total Price": "Prix total", + "Payment_ID": "ID_PAIEMENT", + "Payer_ID": "Payer_ID", + "Product": "Article", + "Products": "Produits", + "Create": "Créer", + "Product Details": "Détails du produit", + "Server Details": "Détails du serveur", + "Product Linking": "Lien du produit", + "Name": "Nom", + "Price in": "Prix en", + "Memory": "Mémoire", + "Cpu": "Cpu", + "Swap": "Swap", + "Disk": "Disque", + "Minimum": "Minimum", + "IO": "IO", + "Databases": "Bases de données", + "Database": "Base de donnée", + "Backups": "Sauvegardes", + "Allocations": "Allocations", + "Disabled": "Désactivé", + "Submit": "Valider", + "This product will only be available for these nodes": "Ce produit est uniquement disponible pour cette node", + "This product will only be available for these eggs": "Ce produit n'est pas disponible pour cet eggs", + "Will hide this option from being selected": "Cachera cette option", + "Link your products to nodes and eggs to create dynamic pricing for each option": "Liez vos produits à des nodes et des eggs pour créer une tarification dynamique pour chaque option", + "Setting to -1 will use the value from configuration.": "Le réglage à -1 utilisera la valeur de la configuration.", + "This is what the users sees": "C'est ce que voient les utilisateurs", + "Edit": "Modifier", + "Price": "Prix", + "Are you sure you wish to delete?": "Êtes-vous sûr de vouloir supprimer ?", + "Create new": "Créer nouveau", + "Show": "Voir", + "Updated at": "Mis à jour le", + "Suspended at": "Suspendus le", + "Settings": "Paramètres", + "Dashboard icons": "Icônes du tableau de bord", + "Select panel icon": "Sélectionner l'icône du panel", + "Select panel favicon": "Sélectionner le favicon du panel", + "Token": "Token", + "Last used": "Dernière utilisation", + "Store": "Boutique", + "Currency code": "Code de devise", + "Checkout the paypal docs to select the appropriate code": "Vérifiez la doc de paypal pour sélectionner le code approprié", + "Quantity": "Quantité", + "Amount given to the user after purchasing": "Montant donné à l'utilisateur après l'achat", + "Display": "Affichage", + "This is what the user sees at store and checkout": "C'est ce que l'utilisateur voit dans la boutique et au moment de payé", + "This is what the user sees at checkout": "C'est ce que l'utilisateur voit dans au moment de payé", + "Adds 1000 credits to your account": "Ajoute 1000 crédits à votre compte", + "Active": "Actif", + "Paypal is not configured.": "Paypal n'est pas configuré.", + "To configure PayPal, head to the .env and add your PayPal’s client id and secret.": "Pour configurer PayPal, rendez-vous sur le fichier .env et ajoutez votre identifiant \"client id\" PayPal et votre \"client id secret\".", + "Useful Links": "Liens Utiles", + "Icon class name": "Nom de la classe de l'icône", + "You can find available free icons": "Vous pouvez trouver des icônes gratuites", + "Title": "Titre", + "Link": "Lien", + "Username": "Nom d'utilisateur", + "Email": "Adresse email", + "Pterodactly ID": "ID Pterodactyl", + "Server Limit": "Limite Serveur", + "Role": "Rôle", + "Administrator": "Administrateur", + "Client": "Client", + "Member": "Membre", + "New Password": "Nouveau mot de passe", + "Confirm Password": "Confirmez le mot de passe", + "This ID refers to the user account created on pterodactyls panel.": "Cet identifiant fait référence au compte utilisateur créé sur le panel Pterodactyl.", + "Only edit this if you know what youre doing :)": "Ne l'activez que si vous savez ce que vous faites.", + "Verified": "Verifié", + "Last seen": "Etait ici", + "Notify": "Notifier", + "All": "Tout", + "Send via": "Envoyer via", + "Content": "Contenu", + "Notifications": "Notifications", + "Usage": "Utilisation", + "Config": "Configuration", + "Vouchers": "Coupons", + "Voucher details": "Détails du bon de réduction", + "Memo": "Mémo", + "Code": "Code", + "Uses": "Utilisations", + "Expires at": "Expire à", + "Max": "Max", + "Random": "Aléatoire", + "Status": "Statut", + "Used / Uses": "Utilisé / Utilisations", + "Expires": "Expire", + "Please confirm your password before continuing.": "Veuillez confirmer votre mot de passe avant de continuer.", + "Password": "Mot de passe", + "Forgot Your Password?": "Mot de passe oublié ?", + "Sign in to start your session": "Identifiez-vous pour commencer votre session", + "Remember Me": "Se souvenir de moi", + "Sign In": "S'enregistrer", + "Register a new membership": "Enregistrer un nouveau membre", + "You forgot your password? Here you can easily retrieve a new password.": "Tu as oublie ton mot de passe ? Ici tu peux facilement le changé.", + "Request new password": "Changer son mot de passe", + "Login": "Connexion", + "You are only one step a way from your new password, recover your password now.": "Vous n'êtes qu'à une étape de votre nouveau mot de passe, récupérez votre mot de passe maintenant.", + "Retype password": "Retapez le mot de passe", + "Change password": "Changer le mot de passe", + "I already have a membership": "Je possède déjà un compte", + "Register": "Inscription", + "Verify Your Email Address": "Vérifiez votre adresse email", + "A fresh verification link has been sent to your email address.": "Un nouveau lien de vérification a été envoyé à votre adresse email.", + "Before proceeding, please check your email for a verification link.": "Avant de continuer, veuillez vérifier vos emails, vous devriez avoir reçu un lien de vérification.", + "If you did not receive the email": "Si vous ne recevez pas l'e-mail", + "click here to request another": "cliquez ici pour faire une nouvelle demande", + "Home": "Accueil", + "Languages": "Langues", + "See all Notifications": "Voir toutes les notifications", + "Profile": "Profil", + "Log back in": "Reconnectez-vous", + "Logout": "Déconnexion", + "Administration": "Administration", + "Overview": "Récapitulatif", + "Application API": "Application API", + "Management": "Gestion", + "Other": "Autre", + "Logs": "Logs", + "Redeem code": "Utiliser un code", + "You have not yet verified your email address": "Vous n'avez pas vérifiez votre adresse mail", + "Click here to resend verification email": "Cliquez ici pour renvoyer un mail de confirmation", + "Please contact support If you didnt receive your verification email.": "Veuillez contacter le support si vous n'avez pas reçu votre e-mail de vérification.", + "Thank you for your purchase!": "Merci pour votre achat !", + "Your payment has been confirmed; Your credit balance has been updated.": "Votre paiement à été accepter, Vos crédits son maintenant disponible sur votre compte.", + "Payment ID": "ID du paiement", + "Balance": "Solde", + "User ID": "ID d'utilisateur", + "Thanks": "Merci", + "Redeem voucher code": "Utiliser le code", + "Redeem": "Appliquer", + "All notifications": "Toutes les notifications", + "Required Email verification!": "La vérification du mail est requise !", + "Required Discord verification!": "Vérification de votre discord est requise !", + "You have not yet verified your discord account": "Vous n'avez pas vérifiez votre compte discord", + "Login with discord": "Se connecter avec Discord", + "Please contact support If you face any issues.": "Veuillez contacter le support si vous rencontrez des problèmes.", + "Due to system settings you are required to verify your discord account!": "En raison des paramètres système, vous devez vérifier votre compte Discord !", + "It looks like this hasnt been set-up correctly! Please contact support.": "Il semble que cela n'a pas été configuré correctement ! Veuillez contacter le support.", + "Change Password": "Modifier le mot de passe", + "Current Password": "Mot de passe actuel", + "Save Changes": "Sauvegarder les modifications", + "Re-Sync Discord": "Resynchroniser Discord", + "You are verified!": "Vous êtes vérifié !", + "By verifying your discord account, you receive extra Credits and increased Server amounts": "En vérifiant votre compte discord, vous recevez des crédits supplémentaires et la possibilité d'avoir plus de serveur", + "Server configuration": "Configuration du serveur", + "Error!": "Erreur !", + "Make sure to link your products to nodes and eggs.": "Assurez-vous de lier vos produits aux nodes aux eggs.", + "There has to be at least 1 valid product for server creation": "Il doit y avoir au moins 1 produit valide pour la création de serveur", + "No products available!": "Aucun produit disponible !", + "No nodes have been linked!": "Aucune node n'a été lié !", + "No nests available!": "Aucun nests disponible !", + "No eggs have been linked!": "Aucun eggs n'a été lié !", + "Software / Games": "Logiciels / Jeux", + "Please select software ...": "Veuillez sélectionner...", + "Specification": "Spécification", + "No selection": "Pas de sélection", + "per month": "par mois", + "Not enough credits!": "Pas assez de crédits !", + "Please select a configuration ...": "Veuillez sélectionner une configuration...", + "No resources found matching current configuration": "Aucune ressources trouvée pour la configuration actuelle", + "No nodes found matching current configuration": "Aucune node trouvée pour la configuration actuelle", + "Please select a node ...": "Veuillez sélectionner une node...", + "Create server": "Créer le serveur", + "Use your servers on our": "Utilisez vos serveurs sur notre", + "pterodactyl panel": "panel pterodactyl", + "Server limit reached!": "Limite de serveurs atteinte !", + "Create Server": "Créer le serveur", + "Manage": "Gérer", + "Delete server": "Supprimer le serveur", + "Price per Hour": "Prix par heure", + "Price per Month": "Prix par Mois", + "Date": "Date", + "To": "À", + "From": "De", + "Pending": "En attente", + "Subtotal": "Sous-total", + "Submit Payment": "Soumettre le Paiement", + "Payment Methods": "Moyens de paiement", + "By purchasing this product you agree and accept our terms of service": "En achetant ce produit, vous acceptez et acceptez nos conditions d'utilisation", + "There are no store products!": "Il n'y a plus de produits dans la boutique !", + "The store is not correctly configured!": "La boutique n'est pas configurée correctement !", + "Out of Credits in": "Hors crédits dans", + "days": "jours", + "hours": "heures", + "You ran out of Credits": "Vous n’avez plus de crédits", + "Profile updated": "Profil mis à jour", + "You are required to verify your email address before you can create a server.": "Vous devez vérifier votre email avant de pouvoir créer un serveur.", + "You are required to link your discord account before you can create a server.": "Vous devez vérifier votre discord avant de pouvoir créer un serveur.", + "No allocations satisfying the requirements for automatic deployment on this node were found.": "Aucune allocation répondant aux exigences de déploiement automatique sur cette node n'a été trouvée.", + "Server removed": "Serveur supprimé", + "Server created": "Serveur créé", + "An exception has occurred while trying to remove a resource \"": "Une erreur s'est produite en essayant de supprimer la ressource", + "You are required to verify your email address before you can purchase credits.": "Vous devez vérifier votre email avant de pouvoir acheter des crédits.", + "You are required to link your discord account before you can purchase ": "Vous devez vérifier votre compte discord avant de pouvoir acheter des crédits ", + "Warning!": "Attention !", + "api key created!": "La clé Api a été créée !", + "api key updated!": "La clé Api a été modifiée !", + "api key has been removed!": "La clé Api a été supprimée !", + "configuration has been updated!": "la configuration a été mise à jour!", + "Pterodactyl synced": "Synchroniser Pterodactyl", + "Your credit balance has been increased!": "Votre solde a été augmenté !", + "Payment was Canceled": "Le paiement a été annulé", + "Store item has been created!": "L'article de la boutique a été créé !", + "Store item has been updated!": "L'article de la boutique a été mis à jour !", + "Product has been updated!": "Produit mis à jour !", + "Store item has been removed!": "L'article de la boutique a été supprimé !", + "Product has been created!": "Produit a été créé !", + "Product has been removed!": "Produit a été supprimé !", + "Server has been updated!": "Le serveur à été mis à jour !", + "Icons updated!": "Icône mise à jour !", + "link has been created!": "Le lien à été créé !", + "link has been updated!": "Le lien à été mis à jour !", + "user has been removed!": "L'utilisateur a été supprimé !", + "Notification sent!": "Notification envoyée !", + "User has been updated!": "L'utilisateur a été mis à jour !", + "User does not exists on pterodactyl's panel": "L'utilisateur n'existe pas sur le panel pterodactyl", + "voucher has been created!": "Le code à été créé !", + "voucher has been updated!": "Le code à été mis à jour !", + "voucher has been removed!": "Le code à été supprimé !", + "This voucher has reached the maximum amount of uses": "Ce code a atteint le nombre maximum d'utilisations", + "This voucher has expired": "Ce code de réduction a expiré", + "You already redeemed this voucher code": "Vous avez déjà utilisé ce code promotionnel", + "You can't redeem this voucher because you would exceed the limit of ": "Vous ne pouvez pas utiliser ce bon car vous dépasseriez la limite de ", + "have been added to your balance!": "ont été ajoutés à votre solde !", + "Invoice": "Facture", + "Serial No.": "N° de série", + "Invoice date": "Date de la facture", + "Seller": "Vendeur", + "Buyer": "Acheteur", + "Address": "Adresse", + "VAT code": "Taux TVA", + "Phone": "Téléphone", + "Units": "Unités", + "Qty": "Qté", + "Discount": "Remise", + "Sub total": "Sous-total", + "Total discount": "Total des réductions", + "Taxable amount": "Montant taxable", + "Total taxes": "Total des taxes", + "Tax rate": "Taux de taxes", + "Total amount": "Montant total", + "Please pay until": "Veuillez payer avant", + "Amount in words": "Montant en toutes lettres", + "Notes": "Notes", + "Shipping": "Expédition", + "Paid": "Payé", + "Due:": "Du:", + "Invoice Settings": "Paramètres de facturation", + "Download all Invoices": "Télécharger toutes les factures", + "Enter your companys name": "Entrez le nom de votre entreprise", + "Enter your companys address": "Entrez l'adresse de votre entreprise", + "Enter your companys phone number": "Entrez le numéro de téléphone de votre entreprise", + "Enter your companys VAT id": "Entrez le site internet de votre entreprise", + "Enter your companys email address": "Entrez l'adresse mail de votre entreprise", + "Enter your companys website": "Entrez le site internet de votre entreprise", + "Enter your custom invoice prefix": "Entrez votre préfixe de facture personnalisé", + "Select Invoice Logo": "Sélectionnez le logo des factures", + "Payment Confirmation": "Confirmation de paiement", + "Payment Confirmed!": "Paiement confirmé !", + "Server Creation Error": "Erreur lors de la création de votre serveur", + "Your servers have been suspended!": "Votre serveur à été suspendu !", + "To automatically re-enable your server/s, you need to purchase more credits.": "Pour réactiver automatiquement votre ou vos serveurs, vous devez racheter des crédits.", + "Purchase credits": "Acheter des crédits", + "If you have any questions please let us know.": "N'hésitez pas à nous contacter si vous avez des questions.", + "Regards": "Cordialement", + "Getting started!": "Commencer !", + "EXPIRED": "EXPIRÉ", + "VALID": "VALIDE", + "Unsuspend": "Annuler la suspension", + "Suspend": "Suspendre", + "Delete": "Supprimer", + "Login as User": "Connectez-vous en tant qu'utilisateur", + "Clone": "Dupliquer", + "Amount due": "Montant à payer", + "Your Payment was successful!": "Votre paiement a été reçu avec succès !", + "Hello": "Bonjour", + "Your payment was processed successfully!": "Votre requête a été traitée avec succès." +} diff --git a/resources/lang/hi.json b/resources/lang/hi.json new file mode 100644 index 00000000..8ab56eca --- /dev/null +++ b/resources/lang/hi.json @@ -0,0 +1,328 @@ +{ + "Activity Logs": "गतिविधि लॉग", + "No recent activity from cronjobs": "Cronjobs से कोई हाल की गतिविधि नहीं", + "Check the docs for it here": "इसके लिए डॉक्स यहां देखें", + "Are cronjobs running?": "क्या क्रोनजॉब चल रहे हैं?", + "Causer": "वजह", + "Description": "विवरण", + "Created at": "पर बनाया गया", + "Edit Configuration": "कॉन्फ़िगरेशन संपादित करें", + "Text Field": "पाठ्य से भरा", + "Cancel": "रद्द करें", + "Close": "बंद", + "Save": "सेव करें", + "true": "सही", + "false": "असत्य", + "Configurations": "विन्यास", + "Dashboard": "डैशबोर्ड", + "Key": "चाभी", + "Value": "मूल्य", + "Type": "प्रकार", + "Admin Overview": "व्यवस्थापक अवलोकन", + "Support server": "समर्थन सर्वर", + "Documentation": "प्रलेखन", + "Github": "गिटहब", + "Support ControlPanel": "समर्थन नियंत्रण पैनल", + "Servers": "सर्वरस", + "Users": "कर्मचारी", + "Total": "कुल", + "Payments": "भुगतान", + "Pterodactyl": "टेरोडक्टाइल", + "Sync": "साथ - साथ करना", + "Resources": "साधन", + "Count": "गिनती", + "Locations": "स्थानों", + "Node": "नोड", + "Nodes": "नोड्स", + "Nests": "घोसले", + "Eggs": "अंडे", + "Last updated :date": "आखरी अपडेट: दिनांक", + "Purchase": "खरीदें", + "ID": "आइडी", + "User": "उपयोगकर्ता", + "Amount": "मात्रा", + "Product Price": "प्रोडक्ट की कीमत", + "Tax": "कर", + "Total Price": "कुल कीमत", + "Payment_ID": "भुगतान_आईडी", + "Payer_ID": "ग्राहक_ID", + "Product": "उत्पाद", + "Products": "उत्पादों", + "Create": "सृजन करना", + "Product Details": "उत्पाद विवरण", + "Server Details": "सर्वर जानकारी", + "Product Linking": "उत्पाद लिंकिंग", + "Name": "नाम", + "Price in": "कीमत में", + "Memory": "मेमोरी", + "Cpu": "Cpu", + "Swap": "स्वैप", + "Disk": "डिस्क", + "Minimum": "न्यूनतम", + "IO": "मैं", + "Databases": "डेटाबेस", + "Database": "डेटाबेस", + "Backups": "बैकअप", + "Allocations": "आवंटन", + "Disabled": "विकलांग", + "Submit": "प्रस्तुत करना", + "This product will only be available for these nodes": "यह उत्पाद केवल इन नोड्स के लिए उपलब्ध होगा", + "This product will only be available for these eggs": "यह उत्पाद केवल इन अंडों के लिए उपलब्ध होगा", + "Will hide this option from being selected": "इस विकल्प को चुने जाने से छिपा देंगे", + "Link your products to nodes and eggs to create dynamic pricing for each option": "प्रत्येक विकल्प के लिए गतिशील मूल्य निर्धारण बनाने के लिए अपने उत्पादों को नोड्स और अंडों से लिंक करें", + "Setting to -1 will use the value from configuration.": "-1 पर सेट करने से कॉन्फ़िगरेशन से मान का उपयोग होगा।", + "This is what the users sees": "यह वही है जो उपयोगकर्ता देखता है", + "Edit": "ऐडिट", + "Price": "कीमत", + "Are you sure you wish to delete?": "क्या आप सचमुच बंद करना चाहते हैं?", + "Create new": "नया बनाओ", + "Show": "दिखाएँ", + "Updated at": "अपडेट किया गया", + "Suspended at": "पर निलंबित", + "Settings": "सेटिंग्स", + "Dashboard icons": "डैशबोर्ड आइकन", + "Select panel icon": "पैनल आइकन चुनें", + "Select panel favicon": "पैनल Favicon चुनें", + "Token": "टोकन", + "Last used": "पिछले इस्तेमाल किया", + "Store": "दुकान", + "Currency code": "मुद्रा कोड", + "Checkout the paypal docs to select the appropriate code": "उपयुक्त कोड का चयन करने के लिए पेपैल दस्तावेज़ चेकआउट करें", + "Quantity": "मात्रा", + "Amount given to the user after purchasing": "खरीद के बाद यूजर को दी जाने वाली राशि", + "Display": "डिस्प्ले", + "This is what the user sees at store and checkout": "उपयोगकर्ता स्टोर और चेकआउट में यही देखता है", + "This is what the user sees at checkout": "चेकआउट के समय उपयोगकर्ता यही देखता है", + "Adds 1000 credits to your account": "आपके खाते में 1000 क्रेडिट जोड़ता है", + "Active": "सक्रिय", + "Paypal is not configured.": "पेपैल कॉन्फ़िगर नहीं है।", + "To configure PayPal, head to the .env and add your PayPal’s client id and secret.": "पेपैल को कॉन्फ़िगर करने के लिए, .env पर जाएं और अपनी पेपैल की क्लाइंट आईडी और गुप्त जोड़ें", + "Useful Links": "उपयोगी कड़ियां", + "Icon class name": "आइकन कक्षा का नाम", + "You can find available free icons": "आप उपलब्ध मुफ्त आइकन पा सकते हैं", + "Title": "शीर्षक", + "Link": "लिंक", + "Username": "उपयोगकर्ता नाम", + "Email": "ईमेल", + "Pterodactly ID": "टेरोडक्टाइल आइडी", + "Server Limit": "सर्वर सीमा", + "Role": "भूमिका", + "Administrator": "प्रशासक", + "Client": "ग्राहक", + "Member": "सदस्य", + "New Password": "नया पासवर्ड", + "Confirm Password": "पासवर्ड की पुष्टि कीजिये", + "This ID refers to the user account created on pterodactyls panel.": "यह आईडी pterodactyls पैनल पर बनाए गए उपयोगकर्ता खाते को संदर्भित करता है।", + "Only edit this if you know what youre doing :)": "इसे केवल तभी संपादित करें जब आप जानते हों कि आप क्या कर रहे हैं :)", + "Verified": "सत्यापित", + "Last seen": "अंतिम बार देखा", + "Notify": "सूचित करें?", + "All": "सब", + "Send via": "के द्वारा भेजें", + "Content": "विषय", + "Notifications": "सूचनाएं", + "Usage": "प्रयोग", + "Config": "कॉन्फ़िग", + "Vouchers": "वाउचर", + "Voucher details": "वाउचर विवरण", + "Memo": "ज्ञापन", + "Code": "कोड", + "Uses": "उपयोगकर्ता", + "Expires at": "पर समाप्त हो रहा है", + "Max": "मैक्स", + "Random": "यादृच्छिक रूप से", + "Status": "स्थिति", + "Used / Uses": "प्रयुक्त / उपयोग", + "Expires": "समय-सीमा समाप्त", + "Please confirm your password before continuing.": "जारी रखने से पहले कृपया अपने पासवर्ड की पुष्टि करें।", + "Password": "पासवर्ड", + "Forgot Your Password?": "अपना पासवर्ड भूल गए?", + "Sign in to start your session": "अपना सत्र शुरू करने के लिए साइन इन करें", + "Remember Me": "मुझे याद रखना", + "Sign In": "साइन इन", + "Register a new membership": "एक नई सदस्यता पंजीकृत करें", + "You forgot your password? Here you can easily retrieve a new password.": "आप अपना पासवर्ड भूल गए? यहां आप आसानी से एक नया पासवर्ड प्राप्त कर सकते हैं।", + "Request new password": "नए पासवर्ड का अनुरोध करें", + "Login": "लॉग इन करें", + "You are only one step a way from your new password, recover your password now.": "आप अपने नए पासवर्ड से केवल एक कदम दूर हैं, अपना पासवर्ड अभी पुनर्प्राप्त करें।", + "Retype password": "पासवर्ड फिर से लिखें", + "Change password": "पासवर्ड बदलें", + "I already have a membership": "मेरे पास पहले से ही सदस्यता है", + "Register": "खाता खोलें", + "Verify Your Email Address": "अपने ईमेल पते की पुष्टि करें", + "A fresh verification link has been sent to your email address.": "आपके ईमेल पते पर एक नया सत्यापन लिंक भेज दिया गया है।", + "Before proceeding, please check your email for a verification link.": "आगे बढ़ने से पहले, कृपया सत्यापन लिंक के लिए अपना ईमेल देखें।", + "If you did not receive the email": "अगर आपको ईमेल प्राप्त नहीं हुआ है", + "click here to request another": "दूसरे का अनुरोध करने के लिए यहां क्लिक करें", + "Home": "घर", + "Languages": "बोली", + "See all Notifications": "सभी सूचनाएं देखें", + "Profile": "प्रोफ़ाइल", + "Log back in": "वापस लॉग इन करें", + "Logout": "लॉग आउट करें", + "Administration": "प्रशासन", + "Overview": "जानकारी", + "Application API": "आवेदन एपीआई", + "Management": "प्रबंध", + "Other": "दूसरा", + "Logs": "लॉग्स", + "Redeem code": "रीडीम कोड", + "You have not yet verified your email address": "आपने अभी तक अपना ईमेल पता सत्यापित नहीं किया है", + "Click here to resend verification email": "सत्यापन ईमेल पुनः भेजने के लिए यहां क्लिक करें", + "Please contact support If you didnt receive your verification email.": "कृपया समर्थन से संपर्क करें यदि आपको अपना सत्यापन ईमेल प्राप्त नहीं हुआ है", + "Thank you for your purchase!": "आपकी खरीदारी के लिए धन्यवाद!", + "Your payment has been confirmed; Your credit balance has been updated.": "आपके भुगतान की पुष्टि हो गई है; आपका क्रेडिट बैलेंस अपडेट कर दिया गया है।", + "Payment ID": "भुगतान आईडी", + "Balance": "बाकी रकम", + "User ID": "उपयोगकर्ता आइडी", + "Thanks": "धन्यवाद!", + "Redeem voucher code": "वाउचर कोड रिडीम करें", + "Redeem": "एवज", + "All notifications": "सारे अधिसूचना", + "Required Email verification!": "आवश्यक ईमेल सत्यापन!", + "Required Discord verification!": "आवश्यक कलह सत्यापन!", + "You have not yet verified your discord account": "आपने अभी तक अपने कलह खाते को सत्यापित नहीं किया है", + "Login with discord": "कलह के साथ लॉगिन करें", + "Please contact support If you face any issues.": "कृपया समर्थन से संपर्क करें यदि आपको कोई समस्या आती है।", + "Due to system settings you are required to verify your discord account!": "सिस्टम सेटिंग्स के कारण आपको अपने कलह खाते को सत्यापित करने की आवश्यकता है!", + "It looks like this hasnt been set-up correctly! Please contact support.": "ऐसा लगता है कि इसे ठीक से सेट अप नहीं किया गया है! कृपया समर्थन से संपर्क करें।", + "Change Password": "पासवर्ड बदलें", + "Current Password": "वर्तमान पासवर्ड", + "Save Changes": "परिवर्तनों को सुरक्षित करें", + "Re-Sync Discord": "पुन: समन्वयन कलह", + "You are verified!": "आप सत्यापित हैं!", + "By verifying your discord account, you receive extra Credits and increased Server amounts": "अपने कलह खाते को सत्यापित करके, आप अतिरिक्त क्रेडिट और बढ़ी हुई सर्वर राशि प्राप्त करते हैं", + "Server configuration": "सर्वर विन्यास", + "Error!": "एरर", + "Make sure to link your products to nodes and eggs.": "अपने उत्पादों को नोड्स और अंडों से जोड़ना सुनिश्चित करें।", + "There has to be at least 1 valid product for server creation": "सर्वर निर्माण के लिए कम से कम 1 वैध उत्पाद होना चाहिए", + "No products available!": "कोई उत्पाद उपलब्ध नहीं है!", + "No nodes have been linked!": "कोई नोड लिंक नहीं किया गया है!", + "No nests available!": "कोई घोंसला उपलब्ध नहीं है!", + "No eggs have been linked!": "कोई अंडे नहीं जोड़े गए हैं!", + "Software / Games": "सॉफ्टवेयर / खेल", + "Please select software ...": "कृपया सॉफ्टवेयर चुनें...", + "Specification": "विनिर्देश", + "No selection": "कोई चयन नहीं", + "per month": "प्रति महीना", + "Not enough credits!": "पर्याप्त क्रेडिट नहीं!", + "Please select a configuration ...": "कृपया कोई कॉन्फ़िगरेशन चुनें...", + "No resources found matching current configuration": "वर्तमान कॉन्फ़िगरेशन से मेल खाने वाला कोई संसाधन नहीं मिला", + "No nodes found matching current configuration": "वर्तमान कॉन्फ़िगरेशन से मेल खाने वाला कोई नोड नहीं मिला", + "Please select a node ...": "कृपया एक नोड चुनें...", + "Create server": "सर्वर बनाएं", + "Use your servers on our": "हमारे पर अपने सर्वर का प्रयोग करें", + "pterodactyl panel": "पटरोडैक्टाइल पैनल", + "Server limit reached!": "सर्वर की सीमा पूरी हो गई!", + "Create Server": "अपना सर्वर बनाएं", + "Manage": "मॅनेज", + "Delete server": "सर्वर हटाएं", + "Price per Hour": "पैसा प्रति घंटा\n", + "Price per Month": "मूल्य प्रति माह", + "Date": "दिनांक", + "To": "को", + "From": "से", + "Pending": "लंबित", + "Subtotal": "उप-योग", + "Submit Payment": "भुगतान सबमिट करें", + "Payment Methods": "भुगतान की विधि", + "By purchasing this product you agree and accept our terms of service": "इस उत्पाद को खरीदकर आप हमारी सेवा की शर्तों से सहमत होते हैं और स्वीकार करते हैं", + "There are no store products!": "कोई स्टोर उत्पाद नहीं हैं!", + "The store is not correctly configured!": "स्टोर सही ढंग से कॉन्फ़िगर नहीं किया गया है!", + "Out of Credits in": "क्रेडिट से बाहर", + "days": "दिन", + "hours": "घंटे", + "You ran out of Credits": "आपका क्रेडिट खत्म हो गया", + "Profile updated": "प्रोफ़ाइल अपडेट", + "You are required to verify your email address before you can create a server.": "सर्वर बनाने से पहले आपको अपना ईमेल पता सत्यापित करना होगा।", + "You are required to link your discord account before you can create a server.": "सर्वर बनाने से पहले आपको अपने डिसॉर्डर अकाउंट को लिंक करना होगा।", + "No allocations satisfying the requirements for automatic deployment on this node were found.": "इस नोड पर स्वचालित परिनियोजन के लिए आवश्यकताओं को पूरा करने वाला कोई आवंटन नहीं मिला।", + "Server removed": "सर्वर हटा दिया गया", + "Server created": "सर्वर बनाया", + "An exception has occurred while trying to remove a resource \"": "\"संसाधन को निकालने का प्रयास करते समय एक अपवाद उत्पन्न हुआ\"", + "You are required to verify your email address before you can purchase credits.": "क्रेडिट खरीदने से पहले आपको अपना ईमेल पता सत्यापित करना होगा।", + "You are required to link your discord account before you can purchase ": "खरीदने से पहले आपको अपने कलह खाते को लिंक करना होगा ", + "Warning!": "चेतावनी!", + "api key created!": "एपीआई कुंजी बनाई गई!", + "api key updated!": "एपीआई कुंजी अद्यतन!", + "api key has been removed!": "एपीआई कुंजी हटा दी गई है!", + "configuration has been updated!": "कॉन्फ़िगरेशन अपडेट कर दिया गया है!", + "Pterodactyl synced": "टेरोडक्टाइल सिंक्रनाइज़", + "Your credit balance has been increased!": "आपका क्रेडिट बैलेंस बढ़ा दिया गया है!", + "Payment was Canceled": "भुगतान रद्द कर दिया गया था", + "Store item has been created!": "स्टोर आइटम बनाया गया है!", + "Store item has been updated!": "स्टोर आइटम अपडेट कर दिया गया है!", + "Product has been updated!": "उत्पाद अपडेट कर दिया गया है!", + "Store item has been removed!": "स्टोर आइटम हटा दिया गया है!", + "Product has been created!": "उत्पाद बनाया गया है!", + "Product has been removed!": "उत्पाद हटा दिया गया है!", + "Server has been updated!": "सर्वर अपडेट कर दिया गया है!", + "Icons updated!": "आइकन अपडेट किए गए!", + "link has been created!": "लिंक बनाया गया है!", + "link has been updated!": "लिंक अपडेट कर दिया गया है!", + "user has been removed!": "उपयोगकर्ता को हटा दिया गया है!", + "Notification sent!": "सूचना भेजी गई!", + "User has been updated!": "उपयोगकर्ता अपडेट कर दिया गया है!", + "User does not exists on pterodactyl's panel": "उपयोगकर्ता pterodactyl के पैनल पर मौजूद नहीं है", + "voucher has been created!": "वाउचर बनाया गया है!", + "voucher has been updated!": "वाउचर अपडेट कर दिया गया है!", + "voucher has been removed!": "वाउचर हटा दिया गया है!", + "This voucher has reached the maximum amount of uses": "यह वाउचर उपयोग की अधिकतम मात्रा तक पहुंच गया है", + "This voucher has expired": "यह वाउचर समाप्त हो गया है", + "You already redeemed this voucher code": "आप इस वाउचर कोड को पहले ही भुना चुके हैं", + "You can't redeem this voucher because you would exceed the limit of ": "आप इस वाउचर को रिडीम नहीं कर सकते क्योंकि आप की सीमा को पार कर जाएंगे ", + "have been added to your balance!": "आपकी शेष राशि में जोड़ दिया गया है!", + "Invoice": "इनवॉयस", + "Serial No.": "सीरीयल नम्बर।", + "Invoice date": "इनवॉयस तारीख", + "Seller": "विक्रेता", + "Buyer": "खरीदार", + "Address": "पता", + "VAT code": "वैट कोड", + "Phone": "फोन", + "Units": "इकाइयों", + "Qty": "मात्रा", + "Discount": "छूट", + "Sub total": "उप कुल", + "Total discount": "कुल छूट", + "Taxable amount": "कर योग्य राशि", + "Total taxes": "कुल कर", + "Tax rate": "कर की दर", + "Total amount": "कुल रकम", + "Please pay until": "कृपया भुगतान करें", + "Amount in words": "राशि शब्दों में", + "Notes": "टिप्पणियाँ", + "Shipping": "शिपिंग", + "Paid": "भुगतान किया गया", + "Due:": "देय:", + "Invoice Settings": "चालान सेटिंग", + "Download all Invoices": "सभी चालान डाउनलोड करें", + "Enter your companys name": "अपनी कंपनी का नाम दर्ज करें", + "Enter your companys address": "अपनी कंपनी का पता दर्ज करें", + "Enter your companys phone number": "अपनी कंपनी का फ़ोन नंबर दर्ज करें", + "Enter your companys VAT id": "अपनी कंपनी की वैट आईडी दर्ज करें", + "Enter your companys email address": "अपनी कंपनी का ईमेल पता दर्ज करें", + "Enter your companys website": "अपनी कंपनी की वेबसाइट दर्ज करें", + "Enter your custom invoice prefix": "अपना कस्टम चालान उपसर्ग दर्ज करें", + "Select Invoice Logo": "चालान लोगो का चयन करें", + "Payment Confirmation": "भुगतान की पुष्टि", + "Payment Confirmed!": "कीमत का भुगतान पूरा हुआ!", + "Server Creation Error": "सर्वर निर्माण त्रुटि", + "Your servers have been suspended!": "आपके सर्वर निलंबित कर दिए गए हैं!", + "To automatically re-enable your server/s, you need to purchase more credits.": "अपने सर्वर/सर्वर को स्वचालित रूप से पुन: सक्षम करने के लिए, आपको अधिक क्रेडिट खरीदने की आवश्यकता है।", + "Purchase credits": "क्रेडिट खरीदें", + "If you have any questions please let us know.": "यदि आपके पास कोई प्रश्न है, तो हमें बताएं।", + "Regards": "सादर", + "Getting started!": "शुरू करना!", + "EXPIRED": "समाप्त हो गई है", + "VALID": "वैध", + "Unsuspend": "निलंबन रद्द किया", + "Suspend": "निलंबित करें", + "Delete": "हटाएं", + "Login as User": "उपयोगकर्ता के रूप में लॉगिन करें", + "Clone": "क्लोन", + "Amount due": "देय राशि", + "Your Payment was successful!": "आपका भुगतान सफल रहा!", + "Hello": "नमस्ते", + "Your payment was processed successfully!": "आपका भुगतान सफलतापूर्वक संसाधित किया गया था!" +} diff --git a/resources/lang/it.json b/resources/lang/it.json new file mode 100644 index 00000000..8916d17e --- /dev/null +++ b/resources/lang/it.json @@ -0,0 +1,328 @@ +{ + "Activity Logs": "Registro attività", + "No recent activity from cronjobs": "Nessuna attività recente dai cronjobs", + "Check the docs for it here": "Controlla la documentazione qui", + "Are cronjobs running?": "I cronjobs stanno funzionando?", + "Causer": "Causa", + "Description": "Descrizione", + "Created at": "Creato il", + "Edit Configuration": "Modifica configurazione", + "Text Field": "Campo di Testo", + "Cancel": "Annulla", + "Close": "Chiudi", + "Save": "Salva", + "true": "vero", + "false": "falso", + "Configurations": "Configurazioni", + "Dashboard": "Dashboard", + "Key": "Chiave", + "Value": "Valore", + "Type": "Tipo", + "Admin Overview": "Panoramica di amministrazione", + "Support server": "Server di supporto", + "Documentation": "Documentazione", + "Github": "GitHub", + "Support ControlPanel": "Supporta ControlPanel", + "Servers": "Servers", + "Users": "Utenti", + "Total": "Totale", + "Payments": "Pagamenti", + "Pterodactyl": "Pterodactyl", + "Sync": "Sincronizza", + "Resources": "Risorse", + "Count": "Conteggio", + "Locations": "Luoghi", + "Node": "Nodo", + "Nodes": "Nodi", + "Nests": "Nidi", + "Eggs": "Uova", + "Last updated :date": "Ultimo aggiornamento :date", + "Purchase": "Acquisto", + "ID": "ID", + "User": "Utente", + "Amount": "Quantità", + "Product Price": "Prezzo del Prodotto", + "Tax": "Tasse", + "Total Price": "Prezzo Totale", + "Payment_ID": "Payment_ID", + "Payer_ID": "Payer_ID", + "Product": "Prodotto", + "Products": "Prodotti", + "Create": "Crea", + "Product Details": "Dettagli sul prodotto", + "Server Details": "Dettagli del server", + "Product Linking": "Collegamenti del prodotto", + "Name": "Nome", + "Price in": "Prezzo in", + "Memory": "Memoria", + "Cpu": "Cpu", + "Swap": "Swap", + "Disk": "Disco", + "Minimum": "Minimo", + "IO": "IO", + "Databases": "Database", + "Database": "Database", + "Backups": "Backups", + "Allocations": "Assegnazioni", + "Disabled": "Disattivato", + "Submit": "Invia", + "This product will only be available for these nodes": "Questo prodotto sarà disponibile solo per questi nodi", + "This product will only be available for these eggs": "Questo prodotto sarà disponibile solo per queste uova (eggs)", + "Will hide this option from being selected": "Nasconderà questa opzione dall’essere selezionata", + "Link your products to nodes and eggs to create dynamic pricing for each option": "Connetti i tuoi prodotti ai nodi e le uova (eggs) per creare un prezzo dinamico per ogni opzione", + "Setting to -1 will use the value from configuration.": "Impostare a -1 farà utilizzare il valore dalla configurazione.", + "This is what the users sees": "Questo è quello che gli utenti vedono", + "Edit": "Modifica", + "Price": "Prezzo", + "Are you sure you wish to delete?": "Sei sicuro di voler cancellare?", + "Create new": "Crea nuovo", + "Show": "Mostra", + "Updated at": "Aggiornato il", + "Suspended at": "Sospeso il", + "Settings": "Impostazioni", + "Dashboard icons": "Icone della Dashboard", + "Select panel icon": "Seleziona l’icona del pannello", + "Select panel favicon": "Seleziona la favicon del pannello", + "Token": "Token", + "Last used": "Ultimo utilizzo", + "Store": "Negozio", + "Currency code": "Codice valuta", + "Checkout the paypal docs to select the appropriate code": "Controlla la documentazione di PayPal per selezionare il codice appropriato", + "Quantity": "Quantità", + "Amount given to the user after purchasing": "Quantità data all’utente dopo l’acquisto", + "Display": "Display", + "This is what the user sees at store and checkout": "Questo è quello che l’utente vede nel negozio e al checkout", + "This is what the user sees at checkout": "Questo è quello che l’utente vede al checkout", + "Adds 1000 credits to your account": "Aggiunge 1000 crediti al tuo account", + "Active": "Attivo", + "Paypal is not configured.": "PayPal non è configurato.", + "To configure PayPal, head to the .env and add your PayPal’s client id and secret.": "Per configurare PayPal, aggiungi il tuo client id ed il codice segreto nel file .env.", + "Useful Links": "Link utili", + "Icon class name": "Nome della classe dell’icona", + "You can find available free icons": "Puoi trovare icone disponibili gratis", + "Title": "Titolo", + "Link": "Link", + "Username": "Nome utente", + "Email": "Email", + "Pterodactly ID": "Pterodactyl ID", + "Server Limit": "Limite server", + "Role": "Ruolo", + "Administrator": "Amministratore", + "Client": "Cliente", + "Member": "Membro", + "New Password": "Nuova password", + "Confirm Password": "Conferma password", + "This ID refers to the user account created on pterodactyls panel.": "Questo ID si riferisce all’account creato sullo Pterodactyl Panel.", + "Only edit this if you know what youre doing :)": "Modifica questo solo se sai cosa stai facendo :)", + "Verified": "Verificato", + "Last seen": "Visto l'ultima volta", + "Notify": "Notifica", + "All": "Tutti", + "Send via": "Invia tramite", + "Content": "Contenuto", + "Notifications": "Notifiche", + "Usage": "Uso", + "Config": "Configurazione", + "Vouchers": "Vouchers", + "Voucher details": "Dettagli del buono", + "Memo": "Memo", + "Code": "Codice", + "Uses": "Utilizzi", + "Expires at": "Scade il", + "Max": "Massimo", + "Random": "Casuale", + "Status": "Stato", + "Used / Uses": "Usato / Utilizzi", + "Expires": "Scade", + "Please confirm your password before continuing.": "Conferma la password prima di continuare.", + "Password": "Password", + "Forgot Your Password?": "Password dimenticata?", + "Sign in to start your session": "Accedi per iniziare la sessione", + "Remember Me": "Ricordami", + "Sign In": "Accedi", + "Register a new membership": "Registrati", + "You forgot your password? Here you can easily retrieve a new password.": "Hai dimenticato la tua password? Ne puoi creare una nuova facilmente, qui.", + "Request new password": "Richiedi una nuova password", + "Login": "Accedi", + "You are only one step a way from your new password, recover your password now.": "Sei a un solo step dalla tua nuova password, ripristinala ora.", + "Retype password": "Reinserisci password", + "Change password": "Cambia password", + "I already have a membership": "Già registrato?", + "Register": "Registrati", + "Verify Your Email Address": "Verifica il tuo indirizzo e-mail", + "A fresh verification link has been sent to your email address.": "Un nuovo link di verifica è stato inviato al tuo indirizzo email.", + "Before proceeding, please check your email for a verification link.": "Prima di procedere, controlla la tua email per un link di verifica.", + "If you did not receive the email": "Se non hai ricevuto l'email", + "click here to request another": "clicca qui per richiederne un'altra", + "Home": "Home", + "Languages": "Lingue", + "See all Notifications": "Vedi tutte le notifiche", + "Profile": "Profilo", + "Log back in": "Fai il login di nuovo", + "Logout": "Disconnettiti", + "Administration": "Amministrazione", + "Overview": "Sommario", + "Application API": "API Applicazione", + "Management": "Gestione", + "Other": "Altro", + "Logs": "Registri", + "Redeem code": "Riscatta un codice", + "You have not yet verified your email address": "Non hai ancora verificato il tuo indirizzo email", + "Click here to resend verification email": "Clicca qui per inviare nuovamente l'e-mail di verifica", + "Please contact support If you didnt receive your verification email.": "Contatta il supporto se non hai ricevuto la mail di verifica.", + "Thank you for your purchase!": "Grazie per l'acquisto!", + "Your payment has been confirmed; Your credit balance has been updated.": "Il tuo pagamento è stato confermato; il tuo bilancio di crediti è stato aggiornato.", + "Payment ID": "ID pagamento", + "Balance": "Saldo", + "User ID": "ID utente", + "Thanks": "Grazie", + "Redeem voucher code": "Riscatta il codice voucher", + "Redeem": "Riscatta", + "All notifications": "Tutte le notifiche", + "Required Email verification!": "Verifica dell’indirizzo email richiesta!", + "Required Discord verification!": "Verifica dell’account Discord richiesta!", + "You have not yet verified your discord account": "Non hai ancora verificato il tuo account Discord", + "Login with discord": "Accedi con Discord", + "Please contact support If you face any issues.": "Contatta il supporto se incontri dei problemi.", + "Due to system settings you are required to verify your discord account!": "Devi verificare il tuo account Discord per alcune impostazioni di sistema!", + "It looks like this hasnt been set-up correctly! Please contact support.": "Sembra che non è stato configurato correttamente! Contatta il supporto.", + "Change Password": "Cambia password", + "Current Password": "Password attuale", + "Save Changes": "Salva modifiche", + "Re-Sync Discord": "Ri-sincronizza Discord", + "You are verified!": "Sei verificato!", + "By verifying your discord account, you receive extra Credits and increased Server amounts": "Ricevi crediti extra è un numero di slot per server aumentato verificando il tuo account", + "Server configuration": "Configurazione del server", + "Error!": "Errore!", + "Make sure to link your products to nodes and eggs.": "Assicurati di connettere i prodotti ai nodi e alle uova (eggs).", + "There has to be at least 1 valid product for server creation": "Deve esserci almeno un prodotto valido per creare un server", + "No products available!": "Nessun prodotto disponibile!", + "No nodes have been linked!": "Nessun nodo è stato connesso!", + "No nests available!": "Nessun nido (nest) disponibile!", + "No eggs have been linked!": "Nessun uovo (egg) è stato connesso!", + "Software / Games": "Software / Giochi", + "Please select software ...": "Per favore selezione il software...", + "Specification": "Specifiche", + "No selection": "Nessuna selezione", + "per month": "al mese", + "Not enough credits!": "Crediti insufficienti!", + "Please select a configuration ...": "Per favore seleziona una configurazione…", + "No resources found matching current configuration": "Nessuna risorsa trovata con la configurazione attuale", + "No nodes found matching current configuration": "Nessuna nodo con la configurazione attuale trovato", + "Please select a node ...": "Per favore seleziona un nodo ...", + "Create server": "Crea un server", + "Use your servers on our": "Utilizza i tuoi server sul nostro", + "pterodactyl panel": "pannello pterodactyl", + "Server limit reached!": "Limite server raggiunto!", + "Create Server": "Crea un server", + "Manage": "Gestisci", + "Delete server": "Cancella un server", + "Price per Hour": "Costo all’ora", + "Price per Month": "Costo al mese", + "Date": "Data", + "To": "A", + "From": "Da", + "Pending": "In attesa", + "Subtotal": "Totale Parziale", + "Submit Payment": "Invia pagamento", + "Payment Methods": "Metodi di Pagamento", + "By purchasing this product you agree and accept our terms of service": "Acquistando il prodotto accetti i nostri termini di servizio", + "There are no store products!": "Non ci sono prodotti del negozio!", + "The store is not correctly configured!": "Il negozio non è configurato correttamente!", + "Out of Credits in": "Crediti esauriti in", + "days": "giorni", + "hours": "ore", + "You ran out of Credits": "Hai finito i crediti", + "Profile updated": "Profilo aggiornato", + "You are required to verify your email address before you can create a server.": "Devi verificare il tuo indirizzo e-mail prima di poter creare un server.", + "You are required to link your discord account before you can create a server.": "Devi connettere il tuo account Discord prima di poter creare un server.", + "No allocations satisfying the requirements for automatic deployment on this node were found.": "Nessuna allocazione trovata soddisfa i requisiti per abilitare il deployment automatico su questo nodo.", + "Server removed": "Server rimosso", + "Server created": "Server creato", + "An exception has occurred while trying to remove a resource \"": "Si è verificato un errore cercando di rimuovere la risorsa", + "You are required to verify your email address before you can purchase credits.": "Devi verificare il tuo indirizzo e-mail prima di poter acquistare crediti.", + "You are required to link your discord account before you can purchase ": "Devi connettere il tuo account Discord prima di poter acquistare crediti ", + "Warning!": "Attenzione!", + "api key created!": "api key creata!", + "api key updated!": "api key aggiornata!", + "api key has been removed!": "l’api key è stata rimossa!", + "configuration has been updated!": "la configurazione è stata aggiornata!", + "Pterodactyl synced": "Pterodactyl sincronizzato", + "Your credit balance has been increased!": "Il you bilancio di crediti è aumentato!", + "Payment was Canceled": "Pagamento annullato", + "Store item has been created!": "L’articolo è stato creato!", + "Store item has been updated!": "L’articolo è stato aggiornato!", + "Product has been updated!": "Il prodotto è stato aggiornato!", + "Store item has been removed!": "Io prodotto è stato rimosso!", + "Product has been created!": "Il prodotto è stato creato!", + "Product has been removed!": "Il prodotto è stato rimosso!", + "Server has been updated!": "Il server è stato aggiornato!", + "Icons updated!": "Le icone sono state aggiornate!", + "link has been created!": "la connessione è stata creata!", + "link has been updated!": "la connessione è stata aggiornata!", + "user has been removed!": "l’utente è stato rimosso!", + "Notification sent!": "Notifica inviata!", + "User has been updated!": "L’utente è stato aggiornato!", + "User does not exists on pterodactyl's panel": "L’utente non esiste sullo pterodactyl panel", + "voucher has been created!": "il voucher è stato creato!", + "voucher has been updated!": "il voucher è stato aggiornato!", + "voucher has been removed!": "il voucher è stato rimosso!", + "This voucher has reached the maximum amount of uses": "Questo voucher ha raggiunto il numero massimo di utilizzi", + "This voucher has expired": "Questo voucher è scaduto", + "You already redeemed this voucher code": "Hai già riscattato questo voucher", + "You can't redeem this voucher because you would exceed the limit of ": "Non puoi riscattare questo voucher perché raggiungeresti il limite di ", + "have been added to your balance!": "sono stati aggiunti al tuo saldo!", + "Invoice": "Fattura", + "Serial No.": "Numero di serie.", + "Invoice date": "Data della fattura", + "Seller": "Venditore", + "Buyer": "Cliente", + "Address": "Indirizzo", + "VAT code": "Partita IVA", + "Phone": "Telefono", + "Units": "Unità", + "Qty": "Quantità", + "Discount": "Sconto", + "Sub total": "Sub totale", + "Total discount": "Sconto Totale", + "Taxable amount": "Importo tassabile", + "Total taxes": "Totale tasse", + "Tax rate": "Percentuale tasse", + "Total amount": "Importo Totale", + "Please pay until": "Per favore paga fino", + "Amount in words": "Numero in parole", + "Notes": "Note", + "Shipping": "Spedizione", + "Paid": "Pagamento", + "Due:": "Scadenza:", + "Invoice Settings": "Impostazioni fattura", + "Download all Invoices": "Scarica tutte le fatture", + "Enter your companys name": "Inserisci il nome della tua azienda", + "Enter your companys address": "Inserisci l'indirizzo della tua azienda", + "Enter your companys phone number": "Inserisci il numero di telefono dell'azienda", + "Enter your companys VAT id": "Inserisci il numero di partita IVA della tua azienda", + "Enter your companys email address": "Inserisci l’indirizzo email della tua azienda", + "Enter your companys website": "Inserisci il sito della tua azienda", + "Enter your custom invoice prefix": "Inserisci il prefisso personalizzato della fattura", + "Select Invoice Logo": "Inserisci il logo della fattura", + "Payment Confirmation": "Conferma pagamento", + "Payment Confirmed!": "Pagamento confermato!", + "Server Creation Error": "Errore di creazione del server", + "Your servers have been suspended!": "I tuoi server sono stati sospesi!", + "To automatically re-enable your server/s, you need to purchase more credits.": "Per ri-abilitare i tuoi server automaticamente, devi acquistare più crediti.", + "Purchase credits": "Acquista crediti", + "If you have any questions please let us know.": "Se hai una domanda faccelo sapere.", + "Regards": "Cordialmente", + "Getting started!": "Come iniziare!", + "EXPIRED": "SCADUTO", + "VALID": "VALIDO", + "Unsuspend": "Riabilita", + "Suspend": "Sospendi", + "Delete": "Elimina", + "Login as User": "Accedi come utente", + "Clone": "Clona", + "Amount due": "Importo dovuto", + "Your Payment was successful!": "Pagamento effettuato con successo!", + "Hello": "Ciao", + "Your payment was processed successfully!": "Il pagamento è stato effettuato con successo!" +} diff --git a/resources/lang/zh.json b/resources/lang/zh.json new file mode 100644 index 00000000..a5116217 --- /dev/null +++ b/resources/lang/zh.json @@ -0,0 +1,328 @@ +{ + "Activity Logs": "活动日志", + "No recent activity from cronjobs": "最近没有cronjob", + "Check the docs for it here": "在这里查看它的文档", + "Are cronjobs running?": "cronjob正在运行吗?", + "Causer": "引起者", + "Description": "描述", + "Created at": "创建于", + "Edit Configuration": "编辑配置", + "Text Field": "文本字段", + "Cancel": "取消", + "Close": "关闭", + "Save": "保存", + "true": "是", + "false": "否", + "Configurations": "配置", + "Dashboard": "控制面板", + "Key": "密钥", + "Value": "价值", + "Type": "类型", + "Admin Overview": "管理员概述", + "Support server": "支持服务器", + "Documentation": "文档", + "Github": "Github", + "Support ControlPanel": "支持我们", + "Servers": "服务器", + "Users": "用户", + "Total": "总数", + "Payments": "支付费用", + "Pterodactyl": "翼手龙", + "Sync": "同步", + "Resources": "资源", + "Count": "计数", + "Locations": "地点", + "Node": "节点", + "Nodes": "节点", + "Nests": "Nests", + "Eggs": "Eggs", + "Last updated :date": "最后更新时间", + "Purchase": "购买", + "ID": "身份证", + "User": "用户", + "Amount": "数量", + "Product Price": "产品价格", + "Tax": "税收", + "Total Price": "总价", + "Payment_ID": "付款人ID", + "Payer_ID": "付款人ID", + "Product": "产品", + "Products": "产品", + "Create": "创建", + "Product Details": "产品详情", + "Server Details": "服务器详细信息", + "Product Linking": "产品链接", + "Name": "名称", + "Price in": "价格", + "Memory": "内存", + "Cpu": "处理器", + "Swap": "虚拟内存", + "Disk": "磁盘", + "Minimum": "最小值", + "IO": "IO", + "Databases": "数据库", + "Database": "数据库", + "Backups": "备份", + "Allocations": "分配", + "Disabled": "禁用", + "Submit": "提交", + "This product will only be available for these nodes": "该产品仅适用于这些节点", + "This product will only be available for these eggs": "该产品仅适用于这些鸡蛋", + "Will hide this option from being selected": "将隐藏此选项,使其不能被选中", + "Link your products to nodes and eggs to create dynamic pricing for each option": "将你的产品链接到节点和彩蛋上,为每个选项创建动态定价。", + "Setting to -1 will use the value from configuration.": "设置为-1将使用配置中的值。", + "This is what the users sees": "这就是用户看到的情况", + "Edit": "编辑", + "Price": "价格", + "Are you sure you wish to delete?": "你确定你要删除吗?", + "Create new": "创建新的", + "Show": "显示", + "Updated at": "更新于", + "Suspended at": "暂停在", + "Settings": "设置", + "Dashboard icons": "仪表板图标", + "Select panel icon": "选择面板图标", + "Select panel favicon": "选择面板图标", + "Token": "代币", + "Last used": "最后使用", + "Store": "商店", + "Currency code": "货币代码", + "Checkout the paypal docs to select the appropriate code": "查看支付宝文档,选择合适的代码。", + "Quantity": "数量", + "Amount given to the user after purchasing": "购买后给用户的金额", + "Display": "显示", + "This is what the user sees at store and checkout": "这就是用户在商店和结账时看到的内容。", + "This is what the user sees at checkout": "这是用户在结账时看到的内容", + "Adds 1000 credits to your account": "为您的账户增加1000个积分", + "Active": "激活", + "Paypal is not configured.": "Paypal没有被配置。", + "To configure PayPal, head to the .env and add your PayPal’s client id and secret.": "要配置PayPal,请到.env中添加你的PayPal的客户ID和秘密。", + "Useful Links": "有用的链接", + "Icon class name": "图标类名称", + "You can find available free icons": "你可以找到可用的免费图标", + "Title": "标题", + "Link": "链接", + "Username": "用户名", + "Email": "电子邮件", + "Pterodactly ID": "翼神ID", + "Server Limit": "服务器限制", + "Role": "角色", + "Administrator": "管理员", + "Client": "客户", + "Member": "会员", + "New Password": "新密码", + "Confirm Password": "确认密码", + "This ID refers to the user account created on pterodactyls panel.": "这个ID指的是在翼龙面板上创建的用户账户。", + "Only edit this if you know what youre doing :)": "只有在你知道自己在做什么的情况下才可以编辑这个 :)", + "Verified": "已验证", + "Last seen": "最后一次看到", + "Notify": "通知", + "All": "全部", + "Send via": "通过以下方式发送", + "Content": "内容", + "Notifications": "通知", + "Usage": "使用情况", + "Config": "配置", + "Vouchers": "凭证", + "Voucher details": "凭证细节", + "Memo": "备忘录", + "Code": "编码", + "Uses": "使用方式", + "Expires at": "过期时间", + "Max": "最大", + "Random": "随机", + "Status": "状态", + "Used / Uses": "已使用/使用情况", + "Expires": "过期", + "Please confirm your password before continuing.": "在继续之前,请确认您的密码。", + "Password": "密码", + "Forgot Your Password?": "忘记密码?", + "Sign in to start your session": "登录以开始您的会议", + "Remember Me": "记住我", + "Sign In": "登录", + "Register a new membership": "注册一个新的会员", + "You forgot your password? Here you can easily retrieve a new password.": "你忘记了你的密码?在这里您可以轻松地找回一个新的密码。", + "Request new password": "申请新密码", + "Login": "登录", + "You are only one step a way from your new password, recover your password now.": "您只差一点就能找到您的密码了。", + "Retype password": "重新输入密码", + "Change password": "更改密码", + "I already have a membership": "我已经有一个会员资格", + "Register": "注册", + "Verify Your Email Address": "验证您的电子邮件地址", + "A fresh verification link has been sent to your email address.": "一个新的验证链接已被发送到您的电子邮件地址。", + "Before proceeding, please check your email for a verification link.": "在继续进行之前,请检查您的电子邮件是否有验证链接。", + "If you did not receive the email": "如果您没有收到该邮件", + "click here to request another": "请点击这里申请另一个", + "Home": "首页", + "Languages": "语言", + "See all Notifications": "查看所有通知", + "Profile": "简介", + "Log back in": "重新登录", + "Logout": "注销", + "Administration": "行政管理", + "Overview": "纵观全局", + "Application API": "应用程序API", + "Management": "管理层", + "Other": "其他的", + "Logs": "日志", + "Redeem code": "兑换代码", + "You have not yet verified your email address": "你还没有验证你的电子邮件地址", + "Click here to resend verification email": "点击这里重新发送验证邮件", + "Please contact support If you didnt receive your verification email.": "如果你没有收到你的验证邮件,请联系支持。", + "Thank you for your purchase!": "谢谢您的购买!", + "Your payment has been confirmed; Your credit balance has been updated.": "您的付款已被确认;您的信用余额已被更新。", + "Payment ID": "付款编号", + "Balance": "余额", + "User ID": "用户ID", + "Thanks": "谢谢", + "Redeem voucher code": "兑换优惠券代码", + "Redeem": "赎回", + "All notifications": "所有通知", + "Required Email verification!": "需要电子邮件验证!", + "Required Discord verification!": "必需的 Discord 验证!", + "You have not yet verified your discord account": "你还没有验证你的discord账户", + "Login with discord": "请用discord登录", + "Please contact support If you face any issues.": "如果你遇到任何问题,请联系支持。", + "Due to system settings you are required to verify your discord account!": "由于系统设置的原因,您需要验证您的 Discord 帐户!", + "It looks like this hasnt been set-up correctly! Please contact support.": "看起来这并没有被正确设置!请联系技术支持。", + "Change Password": "更改密码", + "Current Password": "当前密码", + "Save Changes": "保存更改", + "Re-Sync Discord": "重新同步 Discord", + "You are verified!": "你已经被验证了!", + "By verifying your discord account, you receive extra Credits and increased Server amounts": "通过验证你的 Discord 帐户,你可以获得额外的游戏币和增加的服务器金额。", + "Server configuration": "服务器配置", + "Error!": "错误!", + "Make sure to link your products to nodes and eggs.": "请确保将你的产品链接到节点和彩蛋。", + "There has to be at least 1 valid product for server creation": "至少要有1个有效的产品才能创建服务器。", + "No products available!": "没有可用的产品!", + "No nodes have been linked!": "没有节点被链接!", + "No nests available!": "没有可用的巢穴!", + "No eggs have been linked!": "没有蛋被链接!", + "Software / Games": "软件/游戏", + "Please select software ...": "请选择软件...", + "Specification": "规格", + "No selection": "没有选择", + "per month": "每个月", + "Not enough credits!": "没有足够的点数!", + "Please select a configuration ...": "请选择一个配置 ...", + "No resources found matching current configuration": "没有找到符合当前配置的资源", + "No nodes found matching current configuration": "没有找到符合当前配置的节点", + "Please select a node ...": "请选择一个节点 ...", + "Create server": "创建服务器", + "Use your servers on our": "使用你的服务器在我们的", + "pterodactyl panel": "翼手龙面板", + "Server limit reached!": "已达到服务器限制!", + "Create Server": "创建服务器", + "Manage": "管理", + "Delete server": "删除服务器", + "Price per Hour": "每小时价格", + "Price per Month": "每个月的价格", + "Date": "日期", + "To": "目的地", + "From": "从", + "Pending": "待定", + "Subtotal": "小计", + "Submit Payment": "提交付款", + "Payment Methods": "付款方式", + "By purchasing this product you agree and accept our terms of service": "购买此产品,您同意并接受我们的服务条款。", + "There are no store products!": "没有商店的产品!", + "The store is not correctly configured!": "商店的配置不正确!", + "Out of Credits in": "信用额度用完在", + "days": "天", + "hours": "小时", + "You ran out of Credits": "你的信用额度用完了", + "Profile updated": "资料更新", + "You are required to verify your email address before you can create a server.": "在创建服务器之前,你需要验证你的电子邮件地址。", + "You are required to link your discord account before you can create a server.": "在创建服务器之前,您需要链接您的discord账户。", + "No allocations satisfying the requirements for automatic deployment on this node were found.": "没有发现符合该节点上自动部署要求的分配。", + "Server removed": "移除服务器", + "Server created": "创建了服务器", + "An exception has occurred while trying to remove a resource \"": "移除资源时出错。", + "You are required to verify your email address before you can purchase credits.": "在你购买点数之前,你需要验证你的电子邮件地址。", + "You are required to link your discord account before you can purchase ": "您需要在购买前链接您的迪斯科账户。 ", + "Warning!": "警告!", + "api key created!": "api密钥已创建!", + "api key updated!": "api密钥已更新!", + "api key has been removed!": "api密钥已被删除!", + "configuration has been updated!": "配置已被更新!", + "Pterodactyl synced": "翼手龙已同步化", + "Your credit balance has been increased!": "您的信用余额已增加!", + "Payment was Canceled": "付款已取消", + "Store item has been created!": "商店项目已创建!", + "Store item has been updated!": "商店商品已更新!", + "Product has been updated!": "产品已更新!", + "Store item has been removed!": "商店物品已被删除!", + "Product has been created!": "产品已创建!", + "Product has been removed!": "产品已被删除!", + "Server has been updated!": "服务器已被更新!", + "Icons updated!": "图标已更新!", + "link has been created!": "链接已创建", + "link has been updated!": "链接已更新", + "user has been removed!": "用户已被删除!", + "Notification sent!": "通知已发送!", + "User has been updated!": "用户已被更新!", + "User does not exists on pterodactyl's panel": "用户不存在于翼龙的面板上", + "voucher has been created!": "代金券已创建!", + "voucher has been updated!": "代金券已被更新!", + "voucher has been removed!": "代金券已被删除!", + "This voucher has reached the maximum amount of uses": "此代金券已达到最大使用量", + "This voucher has expired": "此优惠券已过期", + "You already redeemed this voucher code": "你已经兑换了这个优惠券代码", + "You can't redeem this voucher because you would exceed the limit of ": "你不能兑换此优惠券,因为你会超过此优惠券的使用限额。 ", + "have been added to your balance!": "已被添加到您的余额中!", + "Invoice": "发票", + "Serial No.": "序号", + "Invoice date": "发票日期", + "Seller": "卖家", + "Buyer": "买方", + "Address": "地址", + "VAT code": "增值税代码", + "Phone": "电话", + "Units": "单位", + "Qty": "数量", + "Discount": "折扣", + "Sub total": "小计", + "Total discount": "折扣总额", + "Taxable amount": "应纳税额", + "Total taxes": "总税额", + "Tax rate": "税率", + "Total amount": "总金额", + "Please pay until": "请支付至", + "Amount in words": "税额的字数", + "Notes": "笔记", + "Shipping": "运费", + "Paid": "已付", + "Due:": "应付。", + "Invoice Settings": "发票设置", + "Download all Invoices": "下载所有发票", + "Enter your companys name": "输入你的公司名称", + "Enter your companys address": "输入你的公司的地址", + "Enter your companys phone number": "输入你的公司的电话号码", + "Enter your companys VAT id": "输入你的公司的增值税识别码", + "Enter your companys email address": "输入公司的电子邮件地址", + "Enter your companys website": "输入你的公司网站", + "Enter your custom invoice prefix": "输入你的自定义发票前缀", + "Select Invoice Logo": "选择发票标志", + "Payment Confirmation": "付款确认", + "Payment Confirmed!": "付款确认!", + "Server Creation Error": "服务器创建错误", + "Your servers have been suspended!": "您的服务器已被暂停!", + "To automatically re-enable your server/s, you need to purchase more credits.": "为了自动重新启用您的服务器,您需要购买更多的点数。", + "Purchase credits": "购买信用额度", + "If you have any questions please let us know.": "如果你有任何问题,请让我们知道。", + "Regards": "联系我们", + "Getting started!": "开始吧!", + "EXPIRED": "已过期", + "VALID": "有效的", + "Unsuspend": "取消暂停", + "Suspend": "暂停", + "Delete": "删除", + "Login as User": "以用户身份登录", + "Clone": "克隆", + "Amount due": "应付金额", + "Your Payment was successful!": "恭喜,您的订单支付成功 !", + "Hello": "您好", + "Your payment was processed successfully!": "您的请求已处理成功" +} From e8cf7c818451d09f9b0fcd346a0e67970238c9e0 Mon Sep 17 00:00:00 2001 From: Dennis Date: Thu, 16 Dec 2021 22:39:10 +0100 Subject: [PATCH 77/77] Update es.json --- resources/lang/es.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/lang/es.json b/resources/lang/es.json index 52e550b7..510868ce 100644 --- a/resources/lang/es.json +++ b/resources/lang/es.json @@ -160,7 +160,7 @@ "Profile": "Perfil", "Log back in": "Volver a iniciar sesión", "Logout": "Cerrar sesión", - "Administration": "‫Administración", + "Administration": "Administración", "Overview": "Resumen", "Application API": "Aplicación API", "Management": "Gestión",