瀏覽代碼

Merge branch addons/billing_period into V0.10

IceToast 2 年之前
父節點
當前提交
5fd58514b5
共有 45 個文件被更改,包括 1160 次插入431 次删除
  1. 139 0
      app/Console/Commands/ChargeServers.php
  2. 13 3
      app/Console/Kernel.php
  3. 49 47
      app/Http/Controllers/Admin/ProductController.php
  4. 19 1
      app/Http/Controllers/Admin/ServerController.php
  5. 1 1
      app/Http/Controllers/HomeController.php
  6. 83 50
      app/Http/Controllers/ServerController.php
  7. 17 1
      app/Models/Product.php
  8. 16 11
      app/Models/Server.php
  9. 3 1
      app/Models/User.php
  10. 48 0
      database/migrations/2022_06_16_092704_add_billing_period_to_products.php
  11. 33 0
      database/migrations/2022_06_16_094402_update_user_credits_datatype.php
  12. 33 0
      database/migrations/2022_06_16_095818_add_last_billed_field_to_servers.php
  13. 32 0
      database/migrations/2022_07_21_234527_add_cancelation_to_servers_table.php
  14. 32 0
      database/migrations/2022_07_21_234818_undo_decimal_in_price.php
  15. 6 3
      database/seeders/Seeds/ProductSeeder.php
  16. 10 8
      lang/bg.json
  17. 9 7
      lang/bs.json
  18. 12 10
      lang/cs.json
  19. 25 3
      lang/de.json
  20. 43 16
      lang/en.json
  21. 11 9
      lang/es.json
  22. 9 7
      lang/fr.json
  23. 21 19
      lang/he.json
  24. 9 7
      lang/hi.json
  25. 9 7
      lang/hu.json
  26. 9 7
      lang/it.json
  27. 9 7
      lang/nl.json
  28. 9 7
      lang/pl.json
  29. 9 7
      lang/pt.json
  30. 9 7
      lang/ro.json
  31. 10 8
      lang/ru.json
  32. 8 6
      lang/sh.json
  33. 9 7
      lang/sk.json
  34. 9 7
      lang/sr.json
  35. 9 7
      lang/sv.json
  36. 9 7
      lang/tr.json
  37. 9 7
      lang/zh.json
  38. 2 0
      routes/web.php
  39. 52 13
      themes/default/views/admin/products/create.blade.php
  40. 61 15
      themes/default/views/admin/products/edit.blade.php
  41. 2 0
      themes/default/views/admin/products/index.blade.php
  42. 0 16
      themes/default/views/admin/settings/tabs/system.blade.php
  43. 26 8
      themes/default/views/servers/create.blade.php
  44. 223 78
      themes/default/views/servers/index.blade.php
  45. 4 6
      themes/default/views/servers/settings.blade.php

+ 139 - 0
app/Console/Commands/ChargeServers.php

@@ -0,0 +1,139 @@
+<?php
+
+namespace App\Console\Commands;
+
+use App\Models\Server;
+use App\Notifications\ServersSuspendedNotification;
+use Carbon\Carbon;
+use Illuminate\Console\Command;
+use Illuminate\Support\Facades\DB;
+
+class ChargeServers extends Command
+{
+    /**
+     * The name and signature of the console command.
+     *
+     * @var string
+     */
+    protected $signature = 'servers:charge';
+
+    /**
+     * The console command description.
+     *
+     * @var string
+     */
+    protected $description = 'Charge all users with severs that are due to be charged';
+
+        /**
+     * A list of users that have to be notified
+     * @var array
+     */
+    protected $usersToNotify = [];
+
+    /**
+     * Create a new command instance.
+     *
+     * @return void
+     */
+    public function __construct()
+    {
+        parent::__construct();
+    }
+
+    /**
+     * Execute the console command.
+     *
+     * @return int
+     */
+    public function handle()
+    {
+        Server::whereNull('suspended')->with('user', 'product')->chunk(10, function ($servers) {
+            /** @var Server $server */
+            foreach ($servers as $server) {
+                /** @var Product $product */
+                $product = $server->product;
+                /** @var User $user */
+                $user = $server->user;
+
+                $billing_period = $product->billing_period;
+
+
+                // check if server is due to be charged by comparing its last_billed date with the current date and the billing period
+                $newBillingDate = null;
+                switch($billing_period) {
+                    case 'annually':
+                        $newBillingDate = Carbon::parse($server->last_billed)->addYear();
+                        break;
+                    case 'half-annually':
+                        $newBillingDate = Carbon::parse($server->last_billed)->addMonths(6);
+                        break;
+                    case 'quarterly':
+                        $newBillingDate = Carbon::parse($server->last_billed)->addMonths(3);
+                        break;
+                    case 'monthly':
+                        $newBillingDate = Carbon::parse($server->last_billed)->addMonth();
+                        break;
+                    case 'weekly':
+                        $newBillingDate = Carbon::parse($server->last_billed)->addWeek();
+                        break;
+                    case 'daily':
+                        $newBillingDate = Carbon::parse($server->last_billed)->addDay();
+                        break;
+                    case 'hourly':
+                        $newBillingDate = Carbon::parse($server->last_billed)->addHour();
+                    default:
+                        $newBillingDate = Carbon::parse($server->last_billed)->addHour();
+                        break;
+                };
+
+                if (!($newBillingDate->isPast())) {
+                    continue;
+                }
+
+                // check if the server is canceled or if user has enough credits to charge the server or
+                if ( $server->cancelled || $user->credits <= $product->price) {
+                    try {
+                        // suspend server
+                        $this->line("<fg=yellow>{$server->name}</> from user: <fg=blue>{$user->name}</> has been <fg=red>suspended!</>");
+                        $server->suspend();
+
+                        // add user to notify list
+                        if (!in_array($user, $this->usersToNotify)) {
+                            array_push($this->usersToNotify, $user);
+                        }
+                    } catch (\Exception $exception) {
+                        $this->error($exception->getMessage());
+                    }
+                    return;
+                }
+
+                // charge credits to user
+                $this->line("<fg=blue>{$user->name}</> Current credits: <fg=green>{$user->credits}</> Credits to be removed: <fg=red>{$product->price}</>");
+                $user->decrement('credits', $product->price);
+
+                // update server last_billed date in db
+                DB::table('servers')->where('id', $server->id)->update(['last_billed' => $newBillingDate]);
+            }
+
+            return $this->notifyUsers();
+        });
+    }
+
+    /**
+     * @return bool
+     */
+    public function notifyUsers()
+    {
+        if (!empty($this->usersToNotify)) {
+            /** @var User $user */
+            foreach ($this->usersToNotify as $user) {
+                $this->line("<fg=yellow>Notified user:</> <fg=blue>{$user->name}</>");
+                $user->notify(new ServersSuspendedNotification());
+            }
+        }
+
+        #reset array
+        $this->usersToNotify = array();
+        return true;
+    }
+}

+ 13 - 3
app/Console/Kernel.php

@@ -8,6 +8,16 @@ use Illuminate\Support\Facades\Storage;
 
 class Kernel extends ConsoleKernel
 {
+    /**
+     * The Artisan commands provided by your application.
+     *
+     * @var array
+     */
+    protected $commands = [
+        Commands\ChargeCreditsCommand::class,
+        Commands\ChargeServers::class,
+    ];
+
     /**
      * Define the application's command schedule.
      *
@@ -16,12 +26,12 @@ class Kernel extends ConsoleKernel
      */
     protected function schedule(Schedule $schedule)
     {
-        $schedule->command('credits:charge')->hourly();
+        $schedule->command('servers:charge')->everyMinute();
         $schedule->command('cp:versioncheck:get')->daily();
 
         //log cronjob activity
         $schedule->call(function () {
-            Storage::disk('logs')->put('cron.log', 'Last activity from cronjobs - '.now());
+            Storage::disk('logs')->put('cron.log', 'Last activity from cronjobs - ' . now());
         })->everyMinute();
     }
 
@@ -32,7 +42,7 @@ class Kernel extends ConsoleKernel
      */
     protected function commands()
     {
-        $this->load(__DIR__.'/Commands');
+        $this->load(__DIR__ . '/Commands');
 
         require base_path('routes/console.php');
     }

+ 49 - 47
app/Http/Controllers/Admin/ProductController.php

@@ -57,24 +57,25 @@ class ProductController extends Controller
     public function store(Request $request)
     {
         $request->validate([
-            'name' => 'required|max:30',
-            'price' => 'required|numeric|max:1000000|min:0',
-            'memory' => 'required|numeric|max:1000000|min:5',
-            'cpu' => 'required|numeric|max:1000000|min:0',
-            'swap' => 'required|numeric|max:1000000|min:0',
-            'description' => 'required|string|max:191',
-            'disk' => 'required|numeric|max:1000000|min:5',
-            'minimum_credits' => 'required|numeric|max:1000000|min:-1',
-            'io' => 'required|numeric|max:1000000|min:0',
-            'databases' => 'required|numeric|max:1000000|min:0',
-            'backups' => 'required|numeric|max:1000000|min:0',
-            'allocations' => 'required|numeric|max:1000000|min:0',
-            'nodes.*' => 'required|exists:nodes,id',
-            'eggs.*' => 'required|exists:eggs,id',
-            'disabled' => 'nullable',
+            "name" => "required|max:30",
+            "price" => "required|numeric|max:1000000|min:0",
+            "memory" => "required|numeric|max:1000000|min:5",
+            "cpu" => "required|numeric|max:1000000|min:0",
+            "swap" => "required|numeric|max:1000000|min:0",
+            "description" => "required|string|max:191",
+            "disk" => "required|numeric|max:1000000|min:5",
+            "minimum_credits" => "required|numeric|max:1000000|min:-1",
+            "io" => "required|numeric|max:1000000|min:0",
+            "databases" => "required|numeric|max:1000000|min:0",
+            "backups" => "required|numeric|max:1000000|min:0",
+            "allocations" => "required|numeric|max:1000000|min:0",
+            "nodes.*" => "required|exists:nodes,id",
+            "eggs.*" => "required|exists:eggs,id",
+            "disabled" => "nullable",
+            "billing_period" => "required|in:hourly,daily,weekly,monthly,quarterly,half-annually,annually",
         ]);
 
-        $disabled = ! is_null($request->input('disabled'));
+        $disabled = !is_null($request->input('disabled'));
         $product = Product::create(array_merge($request->all(), ['disabled' => $disabled]));
 
         //link nodes and eggs
@@ -123,24 +124,25 @@ class ProductController extends Controller
     public function update(Request $request, Product $product): RedirectResponse
     {
         $request->validate([
-            'name' => 'required|max:30',
-            'price' => 'required|numeric|max:1000000|min:0',
-            'memory' => 'required|numeric|max:1000000|min:5',
-            'cpu' => 'required|numeric|max:1000000|min:0',
-            'swap' => 'required|numeric|max:1000000|min:0',
-            'description' => 'required|string|max:191',
-            'disk' => 'required|numeric|max:1000000|min:5',
-            'io' => 'required|numeric|max:1000000|min:0',
-            'minimum_credits' => 'required|numeric|max:1000000|min:-1',
-            'databases' => 'required|numeric|max:1000000|min:0',
-            'backups' => 'required|numeric|max:1000000|min:0',
-            'allocations' => 'required|numeric|max:1000000|min:0',
-            'nodes.*' => 'required|exists:nodes,id',
-            'eggs.*' => 'required|exists:eggs,id',
-            'disabled' => 'nullable',
+            "name" => "required|max:30",
+            "price" => "required|numeric|max:1000000|min:0",
+            "memory" => "required|numeric|max:1000000|min:5",
+            "cpu" => "required|numeric|max:1000000|min:0",
+            "swap" => "required|numeric|max:1000000|min:0",
+            "description" => "required|string|max:191",
+            "disk" => "required|numeric|max:1000000|min:5",
+            "io" => "required|numeric|max:1000000|min:0",
+            "minimum_credits" => "required|numeric|max:1000000|min:-1",
+            "databases" => "required|numeric|max:1000000|min:0",
+            "backups" => "required|numeric|max:1000000|min:0",
+            "allocations" => "required|numeric|max:1000000|min:0",
+            "nodes.*" => "required|exists:nodes,id",
+            "eggs.*" => "required|exists:eggs,id",
+            "disabled" => "nullable",
+            "billing_period" => "required|in:hourly,daily,weekly,monthly,quarterly,half-annually,annually",
         ]);
 
-        $disabled = ! is_null($request->input('disabled'));
+        $disabled = !is_null($request->input('disabled'));
         $product->update(array_merge($request->all(), ['disabled' => $disabled]));
 
         //link nodes and eggs
@@ -159,7 +161,7 @@ class ProductController extends Controller
      */
     public function disable(Request $request, Product $product)
     {
-        $product->update(['disabled' => ! $product->disabled]);
+        $product->update(['disabled' => !$product->disabled]);
 
         return redirect()->route('admin.products.index')->with('success', 'Product has been updated!');
     }
@@ -194,14 +196,14 @@ class ProductController extends Controller
         return datatables($query)
             ->addColumn('actions', function (Product $product) {
                 return '
-                            <a data-content="'.__('Show').'" data-toggle="popover" data-trigger="hover" data-placement="top" href="'.route('admin.products.show', $product->id).'" class="btn btn-sm text-white btn-warning mr-1"><i class="fas fa-eye"></i></a>
-                            <a data-content="'.__('Clone').'" data-toggle="popover" data-trigger="hover" data-placement="top" href="'.route('admin.products.clone', $product->id).'" class="btn btn-sm text-white btn-primary mr-1"><i class="fas fa-clone"></i></a>
-                            <a data-content="'.__('Edit').'" data-toggle="popover" data-trigger="hover" data-placement="top" href="'.route('admin.products.edit', $product->id).'" class="btn btn-sm btn-info mr-1"><i class="fas fa-pen"></i></a>
-
-                           <form class="d-inline" onsubmit="return submitResult();" method="post" action="'.route('admin.products.destroy', $product->id).'">
-                            '.csrf_field().'
-                            '.method_field('DELETE').'
-                           <button data-content="'.__('Delete').'" data-toggle="popover" data-trigger="hover" data-placement="top" class="btn btn-sm btn-danger mr-1"><i class="fas fa-trash"></i></button>
+                            <a data-content="' . __('Show') . '" data-toggle="popover" data-trigger="hover" data-placement="top" href="' . route('admin.products.show', $product->id) . '" class="btn btn-sm text-white btn-warning mr-1"><i class="fas fa-eye"></i></a>
+                            <a data-content="' . __('Clone') . '" data-toggle="popover" data-trigger="hover" data-placement="top" href="' . route('admin.products.clone', $product->id) . '" class="btn btn-sm text-white btn-primary mr-1"><i class="fas fa-clone"></i></a>
+                            <a data-content="' . __('Edit') . '" data-toggle="popover" data-trigger="hover" data-placement="top" href="' . route('admin.products.edit', $product->id) . '" class="btn btn-sm btn-info mr-1"><i class="fas fa-pen"></i></a>
+
+                           <form class="d-inline" onsubmit="return submitResult();" method="post" action="' . route('admin.products.destroy', $product->id) . '">
+                            ' . csrf_field() . '
+                            ' . method_field('DELETE') . '
+                           <button data-content="' . __('Delete') . '" data-toggle="popover" data-trigger="hover" data-placement="top" class="btn btn-sm btn-danger mr-1"><i class="fas fa-trash"></i></button>
                        </form>
                 ';
             })
@@ -219,18 +221,18 @@ class ProductController extends Controller
                 $checked = $product->disabled == false ? 'checked' : '';
 
                 return '
-                                <form class="d-inline" onsubmit="return submitResult();" method="post" action="'.route('admin.products.disable', $product->id).'">
-                            '.csrf_field().'
-                            '.method_field('PATCH').'
+                                <form class="d-inline" onsubmit="return submitResult();" method="post" action="' . route('admin.products.disable', $product->id) . '">
+                            ' . csrf_field() . '
+                            ' . method_field('PATCH') . '
                             <div class="custom-control custom-switch">
-                            <input '.$checked.' name="disabled" onchange="this.form.submit()" type="checkbox" class="custom-control-input" id="switch'.$product->id.'">
-                            <label class="custom-control-label" for="switch'.$product->id.'"></label>
+                            <input ' . $checked . ' name="disabled" onchange="this.form.submit()" type="checkbox" class="custom-control-input" id="switch' . $product->id . '">
+                            <label class="custom-control-label" for="switch' . $product->id . '"></label>
                           </div>
                        </form>
                 ';
             })
             ->editColumn('minimum_credits', function (Product $product) {
-                return $product->minimum_credits==-1 ? config('SETTINGS::USER:MINIMUM_REQUIRED_CREDITS_TO_MAKE_SERVER') : $product->minimum_credits;
+                return $product->minimum_credits == -1 ? config('SETTINGS::USER:MINIMUM_REQUIRED_CREDITS_TO_MAKE_SERVER') : $product->minimum_credits;
             })
             ->editColumn('created_at', function (Product $product) {
                 return $product->created_at ? $product->created_at->diffForHumans() : '';

+ 19 - 1
app/Http/Controllers/Admin/ServerController.php

@@ -133,7 +133,25 @@ class ServerController extends Controller
     }
 
     /**
-     * @param  Server  $server
+     * Cancel the Server billing cycle.
+     *
+     * @param Server $server
+     * @return RedirectResponse|Response
+     */
+    public function cancel(Server $server)
+    {
+        try {
+            error_log($server->update([
+                'cancelled' => now(),
+            ]));
+            return redirect()->route('servers.index')->with('success', __('Server cancelled'));
+        } catch (Exception $e) {
+            return redirect()->route('servers.index')->with('error', __('An exception has occurred while trying to cancel the server"') . $e->getMessage() . '"');
+        }
+    }
+
+    /**
+     * @param Server $server
      * @return RedirectResponse
      */
     public function toggleSuspended(Server $server)

+ 1 - 1
app/Http/Controllers/HomeController.php

@@ -97,7 +97,7 @@ class HomeController extends Controller
 
         /** Build our Time-Left-Box */
         if ($credits > 0.01 and $usage > 0) {
-            $daysLeft = number_format(($credits * 30) / $usage, 2, '.', '');
+            $daysLeft = number_format($credits / ($usage / 30), 2, '.', '');
             $hoursLeft = number_format($credits / ($usage / 30 / 24), 2, '.', '');
 
             $bg = $this->getTimeLeftBoxBackground($daysLeft);

+ 83 - 50
app/Http/Controllers/ServerController.php

@@ -10,6 +10,7 @@ use App\Models\Node;
 use App\Models\Product;
 use App\Models\Server;
 use App\Notifications\ServerCreationError;
+use Carbon\Carbon;
 use Exception;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Http\Client\Response;
@@ -30,7 +31,7 @@ class ServerController extends Controller
 
             //Get server infos from ptero
             $serverAttributes = Pterodactyl::getServerAttributes($server->pterodactyl_id, true);
-            if (! $serverAttributes) {
+            if (!$serverAttributes) {
                 continue;
             }
             $serverRelationships = $serverAttributes['relationships'];
@@ -67,7 +68,7 @@ class ServerController extends Controller
     /** Show the form for creating a new resource. */
     public function create()
     {
-        if (! is_null($this->validateConfigurationRules())) {
+        if (!is_null($this->validateConfigurationRules())) {
             return $this->validateConfigurationRules();
         }
 
@@ -122,33 +123,31 @@ class ServerController extends Controller
             // Check if node has enough memory and disk space
             $checkResponse = Pterodactyl::checkNodeResources($node, $product->memory, $product->disk);
             if ($checkResponse == false) {
-                return redirect()->route('servers.index')->with('error', __("The node '".$nodeName."' doesn't have the required memory or disk left to allocate this product."));
+                return redirect()->route('servers.index')->with('error', __("The node '" . $nodeName . "' doesn't have the required memory or disk left to allocate this product."));
             }
 
             // Min. Credits
             if (
-                Auth::user()->credits <
-                ($product->minimum_credits == -1
-                    ? config('SETTINGS::USER:MINIMUM_REQUIRED_CREDITS_TO_MAKE_SERVER', 50)
-                    : $product->minimum_credits)
+                Auth::user()->credits < $product->minimum_credits ||
+                Auth::user()->credits < $product->price
             ) {
-                return redirect()->route('servers.index')->with('error', 'You do not have the required amount of '.CREDITS_DISPLAY_NAME.' to use this product!');
+                return redirect()->route('servers.index')->with('error', 'You do not have the required amount of ' . CREDITS_DISPLAY_NAME . ' to use this product!');
             }
         }
 
         //Required Verification for creating an server
-        if (config('SETTINGS::USER:FORCE_EMAIL_VERIFICATION', 'false') === 'true' && ! Auth::user()->hasVerifiedEmail()) {
+        if (config('SETTINGS::USER: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.'));
         }
 
         //Required Verification for creating an server
 
-        if (! config('SETTINGS::SYSTEM:CREATION_OF_NEW_SERVERS', 'true') && Auth::user()->role != 'admin') {
+        if (!config('SETTINGS::SYSTEM:CREATION_OF_NEW_SERVERS', 'true') && Auth::user()->role != 'admin') {
             return redirect()->route('servers.index')->with('error', __('The system administrator has blocked the creation of new servers.'));
         }
 
         //Required Verification for creating an server
-        if (config('SETTINGS::USER:FORCE_DISCORD_VERIFICATION', 'false') === 'true' && ! Auth::user()->discordUser) {
+        if (config('SETTINGS::USER: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.'));
         }
 
@@ -161,7 +160,7 @@ class ServerController extends Controller
         /** @var Node $node */
         /** @var Egg $egg */
         /** @var Product $product */
-        if (! is_null($this->validateConfigurationRules())) {
+        if (!is_null($this->validateConfigurationRules())) {
             return $this->validateConfigurationRules();
         }
 
@@ -180,11 +179,12 @@ class ServerController extends Controller
         $server = $request->user()->servers()->create([
             'name' => $request->input('name'),
             'product_id' => $request->input('product'),
+            'last_billed' => Carbon::now()->toDateTimeString(),
         ]);
 
         //get free allocation ID
         $allocationId = Pterodactyl::getFreeAllocationId($node);
-        if (! $allocationId) {
+        if (!$allocationId) {
             return $this->noAllocationsError($server);
         }
 
@@ -198,14 +198,11 @@ class ServerController extends Controller
         //update server with pterodactyl_id
         $server->update([
             'pterodactyl_id' => $serverAttributes['id'],
-            'identifier' => $serverAttributes['identifier'],
+            'identifier'     => $serverAttributes['identifier'],
         ]);
 
-        if (config('SETTINGS::SYSTEM:SERVER_CREATE_CHARGE_FIRST_HOUR', 'true') == 'true') {
-            if ($request->user()->credits >= $server->product->getHourlyPrice()) {
-                $request->user()->decrement('credits', $server->product->getHourlyPrice());
-            }
-        }
+        // Charge first billing cycle
+        $request->user()->decrement('credits', $server->product->price);
 
         return redirect()->route('servers.index')->with('success', __('Server created'));
     }
@@ -234,8 +231,6 @@ class ServerController extends Controller
      */
     private function serverCreationFailed(Response $response, Server $server)
     {
-        $server->delete();
-
         return redirect()->route('servers.index')->with('error', json_encode($response->json()));
     }
 
@@ -247,7 +242,21 @@ class ServerController extends Controller
 
             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() . '"');
+        }
+    }
+
+    /** Cancel Server */
+    public function cancel(Server $server)
+    {
+        try {
+            error_log($server->update([
+                'cancelled' => now(),
+            ]));
+
+            return redirect()->route('servers.index')->with('success', __('Server cancelled'));
+        } catch (Exception $e) {
+            return redirect()->route('servers.index')->with('error', __('An exception has occurred while trying to cancel the server"') . $e->getMessage() . '"');
         }
     }
 
@@ -255,7 +264,7 @@ class ServerController extends Controller
     public function show(Server $server)
     {
         if ($server->user_id != Auth::user()->id) {
-            return back()->with('error', __('´This is not your Server!'));
+            return back()->with('error', __('This is not your Server!'));
         }
         $serverAttributes = Pterodactyl::getServerAttributes($server->pterodactyl_id);
         $serverRelationships = $serverAttributes['relationships'];
@@ -276,10 +285,10 @@ class ServerController extends Controller
         $pteroNode = Pterodactyl::getNode($serverRelationships['node']['attributes']['id']);
 
         $products = Product::orderBy('created_at')
-        ->whereHas('nodes', function (Builder $builder) use ($serverRelationships) { //Only show products for that node
-            $builder->where('id', '=', $serverRelationships['node']['attributes']['id']);
-        })
-        ->get();
+            ->whereHas('nodes', function (Builder $builder) use ($serverRelationships) { //Only show products for that node
+                $builder->where('id', '=', $serverRelationships['node']['attributes']['id']);
+            })
+            ->get();
 
         // Set the each product eggs array to just contain the eggs name
         foreach ($products as $product) {
@@ -297,10 +306,8 @@ class ServerController extends Controller
 
     public function upgrade(Server $server, Request $request)
     {
-        if ($server->user_id != Auth::user()->id) {
-            return redirect()->route('servers.index');
-        }
-        if (! isset($request->product_upgrade)) {
+        if ($server->user_id != Auth::user()->id || $server->suspended) return redirect()->route('servers.index');
+        if (!isset($request->product_upgrade)) {
             return redirect()->route('servers.show', ['server' => $server->id])->with('error', __('this product is the only one'));
         }
         $user = Auth::user();
@@ -319,30 +326,56 @@ class ServerController extends Controller
         $requiredisk = $newProduct->disk - $oldProduct->disk;
         $checkResponse = Pterodactyl::checkNodeResources($node, $requireMemory, $requiredisk);
         if ($checkResponse == false) {
-            return redirect()->route('servers.index')->with('error', __("The node '".$nodeName."' doesn't have the required memory or disk left to upgrade the server."));
+            return redirect()->route('servers.index')->with('error', __("The node '" . $nodeName . "' doesn't have the required memory or disk left to upgrade the server."));
         }
 
-        $priceupgrade = $newProduct->getHourlyPrice();
-
-        if ($priceupgrade < $oldProduct->getHourlyPrice()) {
-            $priceupgrade = 0;
-        }
-        if ($user->credits >= $priceupgrade && $user->credits >= $newProduct->minimum_credits) {
-            $server->product_id = $request->product_upgrade;
-            $server->update();
+        // calculate the amount of credits that the user overpayed for the old product when canceling the server right now
+        // billing periods are hourly, daily, weekly, monthly, quarterly, half-annually, annually
+        $billingPeriod = $oldProduct->billing_period;
+        // seconds
+        $billingPeriods = [
+            'hourly' => 3600,
+            'daily' => 86400,
+            'weekly' => 604800,
+            'monthly' => 2592000,
+            'quarterly' => 7776000,
+            'half-annually' => 15552000,
+            'annually' => 31104000
+        ];
+        // Get the amount of hours the user has been using the server
+        $billingPeriodMultiplier = $billingPeriods[$billingPeriod];
+        $timeDifference = now()->diffInSeconds($server->last_billed);
+
+        error_log("Time DIFFERENCE!!!! ", $timeDifference);
+        // Calculate the price for the time the user has been using the server
+        $overpayedCredits = $oldProduct->price - $oldProduct->price * ($timeDifference / $billingPeriodMultiplier);
+
+
+        if ($user->credits >= $newProduct->price && $user->credits >= $newProduct->minimum_credits) {
             $server->allocation = $serverAttributes['allocation'];
+            // Update the server on the panel
             $response = Pterodactyl::updateServer($server, $newProduct);
-            if ($response->failed()) {
-                return $this->serverCreationFailed($response, $server);
-            }
-            //update user balance
-            $user->decrement('credits', $priceupgrade);
-            //restart the server
-            $response = Pterodactyl::powerAction($server, 'restart');
-            if ($response->failed()) {
-                return redirect()->route('servers.index')->with('error', $response->json()['errors'][0]['detail']);
-            }
+            if ($response->failed()) return $this->serverCreationFailed($response, $server);
+
+            // Remove the allocation property from the server object as it is not a column in the database
+            unset($server->allocation);
+            // Update the server on controlpanel
+            $server->update([
+                'product_id' => $newProduct->id,
+                'updated_at' => now(),
+                'last_billed' => now(),
+                'cancelled' => null,
+            ]);
+
+            // Refund the user the overpayed credits
+            if ($overpayedCredits > 0) $user->increment('credits', $overpayedCredits);
 
+            // Withdraw the credits for the new product
+            $user->decrement('credits', $newProduct->price);
+
+            //restart the server
+            $response = Pterodactyl::powerAction($server, "restart");
+            if ($response->failed()) return redirect()->route('servers.index')->with('error', 'Server upgraded successfully! Could not restart the server:   ' . $response->json()['errors'][0]['detail']);
             return redirect()->route('servers.show', ['server' => $server->id])->with('success', __('Server Successfully Upgraded'));
         } else {
             return redirect()->route('servers.show', ['server' => $server->id])->with('error', __('Not Enough Balance for Upgrade'));

+ 17 - 1
app/Models/Product.php

@@ -43,7 +43,23 @@ class Product extends Model
 
     public function getHourlyPrice()
     {
-        return ($this->price / 30) / 24;
+        // calculate the hourly price with the billing period
+        switch($this->billing_period) {
+            case 'daily':
+                return $this->price / 24;
+            case 'weekly':
+                return $this->price / 24 / 7;
+            case 'monthly':
+                return $this->price / 24 / 30;
+            case 'quarterly':
+                return $this->price / 24 / 30 / 3;
+            case 'half-annually':
+                return $this->price / 24 / 30 / 6;
+            case 'annually':
+                return $this->price / 24 / 365;
+            default:
+                return $this->price;
+        }
     }
 
     public function getDailyPrice()

+ 16 - 11
app/Models/Server.php

@@ -3,6 +3,7 @@
 namespace App\Models;
 
 use App\Classes\Pterodactyl;
+use Carbon\Carbon;
 use Exception;
 use GuzzleHttp\Promise\PromiseInterface;
 use Hidehalo\Nanoid\Client;
@@ -24,9 +25,9 @@ class Server extends Model
     public function getActivitylogOptions(): LogOptions
     {
         return LogOptions::defaults()
-            -> logOnlyDirty()
-            -> logOnly(['*'])
-            -> dontSubmitEmptyLogs();
+            ->logOnlyDirty()
+            ->logOnly(['*'])
+            ->dontSubmitEmptyLogs();
     }
     /**
      * @var bool
@@ -47,12 +48,14 @@ class Server extends Model
      * @var string[]
      */
     protected $fillable = [
-        'name',
-        'description',
-        'suspended',
-        'identifier',
-        'product_id',
-        'pterodactyl_id',
+        "name",
+        "description",
+        "suspended",
+        "identifier",
+        "product_id",
+        "pterodactyl_id",
+        "last_billed",
+        "cancelled"
     ];
 
     /**
@@ -74,7 +77,7 @@ class Server extends Model
 
         static::deleting(function (Server $server) {
             $response = Pterodactyl::client()->delete("/application/servers/{$server->pterodactyl_id}");
-            if ($response->failed() && ! is_null($server->pterodactyl_id)) {
+            if ($response->failed() && !is_null($server->pterodactyl_id)) {
                 //only return error when it's not a 404 error
                 if ($response['errors'][0]['status'] != '404') {
                     throw new Exception($response['errors'][0]['code']);
@@ -88,7 +91,7 @@ class Server extends Model
      */
     public function isSuspended()
     {
-        return ! is_null($this->suspended);
+        return !is_null($this->suspended);
     }
 
     /**
@@ -125,9 +128,11 @@ class Server extends Model
         if ($response->successful()) {
             $this->update([
                 'suspended' => null,
+                'last_billed' => Carbon::now()->toDateTimeString(),
             ]);
         }
 
+
         return $this;
     }
 

+ 3 - 1
app/Models/User.php

@@ -228,6 +228,8 @@ class User extends Authenticatable implements MustVerifyEmail
     private function getServersWithProduct()
     {
         return $this->servers()
+            ->whereNull('suspended')
+            ->whereNull('cancelled')
             ->with('product')
             ->get();
     }
@@ -258,7 +260,7 @@ class User extends Authenticatable implements MustVerifyEmail
     {
         $usage = 0;
         foreach ($this->getServersWithProduct() as $server) {
-            $usage += $server->product->price;
+            $usage += $server->product->getHourlyPrice() * 24 * 30;
         }
 
         return number_format($usage, 2, '.', '');

+ 48 - 0
database/migrations/2022_06_16_092704_add_billing_period_to_products.php

@@ -0,0 +1,48 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Schema;
+
+class AddBillingPeriodToProducts extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('products', function (Blueprint $table) {
+            $table->string('billing_period')->default("hourly");
+            $table->decimal('price', 15, 4)->change();
+            $table->decimal('minimum_credits', 15, 4)->change();
+
+        });
+
+        DB::statement('UPDATE products SET billing_period="hourly"');
+
+        $products = DB::table('products')->get();
+        foreach ($products as $product) {
+            $price = $product->price;
+            $price = $price / 30 / 24;
+            DB::table('products')->where('id', $product->id)->update(['price' => $price]);
+        }
+
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('products', function (Blueprint $table) {
+            $table->dropColumn('billing_period');
+            $table->decimal('price', 10, 0)->change();
+            $table->float('minimum_credits')->change();
+        });
+    }
+}

+ 33 - 0
database/migrations/2022_06_16_094402_update_user_credits_datatype.php

@@ -0,0 +1,33 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class UpdateUserCreditsDatatype extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('users', function (Blueprint $table) {
+            $table->decimal('credits', 15, 4)->default(0)->change();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('users', function (Blueprint $table) {
+            $table->unsignedFloat('credits')->default(250)->change();
+
+        });
+    }
+}

+ 33 - 0
database/migrations/2022_06_16_095818_add_last_billed_field_to_servers.php

@@ -0,0 +1,33 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Schema;
+
+class AddLastBilledFieldToServers extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('servers', function (Blueprint $table) {
+            $table->dateTime('last_billed')->default(DB::raw('CURRENT_TIMESTAMP'))->nullable();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('servers', function (Blueprint $table) {
+            $table->dropColumn('last_billed');
+        });
+    }
+}

+ 32 - 0
database/migrations/2022_07_21_234527_add_cancelation_to_servers_table.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class AddCancelationToServersTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('servers', function (Blueprint $table) {
+            $table->dateTime('cancelled')->nullable();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('servers', function (Blueprint $table) {
+            $table->dropColumn('cancelled');
+        });
+    }
+}

+ 32 - 0
database/migrations/2022_07_21_234818_undo_decimal_in_price.php

@@ -0,0 +1,32 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+class UndoDecimalInPrice extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::table('products', function (Blueprint $table) {
+            $table->decimal('price', 15, 4)->change();
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::table('products', function (Blueprint $table) {
+            $table->decimal('price',['11','2'])->change();
+        });
+    }
+}

+ 6 - 3
database/seeders/Seeds/ProductSeeder.php

@@ -16,29 +16,32 @@ class ProductSeeder extends Seeder
     {
         Product::create([
             'name' => 'Starter',
-            'description' => '64MB Ram, 1GB Disk, 1 Database, 140 credits monthly',
+            'description' => '64MB Ram, 1GB Disk, 1 Database, 140 credits hourly',
             'price' => 140,
             'memory' => 64,
             'disk' => 1000,
             'databases' => 1,
+            'billing_period' => 'hourly'
         ]);
 
         Product::create([
             'name' => 'Standard',
-            'description' => '128MB Ram, 2GB Disk, 2 Database,  210 credits monthly',
+            'description' => '128MB Ram, 2GB Disk, 2 Database,  210 credits hourly',
             'price' => 210,
             'memory' => 128,
             'disk' => 2000,
             'databases' => 2,
+            'billing_period' => 'hourly'
         ]);
 
         Product::create([
             'name' => 'Advanced',
-            'description' => '256MB Ram, 5GB Disk, 5 Database,  280 credits monthly',
+            'description' => '256MB Ram, 5GB Disk, 5 Database,  280 credits hourly',
             'price' => 280,
             'memory' => 256,
             'disk' => 5000,
             'databases' => 5,
+            'billing_period' => 'hourly'
         ]);
     }
 }

+ 10 - 8
lang/bg.json

@@ -81,7 +81,7 @@
     "Someone registered using your Code!": "Someone registered using your Code!",
     "Server Creation Error": "Грешка при създаване на сървър",
     "Your servers have been suspended!": "Сървърите ви са спрени!",
-    "To automatically re-enable your server\/s, you need to purchase more credits.": "За да активирате автоматично вашия сървър\/и, трябва да закупите повече кредити.",
+    "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": "Поздрави",
@@ -93,7 +93,7 @@
     "Getting started!": "Приготвяме се да започнем!",
     "Welcome to our dashboard": "Welcome to our dashboard",
     "Verification": "Verification",
-    "You can verify your e-mail address and link\/verify your Discord account.": "You can verify your e-mail address and link\/verify your Discord account.",
+    "You can verify your e-mail address and link/verify your Discord account.": "You can verify your e-mail address and link/verify your Discord account.",
     "Information": "Information",
     "This dashboard can be used to create and delete servers": "This dashboard can be used to create and delete servers",
     "These servers can be used and managed on our pterodactyl panel": "These servers can be used and managed on our pterodactyl panel",
@@ -187,7 +187,7 @@
     "Default language": "Език по подразбиране",
     "The fallback Language, if something goes wrong": "Резервният език, ако нещо се обърка",
     "Datable language": "Език с данни",
-    "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ": "Езиков код на таблиците с данни. <br><strong>Пример:<\/strong> en-gb, fr_fr, de_de<br>Повече информация: ",
+    "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ": "Езиков код на таблиците с данни. <br><strong>Пример:</strong> en-gb, fr_fr, de_de<br>Повече информация: ",
     "Auto-translate": "Автоматичен превод",
     "If this is checked, the Dashboard will translate itself to the Clients language, if available": "Ако това е отметнато, таблото за управление ще се преведе на езика на клиентите, ако е наличен",
     "Client Language-Switch": "Превключване на клиентски език",
@@ -243,9 +243,9 @@
     "Charges the first hour worth of credits upon creating a server.": "Таксува кредити за първия час при създаване на сървър.",
     "Credits Display Name": "Credits Display Name",
     "PHPMyAdmin URL": "PHPMyAdmin URL",
-    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>": "Въведете URL адреса на вашата инсталация на PHPMyAdmin. <strong>Без крайна наклонена черта!<\/strong>",
+    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>": "Въведете URL адреса на вашата инсталация на PHPMyAdmin. <strong>Без крайна наклонена черта!</strong>",
     "Pterodactyl URL": "Pterodactyl URL",
-    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>": "Въведете URL адреса на вашата инсталация на Pterodactyl.<strong>Без крайна наклонена черта!<\/strong>",
+    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>": "Въведете URL адреса на вашата инсталация на Pterodactyl.<strong>Без крайна наклонена черта!</strong>",
     "Pterodactyl API Key": "Pterodactyl API Kлюч",
     "Enter the API Key to your Pterodactyl installation.": "Въведете API ключа към вашата инсталация на Pterodactyl.",
     "Force Discord verification": "Принудително потвърждаване на Discord",
@@ -316,7 +316,7 @@
     "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.": "Ваучер може да се използва само веднъж на потребител. Uses определя броя на различните потребители, които могат да използват този ваучер.",
     "Max": "Макс",
     "Expires at": "Изтича на",
-    "Used \/ Uses": "Използван \/ Използвания",
+    "Used / Uses": "Използван / Използвания",
     "Expires": "Изтича",
     "Sign in to start your session": "Влезте, за да започнете сесията си",
     "Password": "Парола",
@@ -388,7 +388,7 @@
     "No nodes have been linked!": "Няма свързани Node-ове!",
     "No nests available!": "Няма налични Nest-ове!",
     "No eggs have been linked!": "Няма свързани Egg-ове!",
-    "Software \/ Games": "Софтуер \/ Игри",
+    "Software / Games": "Софтуер / Игри",
     "Please select software ...": "Моля, изберете софтуер...",
     "---": "---",
     "Specification ": "Спецификация ",
@@ -460,5 +460,7 @@
     "tr": "Турски",
     "ru": "Руски",
     "sv": "Swedish",
-    "sk": "Slovakish"
+    "sk": "Slovakish",
+    "Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed": "Актуализирането / надграждането на сървъра ви ще нулира вашата билнгова цикъл до сега. Вашите превишени кредити ще бъдат възстановени. Цената за новия билнгов цикъл ще бъде извлечена",
+    "Caution": "Внимание"
 }

+ 9 - 7
lang/bs.json

@@ -80,7 +80,7 @@
     "User ID": "User ID",
     "Server Creation Error": "Server Creation Error",
     "Your servers have been suspended!": "Your servers have been suspended!",
-    "To automatically re-enable your server\/s, you need to purchase more credits.": "To automatically re-enable your server\/s, you need to purchase more credits.",
+    "To automatically re-enable your server/s, you need to purchase more credits.": "To automatically re-enable your server/s, you need to purchase more credits.",
     "Purchase credits": "Purchase credits",
     "If you have any questions please let us know.": "If you have any questions please let us know.",
     "Regards": "Regards",
@@ -173,7 +173,7 @@
     "Default language": "Default language",
     "The fallback Language, if something goes wrong": "The fallback Language, if something goes wrong",
     "Datable language": "Datable language",
-    "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ": "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ",
+    "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ": "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ",
     "Auto-translate": "Auto-translate",
     "If this is checked, the Dashboard will translate itself to the Clients language, if available": "If this is checked, the Dashboard will translate itself to the Clients language, if available",
     "Client Language-Switch": "Client Language-Switch",
@@ -214,9 +214,9 @@
     "Charges the first hour worth of credits upon creating a server.": "Charges the first hour worth of credits upon creating a server.",
     "Credits Display Name": "Credits Display Name",
     "PHPMyAdmin URL": "PHPMyAdmin URL",
-    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>": "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>",
+    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>": "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>",
     "Pterodactyl URL": "Pterodactyl URL",
-    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>": "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>",
+    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>": "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>",
     "Pterodactyl API Key": "Pterodactyl API Key",
     "Enter the API Key to your Pterodactyl installation.": "Enter the API Key to your Pterodactyl installation.",
     "Force Discord verification": "Force Discord verification",
@@ -284,7 +284,7 @@
     "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.": "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.",
     "Max": "Max",
     "Expires at": "Expires at",
-    "Used \/ Uses": "Used \/ Uses",
+    "Used / Uses": "Used / Uses",
     "Expires": "Expires",
     "Sign in to start your session": "Sign in to start your session",
     "Password": "Password",
@@ -354,7 +354,7 @@
     "No nodes have been linked!": "No nodes have been linked!",
     "No nests available!": "No nests available!",
     "No eggs have been linked!": "No eggs have been linked!",
-    "Software \/ Games": "Software \/ Games",
+    "Software / Games": "Software / Games",
     "Please select software ...": "Please select software ...",
     "---": "---",
     "Specification ": "Specification ",
@@ -441,5 +441,7 @@
     "pl": "Polish",
     "zh": "Chinese",
     "tr": "Turkish",
-    "ru": "Russian"
+    "ru": "Russian",
+    "Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed": "Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed",
+    "Caution": "Caution"
 }

+ 12 - 10
lang/cs.json

@@ -81,7 +81,7 @@
     "Someone registered using your Code!": "Někdo se zaregistroval pomocí vašeho kódu!",
     "Server Creation Error": "Chyba při vytváření serveru",
     "Your servers have been suspended!": "Vaše servery byly pozastaveny!",
-    "To automatically re-enable your server\/s, you need to purchase more credits.": "Pro opětovné spuštění vašich serverů dobijte prosím kredity.",
+    "To automatically re-enable your server/s, you need to purchase more credits.": "Pro opětovné spuštění vašich serverů dobijte prosím kredity.",
     "Purchase credits": "Zakoupit kredity",
     "If you have any questions please let us know.": "Máte-li jakékoli dotazy, dejte nám vědět.",
     "Regards": "S pozdravem",
@@ -93,7 +93,7 @@
     "Getting started!": "Začínáme!",
     "Welcome to our dashboard": "Vítejte v našem ovládacím panelu",
     "Verification": "Ověření",
-    "You can verify your e-mail address and link\/verify your Discord account.": "Můžete ověřit svojí e-mail adresu a přiojit váš Discord účet.",
+    "You can verify your e-mail address and link/verify your Discord account.": "Můžete ověřit svojí e-mail adresu a přiojit váš Discord účet.",
     "Information": "Informace",
     "This dashboard can be used to create and delete servers": "Tento panel může použít pro vytvoření a mazání serverů",
     "These servers can be used and managed on our pterodactyl panel": "Tyto servery můžete používat a spravovat v našem pterodactyl panelu",
@@ -114,7 +114,7 @@
     "Token": "Token",
     "Last used": "Naposledy použito",
     "Are you sure you wish to delete?": "Opravdu si přejete odstranit?",
-    "Nests": "Software\/hra",
+    "Nests": "Software/hra",
     "Sync": "Synchronizovat",
     "Active": "Aktivní",
     "ID": "ID",
@@ -187,7 +187,7 @@
     "Default language": "Výchozí jazyk",
     "The fallback Language, if something goes wrong": "Záložní jazyk, kdyby se něco pokazilo",
     "Datable language": "Jazyk tabulek",
-    "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ": "Kód jazyka datových tabulek. <br><strong>Příklad:<\/strong> en-gb, fr_fr, de_de<br>Více informací: ",
+    "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ": "Kód jazyka datových tabulek. <br><strong>Příklad:</strong> en-gb, fr_fr, de_de<br>Více informací: ",
     "Auto-translate": "Automatický překlad",
     "If this is checked, the Dashboard will translate itself to the Clients language, if available": "Pokud je tohle zaškrtlé, Panel bude přeložen do Jazyka klienta (pokud to je možné)",
     "Client Language-Switch": "Povolit uživatelům změnu jazyka",
@@ -243,9 +243,9 @@
     "Charges the first hour worth of credits upon creating a server.": "Po vytvoření služby náčtuje ihned první hodinu.",
     "Credits Display Name": "Název kreditů",
     "PHPMyAdmin URL": "PHPMyAdmin URL",
-    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>": "Vložte URL vaší instalace PHPmyAdmin. <strong>Bez koncového lomítka!<\/strong>",
+    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>": "Vložte URL vaší instalace PHPmyAdmin. <strong>Bez koncového lomítka!</strong>",
     "Pterodactyl URL": "Pterodactyl URL",
-    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>": "Vložte URL vaší instalace Pterodactyl. <strong>Bez koncového lomítka!<\/strong>",
+    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>": "Vložte URL vaší instalace Pterodactyl. <strong>Bez koncového lomítka!</strong>",
     "Pterodactyl API Key": "Pterodactyl API klíč",
     "Enter the API Key to your Pterodactyl installation.": "Zadejte API klíč Vaší Pterodactyl instalace.",
     "Force Discord verification": "Vynutit ověření skrz Discord",
@@ -316,7 +316,7 @@
     "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.": "Poukaz může být použit pouze jednou na uživatele. Počet použití upravuje počet různých uživatelů, kteří můžou poukaz použít.",
     "Max": "Maximum",
     "Expires at": "Vyprší",
-    "Used \/ Uses": "Použito",
+    "Used / Uses": "Použito",
     "Expires": "Vyprší",
     "Sign in to start your session": "Pro pokračování se prosím přihlašte",
     "Password": "Heslo",
@@ -386,9 +386,9 @@
     "Sync now": "Synchronizovat nyní",
     "No products available!": "Žádné dostupné balíčky!",
     "No nodes have been linked!": "Nebyly propojeny žádné uzly!",
-    "No nests available!": "Žádný dostupný software\/hry!",
+    "No nests available!": "Žádný dostupný software/hry!",
     "No eggs have been linked!": "Nebyly nastaveny žádné distribuce!",
-    "Software \/ Games": "Software\/hry",
+    "Software / Games": "Software/hry",
     "Please select software ...": "Prosím zvolte software ...",
     "---": "----",
     "Specification ": "Specifikace ",
@@ -460,5 +460,7 @@
     "tr": "Turečtina",
     "ru": "Ruština",
     "sv": "Švédština",
-    "sk": "Slovensky"
+    "sk": "Slovensky",
+    "Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed": "Aktualizace/snížení vašeho serveru resetuje váš fakturační cyklus na aktuální. Vaše přeplacené kredity budou vráceny. Cena za nový fakturační cyklus bude odečtena",
+    "Caution": "Upozornění"
 }

+ 25 - 3
lang/de.json

@@ -461,7 +461,29 @@
     "ru": "Russisch",
     "sv": "Schwedisch",
     "sk": "Slowakisch",
-    "Imprint": "Impressum",
-    "Privacy": "Datenschutz",
-    "Privacy Policy": "Datenschutzerklärung"
+    "hourly": "Stündlich",
+    "monthly": "Monatlich",
+    "yearly": "Jährlich",
+    "daily": "Täglich",
+    "weekly": "Wöchentlich",
+    "quarterly": "Vierteljährlich",
+    "half-annually": "Halbjährlich",
+    "annually": "Jährlich",
+    "Suspended": "Gesperrt",
+    "Cancelled": "Gekündigt",
+    "An exception has occurred while trying to cancel the server": "Ein Fehler ist aufgetreten beim Versuch, den Server zu kündigen",
+    "This will cancel your current server to the next billing period. It will get suspended when the current period runs out.": "Dies wird Ihren aktuellen Server zur nächsten Abrechnungsperiode kündigen. Er wird beim Ablauf der aktuellen Periode gesperrt.",
+    "This is an irreversible action, all files of this server will be removed. <strong>No funds will get refunded</strong>. We recommend deleting the server when server is suspended.": "Dies ist eine irreversiblen Aktion, alle Dateien dieses Servers werden gelöscht. <strong>Keine Rückerstattung!</strong>. Wir empfehlen, den Server zu löschen, wenn er gesperrt ist.",
+    "Cancel Server?": "Server kündigen?",
+    "Delete Server?": "Server löschen?",
+    "Billing Period": "Abrechnungsperiode",
+    "Next Billing Cycle": "Nächste Abrechnungsperiode",
+    "Manage Server": "Server verwalten",
+    "Delete Server": "Server löschen",
+    "Cancel Server": "Server kündigen",
+    "Yes, cancel it!": "Ja, löschen!",
+    "No, abort!": "Abbrechen",
+    "Billing period": "Abrechnungsperiode",
+    "Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed": "Das Upgrade/Downgrade Ihres Servers wird Ihre Abrechnungsperiode auf \"jetzt\" zurücksetzen. Ihre überzahlten Credits werden erstattet. Der Preis für die neue Abrechnungsperiode wird abgebucht.",
+    "Caution": "Achtung"
 }

+ 43 - 16
lang/en.json

@@ -109,7 +109,7 @@
     "Someone registered using your Code!": "Someone registered using your Code!",
     "Server Creation Error": "Server Creation Error",
     "Your servers have been suspended!": "Your servers have been suspended!",
-    "To automatically re-enable your server\/s, you need to purchase more credits.": "To automatically re-enable your server\/s, you need to purchase more credits.",
+    "To automatically re-enable your server/s, you need to purchase more credits.": "To automatically re-enable your server/s, you need to purchase more credits.",
     "Purchase credits": "Purchase credits",
     "If you have any questions please let us know.": "If you have any questions please let us know.",
     "Regards": "Regards",
@@ -121,7 +121,7 @@
     "Getting started!": "Getting started!",
     "Welcome to our dashboard": "Welcome to our dashboard",
     "Verification": "Verification",
-    "You can verify your e-mail address and link\/verify your Discord account.": "You can verify your e-mail address and link\/verify your Discord account.",
+    "You can verify your e-mail address and link/verify your Discord account.": "You can verify your e-mail address and link/verify your Discord account.",
     "Information": "Information",
     "This dashboard can be used to create and delete servers": "This dashboard can be used to create and delete servers",
     "These servers can be used and managed on our pterodactyl panel": "These servers can be used and managed on our pterodactyl panel",
@@ -280,7 +280,7 @@
     "Default language": "Default language",
     "The fallback Language, if something goes wrong": "The fallback Language, if something goes wrong",
     "Datable language": "Datable language",
-    "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ": "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ",
+    "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ": "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ",
     "Auto-translate": "Auto-translate",
     "If this is checked, the Dashboard will translate itself to the Clients language, if available": "If this is checked, the Dashboard will translate itself to the Clients language, if available",
     "Client Language-Switch": "Client Language-Switch",
@@ -340,19 +340,20 @@
     "Tax Value in %": "Tax Value in %",
     "System": "System",
     "Show Terms of Service": "Show Terms of Service",
+    "Show the TOS link in the footer of every page. <br> Edit the content in \"resources/views/information/tos-content.blade.php\"": "Show the TOS link in the footer of every page. <br> Edit the content in \"resources/views/information/tos-content.blade.php\"",
     "Show Imprint": "Show Imprint",
+    "Show the imprint link in the footer of every page. <br> Edit the content in \"resources/views/information/imprint-content.blade.php\"": "Show the imprint link in the footer of every page. <br> Edit the content in \"resources/views/information/imprint-content.blade.php\"",
     "Show Privacy Policy": "Show Privacy Policy",
+    "Show the privacy policy link in the footer of every page. <br> Edit the content in \"resources/views/information/privacy-content.blade.php\"": "Show the privacy policy link in the footer of every page. <br> Edit the content in \"resources/views/information/privacy-content.blade.php\"",
     "Register IP Check": "Register IP Check",
     "Prevent users from making multiple accounts using the same IP address.": "Prevent users from making multiple accounts using the same IP address.",
     "Charge first hour at creation": "Charge first hour at creation",
     "Charges the first hour worth of credits upon creating a server.": "Charges the first hour worth of credits upon creating a server.",
     "Credits Display Name": "Credits Display Name",
     "PHPMyAdmin URL": "PHPMyAdmin URL",
-    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>": "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>",
+    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>": "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>",
     "Pterodactyl URL": "Pterodactyl URL",
-    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>": "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>",
-    "Pterodactyl API perPage limit": "Pterodactyl API perPage limit",
-    "The Pterodactyl API perPage limit. It is necessary to set it higher than your server count.": "The Pterodactyl API perPage limit. It is necessary to set it higher than your server count.",
+    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>": "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>",
     "Pterodactyl API Key": "Pterodactyl API Key",
     "Enter the API Key to your Pterodactyl installation.": "Enter the API Key to your Pterodactyl installation.",
     "Pterodactyl Admin-Account API Key": "Pterodactyl Admin-Account API Key",
@@ -370,8 +371,8 @@
     "Server Limit Increase - E-Mail": "Server Limit Increase - E-Mail",
     "Server Limit after Credits Purchase": "Server Limit after Credits Purchase",
     "Server": "Server",
-    "Enable upgrade\/downgrade of servers": "Enable upgrade\/downgrade of servers",
-    "Allow upgrade\/downgrade to a new product for the given server": "Allow upgrade\/downgrade to a new product for the given server",
+    "Enable upgrade/downgrade of servers": "Enable upgrade/downgrade of servers",
+    "Allow upgrade/downgrade to a new product for the given server": "Allow upgrade/downgrade to a new product for the given server",
     "Creation of new servers": "Creation of new servers",
     "If unchecked, it will disable the creation of new servers for regular users and system moderators, this has no effect for administrators.": "If unchecked, it will disable the creation of new servers for regular users and system moderators, this has no effect for administrators.",
     "Server Allocation Limit": "Server Allocation Limit",
@@ -457,7 +458,7 @@
     "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.": "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.",
     "Max": "Max",
     "Expires at": "Expires at",
-    "Used \/ Uses": "Used \/ Uses",
+    "Used / Uses": "Used / Uses",
     "Expires": "Expires",
     "Sign in to start your session": "Sign in to start your session",
     "Email or Username": "Email or Username",
@@ -530,7 +531,7 @@
     "Created At": "Created At",
     "Add To Blacklist": "Add To Blacklist",
     "please make the best of it": "please make the best of it",
-    "Please note, the blacklist will make the user unable to make a ticket\/reply again": "Please note, the blacklist will make the user unable to make a ticket\/reply again",
+    "Please note, the blacklist will make the user unable to make a ticket/reply again": "Please note, the blacklist will make the user unable to make a ticket/reply again",
     "Ticket": "Ticket",
     "Category": "Category",
     "Priority": "Priority",
@@ -565,7 +566,7 @@
     "No nodes have been linked!": "No nodes have been linked!",
     "No nests available!": "No nests available!",
     "No eggs have been linked!": "No eggs have been linked!",
-    "Software \/ Games": "Software \/ Games",
+    "Software / Games": "Software / Games",
     "Please select software ...": "Please select software ...",
     "---": "---",
     "Specification ": "Specification ",
@@ -600,8 +601,9 @@
     "Hourly Price": "Hourly Price",
     "Monthly Price": "Monthly Price",
     "MySQL Database": "MySQL Database",
-    "Upgrade \/ Downgrade": "Upgrade \/ Downgrade",
-    "Upgrade\/Downgrade Server": "Upgrade\/Downgrade Server",
+    "To enable the upgrade/downgrade system, please set your Ptero Admin-User API Key in the Settings!": "To enable the upgrade/downgrade system, please set your Ptero Admin-User API Key in the Settings!",
+    "Upgrade / Downgrade": "Upgrade / Downgrade",
+    "Upgrade/Downgrade Server": "Upgrade/Downgrade Server",
     "FOR DOWNGRADE PLEASE CHOOSE A PLAN BELOW YOUR PLAN": "FOR DOWNGRADE PLEASE CHOOSE A PLAN BELOW YOUR PLAN",
     "YOUR PRODUCT": "YOUR PRODUCT",
     "Select the product": "Select the product",
@@ -653,5 +655,30 @@
     "ru": "Russian",
     "sv": "Swedish",
     "sk": "Slovakish",
-    "hu": "Hungarian"
-}
+    "hu": "Hungarian",
+    "hourly": "Hourly",
+    "monthly": "Monthly",
+    "yearly": "Yearly",
+    "daily": "Daily",
+    "weekly": "Weekly",
+    "quarterly": "Quarterly",
+    "half-annually": "Half-annually",
+    "annually": "Annually",
+    "Suspended": "Suspended",
+    "Cancelled": "Cancelled",
+    "An exception has occurred while trying to cancel the server": "An exception has occurred while trying to cancel the server",
+    "This will cancel your current server to the next billing period. It will get suspended when the current period runs out.": "This will cancel your current server to the next billing period. It will get suspended when the current period runs out.",
+    "Cancel Server?": "Cancel Server?",
+    "Delete Server?": "Delete Server?",
+    "This is an irreversible action, all files of this server will be removed. <strong>No funds will get refunded</strong>. We recommend deleting the server when server is suspended.": "This is an irreversible action, all files of this server will be removed. <strong>No funds will get refunded</strong>. We recommend deleting the server when server is suspended.",
+    "Billing Period": "Billing Period",
+    "Next Billing Cycle": "Next Billing Cycle",
+    "Manage Server": "Manage Server",
+    "Delete Server": "Delete Server",
+    "Cancel Server": "Cancel Server",
+    "Yes, cancel it!": "Yes, cancel it!",
+    "No, abort!": "No, abort!",
+    "Billing period": "Billing period",
+    "Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed": "Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed",
+    "Caution": "Caution"
+}

+ 11 - 9
lang/es.json

@@ -81,7 +81,7 @@
     "Someone registered using your Code!": "Someone registered using your Code!",
     "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.",
+    "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",
@@ -93,7 +93,7 @@
     "Getting started!": "¡Empezando!",
     "Welcome to our dashboard": "Welcome to our dashboard",
     "Verification": "Verification",
-    "You can verify your e-mail address and link\/verify your Discord account.": "You can verify your e-mail address and link\/verify your Discord account.",
+    "You can verify your e-mail address and link/verify your Discord account.": "You can verify your e-mail address and link/verify your Discord account.",
     "Information": "Information",
     "This dashboard can be used to create and delete servers": "This dashboard can be used to create and delete servers",
     "These servers can be used and managed on our pterodactyl panel": "These servers can be used and managed on our pterodactyl panel",
@@ -187,7 +187,7 @@
     "Default language": "Idioma predeterminado",
     "The fallback Language, if something goes wrong": "El lenguaje alternativo, si algo sale mal",
     "Datable language": "Lenguaje de tabla de datos",
-    "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ": "El código de idioma de las tablas de datos. <br><strong>Ejemplo:<\/strong> en-gb, fr_fr, de_de<br>Más información: ",
+    "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ": "El código de idioma de las tablas de datos. <br><strong>Ejemplo:</strong> en-gb, fr_fr, de_de<br>Más información: ",
     "Auto-translate": "Traducir automáticamente",
     "If this is checked, the Dashboard will translate itself to the Clients language, if available": "Si está marcado, el Tablero se traducirá solo al idioma del Cliente, si está disponible",
     "Client Language-Switch": "Cambio de idioma del cliente",
@@ -243,9 +243,9 @@
     "Charges the first hour worth of credits upon creating a server.": "Carga la primera hora de créditos al crear un servidor.",
     "Credits Display Name": "Nombre de los Créditos para mostrar",
     "PHPMyAdmin URL": "PHPMyAdmin URL",
-    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>": "Ingrese la URL de su instalación de PHPMyAdmin. <strong>¡Sin una barra diagonal final!<\/strong>",
+    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>": "Ingrese la URL de su instalación de PHPMyAdmin. <strong>¡Sin una barra diagonal final!</strong>",
     "Pterodactyl URL": "Pterodactyl URL",
-    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>": "Introduzca la URL de su instalación de Pterodactyl. <strong>¡Sin una barra diagonal final!<\/strong>",
+    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>": "Introduzca la URL de su instalación de Pterodactyl. <strong>¡Sin una barra diagonal final!</strong>",
     "Pterodactyl API Key": "Pterodactyl API Key",
     "Enter the API Key to your Pterodactyl installation.": "Ingrese la API Key para su instalación de Pterodactyl.",
     "Force Discord verification": "Forzar verificación de Discord",
@@ -263,7 +263,7 @@
     "Select panel favicon": "Seleccionar favicon del panel",
     "Store": "Tienda",
     "Server Slots": "Server Slots",
-    "Currency code": "Código de divisa\/moneda",
+    "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",
@@ -316,7 +316,7 @@
     "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.": "El descuento solo se puede utilizar una vez por usuario. Los usos especifica el número de usuarios diferentes que pueden utilizar este cupón.",
     "Max": "Máx",
     "Expires at": "Expira el",
-    "Used \/ Uses": "Uso \/ Usos",
+    "Used / Uses": "Uso / Usos",
     "Expires": "Expira",
     "Sign in to start your session": "Iniciar sesión para comenzar",
     "Password": "Contraseña",
@@ -388,7 +388,7 @@
     "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",
+    "Software / Games": "Software / Juegos",
     "Please select software ...": "Seleccione el software...",
     "---": "---",
     "Specification ": "Especificación ",
@@ -460,5 +460,7 @@
     "tr": "Turco",
     "ru": "Ruso",
     "sv": "Sueco",
-    "sk": "Eslovaco"
+    "sk": "Eslovaco",
+    "Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed": "Actualizar/Reducir el servidor restablecerá su ciclo de facturación a ahora. Se reembolsarán los créditos sobrepagados. El precio del nuevo ciclo de facturación se retirará",
+    "Caution": "Cuidado"
 }

+ 9 - 7
lang/fr.json

@@ -81,7 +81,7 @@
     "Someone registered using your Code!": "Someone registered using your Code!",
     "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.",
+    "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",
@@ -93,7 +93,7 @@
     "Getting started!": "Commencer !",
     "Welcome to our dashboard": "Welcome to our dashboard",
     "Verification": "Verification",
-    "You can verify your e-mail address and link\/verify your Discord account.": "You can verify your e-mail address and link\/verify your Discord account.",
+    "You can verify your e-mail address and link/verify your Discord account.": "You can verify your e-mail address and link/verify your Discord account.",
     "Information": "Information",
     "This dashboard can be used to create and delete servers": "This dashboard can be used to create and delete servers",
     "These servers can be used and managed on our pterodactyl panel": "These servers can be used and managed on our pterodactyl panel",
@@ -187,7 +187,7 @@
     "Default language": "Langue par défaut",
     "The fallback Language, if something goes wrong": "La langue de repli, si quelque chose ne va pas",
     "Datable language": "Datable language",
-    "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ": "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ",
+    "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ": "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ",
     "Auto-translate": "Auto-translate",
     "If this is checked, the Dashboard will translate itself to the Clients language, if available": "If this is checked, the Dashboard will translate itself to the Clients language, if available",
     "Client Language-Switch": "Client Language-Switch",
@@ -243,9 +243,9 @@
     "Charges the first hour worth of credits upon creating a server.": "Charges the first hour worth of credits upon creating a server.",
     "Credits Display Name": "Credits Display Name",
     "PHPMyAdmin URL": "PHPMyAdmin URL",
-    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>": "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>",
+    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>": "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>",
     "Pterodactyl URL": "Pterodactyl URL",
-    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>": "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>",
+    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>": "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>",
     "Pterodactyl API Key": "Pterodactyl API Key",
     "Enter the API Key to your Pterodactyl installation.": "Enter the API Key to your Pterodactyl installation.",
     "Force Discord verification": "Force Discord verification",
@@ -316,7 +316,7 @@
     "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.": "Le code ne peut être utilisé qu'une seule fois. L'utilisation spécifie le nombre d'utilisateurs différents qui peuvent utiliser ce code.",
     "Max": "Max",
     "Expires at": "Expire à",
-    "Used \/ Uses": "Utilisé \/ Utilisations",
+    "Used / Uses": "Utilisé / Utilisations",
     "Expires": "Expire",
     "Sign in to start your session": "Identifiez-vous pour commencer votre session",
     "Password": "Mot de passe",
@@ -388,7 +388,7 @@
     "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",
+    "Software / Games": "Logiciels / Jeux",
     "Please select software ...": "Veuillez sélectionner...",
     "---": "---",
     "Specification ": "Spécification ",
@@ -447,6 +447,8 @@
     "Notes": "Notes",
     "Amount in words": "Montant en toutes lettres",
     "Please pay until": "Veuillez payer avant",
+    "Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed": "Mettre à niveau / Réduire votre serveur réinitialisera votre cycle de facturation à maintenant. Vos crédits surpayés seront remboursés. Le prix du nouveau cycle de facturation sera débité",
+    "Caution": "Attention",
     "cs": "Czech",
     "de": "German",
     "en": "English",

+ 21 - 19
lang/he.json

@@ -60,8 +60,8 @@
     "You ran out of Credits": "נגמר לך המטבעות",
     "Profile updated": "הפרופיל עודכן",
     "Server limit reached!": "הגעת להגבלת השרתים!",
-    "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.": "אתה חייב לקשר את החשבון דיסקורד שלך לפני שתוכל\/י ליצור שרת",
+    "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.": "אתה חייב לקשר את החשבון דיסקורד שלך לפני שתוכל/י ליצור שרת",
     "Server created": "השרת נוצר",
     "No allocations satisfying the requirements for automatic deployment on this node were found.": "לא נמצאו הקצאות העומדות בדרישות לפריסה אוטומטית בשרת זה.",
     "You are required to verify your email address before you can purchase credits.": "אתה נדרש לאמת את כתובת המייל שלך לפני רכישת מטבעות",
@@ -81,7 +81,7 @@
     "Someone registered using your Code!": "Someone registered using your Code!",
     "Server Creation Error": "שגיאה ביצירת שרת",
     "Your servers have been suspended!": "השרת שלך מושעה!",
-    "To automatically re-enable your server\/s, you need to purchase more credits.": "כדי להפעיל מחדש את השרתים שלך באופן אוטומטי, עליך לרכוש מטבעות נוספות.",
+    "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": "בברכה",
@@ -93,7 +93,7 @@
     "Getting started!": "מתחילים!",
     "Welcome to our dashboard": "Welcome to our dashboard",
     "Verification": "Verification",
-    "You can verify your e-mail address and link\/verify your Discord account.": "You can verify your e-mail address and link\/verify your Discord account.",
+    "You can verify your e-mail address and link/verify your Discord account.": "You can verify your e-mail address and link/verify your Discord account.",
     "Information": "Information",
     "This dashboard can be used to create and delete servers": "This dashboard can be used to create and delete servers",
     "These servers can be used and managed on our pterodactyl panel": "These servers can be used and managed on our pterodactyl panel",
@@ -125,7 +125,7 @@
     "Admin Overview": "סקירת מנהל",
     "Support server": "שרת תמיכה",
     "Documentation": "מדריך",
-    "Github": "Github\/גיטאהב",
+    "Github": "Github/גיטאהב",
     "Support ControlPanel": "תמיכת ControlPanel",
     "Servers": "שרתים",
     "Total": "בסך הכל",
@@ -156,7 +156,7 @@
     "Minimum": "מינימום",
     "Setting to -1 will use the value from configuration.": "הגדרות ל -1 ישתמש בערך מ configuration.",
     "IO": "IO",
-    "Databases": "Databases\/ממסד נתונים",
+    "Databases": "Databases/ממסד נתונים",
     "Backups": "גיבויים",
     "Allocations": "הקצאות",
     "Product Linking": "מוצרים מקושרים",
@@ -187,7 +187,7 @@
     "Default language": "שפת ברירת מחדל",
     "The fallback Language, if something goes wrong": "אם משהו משתבש",
     "Datable language": "שפה ניתנת לנתונים",
-    "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ": "טבלת הנתונים של השפות.<br><strong>לדוגמא:<\/strong> en-gb, fr_fr, de_de<br>למידע נוסף: ",
+    "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ": "טבלת הנתונים של השפות.<br><strong>לדוגמא:</strong> en-gb, fr_fr, de_de<br>למידע נוסף: ",
     "Auto-translate": "תרגום אוטומטי",
     "If this is checked, the Dashboard will translate itself to the Clients language, if available": "אם זה מסומן, Dashboard יתרגם את עצמו לשפת הלקוח, אם זמין",
     "Client Language-Switch": "החלפת שפת לקוח",
@@ -243,9 +243,9 @@
     "Charges the first hour worth of credits upon creating a server.": "Cגובה מטבעות בשווי השעה הראשונה בעת יצירת שרת.",
     "Credits Display Name": "שם המטבעות",
     "PHPMyAdmin URL": "קישור PHPMyAdmin",
-    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>": "הכנס את הקישור to פיחפי. <strong>בלי צלייה נגררת!<\/strong>",
+    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>": "הכנס את הקישור to פיחפי. <strong>בלי צלייה נגררת!</strong>",
     "Pterodactyl URL": "קישור Pterodactyl",
-    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>": "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>",
+    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>": "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>",
     "Pterodactyl API Key": "Pterodactyl API מפתח",
     "Enter the API Key to your Pterodactyl installation.": "הכנס את מפתח ה API Pterodactyl installation.",
     "Force Discord verification": "אימות דיסקורד חובה",
@@ -300,12 +300,12 @@
     "Notifications": "התראות",
     "All": "הכל",
     "Send via": "שליחה באמצאות",
-    "Database": "Database\/מאגר נתונים",
+    "Database": "Database/מאגר נתונים",
     "Content": "קשר",
     "Server limit": "הגבלת שרת",
-    "Discord": "Discord\/דיסקורד",
+    "Discord": "Discord/דיסקורד",
     "Usage": "נוהג",
-    "IP": "IP\/אייפי",
+    "IP": "IP/אייפי",
     "Referals": "Referals",
     "Vouchers": "קופונים",
     "Voucher details": "פרטי קופון",
@@ -316,7 +316,7 @@
     "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.": "ניתן להשתמש בשובר פעם אחת בלבד לכל משתמש. שימושים מציינים את מספר המשתמשים השונים שיכולים להשתמש בשובר זה.",
     "Max": "מקסימום",
     "Expires at": "יפוג ב",
-    "Used \/ Uses": "משומש \/ שימושים",
+    "Used / Uses": "משומש / שימושים",
     "Expires": "פגי תוקף",
     "Sign in to start your session": "התחבר על מנת להתחיל",
     "Password": "סיסמה",
@@ -339,7 +339,7 @@
     "Before proceeding, please check your email for a verification link.": "לפני שתמשיך, אנא בדוק באימייל שלך קישור לאימות.",
     "If you did not receive the email": "אם לא קיבלת את המייל",
     "click here to request another": "לחץ כאן כדי לבקש אחר",
-    "per month": "\/חודש",
+    "per month": "/חודש",
     "Out of Credits in": "נגמרו המטבעות ב",
     "Home": "בית",
     "Language": "שפה",
@@ -388,7 +388,7 @@
     "No nodes have been linked!": "שרתים לא מקושרים!",
     "No nests available!": "No nests available!",
     "No eggs have been linked!": "אין eggs מקושרים",
-    "Software \/ Games": "תוכנה \/ משחקים",
+    "Software / Games": "תוכנה / משחקים",
     "Please select software ...": "בבקשה תחבר תוכנה ...",
     "---": "---",
     "Specification ": "ציין ",
@@ -411,9 +411,9 @@
     "Specification": "לציין",
     "Resource plan": "תוכנית משאבים",
     "RAM": "RAM",
-    "MySQL Databases": "בסיס הנתונים <bdi dir=\"ltr\">MySQL<\/bdi>",
-    "per Hour": "\/שעה",
-    "per Month": "\/חודש",
+    "MySQL Databases": "בסיס הנתונים <bdi dir=\"ltr\">MySQL</bdi>",
+    "per Hour": "/שעה",
+    "per Month": "/חודש",
     "Manage": "לנהל",
     "Are you sure?": "האם אתה בטוח?",
     "This is an irreversible action, all files of this server will be removed.": "זוהי פעולה בלתי הפיכה, כל הקבצים של שרת זה יוסרו.",
@@ -460,5 +460,7 @@
     "tr": "טורקית",
     "ru": "רוסית",
     "sv": "שוודית",
-    "sk": "סלובקית"
+    "sk": "סלובקית",
+    "Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed": "שדרוג / הורדת שרת יאפס את מחזור החיוב שלך לעכשיו. הקרדיטים ששילמת יוחזרו. המחיר למחזור החיוב החדש יוחסם",
+    "Caution": "אזהרה"
 }

+ 9 - 7
lang/hi.json

@@ -81,7 +81,7 @@
     "Someone registered using your Code!": "Someone registered using your Code!",
     "Server Creation Error": "सर्वर निर्माण त्रुटि",
     "Your servers have been suspended!": "आपके सर्वर निलंबित कर दिए गए हैं!",
-    "To automatically re-enable your server\/s, you need to purchase more credits.": "अपने सर्वर\/सर्वर को स्वचालित रूप से पुन: सक्षम करने के लिए, आपको अधिक क्रेडिट खरीदने की आवश्यकता है।",
+    "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": "सादर",
@@ -93,7 +93,7 @@
     "Getting started!": "शुरू करना!",
     "Welcome to our dashboard": "Welcome to our dashboard",
     "Verification": "Verification",
-    "You can verify your e-mail address and link\/verify your Discord account.": "You can verify your e-mail address and link\/verify your Discord account.",
+    "You can verify your e-mail address and link/verify your Discord account.": "You can verify your e-mail address and link/verify your Discord account.",
     "Information": "Information",
     "This dashboard can be used to create and delete servers": "This dashboard can be used to create and delete servers",
     "These servers can be used and managed on our pterodactyl panel": "These servers can be used and managed on our pterodactyl panel",
@@ -187,7 +187,7 @@
     "Default language": "डिफ़ॉल्ट भाषा",
     "The fallback Language, if something goes wrong": "फ़ॉलबैक भाषा, अगर कुछ गलत हो जाता है",
     "Datable language": "डेटा योग्य भाषा",
-    "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ": "डेटाटेबल्स लैंग-कोड। <br><strong>उदाहरण:<\/strong> en-gb, fr_fr, de_de<br>अधिक जानकारी: ",
+    "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ": "डेटाटेबल्स लैंग-कोड। <br><strong>उदाहरण:</strong> en-gb, fr_fr, de_de<br>अधिक जानकारी: ",
     "Auto-translate": "ऑटो का अनुवाद",
     "If this is checked, the Dashboard will translate itself to the Clients language, if available": "यदि यह चेक किया जाता है, तो डैशबोर्ड स्वयं को क्लाइंट भाषा में अनुवाद करेगा, यदि उपलब्ध हो",
     "Client Language-Switch": "क्लाइंट भाषा-स्विच",
@@ -243,9 +243,9 @@
     "Charges the first hour worth of credits upon creating a server.": "सर्वर बनाने पर पहले घंटे के क्रेडिट का शुल्क लेता है।",
     "Credits Display Name": "क्रेडिट प्रदर्शन नाम",
     "PHPMyAdmin URL": "PhpMyAdmin URL",
-    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>": "अपने PHPMyAdmin इंस्टॉलेशन का URL दर्ज करें। <strong>पिछली स्लैश के बिना!<\/strong>",
+    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>": "अपने PHPMyAdmin इंस्टॉलेशन का URL दर्ज करें। <strong>पिछली स्लैश के बिना!</strong>",
     "Pterodactyl URL": "पटरोडैक्टाइल यूआरएल",
-    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>": "अपने Pterodactyl संस्थापन का URL दर्ज करें। <strong>पिछली स्लैश के बिना!<\/strong>",
+    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>": "अपने Pterodactyl संस्थापन का URL दर्ज करें। <strong>पिछली स्लैश के बिना!</strong>",
     "Pterodactyl API Key": "पटरोडैक्टाइल एपीआई कुंजी",
     "Enter the API Key to your Pterodactyl installation.": "अपने Pterodactyl स्थापना के लिए API कुंजी दर्ज करें।",
     "Force Discord verification": "बल विवाद सत्यापन",
@@ -316,7 +316,7 @@
     "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.": "वाउचर प्रति उपयोगकर्ता केवल एक बार उपयोग किया जा सकता है। उपयोग इस वाउचर का उपयोग करने वाले विभिन्न उपयोगकर्ताओं की संख्या को निर्दिष्ट करता है।",
     "Max": "मैक्स",
     "Expires at": "पर समाप्त हो रहा है",
-    "Used \/ Uses": "प्रयुक्त \/ उपयोग",
+    "Used / Uses": "प्रयुक्त / उपयोग",
     "Expires": "समय-सीमा समाप्त",
     "Sign in to start your session": "अपना सत्र शुरू करने के लिए साइन इन करें",
     "Password": "पासवर्ड",
@@ -388,7 +388,7 @@
     "No nodes have been linked!": "कोई नोड लिंक नहीं किया गया है!",
     "No nests available!": "कोई घोंसला उपलब्ध नहीं है!",
     "No eggs have been linked!": "कोई अंडे नहीं जोड़े गए हैं!",
-    "Software \/ Games": "सॉफ्टवेयर \/ खेल",
+    "Software / Games": "सॉफ्टवेयर / खेल",
     "Please select software ...": "कृपया सॉफ्टवेयर चुनें...",
     "---": "---",
     "Specification ": "विनिर्देश",
@@ -447,6 +447,8 @@
     "Notes": "टिप्पणियाँ",
     "Amount in words": "राशि शब्दों में",
     "Please pay until": "कृपया भुगतान करें",
+    "Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed": "अपने सर्वर को अपग्रेड / डाउनग्रेड करने से आपका बिलिंग साइकिल अब तक रीसेट हो जाएगा। आपके ओवरपेड क्रेडिट वापस किया जाएगा। नए बिलिंग साइकिल के लिए की गई मूल्य निकाला जाएगा",
+    "Caution": "सावधान",
     "cs": "चेक",
     "de": "जर्मन",
     "en": "अंग्रेज़ी",

+ 9 - 7
lang/hu.json

@@ -81,7 +81,7 @@
     "Someone registered using your Code!": "Valaki regisztrált a te Kódoddal!",
     "Server Creation Error": "Hiba a szerver készítése közben",
     "Your servers have been suspended!": "A szervered fel lett függesztve!",
-    "To automatically re-enable your server\/s, you need to purchase more credits.": "A szervered\/szervereid autómatikus újraengedélyezéséhez Kreditet kell vásárolnod.",
+    "To automatically re-enable your server/s, you need to purchase more credits.": "A szervered/szervereid autómatikus újraengedélyezéséhez Kreditet kell vásárolnod.",
     "Purchase credits": "Kreditek vásárlása",
     "If you have any questions please let us know.": "Ha kérdésed van, kérjük fordulj hozzánk.",
     "Regards": "Üdvözlettel",
@@ -93,7 +93,7 @@
     "Getting started!": "Kezdhetjük!",
     "Welcome to our dashboard": "Üdvözlünk az Irányítópultban",
     "Verification": "Hitelesítés",
-    "You can verify your e-mail address and link\/verify your Discord account.": "Hitelesíteni tudod az email címedet és a Discord fiókodat.",
+    "You can verify your e-mail address and link/verify your Discord account.": "Hitelesíteni tudod az email címedet és a Discord fiókodat.",
     "Information": "Információk",
     "This dashboard can be used to create and delete servers": "Ebben az Irányítópultban szervereket tudsz létrehozni és törölni",
     "These servers can be used and managed on our pterodactyl panel": "Ezeket a szervereket a Pterodactyl panelben tudod kezelni",
@@ -187,7 +187,7 @@
     "Default language": "Alapértelmezett nyelv",
     "The fallback Language, if something goes wrong": "A tartalék nyelv, ha bármi rosszul működne",
     "Datable language": "Keltezhető nyelv",
-    "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ": "Az adattáblák kódnyelve. <br><strong>Például:<\/strong> en-gb, fr_fr, de_de<br>Több információ: ",
+    "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ": "Az adattáblák kódnyelve. <br><strong>Például:</strong> en-gb, fr_fr, de_de<br>Több információ: ",
     "Auto-translate": "Autómatikus fordítás",
     "If this is checked, the Dashboard will translate itself to the Clients language, if available": "Ha be van kapcsolva, akkor az Irányítópult autómatikusan le lesz fordítva a Kliens által használt nyelvre, ha az elérhető",
     "Client Language-Switch": "Kliens nyelv váltás",
@@ -243,9 +243,9 @@
     "Charges the first hour worth of credits upon creating a server.": "Első óra kifizetése szerver létrehozásnál.",
     "Credits Display Name": "Kredit megnevezése",
     "PHPMyAdmin URL": "PHPMyAdmin Hivatkozás",
-    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>": "Írd be a hivatkozást a PHPMyAdmin telepítéséhez. <strong>A zárjó perjel nélkül!<\/strong>",
+    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>": "Írd be a hivatkozást a PHPMyAdmin telepítéséhez. <strong>A zárjó perjel nélkül!</strong>",
     "Pterodactyl URL": "Pterodactyl Hivatkozás",
-    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>": "Írd be a hivatkozást a Pterodactyl telepítéséhez. <strong>A zárjó perjel nélkül!<\/strong>",
+    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>": "Írd be a hivatkozást a Pterodactyl telepítéséhez. <strong>A zárjó perjel nélkül!</strong>",
     "Pterodactyl API Key": "Pterodactyl API Kulcs",
     "Enter the API Key to your Pterodactyl installation.": "Írd be az API Kulcsot a Pterodactyl telepítéséhez.",
     "Force Discord verification": "Discord hitelesítés kötelezése",
@@ -316,7 +316,7 @@
     "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.": "Az utalványt egy felhasználó csak egyszer használhatja fel. Ezzel meg tudod adni, hogy hány felhasználó tudja felhasználni az utalványt.",
     "Max": "Max",
     "Expires at": "Lejárás ideje",
-    "Used \/ Uses": "Felhasználva \/ Felhasználások száma",
+    "Used / Uses": "Felhasználva / Felhasználások száma",
     "Expires": "Lejár",
     "Sign in to start your session": "Jelentkezz be a munkamenet elindításához",
     "Password": "Jelszó",
@@ -388,7 +388,7 @@
     "No nodes have been linked!": "Nem lett csomópont hozzácsatolva!",
     "No nests available!": "Nincs elérhető fészek!",
     "No eggs have been linked!": "Nem lett tojás hozzácsatolva!",
-    "Software \/ Games": "Szoftver \/ Játékok",
+    "Software / Games": "Szoftver / Játékok",
     "Please select software ...": "Szoftver kiválasztása ...",
     "---": "---",
     "Specification ": "Specifikációk ",
@@ -447,6 +447,8 @@
     "Notes": "Jegyzetek",
     "Amount in words": "Mennyiség szavakban",
     "Please pay until": "Fizetési határidő",
+    "Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed": "A szerver frissítése / lefrissítése visszaállítja a számlázási ciklust az aktuálisra. A túlfizetett Kreditet visszatérítjük. A számlázási ciklus új ára lesz kivonva",
+    "Caution": "Figyelem",
     "cs": "Cseh",
     "de": "Német",
     "en": "Angol",

+ 9 - 7
lang/it.json

@@ -81,7 +81,7 @@
     "Someone registered using your Code!": "Someone registered using your Code!",
     "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.",
+    "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",
@@ -93,7 +93,7 @@
     "Getting started!": "Come iniziare!",
     "Welcome to our dashboard": "Welcome to our dashboard",
     "Verification": "Verification",
-    "You can verify your e-mail address and link\/verify your Discord account.": "You can verify your e-mail address and link\/verify your Discord account.",
+    "You can verify your e-mail address and link/verify your Discord account.": "You can verify your e-mail address and link/verify your Discord account.",
     "Information": "Information",
     "This dashboard can be used to create and delete servers": "This dashboard can be used to create and delete servers",
     "These servers can be used and managed on our pterodactyl panel": "These servers can be used and managed on our pterodactyl panel",
@@ -187,7 +187,7 @@
     "Default language": "Lingua predefinita",
     "The fallback Language, if something goes wrong": "La lingua secondaria, se qualcosa va storto",
     "Datable language": "Datable language",
-    "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ": "Il lang-code dei datatables. <br><strong>Esempio:<\/strong> en-gb, fr_fr, de_de<br>Piu informazioni: ",
+    "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ": "Il lang-code dei datatables. <br><strong>Esempio:</strong> en-gb, fr_fr, de_de<br>Piu informazioni: ",
     "Auto-translate": "Traduzione-automatica",
     "If this is checked, the Dashboard will translate itself to the Clients language, if available": "Se questo è abilitato la dashboard si traducerà automaticamente alla lingua dei clienti, se disponibile",
     "Client Language-Switch": "Switch delle lingue dei clienti",
@@ -243,9 +243,9 @@
     "Charges the first hour worth of credits upon creating a server.": "Addebita la prima ora in crediti alla creazione di un server.",
     "Credits Display Name": "Nome di Visualizzazione dei Crediti",
     "PHPMyAdmin URL": "URL PHPMyAdmin",
-    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>": "Inserisci l'URL alla tua installazione di PHPMyAdmin. <strong>Senza lo slash finale!<\/strong>",
+    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>": "Inserisci l'URL alla tua installazione di PHPMyAdmin. <strong>Senza lo slash finale!</strong>",
     "Pterodactyl URL": "URL di Pterodactyl",
-    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>": "Inserisci l'URL alla tua installazione di Pterodactyl. <strong>Senza un trailing slash!<\/strong>",
+    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>": "Inserisci l'URL alla tua installazione di Pterodactyl. <strong>Senza un trailing slash!</strong>",
     "Pterodactyl API Key": "Chiave API di Pterodactyl",
     "Enter the API Key to your Pterodactyl installation.": "Inserisci la Chiave API alla tua installazione di Pterodactyl.",
     "Force Discord verification": "Forza la verifica di Discord",
@@ -316,7 +316,7 @@
     "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.": "Un voucher può essere utilizzato solo una volta per utente. Il numero di usi specifica il numero di utenti diversi che possono utilizzare questo voucher.",
     "Max": "Massimo",
     "Expires at": "Scade il",
-    "Used \/ Uses": "Usato \/ Utilizzi",
+    "Used / Uses": "Usato / Utilizzi",
     "Expires": "Scade",
     "Sign in to start your session": "Accedi per iniziare la sessione",
     "Password": "Password",
@@ -388,7 +388,7 @@
     "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",
+    "Software / Games": "Software / Giochi",
     "Please select software ...": "Per favore selezione il software...",
     "---": "---",
     "Specification ": "Specifiche ",
@@ -447,6 +447,8 @@
     "Notes": "Note",
     "Amount in words": "Numero in parole",
     "Please pay until": "Per favore paga fino",
+    "Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed": "L’aggiornamento / riduzione del tuo server reimposterà il tuo ciclo di fatturazione a ora. I tuoi crediti in eccesso saranno rimborsati. Il prezzo per il nuovo ciclo di fatturazione sarà prelevato",
+    "Caution": "Attenzione",
     "cs": "Ceco",
     "de": "Tedesco",
     "en": "Inglese",

+ 9 - 7
lang/nl.json

@@ -81,7 +81,7 @@
     "Someone registered using your Code!": "Someone registered using your Code!",
     "Server Creation Error": "Fout bij het maken van de server",
     "Your servers have been suspended!": "Uw servers zijn opgeschort!",
-    "To automatically re-enable your server\/s, you need to purchase more credits.": "Om uw server(s) automatisch opnieuw in te schakelen, moet u meer credits kopen.",
+    "To automatically re-enable your server/s, you need to purchase more credits.": "Om uw server(s) automatisch opnieuw in te schakelen, moet u meer credits kopen.",
     "Purchase credits": "Credits kopen",
     "If you have any questions please let us know.": "Als u vragen heeft, laat het ons dan weten.",
     "Regards": "Met vriendelijke groet",
@@ -93,7 +93,7 @@
     "Getting started!": "Aan de slag!",
     "Welcome to our dashboard": "Welkom bij ons dashboard",
     "Verification": "Verificatie",
-    "You can verify your e-mail address and link\/verify your Discord account.": "You can verify your e-mail address and link\/verify your Discord account.",
+    "You can verify your e-mail address and link/verify your Discord account.": "You can verify your e-mail address and link/verify your Discord account.",
     "Information": "Informatie",
     "This dashboard can be used to create and delete servers": "This dashboard can be used to create and delete servers",
     "These servers can be used and managed on our pterodactyl panel": "These servers can be used and managed on our pterodactyl panel",
@@ -187,7 +187,7 @@
     "Default language": "Standaard taal",
     "The fallback Language, if something goes wrong": "De terugval-taal, als er iets misgaat",
     "Datable language": "Dateerbare taal",
-    "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ": "De datatabellen lang-code. <br><strong>Voorbeeld:<\/strong> nl-gb, fr_fr, de_de<br>Meer informatie: ",
+    "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ": "De datatabellen lang-code. <br><strong>Voorbeeld:</strong> nl-gb, fr_fr, de_de<br>Meer informatie: ",
     "Auto-translate": "Automatisch vertalen",
     "If this is checked, the Dashboard will translate itself to the Clients language, if available": "Als dit is aangevinkt, zal het dashboard zichzelf vertalen naar de taal van de klant, indien beschikbaar",
     "Client Language-Switch": "Klant Taal-Switch",
@@ -243,9 +243,9 @@
     "Charges the first hour worth of credits upon creating a server.": "Brengt het eerste uur aan credits in rekening bij het maken van een server.",
     "Credits Display Name": "Weergavenaam tegoed",
     "PHPMyAdmin URL": "PHPMyAdmin-URL",
-    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>": "Voer de URL naar uw PHPMyAdmin-installatie in. <strong>Zonder een slash!<\/strong>",
+    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>": "Voer de URL naar uw PHPMyAdmin-installatie in. <strong>Zonder een slash!</strong>",
     "Pterodactyl URL": "Pterodactyl URL",
-    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>": "Voer de URL naar uw Pterodactyl-installatie in. <strong>Zonder een slash!<\/strong>",
+    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>": "Voer de URL naar uw Pterodactyl-installatie in. <strong>Zonder een slash!</strong>",
     "Pterodactyl API Key": "Pterodactyl API sleutel",
     "Enter the API Key to your Pterodactyl installation.": "Voer de API-sleutel in voor uw Pterodactyl-installatie.",
     "Force Discord verification": "Forceer Discord Verificatie",
@@ -316,7 +316,7 @@
     "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.": "Een voucher kan slechts één keer per gebruiker worden gebruikt. Gebruik geeft het aantal verschillende gebruikers aan dat deze voucher kan gebruiken.",
     "Max": "Maximum",
     "Expires at": "Verloopt om",
-    "Used \/ Uses": "Gebruikt \/ Toepassingen",
+    "Used / Uses": "Gebruikt / Toepassingen",
     "Expires": "Verloopt",
     "Sign in to start your session": "Login om te beginnen",
     "Password": "Wachtwoord",
@@ -388,7 +388,7 @@
     "No nodes have been linked!": "Er zijn geen nodes gekoppeld!",
     "No nests available!": "Er zijn geen nesten beschikbaar!",
     "No eggs have been linked!": "Geen eieren gekoppeld!",
-    "Software \/ Games": "Software \/ Spellen",
+    "Software / Games": "Software / Spellen",
     "Please select software ...": "Selecteer software...",
     "---": "---",
     "Specification ": "Specificatie ",
@@ -447,6 +447,8 @@
     "Notes": "Notities",
     "Amount in words": "Hoeveelheid in eenheden",
     "Please pay until": "Gelieve te betalen tot",
+    "Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed": "Upgraden/downgraden van uw server zal uw facturatiecyclus resetten naar nu. Uw overbetalen krediet zal worden terugbetaald. De prijs voor de nieuwe facturatiecyclus zal worden afgeschreven",
+    "Caution": "Let op",
     "cs": "Tsjechisch",
     "de": "Duits",
     "en": "Engels",

+ 9 - 7
lang/pl.json

@@ -81,7 +81,7 @@
     "Someone registered using your Code!": "Someone registered using your Code!",
     "Server Creation Error": "Błąd podczas tworzenia serwera",
     "Your servers have been suspended!": "Serwery zostały zawieszone!",
-    "To automatically re-enable your server\/s, you need to purchase more credits.": "Aby reaktywować swoje serwery, musisz kupić więcej kredytów.",
+    "To automatically re-enable your server/s, you need to purchase more credits.": "Aby reaktywować swoje serwery, musisz kupić więcej kredytów.",
     "Purchase credits": "Zakup kredyty",
     "If you have any questions please let us know.": "W razie jakichkolwiek pytań prosimy o kontakt.",
     "Regards": "Z poważaniem",
@@ -93,7 +93,7 @@
     "Getting started!": "Zaczynajmy!",
     "Welcome to our dashboard": "Welcome to our dashboard",
     "Verification": "Verification",
-    "You can verify your e-mail address and link\/verify your Discord account.": "You can verify your e-mail address and link\/verify your Discord account.",
+    "You can verify your e-mail address and link/verify your Discord account.": "You can verify your e-mail address and link/verify your Discord account.",
     "Information": "Information",
     "This dashboard can be used to create and delete servers": "This dashboard can be used to create and delete servers",
     "These servers can be used and managed on our pterodactyl panel": "These servers can be used and managed on our pterodactyl panel",
@@ -187,7 +187,7 @@
     "Default language": "Domyślny język",
     "The fallback Language, if something goes wrong": "The fallback Language, if something goes wrong",
     "Datable language": "Domyślny język",
-    "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ": "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ",
+    "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ": "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ",
     "Auto-translate": "Automatyczne tłumaczenie",
     "If this is checked, the Dashboard will translate itself to the Clients language, if available": "If this is checked, the Dashboard will translate itself to the Clients language, if available",
     "Client Language-Switch": "Client Language-Switch",
@@ -243,9 +243,9 @@
     "Charges the first hour worth of credits upon creating a server.": "Charges the first hour worth of credits upon creating a server.",
     "Credits Display Name": "Nazwa Waluty",
     "PHPMyAdmin URL": "PHPMyAdmin URL",
-    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>": "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>",
+    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>": "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>",
     "Pterodactyl URL": "URL Pterodactyl Panelu",
-    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>": "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>",
+    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>": "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>",
     "Pterodactyl API Key": "Klucz API Pterodactyl panelu",
     "Enter the API Key to your Pterodactyl installation.": "Enter the API Key to your Pterodactyl installation.",
     "Force Discord verification": "Force Discord verification",
@@ -316,7 +316,7 @@
     "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.": "Kupon może zostać zrealizowany tylko raz przez użytkownika. „Użycie” określa liczbę użytkowników, którzy mogą zrealizować ten kupon.",
     "Max": "Max",
     "Expires at": "Wygasa",
-    "Used \/ Uses": "Użyto \/ Użyć",
+    "Used / Uses": "Użyto / Użyć",
     "Expires": "Wygasa",
     "Sign in to start your session": "Zaloguj się, aby rozpocząć sesję",
     "Password": "Hasło",
@@ -388,7 +388,7 @@
     "No nodes have been linked!": "Żaden węzeł nie został połączony!",
     "No nests available!": "Brak dostępnych gniazd!",
     "No eggs have been linked!": "Jajka nie zostały połaczone!",
-    "Software \/ Games": "Oprogramowanie \/ gry",
+    "Software / Games": "Oprogramowanie / gry",
     "Please select software ...": "Proszę wybrać oprogramowanie...",
     "---": "---",
     "Specification ": "Specyfikacja ",
@@ -447,6 +447,8 @@
     "Notes": "Uwagi",
     "Amount in words": "Wszystkie słowa",
     "Please pay until": "Zapłać w ciągu:",
+    "Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed": "Aktualizacja / degradacja twojego serwera spowoduje zresetowanie cyklu rozliczeniowego do teraz. Twoje nadpłacone kredyty zostaną zwrócone. Cena za nowy cykl rozliczeniowy zostanie pobrana",
+    "Caution": "Uwaga",
     "cs": "Czeski",
     "de": "Niemiecki",
     "en": "Angielski",

+ 9 - 7
lang/pt.json

@@ -81,7 +81,7 @@
     "Someone registered using your Code!": "Alguém se registrou usando seu código!",
     "Server Creation Error": "Erro de criação do servidor",
     "Your servers have been suspended!": "Os seus servidores foram suspensos!",
-    "To automatically re-enable your server\/s, you need to purchase more credits.": "Para reativar automaticamente o seu(s) servidor(es), é preciso comprar mais créditos.",
+    "To automatically re-enable your server/s, you need to purchase more credits.": "Para reativar automaticamente o seu(s) servidor(es), é preciso comprar mais créditos.",
     "Purchase credits": "Compra de créditos",
     "If you have any questions please let us know.": "Se tiver alguma dúvida, por favor, nos avise.",
     "Regards": "Cumprimentos,",
@@ -93,7 +93,7 @@
     "Getting started!": "Começar",
     "Welcome to our dashboard": "Bem-vindo ao nosso painel",
     "Verification": "Verificação",
-    "You can verify your e-mail address and link\/verify your Discord account.": "Você pode verificar o seu endereço de e-mail e link",
+    "You can verify your e-mail address and link/verify your Discord account.": "Você pode verificar o seu endereço de e-mail e link",
     "Information": "Informações",
     "This dashboard can be used to create and delete servers": "Este painel pode ser usado para criar e excluir servidores",
     "These servers can be used and managed on our pterodactyl panel": "Esses servidores podem ser usados e gerenciados no nosso painel pterodactyl ",
@@ -187,7 +187,7 @@
     "Default language": "Idioma padrão",
     "The fallback Language, if something goes wrong": "Um idioma padrão, se algo der errado",
     "Datable language": "Idioma de dados",
-    "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ": "Os lang-codes disponíveis. <br><strong>Exemplo:<\/strong> en-gb, fr_fr, de_de<br>Mais informações:",
+    "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ": "Os lang-codes disponíveis. <br><strong>Exemplo:</strong> en-gb, fr_fr, de_de<br>Mais informações:",
     "Auto-translate": "Traduzir Automaticamente",
     "If this is checked, the Dashboard will translate itself to the Clients language, if available": "Se isto for ativado, o Painel se traduzirá para o idioma do cliente, se disponível.",
     "Client Language-Switch": "Trocar Idioma do cliente",
@@ -243,9 +243,9 @@
     "Charges the first hour worth of credits upon creating a server.": "Cobra a primeira hora de créditos ao criar um servidor.",
     "Credits Display Name": "Nome de exibição dos créditos",
     "PHPMyAdmin URL": "PHPMyAdmin URL",
-    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>": "Insira o URL do seu PHPMyAdmin. <strong>Sem barra de arrasto!<\/strong>",
+    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>": "Insira o URL do seu PHPMyAdmin. <strong>Sem barra de arrasto!</strong>",
     "Pterodactyl URL": "Pterodactyl URL",
-    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>": "Insira o URL do seu pterodactyl. <strong>Sem barra de arrasto!<\/strong>",
+    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>": "Insira o URL do seu pterodactyl. <strong>Sem barra de arrasto!</strong>",
     "Pterodactyl API Key": "Chave API pterodactyl",
     "Enter the API Key to your Pterodactyl installation.": "Insira a chave API do seu painel pterodactyl.",
     "Force Discord verification": "Forçar verificação do Discord",
@@ -316,7 +316,7 @@
     "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.": "Um vale só pode ser usado uma vez por utilizador. Os usos especificam o número de diferentes utilizadores que podem usar este comprovante.",
     "Max": "Máximo",
     "Expires at": "Expira em",
-    "Used \/ Uses": "Usados \/ Usos",
+    "Used / Uses": "Usados / Usos",
     "Expires": "Expira",
     "Sign in to start your session": "Entre para iniciar a sua sessão",
     "Password": "Senha",
@@ -388,7 +388,7 @@
     "No nodes have been linked!": "Nenhum nó foi ligado!",
     "No nests available!": "Não há ninhos disponíveis!",
     "No eggs have been linked!": "Nenhum ovo foi ligado!",
-    "Software \/ Games": "“Software” \/ Jogos",
+    "Software / Games": "“Software” / Jogos",
     "Please select software ...": "Por favor, selecione o “software”...",
     "---": "—",
     "Specification ": "Especificação",
@@ -447,6 +447,8 @@
     "Notes": "Notas",
     "Amount in words": "Quantia em palavras",
     "Please pay until": "Favor pagar até",
+    "Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed": "Atualizar / Reduzir o seu servidor irá redefinir o seu ciclo de faturação para agora. Os seus créditos pagos a mais serão reembolsados. O preço para o novo ciclo de faturação será debitado",
+    "Caution": "Cuidado",
     "cs": "Tcheco",
     "de": "Alemão",
     "en": "Inglês",

+ 9 - 7
lang/ro.json

@@ -81,7 +81,7 @@
     "Someone registered using your Code!": "Someone registered using your Code!",
     "Server Creation Error": "Server Creation Error",
     "Your servers have been suspended!": "Your servers have been suspended!",
-    "To automatically re-enable your server\/s, you need to purchase more credits.": "To automatically re-enable your server\/s, you need to purchase more credits.",
+    "To automatically re-enable your server/s, you need to purchase more credits.": "To automatically re-enable your server/s, you need to purchase more credits.",
     "Purchase credits": "Purchase credits",
     "If you have any questions please let us know.": "If you have any questions please let us know.",
     "Regards": "Regards",
@@ -93,7 +93,7 @@
     "Getting started!": "Getting started!",
     "Welcome to our dashboard": "Welcome to our dashboard",
     "Verification": "Verification",
-    "You can verify your e-mail address and link\/verify your Discord account.": "You can verify your e-mail address and link\/verify your Discord account.",
+    "You can verify your e-mail address and link/verify your Discord account.": "You can verify your e-mail address and link/verify your Discord account.",
     "Information": "Information",
     "This dashboard can be used to create and delete servers": "This dashboard can be used to create and delete servers",
     "These servers can be used and managed on our pterodactyl panel": "These servers can be used and managed on our pterodactyl panel",
@@ -187,7 +187,7 @@
     "Default language": "Default language",
     "The fallback Language, if something goes wrong": "The fallback Language, if something goes wrong",
     "Datable language": "Datable language",
-    "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ": "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ",
+    "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ": "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ",
     "Auto-translate": "Auto-translate",
     "If this is checked, the Dashboard will translate itself to the Clients language, if available": "If this is checked, the Dashboard will translate itself to the Clients language, if available",
     "Client Language-Switch": "Client Language-Switch",
@@ -243,9 +243,9 @@
     "Charges the first hour worth of credits upon creating a server.": "Charges the first hour worth of credits upon creating a server.",
     "Credits Display Name": "Credits Display Name",
     "PHPMyAdmin URL": "PHPMyAdmin URL",
-    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>": "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>",
+    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>": "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>",
     "Pterodactyl URL": "Pterodactyl URL",
-    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>": "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>",
+    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>": "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>",
     "Pterodactyl API Key": "Pterodactyl API Key",
     "Enter the API Key to your Pterodactyl installation.": "Enter the API Key to your Pterodactyl installation.",
     "Force Discord verification": "Force Discord verification",
@@ -316,7 +316,7 @@
     "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.": "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.",
     "Max": "Max",
     "Expires at": "Expires at",
-    "Used \/ Uses": "Used \/ Uses",
+    "Used / Uses": "Used / Uses",
     "Expires": "Expires",
     "Sign in to start your session": "Sign in to start your session",
     "Password": "Password",
@@ -388,7 +388,7 @@
     "No nodes have been linked!": "No nodes have been linked!",
     "No nests available!": "No nests available!",
     "No eggs have been linked!": "No eggs have been linked!",
-    "Software \/ Games": "Software \/ Games",
+    "Software / Games": "Software / Games",
     "Please select software ...": "Please select software ...",
     "---": "---",
     "Specification ": "Specification ",
@@ -447,6 +447,8 @@
     "Notes": "Notes",
     "Amount in words": "Amount in words",
     "Please pay until": "Please pay until",
+    "Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed": "Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed",
+    "Caution": "Caution",
     "cs": "Czech",
     "de": "German",
     "en": "English",

+ 10 - 8
lang/ru.json

@@ -39,7 +39,7 @@
     "Store item has been removed!": "Товар в магазине был удален!",
     "link has been created!": "Ссылка была создана!",
     "link has been updated!": "Ссылка была обновлена!",
-    "product has been removed!": "Продукт\/Товар был удалён!",
+    "product has been removed!": "Продукт/Товар был удалён!",
     "User does not exists on pterodactyl's panel": "Пользователь не был найден в панеле птеродактиль",
     "user has been removed!": "Пользователь был удален!",
     "Notification sent!": "Оповещение отправлено!",
@@ -81,7 +81,7 @@
     "Someone registered using your Code!": "Someone registered using your Code!",
     "Server Creation Error": "Ошибка создание сервера",
     "Your servers have been suspended!": "Ваши сервера были заблокированы!",
-    "To automatically re-enable your server\/s, you need to purchase more credits.": "Чтобы автоматически повторно включить ваш сервер \/ серверы, вам необходимо приобрести больше кредитов.",
+    "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": "С уважением,",
@@ -93,7 +93,7 @@
     "Getting started!": "Начало работы!",
     "Welcome to our dashboard": "Welcome to our dashboard",
     "Verification": "Verification",
-    "You can verify your e-mail address and link\/verify your Discord account.": "You can verify your e-mail address and link\/verify your Discord account.",
+    "You can verify your e-mail address and link/verify your Discord account.": "You can verify your e-mail address and link/verify your Discord account.",
     "Information": "Information",
     "This dashboard can be used to create and delete servers": "This dashboard can be used to create and delete servers",
     "These servers can be used and managed on our pterodactyl panel": "These servers can be used and managed on our pterodactyl panel",
@@ -187,7 +187,7 @@
     "Default language": "Язык по умолчанию",
     "The fallback Language, if something goes wrong": "Резервный язык, если что-то пойдет не так",
     "Datable language": "Датадатируемый язык",
-    "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ": "Языковой код таблицы данных. <br><strong>Пример:<\/strong> en-gb, fr_fr, de_de<br>Дополнительная информация:",
+    "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ": "Языковой код таблицы данных. <br><strong>Пример:</strong> en-gb, fr_fr, de_de<br>Дополнительная информация:",
     "Auto-translate": "Автоперевод",
     "If this is checked, the Dashboard will translate itself to the Clients language, if available": "Если этот флажок установлен, информационная панель будет переводиться на язык клиентов, если он доступен",
     "Client Language-Switch": "Переключение языка клиента",
@@ -243,9 +243,9 @@
     "Charges the first hour worth of credits upon creating a server.": "Взимает кредиты за первый час при создании сервера.",
     "Credits Display Name": "Отображаемое имя кредитов",
     "PHPMyAdmin URL": "URL-адрес PHPMyAdmin",
-    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>": "Введите URL-адрес вашей установки PHPMyAdmin. <strong>Без косой черты в конце!<\/strong>",
+    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>": "Введите URL-адрес вашей установки PHPMyAdmin. <strong>Без косой черты в конце!</strong>",
     "Pterodactyl URL": "URL-адрес птеродактиля",
-    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>": "Введите URL-адрес вашей установки Pterodactyl. <strong>Без косой черты в конце!<\/strong>",
+    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>": "Введите URL-адрес вашей установки Pterodactyl. <strong>Без косой черты в конце!</strong>",
     "Pterodactyl API Key": "API-ключ птеродактиля",
     "Enter the API Key to your Pterodactyl installation.": "Введите ключ API для установки Pterodactyl.",
     "Force Discord verification": "Требуется верификация в Discord",
@@ -316,7 +316,7 @@
     "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.": "Промокод можно использовать только один раз для каждого пользователя. Пользователь указывает количество различных пользователей, которые могут использовать этот промокод.",
     "Max": "Макс.",
     "Expires at": "Срок действия до",
-    "Used \/ Uses": "Используется \/ Использует",
+    "Used / Uses": "Используется / Использует",
     "Expires": "Истекает",
     "Sign in to start your session": "Войдите, чтобы начать сессию",
     "Password": "Пароль",
@@ -388,7 +388,7 @@
     "No nodes have been linked!": "Ни один узел не был связан!",
     "No nests available!": "Гнезда в наличии нет!",
     "No eggs have been linked!": "Группы были связаны!",
-    "Software \/ Games": "Программное обеспечение \/ Игры",
+    "Software / Games": "Программное обеспечение / Игры",
     "Please select software ...": "Пожалуйста, выберите программное обеспечение...",
     "---": "---",
     "Specification ": "Характеристики ",
@@ -447,6 +447,8 @@
     "Notes": "Примечания",
     "Amount in words": "Сумма прописью",
     "Please pay until": "Пожалуйста, платите до",
+    "Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed": "Обновление/Уменьшение вашего сервера сбросит ваш цикл оплаты на текущий. Ваши переплаты будут возвращены. Цена за новый цикл оплаты будет списана",
+    "Caution": "Внимание",
     "cs": "Czech",
     "de": "German",
     "en": "English",

+ 8 - 6
lang/sh.json

@@ -80,7 +80,7 @@
     "User ID": "User ID",
     "Server Creation Error": "Server Creation Error",
     "Your servers have been suspended!": "Your servers have been suspended!",
-    "To automatically re-enable your server\/s, you need to purchase more credits.": "To automatically re-enable your server\/s, you need to purchase more credits.",
+    "To automatically re-enable your server/s, you need to purchase more credits.": "To automatically re-enable your server/s, you need to purchase more credits.",
     "Purchase credits": "Purchase credits",
     "If you have any questions please let us know.": "If you have any questions please let us know.",
     "Regards": "Regards",
@@ -173,7 +173,7 @@
     "Default language": "Default language",
     "The fallback Language, if something goes wrong": "The fallback Language, if something goes wrong",
     "Datable language": "Datable language",
-    "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ": "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ",
+    "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ": "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ",
     "Auto-translate": "Auto-translate",
     "If this is checked, the Dashboard will translate itself to the Clients language, if available": "If this is checked, the Dashboard will translate itself to the Clients language, if available",
     "Client Language-Switch": "Client Language-Switch",
@@ -214,9 +214,9 @@
     "Charges the first hour worth of credits upon creating a server.": "Charges the first hour worth of credits upon creating a server.",
     "Credits Display Name": "Credits Display Name",
     "PHPMyAdmin URL": "PHPMyAdmin URL",
-    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>": "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>",
+    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>": "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>",
     "Pterodactyl URL": "Pterodactyl URL",
-    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>": "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>",
+    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>": "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>",
     "Pterodactyl API Key": "Pterodactyl API Key",
     "Enter the API Key to your Pterodactyl installation.": "Enter the API Key to your Pterodactyl installation.",
     "Force Discord verification": "Force Discord verification",
@@ -284,7 +284,7 @@
     "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.": "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.",
     "Max": "Max",
     "Expires at": "Expires at",
-    "Used \/ Uses": "Used \/ Uses",
+    "Used / Uses": "Used / Uses",
     "Expires": "Expires",
     "Sign in to start your session": "Sign in to start your session",
     "Password": "Password",
@@ -354,7 +354,7 @@
     "No nodes have been linked!": "No nodes have been linked!",
     "No nests available!": "No nests available!",
     "No eggs have been linked!": "No eggs have been linked!",
-    "Software \/ Games": "Software \/ Games",
+    "Software / Games": "Software / Games",
     "Please select software ...": "Please select software ...",
     "---": "---",
     "Specification ": "Specification ",
@@ -430,6 +430,8 @@
     "The Language of the Datatables. Grab the Language-Codes from here": "The Language of the Datatables. Grab the Language-Codes from here",
     "Let the Client change the Language": "Let the Client change the Language",
     "Icons updated!": "Icons updated!",
+    "Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed": "Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed",
+    "Caution": "Caution",
     "cs": "Czech",
     "de": "German",
     "en": "English",

+ 9 - 7
lang/sk.json

@@ -81,7 +81,7 @@
     "Someone registered using your Code!": "Someone registered using your Code!",
     "Server Creation Error": "Server Creation Error",
     "Your servers have been suspended!": "Your servers have been suspended!",
-    "To automatically re-enable your server\/s, you need to purchase more credits.": "To automatically re-enable your server\/s, you need to purchase more credits.",
+    "To automatically re-enable your server/s, you need to purchase more credits.": "To automatically re-enable your server/s, you need to purchase more credits.",
     "Purchase credits": "Purchase credits",
     "If you have any questions please let us know.": "If you have any questions please let us know.",
     "Regards": "Regards",
@@ -93,7 +93,7 @@
     "Getting started!": "Getting started!",
     "Welcome to our dashboard": "Welcome to our dashboard",
     "Verification": "Verification",
-    "You can verify your e-mail address and link\/verify your Discord account.": "You can verify your e-mail address and link\/verify your Discord account.",
+    "You can verify your e-mail address and link/verify your Discord account.": "You can verify your e-mail address and link/verify your Discord account.",
     "Information": "Information",
     "This dashboard can be used to create and delete servers": "This dashboard can be used to create and delete servers",
     "These servers can be used and managed on our pterodactyl panel": "These servers can be used and managed on our pterodactyl panel",
@@ -187,7 +187,7 @@
     "Default language": "Default language",
     "The fallback Language, if something goes wrong": "The fallback Language, if something goes wrong",
     "Datable language": "Datable language",
-    "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ": "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ",
+    "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ": "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ",
     "Auto-translate": "Auto-translate",
     "If this is checked, the Dashboard will translate itself to the Clients language, if available": "If this is checked, the Dashboard will translate itself to the Clients language, if available",
     "Client Language-Switch": "Client Language-Switch",
@@ -243,9 +243,9 @@
     "Charges the first hour worth of credits upon creating a server.": "Charges the first hour worth of credits upon creating a server.",
     "Credits Display Name": "Credits Display Name",
     "PHPMyAdmin URL": "PHPMyAdmin URL",
-    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>": "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>",
+    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>": "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>",
     "Pterodactyl URL": "Pterodactyl URL",
-    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>": "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>",
+    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>": "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>",
     "Pterodactyl API Key": "Pterodactyl API Key",
     "Enter the API Key to your Pterodactyl installation.": "Enter the API Key to your Pterodactyl installation.",
     "Force Discord verification": "Force Discord verification",
@@ -316,7 +316,7 @@
     "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.": "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.",
     "Max": "Max",
     "Expires at": "Expires at",
-    "Used \/ Uses": "Used \/ Uses",
+    "Used / Uses": "Used / Uses",
     "Expires": "Expires",
     "Sign in to start your session": "Sign in to start your session",
     "Password": "Password",
@@ -388,7 +388,7 @@
     "No nodes have been linked!": "No nodes have been linked!",
     "No nests available!": "No nests available!",
     "No eggs have been linked!": "No eggs have been linked!",
-    "Software \/ Games": "Software \/ Games",
+    "Software / Games": "Software / Games",
     "Please select software ...": "Please select software ...",
     "---": "---",
     "Specification ": "Specification ",
@@ -447,6 +447,8 @@
     "Notes": "Notes",
     "Amount in words": "Amount in words",
     "Please pay until": "Please pay until",
+    "Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed": "Aktualizácia alebo deaktualizácia servera resetuje Vašu fakturačnú dobu na aktuálny čas. Vaše nadbytočné kredity budú vrátené. Cena za novú fakturačnú dobu bude odobraná.",
+    "Caution": "Upozornenie",
     "cs": "Czech",
     "de": "German",
     "en": "English",

+ 9 - 7
lang/sr.json

@@ -81,7 +81,7 @@
     "Someone registered using your Code!": "Someone registered using your Code!",
     "Server Creation Error": "Greška pri kreiranju servera",
     "Your servers have been suspended!": "Vaši serveri su suspendovani!",
-    "To automatically re-enable your server\/s, you need to purchase more credits.": "Da biste automatski ponovo omogućili svoje servere, potrebno je da kupite još kredita.",
+    "To automatically re-enable your server/s, you need to purchase more credits.": "Da biste automatski ponovo omogućili svoje servere, potrebno je da kupite još kredita.",
     "Purchase credits": "Kupite kredite",
     "If you have any questions please let us know.": "Ako imate bilo kakvih pitanja, molimo vas da nas obavestite.",
     "Regards": "Pozdravi",
@@ -93,7 +93,7 @@
     "Getting started!": "Početak!",
     "Welcome to our dashboard": "Welcome to our dashboard",
     "Verification": "Verification",
-    "You can verify your e-mail address and link\/verify your Discord account.": "You can verify your e-mail address and link\/verify your Discord account.",
+    "You can verify your e-mail address and link/verify your Discord account.": "You can verify your e-mail address and link/verify your Discord account.",
     "Information": "Information",
     "This dashboard can be used to create and delete servers": "This dashboard can be used to create and delete servers",
     "These servers can be used and managed on our pterodactyl panel": "These servers can be used and managed on our pterodactyl panel",
@@ -187,7 +187,7 @@
     "Default language": "Podrazumevani jezik",
     "The fallback Language, if something goes wrong": "Sekundarni jezik, u slučaju da bude problema",
     "Datable language": "Datable language",
-    "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ": "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ",
+    "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ": "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ",
     "Auto-translate": "Automatski prevod",
     "If this is checked, the Dashboard will translate itself to the Clients language, if available": "If this is checked, the Dashboard will translate itself to the Clients language, if available",
     "Client Language-Switch": "Korisnički izbor za jezik",
@@ -243,9 +243,9 @@
     "Charges the first hour worth of credits upon creating a server.": "Naplaćuje kredite u vrednosti od prvog sata prilikom kreiranja servera.",
     "Credits Display Name": "Ime prikaza kredita",
     "PHPMyAdmin URL": "PHPMyAdmin Link",
-    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>": "Unesite URL adresu instalacije PHPMyAdmin. <strong>Bez kose crte!<\/strong>",
+    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>": "Unesite URL adresu instalacije PHPMyAdmin. <strong>Bez kose crte!</strong>",
     "Pterodactyl URL": "Pterodactyl URL",
-    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>": "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>",
+    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>": "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>",
     "Pterodactyl API Key": "Pterodactyl API Key",
     "Enter the API Key to your Pterodactyl installation.": "Enter the API Key to your Pterodactyl installation.",
     "Force Discord verification": "Force Discord verification",
@@ -316,7 +316,7 @@
     "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.": "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.",
     "Max": "Maksimalno",
     "Expires at": "Ističe",
-    "Used \/ Uses": "Upotrebljeno \/ Upotrebe",
+    "Used / Uses": "Upotrebljeno / Upotrebe",
     "Expires": "Ističe",
     "Sign in to start your session": "Prijavite se da biste započeli sesiju",
     "Password": "Lozinka",
@@ -388,7 +388,7 @@
     "No nodes have been linked!": "Node-ovi nisu povezani!",
     "No nests available!": "Nema dostupnih gnezda!",
     "No eggs have been linked!": "Jaja nisu povezana!",
-    "Software \/ Games": "Softver \/ Igrice",
+    "Software / Games": "Softver / Igrice",
     "Please select software ...": "Molimo izaberite softver ...",
     "---": "---",
     "Specification ": "Specification ",
@@ -447,6 +447,8 @@
     "Notes": "Napomena",
     "Amount in words": "Iznos u rečima",
     "Please pay until": "Molimo platite do",
+    "Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed": "Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed",
+    "Caution": "Caution",
     "cs": "Czech",
     "de": "German",
     "en": "English",

+ 9 - 7
lang/sv.json

@@ -81,7 +81,7 @@
     "Someone registered using your Code!": "Someone registered using your Code!",
     "Server Creation Error": "Serverskapande fel",
     "Your servers have been suspended!": "Ditt konto har blivit avstängt!",
-    "To automatically re-enable your server\/s, you need to purchase more credits.": "För att automatiskt återaktivera din server\/s, så måste du köpa mer krediter.",
+    "To automatically re-enable your server/s, you need to purchase more credits.": "För att automatiskt återaktivera din server/s, så måste du köpa mer krediter.",
     "Purchase credits": "Köp krediter",
     "If you have any questions please let us know.": "Kontakta oss gärna om du har några eventuella frågor.",
     "Regards": "Hälsningar",
@@ -93,7 +93,7 @@
     "Getting started!": "Kom igång!",
     "Welcome to our dashboard": "Welcome to our dashboard",
     "Verification": "Verification",
-    "You can verify your e-mail address and link\/verify your Discord account.": "You can verify your e-mail address and link\/verify your Discord account.",
+    "You can verify your e-mail address and link/verify your Discord account.": "You can verify your e-mail address and link/verify your Discord account.",
     "Information": "Information",
     "This dashboard can be used to create and delete servers": "This dashboard can be used to create and delete servers",
     "These servers can be used and managed on our pterodactyl panel": "These servers can be used and managed on our pterodactyl panel",
@@ -187,7 +187,7 @@
     "Default language": "Förvalt språk",
     "The fallback Language, if something goes wrong": "Reservspråket, om något går fel",
     "Datable language": "Daterbart språk",
-    "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ": "Datatabellernas språkkod. <br><strong>Exempel:<\/strong> en-gb, fr_fr, de_de<br>Mer information: ",
+    "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ": "Datatabellernas språkkod. <br><strong>Exempel:</strong> en-gb, fr_fr, de_de<br>Mer information: ",
     "Auto-translate": "Auto-översätt",
     "If this is checked, the Dashboard will translate itself to the Clients language, if available": "If this is checked, the Dashboard will translate itself to the Clients language, if available",
     "Client Language-Switch": "Client Language-Switch",
@@ -243,9 +243,9 @@
     "Charges the first hour worth of credits upon creating a server.": "Charges the first hour worth of credits upon creating a server.",
     "Credits Display Name": "Credits Display Name",
     "PHPMyAdmin URL": "PHPMyAdmin URL",
-    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>": "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>",
+    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>": "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>",
     "Pterodactyl URL": "Pterodactyl URL",
-    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>": "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>",
+    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>": "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>",
     "Pterodactyl API Key": "Pterodactyl API Key",
     "Enter the API Key to your Pterodactyl installation.": "Enter the API Key to your Pterodactyl installation.",
     "Force Discord verification": "Force Discord verification",
@@ -316,7 +316,7 @@
     "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.": "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.",
     "Max": "Max",
     "Expires at": "Expires at",
-    "Used \/ Uses": "Used \/ Uses",
+    "Used / Uses": "Used / Uses",
     "Expires": "Expires",
     "Sign in to start your session": "Sign in to start your session",
     "Password": "Password",
@@ -388,7 +388,7 @@
     "No nodes have been linked!": "No nodes have been linked!",
     "No nests available!": "No nests available!",
     "No eggs have been linked!": "No eggs have been linked!",
-    "Software \/ Games": "Software \/ Games",
+    "Software / Games": "Software / Games",
     "Please select software ...": "Please select software ...",
     "---": "---",
     "Specification ": "Specification ",
@@ -447,6 +447,8 @@
     "Notes": "Notes",
     "Amount in words": "Amount in words",
     "Please pay until": "Please pay until",
+    "Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed": "Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed",
+    "Caution": "Caution",
     "cs": "Czech",
     "de": "German",
     "en": "English",

+ 9 - 7
lang/tr.json

@@ -81,7 +81,7 @@
     "Someone registered using your Code!": "Birileri senin kodunu kullanarak kayıt oldu!",
     "Server Creation Error": "Sunucu Oluşturma Hatası",
     "Your servers have been suspended!": "Sunucularınız askıya alındı!",
-    "To automatically re-enable your server\/s, you need to purchase more credits.": "Sunucularınızı\/sunucularınızı otomatik olarak yeniden etkinleştirmek için daha fazla kredi satın almanız gerekir.",
+    "To automatically re-enable your server/s, you need to purchase more credits.": "Sunucularınızı/sunucularınızı otomatik olarak yeniden etkinleştirmek için daha fazla kredi satın almanız gerekir.",
     "Purchase credits": "Satın alma kredisi",
     "If you have any questions please let us know.": "Herhangi bir sorunuz varsa lütfen bize bildirin.",
     "Regards": "Saygılarımızla",
@@ -93,7 +93,7 @@
     "Getting started!": "Başlarken!",
     "Welcome to our dashboard": "Kontrol panelimize hoş geldiniz",
     "Verification": "Doğrulama",
-    "You can verify your e-mail address and link\/verify your Discord account.": "E-posta adresinizi doğrulayabilir ve Discord hesabınızı bağlayabilir\/doğrulayabilirsiniz.",
+    "You can verify your e-mail address and link/verify your Discord account.": "E-posta adresinizi doğrulayabilir ve Discord hesabınızı bağlayabilir/doğrulayabilirsiniz.",
     "Information": "Bilgi",
     "This dashboard can be used to create and delete servers": "Bu gösterge panosu, sunucular oluşturmak ve silmek için kullanılabilir",
     "These servers can be used and managed on our pterodactyl panel": "Bu sunucular pterodactyl panelimizde kullanılabilir ve yönetilebilir",
@@ -187,7 +187,7 @@
     "Default language": "Varsayılan Dil",
     "The fallback Language, if something goes wrong": "Yedek dil, eğer bir şeyler yanlış giderse",
     "Datable language": "Tarih Dili",
-    "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ": "Tarihlerde kullanılacak dil kodu. <br><strong>Örnek:<\/strong> en-gb, fr_fr, de_de<br> Daha fazla bilgi: ",
+    "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ": "Tarihlerde kullanılacak dil kodu. <br><strong>Örnek:</strong> en-gb, fr_fr, de_de<br> Daha fazla bilgi: ",
     "Auto-translate": "Otomatik çeviri",
     "If this is checked, the Dashboard will translate itself to the Clients language, if available": "Eğer bu seçili ise Yönetim paneli kendisini kullanıcının diline çevirecek, eğer kullanılabiliyorsa",
     "Client Language-Switch": "Müşteri Dil Değiştiricisi",
@@ -243,9 +243,9 @@
     "Charges the first hour worth of credits upon creating a server.": "Kullanıcı sunucu oluşturduğumda ilk saatin ödemesini direkt olarak alır.",
     "Credits Display Name": "Kredi ismi",
     "PHPMyAdmin URL": "PHPMyAdmin linki",
-    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>": "PHPMyAdmin kurulumunuzun linkini girin <strong> Sonda eğik çizgi olmadan<\/strong>",
+    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>": "PHPMyAdmin kurulumunuzun linkini girin <strong> Sonda eğik çizgi olmadan</strong>",
     "Pterodactyl URL": "Pterodactyl Linki",
-    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>": "Pterodactyl kurulumunuzun linkini girin <strong> Sonda eğik çizgi olmadan!<\/strong>",
+    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>": "Pterodactyl kurulumunuzun linkini girin <strong> Sonda eğik çizgi olmadan!</strong>",
     "Pterodactyl API Key": "Pterodactyl API Anahtarı",
     "Enter the API Key to your Pterodactyl installation.": "Pterodactyl kurulumunuzun API anahtarını girin.",
     "Force Discord verification": "Discord Doğrulamasını zorunlu yap",
@@ -316,7 +316,7 @@
     "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.": "Bir kupon, kullanıcı başına yalnızca bir kez kullanılabilir. Kullanımlar, bu kuponu kullanabilecek farklı kullanıcıların sayısını belirtir.",
     "Max": "Maks",
     "Expires at": "Sona eriyor",
-    "Used \/ Uses": "Kullanılmış \/ Kullanım Alanları",
+    "Used / Uses": "Kullanılmış / Kullanım Alanları",
     "Expires": "Sona eriyor",
     "Sign in to start your session": "Oturumunuzu başlatmak için oturum açın",
     "Password": "Parola",
@@ -388,7 +388,7 @@
     "No nodes have been linked!": "Hiçbir makine bağlanmamış!",
     "No nests available!": "Hiçbir nest bulunamadı!",
     "No eggs have been linked!": "Hiçbir egg bağlanmamış!",
-    "Software \/ Games": "Yazılımlar \/ Oyunlar",
+    "Software / Games": "Yazılımlar / Oyunlar",
     "Please select software ...": "Lütfen bir yazılım seçin ...",
     "---": "---",
     "Specification ": "Özellikler ",
@@ -447,6 +447,8 @@
     "Notes": "Notlar",
     "Amount in words": "Yazı ile Tutar",
     "Please pay until": "Lütfen şu tarihe kadar ödeyin",
+    "Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed": "Sunucunuzu yükseltmek / düşürmek faturalandırma döngünüzü şimdiye sıfırlayacaktır. Aşırı ödenen kredileriniz iade edilecektir. Yeni faturalandırma döngüsü için ödenen tutar çekilecektir",
+    "Caution": "Dikkat",
     "cs": "Çekçe",
     "de": "Almanca",
     "en": "İngilizce",

+ 9 - 7
lang/zh.json

@@ -81,7 +81,7 @@
     "Someone registered using your Code!": "已经有人使用您的代码注册了",
     "Server Creation Error": "服务器创建错误",
     "Your servers have been suspended!": "您的服务器已被暂停",
-    "To automatically re-enable your server\/s, you need to purchase more credits.": "如需重新启用你的服务器,您需要购买更多的余额",
+    "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": "此致",
@@ -93,7 +93,7 @@
     "Getting started!": "开始吧!",
     "Welcome to our dashboard": "欢迎访问 dashboard",
     "Verification": "验证",
-    "You can verify your e-mail address and link\/verify your Discord account.": "你可以验证你的邮箱地址或者连接到你的Discord账户",
+    "You can verify your e-mail address and link/verify your Discord account.": "你可以验证你的邮箱地址或者连接到你的Discord账户",
     "Information": "相关信息",
     "This dashboard can be used to create and delete servers": "此仪表板可用于创建和删除服务器",
     "These servers can be used and managed on our pterodactyl panel": "这些服务器可以在我们的pterodactyl面板上使用和管理",
@@ -187,7 +187,7 @@
     "Default language": "默认语言",
     "The fallback Language, if something goes wrong": "备用语言",
     "Datable language": "可用语言",
-    "The datatables lang-code. <br><strong>Example:<\/strong> en-gb, fr_fr, de_de<br>More Information: ": "数据表语言代码 <br><strong>示例:<\/strong> en-gb、fr_fr、de_de<br> 更多信息: ",
+    "The datatables lang-code. <br><strong>Example:</strong> en-gb, fr_fr, de_de<br>More Information: ": "数据表语言代码 <br><strong>示例:</strong> en-gb、fr_fr、de_de<br> 更多信息: ",
     "Auto-translate": "自动翻译",
     "If this is checked, the Dashboard will translate itself to the Clients language, if available": "如果勾选此项,系统将把自己翻译成客户语言(如果有)",
     "Client Language-Switch": "客户语言切换",
@@ -243,9 +243,9 @@
     "Charges the first hour worth of credits upon creating a server.": "在创建服务器时收取第一个小时的费用",
     "Credits Display Name": "积分显示名称",
     "PHPMyAdmin URL": "PHPMyAdmin地址",
-    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!<\/strong>": "输入你PHPMyAdmin的URL。<strong>不要有尾部斜线!<\/strong>",
+    "Enter the URL to your PHPMyAdmin installation. <strong>Without a trailing slash!</strong>": "输入你PHPMyAdmin的URL。<strong>不要有尾部斜线!</strong>",
     "Pterodactyl URL": "Pterodactyl地址",
-    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!<\/strong>": "输入你Pterodactyl的URL。<strong>不要有尾部斜线!<\/strong>",
+    "Enter the URL to your Pterodactyl installation. <strong>Without a trailing slash!</strong>": "输入你Pterodactyl的URL。<strong>不要有尾部斜线!</strong>",
     "Pterodactyl API Key": "Pterodactyl API密钥",
     "Enter the API Key to your Pterodactyl installation.": "输入Pterodactyl API密钥",
     "Force Discord verification": "强制Discord验证",
@@ -316,7 +316,7 @@
     "A voucher can only be used one time per user. Uses specifies the number of different users that can use this voucher.": "每个用户只能使用一次代金券。使用次数指定了可以使用此代金券的不同用户的数量。",
     "Max": "最大",
     "Expires at": "过期时间",
-    "Used \/ Uses": "已使用\/使用情况",
+    "Used / Uses": "已使用/使用情况",
     "Expires": "过期",
     "Sign in to start your session": "登录以开始您的会议",
     "Password": "密码",
@@ -388,7 +388,7 @@
     "No nodes have been linked!": "没有节点被链接!",
     "No nests available!": "没有可用的巢穴!",
     "No eggs have been linked!": "没有蛋被链接!",
-    "Software \/ Games": "软件\/游戏",
+    "Software / Games": "软件/游戏",
     "Please select software ...": "请选择软件...",
     "---": "---",
     "Specification ": "规格 ",
@@ -447,6 +447,8 @@
     "Notes": "笔记",
     "Amount in words": "税额的字数",
     "Please pay until": "请支付至",
+    "Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed": "升级/降级你的服务器将重置你的账单周期。你的多余的点数将被退还。新的账单周期的价格将被扣除",
+    "Caution": "警告",
     "cs": "捷克语",
     "de": "德语",
     "en": "英语",

+ 2 - 0
routes/web.php

@@ -70,6 +70,7 @@ Route::middleware(['auth', 'checkSuspended'])->group(function () {
     //normal routes
     Route::get('notifications/readAll', [NotificationController::class, 'readAll'])->name('notifications.readAll');
     Route::resource('notifications', NotificationController::class);
+    Route::patch('/servers/cancel/{server}', [ServerController::class, 'cancel'])->name('servers.cancel');
     Route::resource('servers', ServerController::class);
     if (config('SETTINGS::SYSTEM:ENABLE_UPGRADE')) {
         Route::post('servers/{server}/upgrade', [ServerController::class, 'upgrade'])->name('servers.upgrade');
@@ -136,6 +137,7 @@ Route::middleware(['auth', 'checkSuspended'])->group(function () {
         //servers
         Route::get('servers/datatable', [AdminServerController::class, 'datatable'])->name('servers.datatable');
         Route::post('servers/togglesuspend/{server}', [AdminServerController::class, 'toggleSuspended'])->name('servers.togglesuspend');
+        Route::patch('servers/cancel/{server}', [AdminServerController::class, 'cancel'])->name('servers.cancel');
         Route::get('servers/sync', [AdminServerController::class, 'syncServers'])->name('servers.sync');
         Route::resource('servers', AdminServerController::class);
 

+ 52 - 13
themes/default/views/admin/products/create.blade.php

@@ -66,6 +66,7 @@
                                             <label for="price">{{__('Price in')}} {{CREDITS_DISPLAY_NAME}}</label>
                                             <input value="{{$product->price ??  old('price')}}" id="price" name="price" step=".01"
                                                    type="number"
+                                                   step="0.0001"
                                                    class="form-control @error('price') is-invalid @enderror"
                                                    required="required">
                                             @error('price')
@@ -116,6 +117,20 @@
                                             @enderror
                                         </div>
 
+                                        <div class="form-group">
+                                            <label for="allocations">{{__('Allocations')}}</label>
+                                            <input value="{{$product->allocations ?? old('allocations') ?? 0}}"
+                                                   id="allocations" name="allocations"
+                                                   type="number"
+                                                   class="form-control @error('allocations') is-invalid @enderror"
+                                                   required="required">
+                                            @error('allocations')
+                                            <div class="invalid-feedback">
+                                                {{ $message }}
+                                            </div>
+                                            @enderror
+                                        </div>
+
                                         <div class="form-group">
                                             <label for="description">{{__('Description')}} <i data-toggle="popover"
                                                                                               data-trigger="hover"
@@ -148,6 +163,43 @@
                                             @enderror
                                         </div>
 
+                                        <div class="form-group">
+                                            <label for="billing_period">{{__('Billing Period')}} <i
+                                                    data-toggle="popover" data-trigger="hover"
+                                                    data-content="{{__('Period when the user will be charged for the given price')}}"
+                                                    class="fas fa-info-circle"></i></label>
+
+                                            <select id="billing_period" style="width:100%" class="custom-select" name="billing_period" required
+                                                autocomplete="off" @error('billing_period') is-invalid @enderror>
+                                                    <option value="hourly" selected>
+                                                        {{__('Hourly')}}
+                                                    </option>
+                                                    <option value="daily">
+                                                        {{__('Daily')}}
+                                                    </option>
+                                                    <option value="weekly">
+                                                        {{__('Weekly')}}
+                                                    </option>
+                                                     <option value="monthly">
+                                                        {{__('Monthly')}}
+                                                    </option>
+                                                    <option value="quarterly">
+                                                        {{__('Quarterly')}}
+                                                    </option>
+                                                    <option value="half-annually">
+                                                        {{__('Half Annually')}}
+                                                    </option>
+                                                    <option value="annually">
+                                                        {{__('Annually')}}
+                                                    </option>
+                                            </select>
+                                            @error('billing_period')
+                                            <div class="invalid-feedback">
+                                                {{ $message }}
+                                            </div>
+                                            @enderror
+                                        </div>
+
                                         <div class="form-group">
                                             <label for="minimum_credits">{{__('Minimum')}} {{ CREDITS_DISPLAY_NAME }} <i
                                                     data-toggle="popover" data-trigger="hover"
@@ -205,19 +257,6 @@
                                             </div>
                                             @enderror
                                         </div>
-                                        <div class="form-group">
-                                            <label for="allocations">{{__('Allocations')}}</label>
-                                            <input value="{{$product->allocations ?? old('allocations') ?? 0}}"
-                                                   id="allocations" name="allocations"
-                                                   type="number"
-                                                   class="form-control @error('allocations') is-invalid @enderror"
-                                                   required="required">
-                                            @error('allocations')
-                                            <div class="invalid-feedback">
-                                                {{ $message }}
-                                            </div>
-                                            @enderror
-                                        </div>
                                     </div>
                                 </div>
 

+ 61 - 15
themes/default/views/admin/products/edit.blade.php

@@ -75,8 +75,10 @@
                                         </div>
 
                                         <div class="form-group">
-                                            <label for="price">{{__('Price in')}} {{ CREDITS_DISPLAY_NAME }}</label>
-                                            <input value="{{ $product->price }}" id="price" name="price" type="number" step=".01"
+                                            <label for="price">{{__('Price in')}} {{CREDITS_DISPLAY_NAME}}</label>
+                                            <input value="{{$product->price}}" id="price" name="price"
+                                                   type="number"
+                                                   step="0.0001"
                                                    class="form-control @error('price') is-invalid @enderror"
                                                    required="required">
                                             @error('price')
@@ -122,7 +124,18 @@
                                             </div>
                                             @enderror
                                         </div>
-
+                                        <div class="form-group">
+                                            <label for="allocations">{{__('Allocations')}}</label>
+                                            <input value="{{ $product->allocations }}" id="allocations"
+                                                   name="allocations" type="number"
+                                                   class="form-control @error('allocations') is-invalid @enderror"
+                                                   required="required">
+                                            @error('allocations')
+                                            <div class="invalid-feedback">
+                                                {{ $message }}
+                                            </div>
+                                            @enderror
+                                        </div>
                                         <div class="form-group">
                                             <label for="description">{{__('Description')}} <i data-toggle="popover"
                                                                                               data-trigger="hover"
@@ -152,6 +165,51 @@
                                             </div>
                                             @enderror
                                         </div>
+
+                                        <div class="form-group">
+                                            <label for="billing_period">{{__('Billing Period')}} <i
+                                                    data-toggle="popover" data-trigger="hover"
+                                                    data-content="{{__('Period when the user will be charged for the given price')}}"
+                                                    class="fas fa-info-circle"></i></label>
+
+                                            <select id="billing_period" style="width:100%" class="custom-select" name="billing_period" required
+                                                autocomplete="off" @error('billing_period') is-invalid @enderror>
+                                                    <option value="hourly" @if ($product->billing_period == 'hourly') selected
+                                                    @endif>
+                                                        {{__('Hourly')}}
+                                                    </option>
+                                                    <option value="daily" @if ($product->billing_period  == 'daily') selected
+                                                    @endif>
+                                                        {{__('Daily')}}
+                                                    </option>
+                                                    <option value="weekly" @if ($product->billing_period  == 'weekly') selected
+                                                    @endif>
+                                                        {{__('Weekly')}}
+                                                    </option>
+                                                     <option value="monthly" @if ($product->billing_period  == 'monthly') selected
+                                                     @endif>
+                                                        {{__('Monthly')}}
+                                                    </option>
+                                                    <option value="quarterly" @if ($product->billing_period  == 'quarterly') selected
+                                                    @endif>
+                                                        {{__('Quarterly')}}
+                                                    </option>
+                                                    <option value="half-annually" @if ($product->billing_period  == 'half-annually') selected
+                                                    @endif>
+                                                        {{__('Half Annually')}}
+                                                    </option>
+                                                    <option value="annually" @if ($product->billing_period  == 'annually') selected
+                                                    @endif>
+                                                        {{__('Annually')}}
+                                                    </option>
+                                            </select>
+                                            @error('billing_period')
+                                            <div class="invalid-feedback">
+                                                {{ $message }}
+                                            </div>
+                                            @enderror
+                                        </div>
+
                                         <div class="form-group">
                                             <label for="minimum_credits">{{__('Minimum')}} {{ CREDITS_DISPLAY_NAME }} <i
                                                     data-toggle="popover" data-trigger="hover"
@@ -202,18 +260,6 @@
                                             </div>
                                             @enderror
                                         </div>
-                                        <div class="form-group">
-                                            <label for="allocations">{{__('Allocations')}}</label>
-                                            <input value="{{ $product->allocations }}" id="allocations"
-                                                   name="allocations" type="number"
-                                                   class="form-control @error('allocations') is-invalid @enderror"
-                                                   required="required">
-                                            @error('allocations')
-                                            <div class="invalid-feedback">
-                                                {{ $message }}
-                                            </div>
-                                            @enderror
-                                        </div>
                                     </div>
                                 </div>
 

+ 2 - 0
themes/default/views/admin/products/index.blade.php

@@ -44,6 +44,7 @@
                             <th>{{__('Active')}}</th>
                             <th>{{__('Name')}}</th>
                             <th>{{__('Price')}}</th>
+                            <th>{{__('Billing period')}}</th>
                             <th>{{__('Memory')}}</th>
                             <th>{{__('Cpu')}}</th>
                             <th>{{__('Swap')}}</th>
@@ -92,6 +93,7 @@
                     {data: "disabled"},
                     {data: "name"},
                     {data: "price"},
+                    {data: "billing_period"},
                     {data: "memory"},
                     {data: "cpu"},
                     {data: "swap"},

+ 0 - 16
themes/default/views/admin/settings/tabs/system.blade.php

@@ -67,22 +67,6 @@
                         </div>
                     </div>
 
-                    <div class="custom-control mb-3 p-0">
-                        <div class="col m-0 p-0 d-flex justify-content-between align-items-center">
-                            <div>
-                                <input value="true" id="server-create-charge-first-hour"
-                                    name="server-create-charge-first-hour"
-                                    {{ config('SETTINGS::SYSTEM:SERVER_CREATE_CHARGE_FIRST_HOUR') == 'true' ? 'checked' : '' }}
-                                    type="checkbox">
-                                <label for="server-create-charge-first-hour">{{ __('Charge first hour at creation') }}
-                                </label>
-                            </div>
-                            <i data-toggle="popover" data-trigger="hover" data-html="true"
-                                data-content="{{ __('Charges the first hour worth of credits upon creating a server.') }}"
-                                class="fas fa-info-circle"></i>
-                        </div>
-                    </div>
-
                     <div class="custom-control mb-3 p-0">
                         <label for="credits-display-name">{{ __('Credits Display Name') }}</label>
                         <input x-model="credits-display-name" id="credits-display-name" name="credits-display-name"

+ 26 - 8
themes/default/views/servers/create.blade.php

@@ -208,11 +208,20 @@
                                                     <span class="d-inline-block" x-text="product.allocations"></span>
                                                 </li>
                                                 <li class="d-flex justify-content-between">
-                                                    <span class="d-inline-block"><i class="fa fa-coins"></i>
+                                                    <<<<<<< HEAD:themes/default/views/servers/create.blade.php <span
+                                                        class="d-inline-block"><i class="fa fa-coins"></i>
                                                         {{ __('Required') }} {{ CREDITS_DISPLAY_NAME }}
                                                         {{ __('to create this server') }}</span>
-                                                    <span class="d-inline-block"
-                                                        x-text="product.minimum_credits === -1 ? {{ config('SETTINGS::USER:MINIMUM_REQUIRED_CREDITS_TO_MAKE_SERVER') }} : product.minimum_credit"></span>
+                                                        <span class="d-inline-block"
+                                                            x-text="product.minimum_credits === -1 ? {{ config('SETTINGS::USER:MINIMUM_REQUIRED_CREDITS_TO_MAKE_SERVER') }} : product.minimum_credit"></span>
+                                                        =======
+                                                        <span class="d-inline-block"><i class="fas fa-clock"></i>
+                                                            {{ __('Billing Period') }}</span>
+
+                                                        <span class="d-inline-block"
+                                                            x-text="product.billing_period"></span>
+                                                        >>>>>>>
+                                                        addon/billing_system:resources/views/servers/create.blade.php
                                                 </li>
                                             </ul>
                                         </div>
@@ -224,8 +233,8 @@
                                     </div>
                                     <div class="mt-auto border rounded border-secondary">
                                         <div class="d-flex justify-content-between p-2">
-                                            <span class="d-inline-block mr-4">
-                                                {{ __('Price') }}:
+                                            <span class="d-inline-block mr-4"
+                                                x-text="'{{ __('Price') }}' + ' (' + product.billing_period + ')'">
                                             </span>
                                             <span class="d-inline-block"
                                                 x-text="product.price + ' {{ CREDITS_DISPLAY_NAME }}'"></span>
@@ -237,11 +246,11 @@
                                     <div>
                                         <button type="submit" x-model="selectedProduct" name="product"
                                             :disabled="product.minimum_credits > user.credits || product.doesNotFit == true ||
-                                                submitClicked"
+                                                product.price > user.credits || submitClicked"
                                             :class="product.minimum_credits > user.credits || product.doesNotFit == true ||
-                                                submitClicked ? 'disabled' : ''"
+                                                product.price > user.credits || submitClicked ? 'disabled' : ''"
                                             class="btn btn-primary btn-block mt-2" @click="setProduct(product.id);"
-                                            x-text=" product.doesNotFit == true ? '{{ __('Server cant fit on this Node') }}' : (product.minimum_credits > user.credits ? '{{ __('Not enough') }} {{ CREDITS_DISPLAY_NAME }}!' : '{{ __('Create server') }}')">
+                                            x-text=" product.doesNotFit == true ? '{{ __('Server cant fit on this Node') }}' : (product.minimum_credits > user.credits || product.price > user.credits ? '{{ __('Not enough') }} {{ CREDITS_DISPLAY_NAME }}!' : '{{ __('Create server') }}')">
                                         </button>
                                     </div>
                                 </div>
@@ -372,6 +381,7 @@
                         .catch(console.error)
 
                     this.fetchedProducts = true;
+
                     // TODO: Sortable by user chosen property (cpu, ram, disk...)
                     this.products = response.data.sort((p1, p2) => parseInt(p1.price, 10) > parseInt(p2.price, 10) &&
                         1 || -1)
@@ -381,11 +391,19 @@
                         product.cpu = product.cpu / 100;
                     })
 
+                    //format price to have no decimals if it is a whole number
+                    this.products.forEach(product => {
+                        if (product.price % 1 === 0) {
+                            product.price = Math.round(product.price);
+                        }
+                    })
+
 
                     this.loading = false;
                     this.updateSelectedObjects()
                 },
 
+
                 /**
                  * @description map selected id's to selected objects
                  * @note being used in the server info box

+ 223 - 78
themes/default/views/servers/index.blade.php

@@ -48,34 +48,57 @@
             <div class="row d-flex flex-row justify-content-center justify-content-md-start">
                 @foreach ($servers as $server)
                     @if($server->location&&$server->node&&$server->nest&&$server->egg)
-                        <div class="col-xl-3 col-lg-5 col-md-6 col-sm-6 col-xs-12 card pr-0 pl-0 ml-sm-2 mr-sm-3"
-                            style="max-width: 350px">
-                            <div class="card-header">
-                                <div class="d-flex justify-content-between align-items-center">
-                                    <h5 class="card-title mt-1">{{ $server->name }}
-                                    </h5>
+                    <div class="col-xl-3 col-lg-5 col-md-6 col-sm-6 col-xs-12 card pr-0 pl-0 ml-sm-2 mr-sm-3"
+                        style="max-width: 350px">
+                        <div class="card-header">
+                            <div class="d-flex justify-content-between align-items-center">
+                                <h5 class="card-title mt-1">{{ $server->name }}
+                                </h5>
+                                <div class="card-tools mt-1">
+                                    <div class="dropdown no-arrow">
+                                        <a href="#" role="button" id="dropdownMenuLink" data-toggle="dropdown"
+                                            aria-haspopup="true" aria-expanded="false">
+                                            <i class="fas fa-ellipsis-v fa-sm fa-fw text-white-50"></i>
+                                        </a>
+                                        <div class="dropdown-menu dropdown-menu-right shadow animated--fade-in"
+                                            aria-labelledby="dropdownMenuLink">
+                                            @if (!empty(config('SETTINGS::MISC:PHPMYADMIN:URL')))
+                                                <a href="{{ config('SETTINGS::MISC:PHPMYADMIN:URL') }}"
+                                                    class="dropdown-item text-info" target="__blank"><i title="manage"
+                                                        class="fas fa-database mr-2"></i><span>{{ __('Database') }}</span></a>
+                                            @endif
+                                            <div class="dropdown-divider"></div>
+                                            <span class="dropdown-item"><i title="Created at"
+                                                    class="fas fa-sync-alt mr-2"></i><span>{{ $server->created_at->isoFormat('LL') }}</span></span>
+                                        </div>
+                                    </div>
                                 </div>
                             </div>
-                            <div class="card-body">
-                                <div class="container mt-1">
-                                    <div class="row mb-3">
-                                        <div class="col my-auto">{{ __('Status') }}:</div>
-                                        <div class="col-7 my-auto">
-                                            <i
-                                                class="fas {{ $server->isSuspended() ? 'text-danger' : 'text-success' }} fa-circle mr-2"></i>
-                                            {{ $server->isSuspended() ? 'Suspended' : 'Active' }}
-                                        </div>
+                        </div>
+                        <div class="card-body">
+                            <div class="container mt-1">
+                                <div class="row mb-3">
+                                    <div class="col my-auto">{{ __('Status') }}:</div>
+                                    <div class="col-7 my-auto">
+                                        @if($server->suspended)
+                                            <span class="badge badge-danger">{{ __('Suspended') }}</span>
+                                        @elseif($server->cancelled)
+                                            <span class="badge badge-warning">{{ __('Cancelled') }}</span>
+                                        @else
+                                            <span class="badge badge-success">{{ __('Active') }}</span>
+                                        @endif
+                                    </div>
+                                </div>
+                                <div class="row mb-2">
+                                    <div class="col-5">
+                                        {{ __('Location') }}:
+                                    </div>
+                                    <div class="col-7 d-flex justify-content-between align-items-center">
+                                        <span class="">{{ $server->location }}</span>
+                                        <i data-toggle="popover" data-trigger="hover"
+                                            data-content="{{ __('Node') }}: {{ $server->node }}"
+                                            class="fas fa-info-circle"></i>
                                     </div>
-                                    <div class="row mb-2">
-                                        <div class="col-5">
-                                            {{ __('Location') }}:
-                                        </div>
-                                        <div class="col-7 d-flex justify-content-between align-items-center">
-                                            <span class="">{{ $server->location }}</span>
-                                            <i data-toggle="popover" data-trigger="hover"
-                                                data-content="{{ __('Node') }}: {{ $server->node }}"
-                                                class="fas fa-info-circle"></i>
-                                        </div>
 
                                     </div>
                                     <div class="row mb-2">
@@ -86,69 +109,127 @@
                                             <span>{{ $server->nest }}</span>
                                         </div>
 
+                                </div>
+                                <div class="row mb-2">
+                                    <div class="col-5 ">
+                                        {{ __('Specification') }}:
                                     </div>
-                                    <div class="row mb-2">
-                                        <div class="col-5 ">
-                                            {{ __('Specification') }}:
-                                        </div>
-                                        <div class="col-7 text-wrap">
-                                            <span>{{ $server->egg }}</span>
-                                        </div>
+                                    <div class="col-7 text-wrap">
+                                        <span>{{ $server->egg }}</span>
                                     </div>
-                                    <div class="row mb-4">
-                                        <div class="col-5 ">
-                                            {{ __('Resource plan') }}:
-                                        </div>
-                                        <div class="col-7 text-wrap d-flex justify-content-between align-items-center">
-                                            <span>{{ $server->product->name }}
-                                            </span>
-                                            <i data-toggle="popover" data-trigger="hover" data-html="true"
-                                                data-content="{{ __('CPU') }}: {{ $server->product->cpu / 100 }} {{ __('vCores') }} <br/>{{ __('RAM') }}: {{ $server->product->memory }} MB <br/>{{ __('Disk') }}: {{ $server->product->disk }} MB <br/>{{ __('Backups') }}: {{ $server->product->backups }} <br/> {{ __('MySQL Databases') }}: {{ $server->product->databases }} <br/> {{ __('Allocations') }}: {{ $server->product->allocations }} <br/>"
-                                                class="fas fa-info-circle"></i>
-                                        </div>
+                                </div>
+                                <div class="row mb-2">
+                                    <div class="col-5 ">
+                                        {{ __('Resource plan') }}:
+                                    </div>
+                                    <div class="col-7 text-wrap d-flex justify-content-between align-items-center">
+                                        <span>{{ $server->product->name }}
+                                        </span>
+                                        <i data-toggle="popover" data-trigger="hover" data-html="true"
+                                            data-content="{{ __('CPU') }}: {{ $server->product->cpu / 100 }} {{ __('vCores') }} <br/>{{ __('RAM') }}: {{ $server->product->memory }} MB <br/>{{ __('Disk') }}: {{ $server->product->disk }} MB <br/>{{ __('Backups') }}: {{ $server->product->backups }} <br/> {{ __('MySQL Databases') }}: {{ $server->product->databases }} <br/> {{ __('Allocations') }}: {{ $server->product->allocations }} <br/> {{ __('Billing Period') }}: {{$server->product->billing_period}}"
+                                            class="fas fa-info-circle"></i>
+                                    </div>
+                                </div>
 
+                                <div class="row mb-4 ">
+                                    <div class="col-5 word-break" style="hyphens: auto">
+                                        {{ __('Next Billing Cycle') }}:
                                     </div>
-                                    <div class="row mb-2">
-                                        <div class="col-4">
-                                            {{ __('Price') }}:
-                                            <span class="text-muted">
-                                                ({{ CREDITS_DISPLAY_NAME }})
-                                            </span>
-                                        </div>
-                                        <div class="col-8">
-                                            <div class="row">
-                                                <div class="col-6  text-center">
-                                                    <div class="text-muted">{{ __('per Hour') }}</div>
-                                                    <span>
-                                                        {{ number_format($server->product->getHourlyPrice(), 2, '.', '') }}
-                                                    </span>
-                                                </div>
-                                                <div class="col-6  text-center">
-                                                    <div class="text-muted">{{ __('per Month') }}
-                                                    </div>
-                                                    <span>
-                                                        {{ $server->product->getHourlyPrice() * 24 * 30 }}
-                                                    </span>
-                                                </div>
+                                    <div class="col-7 d-flex text-wrap align-items-center">
+                                        <span>
+                                        @if ($server->suspended)
+                                            -
+                                        @else
+                                            @switch($server->product->billing_period)
+                                                @case('monthly')
+                                                    {{ \Carbon\Carbon::parse($server->last_billed)->addMonth()->toDayDateTimeString(); }}
+                                                    @break
+                                                @case('weekly')
+                                                    {{ \Carbon\Carbon::parse($server->last_billed)->addWeek()->toDayDateTimeString(); }}
+                                                    @break
+                                                @case('daily')
+                                                    {{ \Carbon\Carbon::parse($server->last_billed)->addDay()->toDayDateTimeString(); }}
+                                                    @break
+                                                @case('hourly')
+                                                    {{ \Carbon\Carbon::parse($server->last_billed)->addHour()->toDayDateTimeString(); }}
+                                                    @break
+                                                @case('quarterly')
+                                                    {{ \Carbon\Carbon::parse($server->last_billed)->addMonths(3)->toDayDateTimeString(); }}
+                                                    @break
+                                                @case('half-annually')
+                                                    {{ \Carbon\Carbon::parse($server->last_billed)->addMonths(6)->toDayDateTimeString(); }}
+                                                    @break
+                                                @case('annually')
+                                                    {{ \Carbon\Carbon::parse($server->last_billed)->addYear()->toDayDateTimeString(); }}
+                                                    @break
+                                                @default
+                                                    {{ __('Unknown') }}
+                                            @endswitch
+                                        @endif
+                                        </span>
+                                    </div>
+                                </div>
+
+                                <div class="row mb-2">
+                                    <div class="col-4">
+                                        {{ __('Price') }}:
+                                        <span class="text-muted">
+                                            ({{ CREDITS_DISPLAY_NAME }})
+                                        </span>
+                                    </div>
+                                    <div class="col-8 text-center">
+                                        <div class="text-muted">
+                                        @if($server->product->billing_period == 'monthly')
+                                            {{ __('per Month') }}
+                                        @elseif($server->product->billing_period == 'half-annually')
+                                            {{ __('per 6 Months') }}
+                                        @elseif($server->product->billing_period == 'quarterly')
+                                            {{ __('per 3 Months') }}
+                                        @elseif($server->product->billing_period == 'annually')
+                                            {{ __('per Year') }}
+                                        @elseif($server->product->billing_period == 'weekly')
+                                            {{ __('per Week') }}
+                                        @elseif($server->product->billing_period == 'daily')
+                                            {{ __('per Day') }}
+                                        @elseif($server->product->billing_period == 'hourly')
+                                            {{ __('per Hour') }}
+                                        @endif
                                             </div>
-                                        </div>
+                                        <span>
+                                            {{ $server->product->price == round($server->product->price) ? round($server->product->price) : $server->product->price }}
+                                        </span>
                                     </div>
                                 </div>
                             </div>
+                        </div>
 
-                            <div class="card-footer d-flex align-items-center justify-content-between">
-                                <a href="{{ config('SETTINGS::SYSTEM:PTERODACTYL:URL') }}/server/{{ $server->identifier }}"
-                                    target="__blank"
-                                    class="btn btn-info mx-3 w-100 align-items-center justify-content-center d-flex">
-                                    <i class="fas fa-tools mr-2"></i>
-                                    <span>{{ __('Manage') }}</span>
-                                </a>
-                                <a href="{{ route('servers.show', ['server' => $server->id])}}" class="btn btn-warning mx-3 w-100 align-items-center justify-content-center d-flex">
-                                    <i class="fas fa-cog mr-2"></i>
-                                    <span>{{ __('Settings') }}</span>
-                                </a>
-                            </div>
+                        <div class="card-footer text-center">
+                            <a href="{{ config('SETTINGS::SYSTEM:PTERODACTYL:URL') }}/server/{{ $server->identifier }}"
+                                target="__blank"
+                                class="btn btn-info text-center float-left ml-2"
+                                data-toggle="tooltip" data-placement="bottom" title="{{ __('Manage Server') }}">
+                                <i class="fas fa-tools mx-2"></i>
+                            </a>
+                            @if(config("SETTINGS::SYSTEM:PTERODACTYL:ADMIN_USER_TOKEN"))
+                            <a href="{{ route('servers.show', ['server' => $server->id])}}"
+                            	class="btn btn-info text-center mr-3"
+                            	data-toggle="tooltip" data-placement="bottom" title="{{ __('Server Settings') }}">
+                                <i class="fas fa-cog mx-2"></i>
+                            </a>
+                            @endif
+                            <button onclick="handleServerCancel('{{ $server->id }}');" target="__blank"
+                                class="btn btn-warning  text-center"
+                                {{ $server->suspended || $server->cancelled ? "disabled" : "" }}
+                                data-toggle="tooltip" data-placement="bottom" title="{{ __('Cancel Server') }}">
+                                <i class="fas fa-ban mx-2"></i>
+                            </button>
+                            <button onclick="handleServerDelete('{{ $server->id }}');" target="__blank"
+                                class="btn btn-danger  text-center float-right mr-2"
+                                data-toggle="tooltip" data-placement="bottom" title="{{ __('Delete Server') }}">
+                                <i class="fas fa-trash mx-2"></i>
+                            </button>
                         </div>
+                    </div>
                     @endif
                 @endforeach
             </div>
@@ -156,4 +237,68 @@
         </div>
     </section>
     <!-- END CONTENT -->
+
+    <script>
+        const handleServerCancel = (serverId) => {
+            // Handle server cancel with sweetalert
+            Swal.fire({
+                title: "{{ __('Cancel Server?') }}",
+                text: "{{ __('This will cancel your current server to the next billing period. It will get suspended when the current period runs out.') }}",
+                icon: 'warning',
+                confirmButtonColor: '#d9534f',
+                showCancelButton: true,
+                confirmButtonText: "{{ __('Yes, cancel it!') }}",
+                cancelButtonText: "{{ __('No, abort!') }}",
+                reverseButtons: true
+            }).then((result) => {
+                if (result.value) {
+                    // Delete server
+                    fetch("{{ route('servers.cancel', '') }}" + '/' + serverId, {
+                        method: 'PATCH',
+                        headers: {
+                            'X-CSRF-TOKEN': '{{ csrf_token() }}'
+                        }
+                    }).then(() => {
+                        window.location.reload();
+                    });
+                    return
+                }
+            })
+        }
+
+        const handleServerDelete = (serverId) => {
+            Swal.fire({
+                title: "{{ __('Delete Server?') }}",
+                html: "{{!! __('This is an irreversible action, all files of this server will be removed. <strong>No funds will get refunded</strong>. We recommend deleting the server when server is suspended.') !!}}",
+                icon: 'warning',
+                confirmButtonColor: '#d9534f',
+                showCancelButton: true,
+                confirmButtonText: "{{ __('Yes, delete it!') }}",
+                cancelButtonText: "{{ __('No, abort!') }}",
+                reverseButtons: true
+            }).then((result) => {
+                if (result.value) {
+                    // Delete server
+                    fetch("{{ route('servers.destroy', '') }}" + '/' + serverId, {
+                        method: 'DELETE',
+                        headers: {
+                            'X-CSRF-TOKEN': '{{ csrf_token() }}'
+                        }
+                    }).then(() => {
+                        window.location.reload();
+                    });
+                    return
+                }
+            });
+
+        }
+
+        document.addEventListener('DOMContentLoaded', () => {
+            $('[data-toggle="popover"]').popover();
+        });
+
+        $(function () {
+            $('[data-toggle="tooltip"]').tooltip()
+        })
+    </script>
 @endsection

+ 4 - 6
themes/default/views/servers/settings.blade.php

@@ -243,10 +243,7 @@
                                         </button>
                                     </div>
                                     <div class="modal-body card-body">
-                                        <strong>{{__("FOR DOWNGRADE PLEASE CHOOSE A PLAN BELOW YOUR PLAN")}}</strong>
-                                        <br>
-                                        <br>
-                                        <strong>{{__("YOUR PRODUCT")}} : </strong> {{ $server->product->name }}
+                                        <strong>{{__("Current Product")}}: </strong> {{ $server->product->name }}
                                         <br>
                                         <br>
 
@@ -256,12 +253,13 @@
                                             <option value="">{{__("Select the product")}}</option>
                                               @foreach($products as $product)
                                                   @if(in_array($server->egg, $product->eggs) && $product->id != $server->product->id && $product->disabled == false)
-                                                    <option value="{{ $product->id }}" @if($product->doesNotFit)disabled @endif>{{ $product->name }} [ {{ CREDITS_DISPLAY_NAME }} {{ $product->price }} @if($product->doesNotFit)] {{__('Server can´t fit on this node')}} @else @if($product->minimum_credits!=-1) /
+                                                    <option value="{{ $product->id }}" @if($product->doesNotFit)disabled @endif>{{ $product->name }} [ {{ CREDITS_DISPLAY_NAME }} {{ $product->price }} @if($product->doesNotFit)] {{__('Server can\'t fit on this node')}} @else @if($product->minimum_credits!=-1) /
                                                         {{__("Required")}}: {{$product->minimum_credits}} {{ CREDITS_DISPLAY_NAME }}@endif ] @endif</option>
                                                   @endif
                                               @endforeach
                                           </select>
-                                          <br> {{__("Once the Upgrade button is pressed, we will automatically deduct the amount for the first hour according to the new product from your credits")}}. <br>
+                                          
+                                          <br> <strong>{{__("Caution") }}:</strong> {{__("Upgrading/Downgrading your server will reset your billing cycle to now. Your overpayed Credits will be refunded. The price for the new billing cycle will be withdrawed")}}. <br>
                                           <br> {{__("Server will be automatically restarted once upgraded")}}
                                     </div>
                                     <div class="modal-footer card-body">