diff --git a/.babelrc b/.babelrc new file mode 100644 index 000000000..adc18d407 --- /dev/null +++ b/.babelrc @@ -0,0 +1,8 @@ +{ + "presets": ["es2015"], + "compact": true, + "minified": true, + "only": "public/js/files/*.js", + "sourceMaps": "inline", + "comments": false +} diff --git a/.editorconfig b/.editorconfig index 557990c52..bc49d523e 100644 --- a/.editorconfig +++ b/.editorconfig @@ -3,8 +3,10 @@ root = true [*] end_of_line = lf insert_final_newline = true - -[*.{php,js,html,css}] -charset = utf-8 indent_style = space indent_size = 4 +charset = utf-8 +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false diff --git a/.gitignore b/.gitignore index 9dfd2bc12..595557b70 100644 --- a/.gitignore +++ b/.gitignore @@ -9,5 +9,4 @@ Homestead.yaml Vagrantfile Vagrantfile -node_modules -.babelrc \ No newline at end of file +node_modules \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 8db9eb9de..33682bd80 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,25 @@ This file is a running track of new features and fixes to each version of the pa This project follows [Semantic Versioning](http://semver.org) guidelines. +## v0.5.6 (Bodacious Boreopterus) +### Added +* Added the following languages: Estonian `et`, Dutch `nl`, Norwegian `nb` (partial), Romanian `ro`, and Russian `ru`. Interested in helping us translate the panel into more languages, or improving existing translations? Contact us on Discord and let us know. +* Added missing `strings.password` to language file for English. +* Allow listing of users from the API by passing either the user ID or their email. + +### Fixed +* Fixes bug where assigning a variable a default value (or valid value) of `0` would cause the panel to reject the value thinking it did not exist. +* Addresses potential for crash by limiting total ports that can be assigned per-range to 2000. +* Fixes server names requiring at minimum 4 characters. Name can now be 1 to 200 characters long. :pencil2: +* Fixes bug that would allow adding the owner of a server as a subuser for that same server. +* Fixes bug that would allow creating multiple subusers with the same email address. +* Fixes bug where Sponge servers were improperly tagged as a spigot server in the daemon causing issues when booting or modifying configuration files. +* Use transpiled ES6 -> ES5 filemanager code in browsers. +* Fixes service option name displaying the name of a nwly added variable after the variable is added and until the page is refreshed. (see #208) + +### Changed +* Filemanager and EULA checking javascript is now written in pure ES6 code rather than as a blade-syntax template. This allows the use of babel to transpile into ES5 as a minified version. + ## v0.5.5 (Bodacious Boreopterus) ### Added * New API route to return allocations given a server ID. This adds support for a community-driven WHMCS module :rocket: available [here](https://github.com/hammerdawn/Pterodactyl-WHMCS). diff --git a/app/Http/Controllers/API/UserController.php b/app/Http/Controllers/API/UserController.php index ad7eca5d5..59e9af975 100755 --- a/app/Http/Controllers/API/UserController.php +++ b/app/Http/Controllers/API/UserController.php @@ -75,7 +75,7 @@ class UserController extends BaseController */ public function view(Request $request, $id) { - $query = Models\User::where('id', $id); + $query = Models\User::where((is_numeric($id) ? 'id' : 'email'), $id); if (! is_null($request->input('fields'))) { foreach (explode(',', $request->input('fields')) as $field) { diff --git a/app/Http/Controllers/Admin/NodesController.php b/app/Http/Controllers/Admin/NodesController.php index e2b617b63..e7f53fa7f 100644 --- a/app/Http/Controllers/Admin/NodesController.php +++ b/app/Http/Controllers/Admin/NodesController.php @@ -27,6 +27,7 @@ namespace Pterodactyl\Http\Controllers\Admin; use DB; use Log; use Alert; +use Carbon; use Validator; use Pterodactyl\Models; use Illuminate\Http\Request; @@ -82,6 +83,7 @@ class NodesController extends Controller '_token', ])); Alert::success('Successfully created new node. Before you can add any servers you need to first assign some IP addresses and ports.')->flash(); + Alert::info('To simplify the node setup you can generate a token on the configuration tab.')->flash(); return redirect()->route('admin.nodes.view', [ 'id' => $new, @@ -276,4 +278,24 @@ class NodesController extends Controller 'tab' => 'tab_delete', ]); } + + public function getConfigurationToken(Request $request, $id) + { + // Check if Node exists. Will lead to 404 if not. + Models\Node::findOrFail($id); + + // Create a token + $token = new Models\NodeConfigurationToken(); + $token->node = $id; + $token->token = str_random(32); + $token->expires_at = Carbon::now()->addMinutes(5); // Expire in 5 Minutes + $token->save(); + + $token_response = [ + 'token' => $token->token, + 'expires_at' => $token->expires_at->toDateTimeString(), + ]; + + return response()->json($token_response, 200); + } } diff --git a/app/Http/Controllers/Admin/ServiceController.php b/app/Http/Controllers/Admin/ServiceController.php index adcde0f61..4e1b3b1b3 100644 --- a/app/Http/Controllers/Admin/ServiceController.php +++ b/app/Http/Controllers/Admin/ServiceController.php @@ -232,7 +232,7 @@ class ServiceController extends Controller ])); Alert::success('Successfully added new variable to this option.')->flash(); - return redirect()->route('admin.services.option', [$service, $option])->withInput(); + return redirect()->route('admin.services.option', [$service, $option]); } catch (DisplayValidationException $ex) { return redirect()->route('admin.services.option.variable.new', [$service, $option])->withErrors(json_decode($ex->getMessage()))->withInput(); } catch (DisplayException $ex) { diff --git a/app/Http/Controllers/Base/LanguageController.php b/app/Http/Controllers/Base/LanguageController.php index a735c365c..1051759ef 100644 --- a/app/Http/Controllers/Base/LanguageController.php +++ b/app/Http/Controllers/Base/LanguageController.php @@ -33,16 +33,14 @@ use Pterodactyl\Http\Controllers\Controller; class LanguageController extends Controller { protected $languages = [ - 'de' => 'Danish', + 'de' => 'German', 'en' => 'English', - 'es' => 'Spanish', - 'fr' => 'French', - 'it' => 'Italian', - 'pl' => 'Polish', + 'et' => 'Estonian', + 'nb' => 'Norwegian', + 'nl' => 'Dutch', 'pt' => 'Portuguese', + 'ro' => 'Romanian', 'ru' => 'Russian', - 'se' => 'Swedish', - 'zh' => 'Chinese', ]; /** diff --git a/app/Http/Controllers/Remote/RemoteController.php b/app/Http/Controllers/Remote/RemoteController.php index e6dab6984..600e3d0d0 100644 --- a/app/Http/Controllers/Remote/RemoteController.php +++ b/app/Http/Controllers/Remote/RemoteController.php @@ -24,6 +24,7 @@ namespace Pterodactyl\Http\Controllers\Remote; +use Carbon\Carbon; use Pterodactyl\Models; use Illuminate\Http\Request; use Pterodactyl\Http\Controllers\Controller; @@ -107,4 +108,29 @@ class RemoteController extends Controller return response('', 201); } + + public function getConfiguration(Request $request, $tokenString) + { + // Try to query the token and the node from the database + try { + $token = Models\NodeConfigurationToken::where('token', $tokenString)->firstOrFail(); + $node = Models\Node::findOrFail($token->node); + } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $e) { + return response()->json(['error' => 'token_invalid'], 403); + } + + // Check if token is expired + if ($token->expires_at->lt(Carbon::now())) { + $token->delete(); + + return response()->json(['error' => 'token_expired'], 403); + } + + // Delete the token, it's one-time use + $token->delete(); + + // Manually as getConfigurationAsJson() returns it in correct format already + return response($node->getConfigurationAsJson(), 200) + ->header('Content-Type', 'application/json'); + } } diff --git a/app/Http/Controllers/Server/ServerController.php b/app/Http/Controllers/Server/ServerController.php index ed051b8e9..81a7e20cf 100644 --- a/app/Http/Controllers/Server/ServerController.php +++ b/app/Http/Controllers/Server/ServerController.php @@ -28,9 +28,9 @@ use DB; use Log; use Uuid; use Alert; +use Javascript; use Pterodactyl\Models; use Illuminate\Http\Request; -use InvalidArgumentException; use Pterodactyl\Exceptions\DisplayException; use Pterodactyl\Http\Controllers\Controller; use Pterodactyl\Repositories\ServerRepository; @@ -49,24 +49,6 @@ class ServerController extends Controller // } - public function getJavascript(Request $request, $uuid, $folder, $file) - { - $server = Models\Server::getByUUID($uuid); - - $info = pathinfo($file); - $routeFile = str_replace('/', '.', $info['dirname']) . '.' . $info['filename']; - try { - return response()->view('server.js.' . $folder . '.' . $routeFile, [ - 'server' => $server, - 'node' => Models\Node::find($server->node), - ])->header('Content-Type', 'application/javascript'); - } catch (InvalidArgumentException $ex) { - return abort(404); - } catch (\Exception $ex) { - throw $ex; - } - } - /** * Renders server index page for specified server. * @@ -77,6 +59,13 @@ class ServerController extends Controller { $server = Models\Server::getByUUID($request->route()->server); + Javascript::put([ + 'meta' => [ + 'saveFile' => route('server.files.save', $server->uuidShort), + 'csrfToken' => csrf_token(), + ], + ]); + return view('server.index', [ 'server' => $server, 'allocations' => Models\Allocation::where('assigned_to', $server->id)->orderBy('ip', 'asc')->orderBy('port', 'asc')->get(), @@ -90,14 +79,34 @@ class ServerController extends Controller * @param Request $request * @return \Illuminate\Contracts\View\View */ - public function getFiles(Request $request) + public function getFiles(Request $request, $uuid) { - $server = Models\Server::getByUUID($request->route()->server); + $server = Models\Server::getByUUID($uuid); $this->authorize('list-files', $server); + $node = Models\Node::find($server->node); + + Javascript::put([ + 'server' => collect($server->makeVisible('daemonSecret'))->only('uuid', 'uuidShort', 'daemonSecret'), + 'node' => collect($node)->only('fqdn', 'scheme', 'daemonListen'), + 'meta' => [ + 'directoryList' => route('server.files.directory-list', $server->uuidShort), + 'csrftoken' => csrf_token(), + ], + 'permissions' => [ + 'moveFiles' => $request->user()->can('move-files', $server), + 'copyFiles' => $request->user()->can('copy-files', $server), + 'compressFiles' => $request->user()->can('compress-files', $server), + 'decompressFiles' => $request->user()->can('decompress-files', $server), + 'createFiles' => $request->user()->can('create-files', $server), + 'downloadFiles' => $request->user()->can('download-files', $server), + 'deleteFiles' => $request->user()->can('delete-files', $server), + ], + ]); + return view('server.files.index', [ 'server' => $server, - 'node' => Models\Node::find($server->node), + 'node' => $node, ]); } @@ -107,9 +116,9 @@ class ServerController extends Controller * @param Request $request * @return \Illuminate\Contracts\View\View */ - public function getAddFile(Request $request) + public function getAddFile(Request $request, $uuid) { - $server = Models\Server::getByUUID($request->route()->server); + $server = Models\Server::getByUUID($uuid); $this->authorize('add-files', $server); return view('server.files.add', [ diff --git a/app/Http/Routes/AdminRoutes.php b/app/Http/Routes/AdminRoutes.php index fb3d16ba7..731052238 100644 --- a/app/Http/Routes/AdminRoutes.php +++ b/app/Http/Routes/AdminRoutes.php @@ -286,6 +286,11 @@ class AdminRoutes 'as' => 'admin.nodes.delete', 'uses' => 'Admin\NodesController@deleteNode', ]); + + $router->get('/{id}/configurationtoken', [ + 'as' => 'admin.nodes.configuration-token', + 'uses' => 'Admin\NodesController@getConfigurationToken', + ]); }); // Location Routes diff --git a/app/Http/Routes/RemoteRoutes.php b/app/Http/Routes/RemoteRoutes.php index 2e2201c45..a42a611e9 100644 --- a/app/Http/Routes/RemoteRoutes.php +++ b/app/Http/Routes/RemoteRoutes.php @@ -46,6 +46,11 @@ class RemoteRoutes 'as' => 'remote.event', 'uses' => 'Remote\RemoteController@event', ]); + + $router->get('configuration/{token}', [ + 'as' => 'remote.configuration', + 'uses' => 'Remote\RemoteController@getConfiguration', + ]); }); } } diff --git a/app/Http/Routes/ServerRoutes.php b/app/Http/Routes/ServerRoutes.php index 49c58754a..061652761 100644 --- a/app/Http/Routes/ServerRoutes.php +++ b/app/Http/Routes/ServerRoutes.php @@ -166,15 +166,6 @@ class ServerRoutes 'uses' => 'Server\AjaxController@postResetDatabasePassword', ]); }); - - // Assorted AJAX Routes - $router->group(['prefix' => 'js'], function ($server) use ($router) { - // Returns Server Status - $router->get('{folder}/{file}', [ - 'as' => 'server.js', - 'uses' => 'Server\ServerController@getJavascript', - ])->where('file', '.*'); - }); }); } } diff --git a/app/Models/Node.php b/app/Models/Node.php index 396f2849d..7c113b2f0 100644 --- a/app/Models/Node.php +++ b/app/Models/Node.php @@ -117,4 +117,61 @@ class Node extends Model return self::$guzzle[$node]; } + + /** + * Returns the configuration in JSON format. + * + * @param bool $pretty Wether to pretty print the JSON or not + * @return string The configration in JSON format + */ + public function getConfigurationAsJson($pretty = false) + { + $config = [ + 'web' => [ + 'host' => '0.0.0.0', + 'listen' => $this->daemonListen, + 'ssl' => [ + 'enabled' => $this->scheme === 'https', + 'certificate' => '/etc/letsencrypt/live/localhost/fullchain.pem', + 'key' => '/etc/letsencrypt/live/localhost/privkey.pem', + ], + ], + 'docker' => [ + 'socket' => '/var/run/docker.sock', + 'autoupdate_images' => true, + ], + 'sftp' => [ + 'path' => $this->daemonBase, + 'port' => $this->daemonSFTP, + 'container' => 'ptdl-sftp', + ], + 'query' => [ + 'kill_on_fail' => true, + 'fail_limit' => 5, + ], + 'logger' => [ + 'path' => 'logs/', + 'src' => false, + 'level' => 'info', + 'period' => '1d', + 'count' => 3, + ], + 'remote' => [ + 'base' => config('app.url'), + 'download' => route('remote.download'), + 'installed' => route('remote.install'), + ], + 'uploads' => [ + 'size_limit' => $this->upload_size, + ], + 'keys' => [$this->daemonSecret], + ]; + + $json_options = JSON_UNESCAPED_SLASHES; + if ($pretty) { + $json_options |= JSON_PRETTY_PRINT; + } + + return json_encode($config, $json_options); + } } diff --git a/app/Models/NodeConfigurationToken.php b/app/Models/NodeConfigurationToken.php new file mode 100644 index 000000000..d7a309adc --- /dev/null +++ b/app/Models/NodeConfigurationToken.php @@ -0,0 +1,51 @@ +. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +namespace Pterodactyl\Models; + +use Illuminate\Database\Eloquent\Model; + +class NodeConfigurationToken extends Model +{ + /** + * The table associated with the model. + * + * @var string + */ + protected $table = 'node_configuration_tokens'; + + /** + * Fields that are not mass assignable. + * + * @var array + */ + protected $guarded = ['id', 'created_at', 'updated_at']; + + /** + * The attributes that should be mutated to dates. + * + * @var array + */ + protected $dates = ['created_at', 'updated_at', 'expires_at']; +} diff --git a/app/Repositories/NodeRepository.php b/app/Repositories/NodeRepository.php index 4c80b8a4a..021626e97 100644 --- a/app/Repositories/NodeRepository.php +++ b/app/Repositories/NodeRepository.php @@ -213,7 +213,13 @@ class NodeRepository throw new DisplayException('The mapping for ' . $port . ' is invalid and cannot be processed.'); } if (preg_match('/^(\d{1,5})-(\d{1,5})$/', $port, $matches)) { - foreach (range($matches[1], $matches[2]) as $assignPort) { + $portBlock = range($matches[1], $matches[2]); + + if (count($portBlock) > 2000) { + throw new DisplayException('Adding more than 2000 ports at once is not currently supported. Please consider using a smaller port range.'); + } + + foreach ($portBlock as $assignPort) { $alloc = Models\Allocation::firstOrNew([ 'node' => $node->id, 'ip' => $ip, @@ -252,7 +258,6 @@ class NodeRepository } DB::commit(); - // return true; } catch (\Exception $ex) { DB::rollBack(); throw $ex; @@ -277,6 +282,9 @@ class NodeRepository // Delete Allocations Models\Allocation::where('node', $node->id)->delete(); + // Delete configure tokens + Models\NodeConfigurationToken::where('node', $node->id)->delete(); + // Delete Node $node->delete(); diff --git a/app/Repositories/ServerRepository.php b/app/Repositories/ServerRepository.php index a133e0521..deb6a1b75 100644 --- a/app/Repositories/ServerRepository.php +++ b/app/Repositories/ServerRepository.php @@ -73,7 +73,7 @@ class ServerRepository // Validate Fields $validator = Validator::make($data, [ 'owner' => 'bail|required', - 'name' => 'required|regex:/^([\w -]{4,35})$/', + 'name' => 'required|regex:/^([\w .-]{1,200})$/', 'memory' => 'required|numeric|min:0', 'swap' => 'required|numeric|min:-1', 'io' => 'required|numeric|min:10|max:1000', @@ -179,7 +179,7 @@ class ServerRepository foreach ($variables as $variable) { // Is the variable required? - if (! $data['env_' . $variable->env_variable]) { + if (! isset($data['env_' . $variable->env_variable])) { if ($variable->required === 1) { throw new DisplayException('A required service option variable field (env_' . $variable->env_variable . ') was missing from the request.'); } @@ -360,7 +360,7 @@ class ServerRepository // Validate Fields $validator = Validator::make($data, [ 'owner' => 'email|exists:users,email', - 'name' => 'regex:([\w -]{4,35})', + 'name' => 'regex:([\w .-]{1,200})', ]); // Run validator, throw catchable and displayable exception if it fails. diff --git a/app/Repositories/SubuserRepository.php b/app/Repositories/SubuserRepository.php index d7620732a..dfc72b38b 100644 --- a/app/Repositories/SubuserRepository.php +++ b/app/Repositories/SubuserRepository.php @@ -117,6 +117,7 @@ class SubuserRepository public function create($sid, array $data) { $server = Models\Server::findOrFail($sid); + $validator = Validator::make($data, [ 'permissions' => 'required|array', 'email' => 'required|email', @@ -140,6 +141,10 @@ class SubuserRepository } catch (\Exception $ex) { throw $ex; } + } elseif ($server->owner === $user->id) { + throw new DisplayException('You cannot add the owner of a server as a subuser.'); + } elseif (Models\Subuser::select('id')->where('user_id', $user->id)->where('server_id', $server->id)->first()) { + throw new DisplayException('A subuser with that email already exists for this server.'); } $uuid = new UuidService; @@ -159,6 +164,7 @@ class SubuserRepository if (! is_null($this->permissions[$permission])) { array_push($daemonPermissions, $this->permissions[$permission]); } + $model = new Models\Permission; $model->fill([ 'user_id' => $user->id, diff --git a/composer.json b/composer.json index 3569e3d1b..585c51728 100644 --- a/composer.json +++ b/composer.json @@ -26,7 +26,8 @@ "mtdowling/cron-expression": "1.1.0", "dingo/api": "1.0.0-beta6", "aws/aws-sdk-php": "3.19.20", - "predis/predis": "1.1.1" + "predis/predis": "1.1.1", + "laracasts/utilities": "2.1.0" }, "require-dev": { "fzaninotto/faker": "~1.4", diff --git a/config/app.php b/config/app.php index a3c3ff532..8fbce1528 100644 --- a/config/app.php +++ b/config/app.php @@ -158,6 +158,7 @@ return [ igaster\laravelTheme\themeServiceProvider::class, Prologue\Alerts\AlertsServiceProvider::class, Krucas\Settings\Providers\SettingsServiceProvider::class, + Laracasts\Utilities\JavaScript\JavaScriptServiceProvider::class, ], @@ -198,6 +199,7 @@ return [ 'Hash' => Illuminate\Support\Facades\Hash::class, 'Input' => Illuminate\Support\Facades\Input::class, 'Inspiring' => Illuminate\Foundation\Inspiring::class, + 'Javascript' => Laracasts\Utilities\JavaScript\JavaScriptFacade::class, 'Lang' => Illuminate\Support\Facades\Lang::class, 'Log' => Illuminate\Support\Facades\Log::class, 'Mail' => Illuminate\Support\Facades\Mail::class, diff --git a/config/javascript.php b/config/javascript.php new file mode 100644 index 000000000..2a5cda584 --- /dev/null +++ b/config/javascript.php @@ -0,0 +1,32 @@ + [ + 'layouts.master', + ], + + /* + |-------------------------------------------------------------------------- + | JavaScript Namespace + |-------------------------------------------------------------------------- + | + | By default, we'll add variables to the global window object. However, + | it's recommended that you change this to some namespace - anything. + | That way, you can access vars, like "SomeNamespace.someVariable." + | + */ + 'js_namespace' => 'Pterodactyl', + +]; diff --git a/database/migrations/2017_01_03_150436_fix_misnamed_option_tag.php b/database/migrations/2017_01_03_150436_fix_misnamed_option_tag.php new file mode 100644 index 000000000..a03584ca0 --- /dev/null +++ b/database/migrations/2017_01_03_150436_fix_misnamed_option_tag.php @@ -0,0 +1,40 @@ +where([ + ['name', 'Sponge (SpongeVanilla)'], + ['tag', 'spigot'], + ['docker_image', 'quay.io/pterodactyl/minecraft:sponge'], + ])->update([ + 'tag' => 'sponge', + ]); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + DB::table('service_options')->where([ + ['name', 'Sponge (SpongeVanilla)'], + ['tag', 'sponge'], + ['docker_image', 'quay.io/pterodactyl/minecraft:sponge'], + ])->update([ + 'tag' => 'spigot', + ]); + } +} diff --git a/database/migrations/2017_01_07_154228_create_node_configuration_tokens_table.php b/database/migrations/2017_01_07_154228_create_node_configuration_tokens_table.php new file mode 100644 index 000000000..905d28a46 --- /dev/null +++ b/database/migrations/2017_01_07_154228_create_node_configuration_tokens_table.php @@ -0,0 +1,35 @@ +increments('id'); + $table->char('token', 32); + $table->timestamp('expires_at'); + $table->integer('node')->unsigned(); + $table->foreign('node')->references('id')->on('nodes'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('node_configuration_tokens'); + } +} diff --git a/database/seeds/MinecraftServiceTableSeeder.php b/database/seeds/MinecraftServiceTableSeeder.php index 4b33d8957..e0df5b36c 100644 --- a/database/seeds/MinecraftServiceTableSeeder.php +++ b/database/seeds/MinecraftServiceTableSeeder.php @@ -90,7 +90,7 @@ class MinecraftServiceTableSeeder extends Seeder 'parent_service' => $this->service->id, 'name' => 'Sponge (SpongeVanilla)', 'description' => 'SpongeVanilla is the SpongeAPI implementation for Vanilla Minecraft.', - 'tag' => 'spigot', + 'tag' => 'sponge', 'docker_image' => 'quay.io/pterodactyl/minecraft:sponge', 'executable' => null, 'startup' => null, diff --git a/package.json b/package.json new file mode 100644 index 000000000..da55a0004 --- /dev/null +++ b/package.json @@ -0,0 +1,11 @@ +{ + "name": "pterodactyl-panel", + "devDependencies": { + "babel-cli": "6.18.0", + "babel-plugin-transform-strict-mode": "^6.18.0", + "babel-preset-es2015": "6.18.0" + }, + "scripts": { + "build": "./node_modules/babel-cli/bin/babel.js public/js/files --source-maps --out-file public/js/filemanager.min.js" + } +} diff --git a/public/js/filemanager.min.js b/public/js/filemanager.min.js new file mode 100644 index 000000000..64a74e92d --- /dev/null +++ b/public/js/filemanager.min.js @@ -0,0 +1,5 @@ +'use strict';var _createClass=function(){function defineProperties(target,props){for(var i=0;i\n \n ';nameBlock.html(attachEditor);var inputField=nameBlock.find('input');var inputLoader=nameBlock.find('.input-loader');inputField.focus();inputField.on('blur keydown',function(e){if(e.type==='keydown'&&e.which===27||e.type==='blur'||e.type==='keydown'&&e.which===13&¤tName===inputField.val()){if(!_.isEmpty(currentLink)){nameBlock.html(currentLink)}else{nameBlock.html(currentName)}inputField.remove();ContextMenu.unbind().run();return}if(e.type==='keydown'&&e.which!==13)return;inputLoader.show();var currentPath=decodeURIComponent(nameBlock.data('path'));$.ajax({type:'POST',headers:{'X-Access-Token':Pterodactyl.server.daemonSecret,'X-Access-Server':Pterodactyl.server.uuid},contentType:'application/json; charset=utf-8',url:Pterodactyl.node.scheme+'://'+Pterodactyl.node.fqdn+':'+Pterodactyl.node.daemonListen+'/server/file/rename',timeout:10000,data:JSON.stringify({from:''+currentPath+currentName,to:''+currentPath+inputField.val()})}).done(function(data){nameBlock.attr('data-name',inputField.val());if(!_.isEmpty(currentLink)){var newLink=currentLink.attr('href');if(nameBlock.parent().data('type')!=='folder'){newLink=newLink.substr(0,newLink.lastIndexOf('/'))+'/'+inputField.val()}currentLink.attr('href',newLink);nameBlock.html(currentLink.html(inputField.val()))}else{nameBlock.html(inputField.val())}inputField.remove()}).fail(function(jqXHR){console.error(jqXHR);var error='An error occured while trying to process this request.';if(typeof jqXHR.responseJSON!=='undefined'&&typeof jqXHR.responseJSON.error!=='undefined'){error=jqXHR.responseJSON.error}nameBlock.addClass('has-error').delay(2000).queue(function(){nameBlock.removeClass('has-error').dequeue()});inputField.popover({animation:true,placement:'top',content:error,title:'Save Error'}).popover('show')}).always(function(){inputLoader.remove();ContextMenu.unbind().run()})})}},{key:'copy',value:function copy(){var nameBlock=$(this.element).find('td[data-identifier="name"]');var currentName=decodeURIComponent(nameBlock.attr('data-name'));var currentPath=decodeURIComponent(nameBlock.data('path'));swal({type:'input',title:'Copy File',text:'Please enter the new path for the copied file below.',showCancelButton:true,showConfirmButton:true,closeOnConfirm:false,showLoaderOnConfirm:true,inputValue:''+currentPath+currentName},function(val){$.ajax({type:'POST',headers:{'X-Access-Token':Pterodactyl.server.daemonSecret,'X-Access-Server':Pterodactyl.server.uuid},contentType:'application/json; charset=utf-8',url:Pterodactyl.node.scheme+'://'+Pterodactyl.node.fqdn+':'+Pterodactyl.node.daemonListen+'/server/file/copy',timeout:10000,data:JSON.stringify({from:''+currentPath+currentName,to:''+val})}).done(function(data){swal({type:'success',title:'',text:'File successfully copied.'});Files.list()}).fail(function(jqXHR){console.error(jqXHR);var error='An error occured while trying to process this request.';if(typeof jqXHR.responseJSON!=='undefined'&&typeof jqXHR.responseJSON.error!=='undefined'){error=jqXHR.responseJSON.error}swal({type:'error',title:'',text:error})})})}},{key:'download',value:function download(){var nameBlock=$(this.element).find('td[data-identifier="name"]');var fileName=decodeURIComponent(nameBlock.attr('data-name'));var filePath=decodeURIComponent(nameBlock.data('path'));window.location='/server/'+Pterodactyl.server.uuidShort+'/files/download/'+filePath+fileName}},{key:'delete',value:function _delete(){var nameBlock=$(this.element).find('td[data-identifier="name"]');var delPath=decodeURIComponent(nameBlock.data('path'));var delName=decodeURIComponent(nameBlock.data('name'));swal({type:'warning',title:'',text:'Are you sure you want to delete '+delName+'? There is no reversing this action.',html:true,showCancelButton:true,showConfirmButton:true,closeOnConfirm:false,showLoaderOnConfirm:true},function(){$.ajax({type:'DELETE',url:Pterodactyl.node.scheme+'://'+Pterodactyl.node.fqdn+':'+Pterodactyl.node.daemonListen+'/server/file/f/'+delPath+delName,headers:{'X-Access-Token':Pterodactyl.server.daemonSecret,'X-Access-Server':Pterodactyl.server.uuid}}).done(function(data){nameBlock.parent().addClass('warning').delay(200).fadeOut();swal({type:'success',title:'File Deleted'})}).fail(function(jqXHR){console.error(jqXHR);swal({type:'error',title:'Whoops!',html:true,text:'An error occured while attempting to delete this file. Please try again.'})})})}},{key:'decompress',value:function decompress(){var nameBlock=$(this.element).find('td[data-identifier="name"]');var compPath=decodeURIComponent(nameBlock.data('path'));var compName=decodeURIComponent(nameBlock.data('name'));swal({title:' Decompressing...',text:'This might take a few seconds to complete.',html:true,allowOutsideClick:false,allowEscapeKey:false,showConfirmButton:false});$.ajax({type:'POST',url:Pterodactyl.node.scheme+'://'+Pterodactyl.node.fqdn+':'+Pterodactyl.node.daemonListen+'/server/file/decompress',headers:{'X-Access-Token':Pterodactyl.server.daemonSecret,'X-Access-Server':Pterodactyl.server.uuid},contentType:'application/json; charset=utf-8',data:JSON.stringify({files:''+compPath+compName})}).done(function(data){swal.close();Files.list(compPath)}).fail(function(jqXHR){console.error(jqXHR);var error='An error occured while trying to process this request.';if(typeof jqXHR.responseJSON!=='undefined'&&typeof jqXHR.responseJSON.error!=='undefined'){error=jqXHR.responseJSON.error}swal({type:'error',title:'Whoops!',html:true,text:error})})}},{key:'compress',value:function compress(){var nameBlock=$(this.element).find('td[data-identifier="name"]');var compPath=decodeURIComponent(nameBlock.data('path'));var compName=decodeURIComponent(nameBlock.data('name'));$.ajax({type:'POST',url:Pterodactyl.node.scheme+'://'+Pterodactyl.node.fqdn+':'+Pterodactyl.node.daemonListen+'/server/file/compress',headers:{'X-Access-Token':Pterodactyl.server.daemonSecret,'X-Access-Server':Pterodactyl.server.uuid},contentType:'application/json; charset=utf-8',data:JSON.stringify({files:''+compPath+compName,to:compPath.toString()})}).done(function(data){Files.list(compPath,function(err){if(err)return;var fileListing=$('#file_listing').find('[data-name="'+data.saved_as+'"]').parent();fileListing.addClass('success pulsate').delay(3000).queue(function(){fileListing.removeClass('success pulsate').dequeue()})})}).fail(function(jqXHR){console.error(jqXHR);var error='An error occured while trying to process this request.';if(typeof jqXHR.responseJSON!=='undefined'&&typeof jqXHR.responseJSON.error!=='undefined'){error=jqXHR.responseJSON.error}swal({type:'error',title:'Whoops!',html:true,text:error})})}}]);return ActionsClass}(); +'use strict';var _createClass=function(){function defineProperties(target,props){for(var i=0;i New File
  • New Folder
  • '}if(Pterodactyl.permissions.downloadFiles||Pterodactyl.permissions.deleteFiles){buildMenu+='
  • '}if(Pterodactyl.permissions.downloadFiles){buildMenu+=''}if(Pterodactyl.permissions.deleteFiles){buildMenu+='
  • Delete
  • '}buildMenu+='';return buildMenu}},{key:'rightClick',value:function rightClick(){var _this=this;$('[data-action="toggleMenu"]').on('mousedown',function(){event.preventDefault();_this.showMenu(event)});$('#file_listing > tbody td').on('contextmenu',function(event){_this.showMenu(event)})}},{key:'showMenu',value:function showMenu(event){var _this2=this;var parent=$(event.target).closest('tr');var menu=$(this.makeMenu(parent));if(parent.data('type')==='disabled')return;event.preventDefault();$(menu).appendTo('body');$(menu).data('invokedOn',$(event.target)).show().css({position:'absolute',left:event.pageX-150,top:event.pageY});this.activeLine=parent;this.activeLine.addClass('active');var Actions=new ActionsClass(parent,menu);if(Pterodactyl.permissions.moveFiles){$(menu).find('li[data-action="move"]').unbind().on('click',function(e){e.preventDefault();Actions.move()});$(menu).find('li[data-action="rename"]').unbind().on('click',function(e){e.preventDefault();Actions.rename()})}if(Pterodactyl.permissions.copyFiles){$(menu).find('li[data-action="copy"]').unbind().on('click',function(e){e.preventDefault();Actions.copy()})}if(Pterodactyl.permissions.compressFiles){if(parent.data('type')==='folder'){$(menu).find('li[data-action="compress"]').removeClass('hidden')}$(menu).find('li[data-action="compress"]').unbind().on('click',function(e){e.preventDefault();Actions.compress()})}if(Pterodactyl.permissions.decompressFiles){if(_.without(['application/zip','application/gzip','application/x-gzip'],parent.data('mime')).length<3){$(menu).find('li[data-action="decompress"]').removeClass('hidden')}$(menu).find('li[data-action="decompress"]').unbind().on('click',function(e){e.preventDefault();Actions.decompress()})}if(Pterodactyl.permissions.createFiles){$(menu).find('li[data-action="folder"]').unbind().on('click',function(e){e.preventDefault();Actions.folder()})}if(Pterodactyl.permissions.downloadFiles){if(parent.data('type')==='file'){$(menu).find('li[data-action="download"]').removeClass('hidden')}$(menu).find('li[data-action="download"]').unbind().on('click',function(e){e.preventDefault();Actions.download()})}if(Pterodactyl.permissions.deleteFiles){$(menu).find('li[data-action="delete"]').unbind().on('click',function(e){e.preventDefault();Actions.delete()})}$(window).on('click',function(){$(menu).remove();if(!_.isNull(_this2.activeLine))_this2.activeLine.removeClass('active')})}},{key:'directoryClick',value:function directoryClick(){$('a[data-action="directory-view"]').on('click',function(event){event.preventDefault();var path=$(this).parent().data('path')||'';var name=$(this).parent().data('name')||'';window.location.hash=encodeURIComponent(path+name);Files.list()})}}]);return ContextMenuClass}();window.ContextMenu=new ContextMenuClass; +'use strict';var _createClass=function(){function defineProperties(target,props){for(var i=0;i\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\nclass ActionsClass {\n constructor(element, menu) {\n this.element = element;\n this.menu = menu;\n }\n\n destroy() {\n this.element = undefined;\n }\n\n folder() {\n const nameBlock = $(this.element).find('td[data-identifier=\"name\"]');\n const currentName = decodeURIComponent(nameBlock.attr('data-name'));\n const currentPath = decodeURIComponent(nameBlock.data('path'));\n\n let inputValue = `${currentPath}${currentName}/`;\n if ($(this.element).data('type') === 'file') {\n inputValue = currentPath;\n }\n swal({\n type: 'input',\n title: 'Create Folder',\n text: 'Please enter the path and folder name below.',\n showCancelButton: true,\n showConfirmButton: true,\n closeOnConfirm: false,\n showLoaderOnConfirm: true,\n inputValue: inputValue\n }, (val) => {\n $.ajax({\n type: 'POST',\n headers: {\n 'X-Access-Token': Pterodactyl.server.daemonSecret,\n 'X-Access-Server': Pterodactyl.server.uuid,\n },\n contentType: 'application/json; charset=utf-8',\n url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/server/file/folder`,\n timeout: 10000,\n data: JSON.stringify({\n path: val,\n }),\n }).done(data => {\n swal.close();\n Files.list();\n }).fail(jqXHR => {\n console.error(jqXHR);\n var error = 'An error occured while trying to process this request.';\n if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') {\n error = jqXHR.responseJSON.error;\n }\n swal({\n type: 'error',\n title: '',\n text: error,\n });\n });\n });\n }\n\n move() {\n const nameBlock = $(this.element).find('td[data-identifier=\"name\"]');\n const currentName = decodeURIComponent(nameBlock.attr('data-name'));\n const currentPath = decodeURIComponent(nameBlock.data('path'));\n\n swal({\n type: 'input',\n title: 'Move File',\n text: 'Please enter the new path for the file below.',\n showCancelButton: true,\n showConfirmButton: true,\n closeOnConfirm: false,\n showLoaderOnConfirm: true,\n inputValue: `${currentPath}${currentName}`,\n }, (val) => {\n $.ajax({\n type: 'POST',\n headers: {\n 'X-Access-Token': Pterodactyl.server.daemonSecret,\n 'X-Access-Server': Pterodactyl.server.uuid,\n },\n contentType: 'application/json; charset=utf-8',\n url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/server/file/move`,\n timeout: 10000,\n data: JSON.stringify({\n from: `${currentPath}${currentName}`,\n to: `${val}`,\n }),\n }).done(data => {\n nameBlock.parent().addClass('warning').delay(200).fadeOut();\n swal.close();\n }).fail(jqXHR => {\n console.error(jqXHR);\n var error = 'An error occured while trying to process this request.';\n if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') {\n error = jqXHR.responseJSON.error;\n }\n swal({\n type: 'error',\n title: '',\n text: error,\n });\n });\n });\n\n }\n\n rename() {\n const nameBlock = $(this.element).find('td[data-identifier=\"name\"]');\n const currentLink = nameBlock.find('a');\n const currentName = decodeURIComponent(nameBlock.attr('data-name'));\n const attachEditor = `\n \n \n `;\n\n nameBlock.html(attachEditor);\n const inputField = nameBlock.find('input');\n const inputLoader = nameBlock.find('.input-loader');\n\n inputField.focus();\n inputField.on('blur keydown', e => {\n // Save Field\n if (\n (e.type === 'keydown' && e.which === 27)\n || e.type === 'blur'\n || (e.type === 'keydown' && e.which === 13 && currentName === inputField.val())\n ) {\n if (!_.isEmpty(currentLink)) {\n nameBlock.html(currentLink);\n } else {\n nameBlock.html(currentName);\n }\n inputField.remove();\n ContextMenu.unbind().run();\n return;\n }\n\n if (e.type === 'keydown' && e.which !== 13) return;\n\n inputLoader.show();\n const currentPath = decodeURIComponent(nameBlock.data('path'));\n\n $.ajax({\n type: 'POST',\n headers: {\n 'X-Access-Token': Pterodactyl.server.daemonSecret,\n 'X-Access-Server': Pterodactyl.server.uuid,\n },\n contentType: 'application/json; charset=utf-8',\n url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/server/file/rename`,\n timeout: 10000,\n data: JSON.stringify({\n from: `${currentPath}${currentName}`,\n to: `${currentPath}${inputField.val()}`,\n }),\n }).done(data => {\n nameBlock.attr('data-name', inputField.val());\n if (!_.isEmpty(currentLink)) {\n let newLink = currentLink.attr('href');\n if (nameBlock.parent().data('type') !== 'folder') {\n newLink = newLink.substr(0, newLink.lastIndexOf('/')) + '/' + inputField.val();\n }\n currentLink.attr('href', newLink);\n nameBlock.html(\n currentLink.html(inputField.val())\n );\n } else {\n nameBlock.html(inputField.val());\n }\n inputField.remove();\n }).fail(jqXHR => {\n console.error(jqXHR);\n var error = 'An error occured while trying to process this request.';\n if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') {\n error = jqXHR.responseJSON.error;\n }\n nameBlock.addClass('has-error').delay(2000).queue(() => {\n nameBlock.removeClass('has-error').dequeue();\n });\n inputField.popover({\n animation: true,\n placement: 'top',\n content: error,\n title: 'Save Error'\n }).popover('show');\n }).always(() => {\n inputLoader.remove();\n ContextMenu.unbind().run();\n });\n });\n }\n\n copy() {\n const nameBlock = $(this.element).find('td[data-identifier=\"name\"]');\n const currentName = decodeURIComponent(nameBlock.attr('data-name'));\n const currentPath = decodeURIComponent(nameBlock.data('path'));\n\n swal({\n type: 'input',\n title: 'Copy File',\n text: 'Please enter the new path for the copied file below.',\n showCancelButton: true,\n showConfirmButton: true,\n closeOnConfirm: false,\n showLoaderOnConfirm: true,\n inputValue: `${currentPath}${currentName}`,\n }, (val) => {\n $.ajax({\n type: 'POST',\n headers: {\n 'X-Access-Token': Pterodactyl.server.daemonSecret,\n 'X-Access-Server': Pterodactyl.server.uuid,\n },\n contentType: 'application/json; charset=utf-8',\n url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/server/file/copy`,\n timeout: 10000,\n data: JSON.stringify({\n from: `${currentPath}${currentName}`,\n to: `${val}`,\n }),\n }).done(data => {\n swal({\n type: 'success',\n title: '',\n text: 'File successfully copied.'\n });\n Files.list();\n }).fail(jqXHR => {\n console.error(jqXHR);\n var error = 'An error occured while trying to process this request.';\n if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') {\n error = jqXHR.responseJSON.error;\n }\n swal({\n type: 'error',\n title: '',\n text: error,\n });\n });\n });\n }\n\n download() {\n const nameBlock = $(this.element).find('td[data-identifier=\"name\"]');\n const fileName = decodeURIComponent(nameBlock.attr('data-name'));\n const filePath = decodeURIComponent(nameBlock.data('path'));\n\n window.location = `/server/${Pterodactyl.server.uuidShort}/files/download/${filePath}${fileName}`;\n }\n\n delete() {\n const nameBlock = $(this.element).find('td[data-identifier=\"name\"]');\n const delPath = decodeURIComponent(nameBlock.data('path'));\n const delName = decodeURIComponent(nameBlock.data('name'));\n\n swal({\n type: 'warning',\n title: '',\n text: 'Are you sure you want to delete ' + delName + '? There is no reversing this action.',\n html: true,\n showCancelButton: true,\n showConfirmButton: true,\n closeOnConfirm: false,\n showLoaderOnConfirm: true\n }, () => {\n $.ajax({\n type: 'DELETE',\n url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/server/file/f/${delPath}${delName}`,\n headers: {\n 'X-Access-Token': Pterodactyl.server.daemonSecret,\n 'X-Access-Server': Pterodactyl.server.uuid,\n }\n }).done(data => {\n nameBlock.parent().addClass('warning').delay(200).fadeOut();\n swal({\n type: 'success',\n title: 'File Deleted'\n });\n }).fail(jqXHR => {\n console.error(jqXHR);\n swal({\n type: 'error',\n title: 'Whoops!',\n html: true,\n text: 'An error occured while attempting to delete this file. Please try again.',\n });\n });\n });\n }\n\n decompress() {\n const nameBlock = $(this.element).find('td[data-identifier=\"name\"]');\n const compPath = decodeURIComponent(nameBlock.data('path'));\n const compName = decodeURIComponent(nameBlock.data('name'));\n\n swal({\n title: ' Decompressing...',\n text: 'This might take a few seconds to complete.',\n html: true,\n allowOutsideClick: false,\n allowEscapeKey: false,\n showConfirmButton: false,\n });\n\n $.ajax({\n type: 'POST',\n url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/server/file/decompress`,\n headers: {\n 'X-Access-Token': Pterodactyl.server.daemonSecret,\n 'X-Access-Server': Pterodactyl.server.uuid,\n },\n contentType: 'application/json; charset=utf-8',\n data: JSON.stringify({\n files: `${compPath}${compName}`\n })\n }).done(data => {\n swal.close();\n Files.list(compPath);\n }).fail(jqXHR => {\n console.error(jqXHR);\n var error = 'An error occured while trying to process this request.';\n if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') {\n error = jqXHR.responseJSON.error;\n }\n swal({\n type: 'error',\n title: 'Whoops!',\n html: true,\n text: error\n });\n });\n }\n\n compress() {\n const nameBlock = $(this.element).find('td[data-identifier=\"name\"]');\n const compPath = decodeURIComponent(nameBlock.data('path'));\n const compName = decodeURIComponent(nameBlock.data('name'));\n\n $.ajax({\n type: 'POST',\n url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/server/file/compress`,\n headers: {\n 'X-Access-Token': Pterodactyl.server.daemonSecret,\n 'X-Access-Server': Pterodactyl.server.uuid,\n },\n contentType: 'application/json; charset=utf-8',\n data: JSON.stringify({\n files: `${compPath}${compName}`,\n to: compPath.toString()\n })\n }).done(data => {\n Files.list(compPath, err => {\n if (err) return;\n const fileListing = $('#file_listing').find(`[data-name=\"${data.saved_as}\"]`).parent();\n fileListing.addClass('success pulsate').delay(3000).queue(() => {\n fileListing.removeClass('success pulsate').dequeue();\n });\n });\n }).fail(jqXHR => {\n console.error(jqXHR);\n var error = 'An error occured while trying to process this request.';\n if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') {\n error = jqXHR.responseJSON.error;\n }\n swal({\n type: 'error',\n title: 'Whoops!',\n html: true,\n text: error\n });\n });\n }\n}\n","\"use strict\";\n\n// Copyright (c) 2015 - 2016 Dane Everitt \n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\nclass ContextMenuClass {\n constructor() {\n this.activeLine = null;\n }\n\n run() {\n this.directoryClick();\n this.rightClick();\n }\n\n makeMenu(parent) {\n $(document).find('#fileOptionMenu').remove();\n if (!_.isNull(this.activeLine)) this.activeLine.removeClass('active');\n\n let newFilePath = $('#headerTableRow').attr('data-currentDir');\n if (parent.data('type') === 'folder') {\n const nameBlock = parent.find('td[data-identifier=\"name\"]');\n const currentName = decodeURIComponent(nameBlock.attr('data-name'));\n const currentPath = decodeURIComponent(nameBlock.data('path'));\n newFilePath = `${currentPath}${currentName}`;\n }\n\n let buildMenu = '
      ';\n\n if (Pterodactyl.permissions.moveFiles) {\n buildMenu += '
    • Rename
    • \\\n
    • Move
    • ';\n }\n\n if (Pterodactyl.permissions.copyFiles) {\n buildMenu += '
    • Copy
    • ';\n }\n\n if (Pterodactyl.permissions.compressFiles) {\n buildMenu += '
    • Compress
    • ';\n }\n\n if (Pterodactyl.permissions.decompressFiles) {\n buildMenu += '
    • Decompress
    • ';\n }\n\n if (Pterodactyl.permissions.createFiles) {\n buildMenu += '
    • \\\n
    • New File
    • \\\n
    • New Folder
    • ';\n }\n\n if (Pterodactyl.permissions.downloadFiles || Pterodactyl.permissions.deleteFiles) {\n buildMenu += '
    • ';\n }\n\n if (Pterodactyl.permissions.downloadFiles) {\n buildMenu += '
    • Download
    • ';\n }\n\n if (Pterodactyl.permissions.deleteFiles) {\n buildMenu += '
    • Delete
    • ';\n }\n\n buildMenu += '
    ';\n return buildMenu;\n }\n\n rightClick() {\n $('[data-action=\"toggleMenu\"]').on('mousedown', () => {\n event.preventDefault();\n this.showMenu(event);\n });\n $('#file_listing > tbody td').on('contextmenu', event => {\n this.showMenu(event);\n });\n }\n\n showMenu(event) {\n const parent = $(event.target).closest('tr');\n const menu = $(this.makeMenu(parent));\n\n if (parent.data('type') === 'disabled') return;\n event.preventDefault();\n\n $(menu).appendTo('body');\n $(menu).data('invokedOn', $(event.target)).show().css({\n position: 'absolute',\n left: event.pageX - 150,\n top: event.pageY,\n });\n\n this.activeLine = parent;\n this.activeLine.addClass('active');\n\n // Handle Events\n const Actions = new ActionsClass(parent, menu);\n if (Pterodactyl.permissions.moveFiles) {\n $(menu).find('li[data-action=\"move\"]').unbind().on('click', e => {\n e.preventDefault();\n Actions.move();\n });\n $(menu).find('li[data-action=\"rename\"]').unbind().on('click', e => {\n e.preventDefault();\n Actions.rename();\n });\n }\n\n if (Pterodactyl.permissions.copyFiles) {\n $(menu).find('li[data-action=\"copy\"]').unbind().on('click', e => {\n e.preventDefault();\n Actions.copy();\n });\n }\n\n if (Pterodactyl.permissions.compressFiles) {\n if (parent.data('type') === 'folder') {\n $(menu).find('li[data-action=\"compress\"]').removeClass('hidden');\n }\n $(menu).find('li[data-action=\"compress\"]').unbind().on('click', e => {\n e.preventDefault();\n Actions.compress();\n });\n }\n\n if (Pterodactyl.permissions.decompressFiles) {\n if (_.without(['application/zip', 'application/gzip', 'application/x-gzip'], parent.data('mime')).length < 3) {\n $(menu).find('li[data-action=\"decompress\"]').removeClass('hidden');\n }\n $(menu).find('li[data-action=\"decompress\"]').unbind().on('click', e => {\n e.preventDefault();\n Actions.decompress();\n });\n }\n\n if (Pterodactyl.permissions.createFiles) {\n $(menu).find('li[data-action=\"folder\"]').unbind().on('click', e => {\n e.preventDefault();\n Actions.folder();\n });\n }\n\n if (Pterodactyl.permissions.downloadFiles) {\n if (parent.data('type') === 'file') {\n $(menu).find('li[data-action=\"download\"]').removeClass('hidden');\n }\n $(menu).find('li[data-action=\"download\"]').unbind().on('click', e => {\n e.preventDefault();\n Actions.download();\n });\n }\n\n if (Pterodactyl.permissions.deleteFiles) {\n $(menu).find('li[data-action=\"delete\"]').unbind().on('click', e => {\n e.preventDefault();\n Actions.delete();\n });\n }\n\n $(window).on('click', () => {\n $(menu).remove();\n if(!_.isNull(this.activeLine)) this.activeLine.removeClass('active');\n });\n }\n\n directoryClick() {\n $('a[data-action=\"directory-view\"]').on('click', function (event) {\n event.preventDefault();\n\n const path = $(this).parent().data('path') || '';\n const name = $(this).parent().data('name') || '';\n\n window.location.hash = encodeURIComponent(path + name);\n Files.list();\n });\n }\n}\n\nwindow.ContextMenu = new ContextMenuClass;\n","\"use strict\";\n\n// Copyright (c) 2015 - 2016 Dane Everitt \n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\nclass FileManager {\n constructor() {\n this.list(this.decodeHash());\n }\n\n list(path, next) {\n if (_.isUndefined(path)) {\n path = this.decodeHash();\n }\n\n this.loader(true);\n $.ajax({\n type: 'POST',\n url: Pterodactyl.meta.directoryList,\n headers: {\n 'X-CSRF-Token': Pterodactyl.meta.csrftoken,\n },\n data: {\n directory: path,\n },\n }).done(data => {\n this.loader(false);\n $('#load_files').slideUp().html(data).slideDown(100, () => {\n ContextMenu.run();\n this.reloadFilesButton();\n if (_.isFunction(next)) {\n return next();\n }\n });\n $('#internal_alert').slideUp();\n }).fail(jqXHR => {\n this.loader(false);\n if (_.isFunction(next)) {\n return next(new Error('Failed to load file listing.'));\n }\n swal({\n type: 'error',\n title: 'File Error',\n text: 'An error occured while attempting to process this request. Please try again.',\n });\n console.log(jqXHR);\n });\n }\n\n loader(show) {\n if ($('#load_files').height() < 5) return;\n\n if (show === true){\n var height = $('#load_files').height();\n var width = $('.ajax_loading_box').width();\n var center_height = (height / 2) - 30;\n var center_width = (width / 2) - 30;\n\n $('#position_me').css({\n 'top': center_height,\n 'left': center_width,\n 'font-size': '60px'\n });\n\n $('.ajax_loading_box').css('height', (height + 5)).show();\n } else {\n $('.ajax_loading_box').hide();\n }\n }\n\n reloadFilesButton() {\n $('i[data-action=\"reload-files\"]').unbind().on('click', () => {\n $('i[data-action=\"reload-files\"]').addClass('fa-spin');\n this.list();\n });\n }\n\n decodeHash() {\n return decodeURIComponent(window.location.hash.substring(1));\n }\n\n}\n\nwindow.Files = new FileManager;\n"]} \ No newline at end of file diff --git a/public/js/files/actions.js b/public/js/files/actions.js new file mode 100644 index 000000000..9ff978539 --- /dev/null +++ b/public/js/files/actions.js @@ -0,0 +1,394 @@ +"use strict"; + +// Copyright (c) 2015 - 2016 Dane Everitt +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +class ActionsClass { + constructor(element, menu) { + this.element = element; + this.menu = menu; + } + + destroy() { + this.element = undefined; + } + + folder() { + const nameBlock = $(this.element).find('td[data-identifier="name"]'); + const currentName = decodeURIComponent(nameBlock.attr('data-name')); + const currentPath = decodeURIComponent(nameBlock.data('path')); + + let inputValue = `${currentPath}${currentName}/`; + if ($(this.element).data('type') === 'file') { + inputValue = currentPath; + } + swal({ + type: 'input', + title: 'Create Folder', + text: 'Please enter the path and folder name below.', + showCancelButton: true, + showConfirmButton: true, + closeOnConfirm: false, + showLoaderOnConfirm: true, + inputValue: inputValue + }, (val) => { + $.ajax({ + type: 'POST', + headers: { + 'X-Access-Token': Pterodactyl.server.daemonSecret, + 'X-Access-Server': Pterodactyl.server.uuid, + }, + contentType: 'application/json; charset=utf-8', + url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/server/file/folder`, + timeout: 10000, + data: JSON.stringify({ + path: val, + }), + }).done(data => { + swal.close(); + Files.list(); + }).fail(jqXHR => { + console.error(jqXHR); + var error = 'An error occured while trying to process this request.'; + if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') { + error = jqXHR.responseJSON.error; + } + swal({ + type: 'error', + title: '', + text: error, + }); + }); + }); + } + + move() { + const nameBlock = $(this.element).find('td[data-identifier="name"]'); + const currentName = decodeURIComponent(nameBlock.attr('data-name')); + const currentPath = decodeURIComponent(nameBlock.data('path')); + + swal({ + type: 'input', + title: 'Move File', + text: 'Please enter the new path for the file below.', + showCancelButton: true, + showConfirmButton: true, + closeOnConfirm: false, + showLoaderOnConfirm: true, + inputValue: `${currentPath}${currentName}`, + }, (val) => { + $.ajax({ + type: 'POST', + headers: { + 'X-Access-Token': Pterodactyl.server.daemonSecret, + 'X-Access-Server': Pterodactyl.server.uuid, + }, + contentType: 'application/json; charset=utf-8', + url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/server/file/move`, + timeout: 10000, + data: JSON.stringify({ + from: `${currentPath}${currentName}`, + to: `${val}`, + }), + }).done(data => { + nameBlock.parent().addClass('warning').delay(200).fadeOut(); + swal.close(); + }).fail(jqXHR => { + console.error(jqXHR); + var error = 'An error occured while trying to process this request.'; + if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') { + error = jqXHR.responseJSON.error; + } + swal({ + type: 'error', + title: '', + text: error, + }); + }); + }); + + } + + rename() { + const nameBlock = $(this.element).find('td[data-identifier="name"]'); + const currentLink = nameBlock.find('a'); + const currentName = decodeURIComponent(nameBlock.attr('data-name')); + const attachEditor = ` + + + `; + + nameBlock.html(attachEditor); + const inputField = nameBlock.find('input'); + const inputLoader = nameBlock.find('.input-loader'); + + inputField.focus(); + inputField.on('blur keydown', e => { + // Save Field + if ( + (e.type === 'keydown' && e.which === 27) + || e.type === 'blur' + || (e.type === 'keydown' && e.which === 13 && currentName === inputField.val()) + ) { + if (!_.isEmpty(currentLink)) { + nameBlock.html(currentLink); + } else { + nameBlock.html(currentName); + } + inputField.remove(); + ContextMenu.unbind().run(); + return; + } + + if (e.type === 'keydown' && e.which !== 13) return; + + inputLoader.show(); + const currentPath = decodeURIComponent(nameBlock.data('path')); + + $.ajax({ + type: 'POST', + headers: { + 'X-Access-Token': Pterodactyl.server.daemonSecret, + 'X-Access-Server': Pterodactyl.server.uuid, + }, + contentType: 'application/json; charset=utf-8', + url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/server/file/rename`, + timeout: 10000, + data: JSON.stringify({ + from: `${currentPath}${currentName}`, + to: `${currentPath}${inputField.val()}`, + }), + }).done(data => { + nameBlock.attr('data-name', inputField.val()); + if (!_.isEmpty(currentLink)) { + let newLink = currentLink.attr('href'); + if (nameBlock.parent().data('type') !== 'folder') { + newLink = newLink.substr(0, newLink.lastIndexOf('/')) + '/' + inputField.val(); + } + currentLink.attr('href', newLink); + nameBlock.html( + currentLink.html(inputField.val()) + ); + } else { + nameBlock.html(inputField.val()); + } + inputField.remove(); + }).fail(jqXHR => { + console.error(jqXHR); + var error = 'An error occured while trying to process this request.'; + if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') { + error = jqXHR.responseJSON.error; + } + nameBlock.addClass('has-error').delay(2000).queue(() => { + nameBlock.removeClass('has-error').dequeue(); + }); + inputField.popover({ + animation: true, + placement: 'top', + content: error, + title: 'Save Error' + }).popover('show'); + }).always(() => { + inputLoader.remove(); + ContextMenu.unbind().run(); + }); + }); + } + + copy() { + const nameBlock = $(this.element).find('td[data-identifier="name"]'); + const currentName = decodeURIComponent(nameBlock.attr('data-name')); + const currentPath = decodeURIComponent(nameBlock.data('path')); + + swal({ + type: 'input', + title: 'Copy File', + text: 'Please enter the new path for the copied file below.', + showCancelButton: true, + showConfirmButton: true, + closeOnConfirm: false, + showLoaderOnConfirm: true, + inputValue: `${currentPath}${currentName}`, + }, (val) => { + $.ajax({ + type: 'POST', + headers: { + 'X-Access-Token': Pterodactyl.server.daemonSecret, + 'X-Access-Server': Pterodactyl.server.uuid, + }, + contentType: 'application/json; charset=utf-8', + url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/server/file/copy`, + timeout: 10000, + data: JSON.stringify({ + from: `${currentPath}${currentName}`, + to: `${val}`, + }), + }).done(data => { + swal({ + type: 'success', + title: '', + text: 'File successfully copied.' + }); + Files.list(); + }).fail(jqXHR => { + console.error(jqXHR); + var error = 'An error occured while trying to process this request.'; + if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') { + error = jqXHR.responseJSON.error; + } + swal({ + type: 'error', + title: '', + text: error, + }); + }); + }); + } + + download() { + const nameBlock = $(this.element).find('td[data-identifier="name"]'); + const fileName = decodeURIComponent(nameBlock.attr('data-name')); + const filePath = decodeURIComponent(nameBlock.data('path')); + + window.location = `/server/${Pterodactyl.server.uuidShort}/files/download/${filePath}${fileName}`; + } + + delete() { + const nameBlock = $(this.element).find('td[data-identifier="name"]'); + const delPath = decodeURIComponent(nameBlock.data('path')); + const delName = decodeURIComponent(nameBlock.data('name')); + + swal({ + type: 'warning', + title: '', + text: 'Are you sure you want to delete ' + delName + '? There is no reversing this action.', + html: true, + showCancelButton: true, + showConfirmButton: true, + closeOnConfirm: false, + showLoaderOnConfirm: true + }, () => { + $.ajax({ + type: 'DELETE', + url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/server/file/f/${delPath}${delName}`, + headers: { + 'X-Access-Token': Pterodactyl.server.daemonSecret, + 'X-Access-Server': Pterodactyl.server.uuid, + } + }).done(data => { + nameBlock.parent().addClass('warning').delay(200).fadeOut(); + swal({ + type: 'success', + title: 'File Deleted' + }); + }).fail(jqXHR => { + console.error(jqXHR); + swal({ + type: 'error', + title: 'Whoops!', + html: true, + text: 'An error occured while attempting to delete this file. Please try again.', + }); + }); + }); + } + + decompress() { + const nameBlock = $(this.element).find('td[data-identifier="name"]'); + const compPath = decodeURIComponent(nameBlock.data('path')); + const compName = decodeURIComponent(nameBlock.data('name')); + + swal({ + title: ' Decompressing...', + text: 'This might take a few seconds to complete.', + html: true, + allowOutsideClick: false, + allowEscapeKey: false, + showConfirmButton: false, + }); + + $.ajax({ + type: 'POST', + url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/server/file/decompress`, + headers: { + 'X-Access-Token': Pterodactyl.server.daemonSecret, + 'X-Access-Server': Pterodactyl.server.uuid, + }, + contentType: 'application/json; charset=utf-8', + data: JSON.stringify({ + files: `${compPath}${compName}` + }) + }).done(data => { + swal.close(); + Files.list(compPath); + }).fail(jqXHR => { + console.error(jqXHR); + var error = 'An error occured while trying to process this request.'; + if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') { + error = jqXHR.responseJSON.error; + } + swal({ + type: 'error', + title: 'Whoops!', + html: true, + text: error + }); + }); + } + + compress() { + const nameBlock = $(this.element).find('td[data-identifier="name"]'); + const compPath = decodeURIComponent(nameBlock.data('path')); + const compName = decodeURIComponent(nameBlock.data('name')); + + $.ajax({ + type: 'POST', + url: `${Pterodactyl.node.scheme}://${Pterodactyl.node.fqdn}:${Pterodactyl.node.daemonListen}/server/file/compress`, + headers: { + 'X-Access-Token': Pterodactyl.server.daemonSecret, + 'X-Access-Server': Pterodactyl.server.uuid, + }, + contentType: 'application/json; charset=utf-8', + data: JSON.stringify({ + files: `${compPath}${compName}`, + to: compPath.toString() + }) + }).done(data => { + Files.list(compPath, err => { + if (err) return; + const fileListing = $('#file_listing').find(`[data-name="${data.saved_as}"]`).parent(); + fileListing.addClass('success pulsate').delay(3000).queue(() => { + fileListing.removeClass('success pulsate').dequeue(); + }); + }); + }).fail(jqXHR => { + console.error(jqXHR); + var error = 'An error occured while trying to process this request.'; + if (typeof jqXHR.responseJSON !== 'undefined' && typeof jqXHR.responseJSON.error !== 'undefined') { + error = jqXHR.responseJSON.error; + } + swal({ + type: 'error', + title: 'Whoops!', + html: true, + text: error + }); + }); + } +} diff --git a/resources/views/server/js/filemanager/contextmenu.blade.php b/public/js/files/contextmenu.js similarity index 64% rename from resources/views/server/js/filemanager/contextmenu.blade.php rename to public/js/files/contextmenu.js index e396b50aa..f61b7bb28 100644 --- a/resources/views/server/js/filemanager/contextmenu.blade.php +++ b/public/js/files/contextmenu.js @@ -40,19 +40,46 @@ class ContextMenuClass { const currentPath = decodeURIComponent(nameBlock.data('path')); newFilePath = `${currentPath}${currentName}`; } - return ''; + + let buildMenu = ''; + return buildMenu; } rightClick() { @@ -82,79 +109,69 @@ class ContextMenuClass { this.activeLine = parent; this.activeLine.addClass('active'); - @can('download-files', $server) - if (parent.data('type') === 'file') { - $(menu).find('li[data-action="download"]').removeClass('hidden'); - } - @endcan - - @can('compress-files', $server) - if (parent.data('type') === 'folder') { - $(menu).find('li[data-action="compress"]').removeClass('hidden'); - } - @endcan - - @can('decompress-files', $server) - if (_.without(['application/zip', 'application/gzip', 'application/x-gzip'], parent.data('mime')).length < 3) { - $(menu).find('li[data-action="decompress"]').removeClass('hidden'); - } - @endcan - // Handle Events const Actions = new ActionsClass(parent, menu); - @can('move-files', $server) + if (Pterodactyl.permissions.moveFiles) { $(menu).find('li[data-action="move"]').unbind().on('click', e => { e.preventDefault(); Actions.move(); }); - @endcan - - @can('copy-files', $server) - $(menu).find('li[data-action="copy"]').unbind().on('click', e => { - e.preventDefault(); - Actions.copy(); - }); - @endcan - - @can('move-files', $server) $(menu).find('li[data-action="rename"]').unbind().on('click', e => { e.preventDefault(); Actions.rename(); }); - @endcan + } - @can('compress-files', $server) + if (Pterodactyl.permissions.copyFiles) { + $(menu).find('li[data-action="copy"]').unbind().on('click', e => { + e.preventDefault(); + Actions.copy(); + }); + } + + if (Pterodactyl.permissions.compressFiles) { + if (parent.data('type') === 'folder') { + $(menu).find('li[data-action="compress"]').removeClass('hidden'); + } $(menu).find('li[data-action="compress"]').unbind().on('click', e => { e.preventDefault(); Actions.compress(); }); - @endcan + } - @can('decompress-files', $server) + if (Pterodactyl.permissions.decompressFiles) { + if (_.without(['application/zip', 'application/gzip', 'application/x-gzip'], parent.data('mime')).length < 3) { + $(menu).find('li[data-action="decompress"]').removeClass('hidden'); + } $(menu).find('li[data-action="decompress"]').unbind().on('click', e => { e.preventDefault(); Actions.decompress(); }); - @endcan + } - @can('create-files', $server) + if (Pterodactyl.permissions.createFiles) { $(menu).find('li[data-action="folder"]').unbind().on('click', e => { e.preventDefault(); Actions.folder(); }); - @endcan + } - @can('download-files', $server) + if (Pterodactyl.permissions.downloadFiles) { + if (parent.data('type') === 'file') { + $(menu).find('li[data-action="download"]').removeClass('hidden'); + } $(menu).find('li[data-action="download"]').unbind().on('click', e => { e.preventDefault(); Actions.download(); }); - @endcan + } - $(menu).find('li[data-action="delete"]').unbind().on('click', e => { - e.preventDefault(); - Actions.delete(); - }); + if (Pterodactyl.permissions.deleteFiles) { + $(menu).find('li[data-action="delete"]').unbind().on('click', e => { + e.preventDefault(); + Actions.delete(); + }); + } $(window).on('click', () => { $(menu).remove(); diff --git a/resources/views/server/js/filemanager/index.blade.php b/public/js/files/index.js similarity index 95% rename from resources/views/server/js/filemanager/index.blade.php rename to public/js/files/index.js index a89b4114f..a8142123f 100644 --- a/resources/views/server/js/filemanager/index.blade.php +++ b/public/js/files/index.js @@ -32,9 +32,9 @@ class FileManager { this.loader(true); $.ajax({ type: 'POST', - url: '{{ route('server.files.directory-list', $server->uuidShort) }}', + url: Pterodactyl.meta.directoryList, headers: { - 'X-CSRF-Token': '{{ csrf_token() }}', + 'X-CSRF-Token': Pterodactyl.meta.csrftoken, }, data: { directory: path, diff --git a/resources/views/server/js/minecraft/eula.blade.php b/public/js/plugins/minecraft/eula.js similarity index 55% rename from resources/views/server/js/minecraft/eula.blade.php rename to public/js/plugins/minecraft/eula.js index 5eefb11f7..28fe082e0 100644 --- a/resources/views/server/js/minecraft/eula.blade.php +++ b/public/js/plugins/minecraft/eula.js @@ -1,22 +1,22 @@ -{{-- Copyright (c) 2015 - 2016 Dane Everitt --}} - -{{-- Permission is hereby granted, free of charge, to any person obtaining a copy --}} -{{-- of this software and associated documentation files (the "Software"), to deal --}} -{{-- in the Software without restriction, including without limitation the rights --}} -{{-- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell --}} -{{-- copies of the Software, and to permit persons to whom the Software is --}} -{{-- furnished to do so, subject to the following conditions: --}} - -{{-- The above copyright notice and this permission notice shall be included in all --}} -{{-- copies or substantial portions of the Software. --}} - -{{-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR --}} -{{-- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, --}} -{{-- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE --}} -{{-- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER --}} -{{-- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, --}} -{{-- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE --}} -{{-- SOFTWARE. --}} +// Copyright (c) 2015 - 2016 Dane Everitt +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. $(window).load(function () { socket.on('console', function (data) { if (data.line.indexOf('You need to agree to the EULA in order to run the server') > -1) { @@ -34,8 +34,8 @@ $(window).load(function () { }, function () { $.ajax({ type: 'POST', - url: '{{ route('server.files.save', $server->uuidShort) }}', - headers: { 'X-CSRF-Token': '{{ csrf_token() }}' }, + url: Pterodactyl.meta.saveFile, + headers: { 'X-CSRF-Token': Pterodactyl.meta.csrfToken, }, data: { file: 'eula.txt', contents: 'eula=true' diff --git a/resources/lang/de/auth.php b/resources/lang/de/auth.php index f560a3814..dab71c83f 100644 --- a/resources/lang/de/auth.php +++ b/resources/lang/de/auth.php @@ -1,49 +1,13 @@ - * Some Modifications (c) 2015 Dylan Seidt - * Translated by Jakob Schrettenbrunner . - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ + return [ - - /* - |-------------------------------------------------------------------------- - | Authentication Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines are used during authentication for various - | messages that we need to display to the user. You are free to modify - | these language lines according to your application's requirements. - | - */ - - 'failed' => 'Die Zugangsdaten sind ungültig.', - 'throttle' => 'Zu viele Loginversuche. Bitte in :seconds Sekunden erneut versuchen.', - 'errorencountered' => 'Während der Anfrage ist ein Fehler aufgetreten.', - 'resetpassword' => 'Passwort zurücksetzen', 'confirmpassword' => 'Passwort bestätigen', - 'sendlink' => 'Passwort Rücksetzungslink anfordern.', 'emailsent' => 'Die E-Mail mit dem Rücksetzungslink ist unterwegs.', + 'errorencountered' => 'Während der Anfrage ist ein Fehler aufgetreten.', + 'failed' => 'Die Zugangsdaten sind ungültig.', 'remeberme' => 'Angemeldet bleiben', + 'resetpassword' => 'Passwort zurücksetzen', + 'sendlink' => 'Passwort Rücksetzungslink anfordern.', + 'throttle' => 'Zu viele Loginversuche. Bitte in :seconds Sekunden erneut versuchen.', 'totp_failed' => 'Das TOTP Token ist ungültig. Bitte stelle sicher dass das generierte Token gültig ist.', - ]; diff --git a/resources/lang/de/base.php b/resources/lang/de/base.php index 2687b2ea3..44d989efc 100644 --- a/resources/lang/de/base.php +++ b/resources/lang/de/base.php @@ -1,72 +1,31 @@ - * Some Modifications (c) 2015 Dylan Seidt - * Translated by Jakob Schrettenbrunner . - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ + return [ - - /* - |-------------------------------------------------------------------------- - | Base Pterodactyl Language - |-------------------------------------------------------------------------- - | - | These base strings are used throughout the front-end of Pterodactyl but - | not on pages that are used when viewing a server. Those keys are in server.php - | - */ - - 'validation_error' => 'Beim validieren der Daten ist ein Fehler aufgetreten:', - - 'confirm' => 'Bist du sicher?', - 'failed' => 'Diese Zugangsdaten sind ungültig.', - 'throttle' => 'Zu viele Loginversuche. Bitte in :seconds Sekunden erneut versuchen.', - 'view_as_admin' => 'Du siehst die Serverliste als Administrator. Daher werden alle registrierten Server angezeigt. Server deren Eigentümer du bist sind mit einem blauen Punkt links neben dem Namen markiert.', - 'server_name' => 'Server Name', - 'no_servers' => 'Aktuell hast du keinen Zugriff auf irgendwelche server.', - 'form_error' => 'Folgende Fehler wurden beim Verarbeiten der Anfrage festgestellt.', - 'password_req' => 'Passwörter müssen folgende Anforderungen erfüllen: mindestens ein Klein- und Großbuchstabe, eine Ziffer und eine Länge von mindestens 8 Zeichen.', - 'account' => [ - 'totp_header' => 'Zwei-Faktor Authentifizierung', - 'totp_qr' => 'TOTP QR Code', - 'totp_enable_help' => 'Anscheinend hast du Zwei-Faktor Authentifizierung deaktiviert. Diese Authentifizierungsmethode schützt dein Konto zusätzlich vor unauthorisierten Zugriffen. Wenn du es aktivierst wirst du bei jedem Login dazu aufgefordert ein TOTP Token einzugeben bevor du dich einloggen kannst. Dieses Token kann mit einem Smartphone oder anderen TOTP unterstützenden Gerät erzeugt werden.', - 'totp_apps' => 'Du benötigst eine TOTP unterstützende App (z.B. Google Authenticator, DUO Mobile, Authy, Enpass) um diese Option zu nutzen.', - 'totp_enable' => 'Aktiviere Zwei-Faktor Authentifizierung', - 'totp_disable' => 'Deaktiviere Zwei-Faktor Authentifizierung', - 'totp_token' => 'TOTP Token', - 'totp_disable_help' => 'Um Zwei-Faktor Authentifizierung zu deaktiveren musst du ein gültiges TOTP Token eingeben. Danach wird Zwei-Faktor Authentifizierung deaktivert.', - 'totp_checkpoint_help' => 'Bitte verifiziere deine TOTP Einstellungen indem du den QR Code mit einer App auf deinem Smartphone scannst und gebe die 6 Stellige Nummer im Eingabefeld unten ein. Drücke die Eingabetaste wenn du fertig bist.', - 'totp_enabled' => 'Zwei-Faktor Authentifizierung wurde erfolgreich aktiviert. Bitte schließe dieses Popup um den Vorgang abzuschließen.', - 'totp_enabled_error' => 'Das angegebene TOTP Token konnte nicht verifiziert werden. Bitte versuche es noch einmal.', - - 'email_password' => 'Email Passwort', - 'update_user' => 'Benutzer aktualisieren', 'delete_user' => 'Benutzer löschen', - 'update_email' => 'Email aktualisieren', + 'email_password' => 'Email Passwort', 'new_email' => 'Neue Email', 'new_password' => 'Neues Passwort', + 'totp_apps' => 'Du benötigst eine TOTP unterstützende App (z.B. Google Authenticator, DUO Mobile, Authy, Enpass) um diese Option zu nutzen.', + 'totp_checkpoint_help' => 'Bitte verifiziere deine TOTP Einstellungen indem du den QR Code mit einer App auf deinem Smartphone scannst und gebe die 6 Stellige Nummer im Eingabefeld unten ein. Drücke die Eingabetaste wenn du fertig bist.', + 'totp_disable' => 'Deaktiviere Zwei-Faktor Authentifizierung', + 'totp_disable_help' => 'Um Zwei-Faktor Authentifizierung zu deaktiveren musst du ein gültiges TOTP Token eingeben. Danach wird Zwei-Faktor Authentifizierung deaktivert.', + 'totp_enable' => 'Aktiviere Zwei-Faktor Authentifizierung', + 'totp_enabled' => 'Zwei-Faktor Authentifizierung wurde erfolgreich aktiviert. Bitte schließe dieses Popup um den Vorgang abzuschließen.', + 'totp_enabled_error' => 'Das angegebene TOTP Token konnte nicht verifiziert werden. Bitte versuche es noch einmal.', + 'totp_enable_help' => 'Anscheinend hast du Zwei-Faktor Authentifizierung deaktiviert. Diese Authentifizierungsmethode schützt dein Konto zusätzlich vor unauthorisierten Zugriffen. Wenn du es aktivierst wirst du bei jedem Login dazu aufgefordert ein TOTP Token einzugeben bevor du dich einloggen kannst. Dieses Token kann mit einem Smartphone oder anderen TOTP unterstützenden Gerät erzeugt werden.', + 'totp_header' => 'Zwei-Faktor Authentifizierung', + 'totp_qr' => 'TOTP QR Code', + 'totp_token' => 'TOTP Token', + 'update_email' => 'Email aktualisieren', 'update_pass' => 'Passwort aktualisieren', - + 'update_user' => 'Benutzer aktualisieren', ], - + 'confirm' => 'Bist du sicher?', + 'form_error' => 'Folgende Fehler wurden beim Verarbeiten der Anfrage festgestellt.', + 'no_servers' => 'Aktuell hast du keinen Zugriff auf irgendwelche server.', + 'password_req' => 'Passwörter müssen folgende Anforderungen erfüllen: mindestens ein Klein- und Großbuchstabe, eine Ziffer und eine Länge von mindestens 8 Zeichen.', + 'server_name' => 'Server Name', + 'validation_error' => 'Beim validieren der Daten ist ein Fehler aufgetreten:', + 'view_as_admin' => 'Du siehst die Serverliste als Administrator. Daher werden alle registrierten Server angezeigt. Server deren Eigentümer du bist sind mit einem blauen Punkt links neben dem Namen markiert.', ]; diff --git a/resources/lang/de/pagination.php b/resources/lang/de/pagination.php index 9d3da5976..cdf30a98a 100644 --- a/resources/lang/de/pagination.php +++ b/resources/lang/de/pagination.php @@ -1,52 +1,17 @@ - * Translated by Jakob Schrettenbrunner . - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ + return [ - - /* - |-------------------------------------------------------------------------- - | Pagination Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines are used by the paginator library to build - | the simple pagination links. You are free to change them to anything - | you want to customize your views to better match your application. - | - */ - + 'next' => 'Nächste »', 'previous' => '« Vorherige', - 'next' => 'Nächste »', - 'sidebar' => [ + 'sidebar' => [ 'account_controls' => 'Account Verwaltung', - 'account_settings' => 'Account Einstellungen', 'account_security' => 'Account Sicherheit', - 'server_controls' => 'Server Verwaltung', - 'servers' => 'Deine Server', - 'overview' => 'Server Übersicht', + 'account_settings' => 'Account Einstellungen', 'files' => 'Datei Manager', - 'subusers' => 'Sub-Benutzer verwalten', 'manage' => 'Server verwalten', + 'overview' => 'Server Übersicht', + 'servers' => 'Deine Server', + 'server_controls' => 'Server Verwaltung', + 'subusers' => 'Sub-Benutzer verwalten', ], - ]; diff --git a/resources/lang/de/passwords.php b/resources/lang/de/passwords.php index 8d1d2e04b..86b8bdba4 100644 --- a/resources/lang/de/passwords.php +++ b/resources/lang/de/passwords.php @@ -1,44 +1,9 @@ - * Translated by Jakob Schrettenbrunner . - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ + return [ - - /* - |-------------------------------------------------------------------------- - | Password Reminder Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines are the default lines which match reasons - | that are given by the password broker for a password update attempt - | has failed, such as for an invalid token or invalid new password. - | - */ - 'password' => 'Dein Passwort muss länger als 6 Zeichen sein und mit der Wiederolung übereinstimmen.', 'reset' => 'Dein Passwort wurde zurückgesetzt!', 'sent' => 'Du erhältst eine E-Mail mit dem Zurücksetzungslink!', 'token' => 'Dieses Paswortrücksetzungstoken ist ungültig.', 'user' => 'Wir können keinen Nutzer mit dieser Email Adresse finden.', - ]; diff --git a/resources/lang/de/server.php b/resources/lang/de/server.php index 6b8b67c4d..b74f55e75 100644 --- a/resources/lang/de/server.php +++ b/resources/lang/de/server.php @@ -1,60 +1,29 @@ - * Some Modifications (c) 2015 Dylan Seidt - * Translated by Jakob Schrettenbrunner . - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ + return [ - - /* - |-------------------------------------------------------------------------- - | Pterodactyl Language Strings for /server/{server} Routes - |-------------------------------------------------------------------------- - */ - 'ajax' => [ 'socket_error' => 'Wir konnten uns nicht zum Socket.IO server verbinden. Möglicherweise bestehen Netzwerkprobleme. Das Panel funktioniert unter Umständen nicht wie erwartet.', 'socket_status' => 'Der status dieses Servers hat sich geändert zu:', 'socket_status_crashed' => 'Dieser Server wurde als ABGESTÜRZT erkannt.', ], + 'files' => [ + 'back' => 'Zurück zum Dateimanager', + 'loading' => 'Lade Dateibaum, das könnte ein paar Sekunden dauern...', + 'saved' => 'Datei erfolgreich gespeichert.', + 'yaml_notice' => 'Du bearbeitest gearde eine YAML Datei. Diese Dateien benötigen Leerzeichen. Wir haben dafür gesorgt dass Tabs automatisch durch :dropdown Leerzeichen ersetzt werden.', + ], 'index' => [ 'add_new' => 'Neuen Server hinzufügen', - 'memory_use' => 'Speicherverbrauch', - 'cpu_use' => 'CPU Verbrauch', - 'xaxis' => 'Zeit (2s Abstand)', - 'server_info' => 'Server Information', - 'connection' => 'Standardverbindung', - 'mem_limit' => 'Speichergrenze', - 'disk_space' => 'Festplattenspeicher', - 'control' => 'Systemsteuerung', - 'usage' => 'Verbrauch', 'allocation' => 'Zuweisung', 'command' => 'Konsolenbefehl eingeben', + 'connection' => 'Standardverbindung', + 'control' => 'Systemsteuerung', + 'cpu_use' => 'CPU Verbrauch', + 'disk_space' => 'Festplattenspeicher', + 'memory_use' => 'Speicherverbrauch', + 'mem_limit' => 'Speichergrenze', + 'server_info' => 'Server Information', + 'usage' => 'Verbrauch', + 'xaxis' => 'Zeit (2s Abstand)', ], - 'files' => [ - 'loading' => 'Lade Dateibaum, das könnte ein paar Sekunden dauern...', - 'yaml_notice' => 'Du bearbeitest gearde eine YAML Datei. Diese Dateien benötigen Leerzeichen. Wir haben dafür gesorgt dass Tabs automatisch durch :dropdown Leerzeichen ersetzt werden.', - 'back' => 'Zurück zum Dateimanager', - 'saved' => 'Datei erfolgreich gespeichert.', - ], - ]; diff --git a/resources/lang/de/strings.php b/resources/lang/de/strings.php index 96b5330b7..e4cebac0e 100644 --- a/resources/lang/de/strings.php +++ b/resources/lang/de/strings.php @@ -1,62 +1,30 @@ - * Some Modifications (c) 2015 Dylan Seidt - * Translated by Jakob Schrettenbrunner . - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ + return [ - - /* - |-------------------------------------------------------------------------- - | Standalone Pterodactyl Language Strings - |-------------------------------------------------------------------------- - */ - - 'login' => 'Login', - 'password' => 'Passwort', - 'email' => 'Email', - 'whoops' => 'Uuups', - 'success' => 'Erfolgreich', - 'location' => 'Ort', - 'node' => 'Node', - 'connection' => 'Verbindung', - 'language' => 'Sprache', - 'close' => 'Schließen', - 'start' => 'Start', - 'stop' => 'Stop', - 'restart' => 'Neustart', - 'save' => 'Speichern', - 'enabled' => 'Aktiviert', - 'disabled' => 'Deaktiviert', - 'submit' => 'Absenden', - 'current_password' => 'Aktuelles Passwort', 'again' => 'wiederholen', - 'registered' => 'Registriert', - 'root_administrator' => 'Root Administrator', - 'yes' => 'Ja', - 'no' => 'Nein', - 'memory' => 'Speicher', + 'close' => 'Schließen', + 'connection' => 'Verbindung', 'cpu' => 'CPU', - 'status' => 'Status', + 'current_password' => 'Aktuelles Passwort', + 'disabled' => 'Deaktiviert', + 'email' => 'Email', + 'enabled' => 'Aktiviert', + 'language' => 'Sprache', + 'location' => 'Ort', + 'login' => 'Login', + 'memory' => 'Arbeitsspeicher', + 'no' => 'Nein', + 'node' => 'Node', 'players' => 'Spieler', - + 'registered' => 'Registriert', + 'restart' => 'Neustart', + 'root_administrator' => 'Root Administrator', + 'save' => 'Speichern', + 'start' => 'Start', + 'status' => 'Status', + 'stop' => 'Stop', + 'submit' => 'Absenden', + 'success' => 'Erfolgreich', + 'whoops' => 'Uuups', + 'yes' => 'Ja', ]; diff --git a/resources/lang/de/validation.php b/resources/lang/de/validation.php index 215cb1e44..d53153111 100644 --- a/resources/lang/de/validation.php +++ b/resources/lang/de/validation.php @@ -1,110 +1,71 @@ ':attribute muss akzeptiert werden.', - 'active_url' => ':attribute ist keine gültige URL.', - 'after' => ':attribute muss ein Datum in diesem Format sein: :date', - 'alpha' => ':attribute darf nur Buchstaben enthalten.', - 'alpha_dash' => ':attribute darf nur Buchstaben, Ziffern und Bindestriche enthalten.', - 'alpha_num' => ':attribute darf nur Zahlen und Buchstaben enthalten.', - 'array' => ':attribute muss ein Array sein.', - 'before' => ':attribute muss ein Datum in diesem Format sein: :date', - 'between' => [ + 'accepted' => ':attribute muss akzeptiert werden.', + 'active_url' => ':attribute ist keine gültige URL.', + 'after' => ':attribute muss ein Datum in diesem Format sein: :date', + 'alpha' => ':attribute darf nur Buchstaben enthalten.', + 'alpha_dash' => ':attribute darf nur Buchstaben, Ziffern und Bindestriche enthalten.', + 'alpha_num' => ':attribute darf nur Zahlen und Buchstaben enthalten.', + 'array' => ':attribute muss ein Array sein.', + 'before' => ':attribute muss ein Datum in diesem Format sein: :date', + 'between' => [ + 'array' => ':attribute muss aus :min bis :max Elemente bestehen.', + 'file' => ':attribute muss zwischen :min und :max Kilobyte liegen.', 'numeric' => ':attribute muss zwischen :min und :max liegen.', - 'file' => ':attribute muss zwischen :min und :max Kilobyte liegen.', - 'string' => ':attribute muss aus :min bis :max Zeichen bestehen.', - 'array' => ':attribute muss aus :min bis :max Elemente bestehen.', + 'string' => ':attribute muss aus :min bis :max Zeichen bestehen.', ], - 'boolean' => ':attribute muss wahr oder falsch sein.', - 'confirmed' => ':attribute wiederholung stimmt nicht überein.', - 'date' => ':attribute ist kein gültiges Datum.', - 'date_format' => ':attribute entspricht nicht dem Format: :format', - 'different' => ':attribute und :other muss verschieden sein.', - 'digits' => ':attribute muss aus :digits Ziffern bestehen.', - 'digits_between' => ':attribute muss aus :min bis :max Ziffern bestehen.', - 'email' => ':attribute muss eine gültige Email Adresse sein.', - 'exists' => 'das ausgewählte Attribut :attribute ist ungültig.', - 'filled' => ':attribute ist erforderlich.', - 'image' => ':attribute muss ein Bild sein.', - 'in' => 'Das ausgewählte Attribut :attribute ist ungültig.', - 'integer' => ':attribute muss eine Zahl sein.', - 'ip' => ':attribute muss eine gültige IP Adresse sein.', - 'json' => ':attribute muss ein gültiger JSON String sein.', - 'max' => [ - 'numeric' => ':attribute darf nicht größer als :max sein.', - 'file' => ':attribute darf nicht größer als :max Kilobytes sein.', - 'string' => ':attribute darf nicht mehr als :max Zeichen lang sein.', - 'array' => ':attribute darf nicht aus mehr als :max Elementen bestehen.', - ], - 'mimes' => ':attribute muss eine Datei des Typs :values sein.', - 'min' => [ - 'numeric' => ':attribute muss mindestens :min sein.', - 'file' => ':attribute muss mindestens :min Kilobytes sein.', - 'string' => ':attribute muss mindestens :min Zeichen lang sein.', - 'array' => ':attribute muss aus mindestens :min Elementen bestehen.', - ], - 'not_in' => 'Das ausgewählte Attribut :attribute ist ungültig.', - 'numeric' => ':attribute muss eine Zahl sein.', - 'regex' => ':attribute Format ungültig.', - 'required' => ':attribute ist erforderlich.', - 'required_if' => ':attribute ist erforderlich wenn :other gleich :value ist.', - 'required_with' => ':attribute ist erforderlich wenn eines von :values gesetzt ist.', - 'required_with_all' => ':attribute ist erforderlich wenn :values gesetzt ist.', - 'required_without' => ':attribute ist erforderlich wenn :values nicht gesetzt ist.', - 'required_without_all' => ':attribute ist erforderlich wenn keines von :values gesetzt ist.', - 'same' => ':attribute und :other müssen übereinstimmen.', - 'size' => [ - 'numeric' => ':attribute muss :size groß sein.', - 'file' => ':attribute muss :size Kilobytes groß sein.', - 'string' => ':attribute muss :size Zeichen lang sein.', - 'array' => ':attribute muss mindestens :size Elemente enthalten.', - ], - 'string' => ':attribute muss eine Zeichenkette sein.', - 'totp' => 'totp Token ist ungültig. Ist es abgelaufen?', - 'timezone' => ':attribute muss eine gültige Zeitzone sein.', - 'unique' => ':attribute wurde bereits verwendet.', - 'url' => ':attribute Format ungültig.', - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute.rule" to name the lines. This makes it quick to - | specify a specific custom language line for a given attribute rule. - | - */ - + 'boolean' => ':attribute muss wahr oder falsch sein.', + 'confirmed' => ':attribute wiederholung stimmt nicht überein.', 'custom' => [ 'attribute-name' => [ 'rule-name' => 'custom-message', ], ], - - /* - |-------------------------------------------------------------------------- - | Custom Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as E-Mail Address instead - | of "email". This simply helps us make messages a little cleaner. - | - */ - - 'attributes' => [], - + 'date' => ':attribute ist kein gültiges Datum.', + 'date_format' => ':attribute entspricht nicht dem Format: :format', + 'different' => ':attribute und :other muss verschieden sein.', + 'digits' => ':attribute muss aus :digits Ziffern bestehen.', + 'digits_between' => ':attribute muss aus :min bis :max Ziffern bestehen.', + 'exists' => 'das ausgewählte Attribut :attribute ist ungültig.', + 'filled' => ':attribute ist erforderlich.', + 'image' => ':attribute muss ein Bild sein.', + 'in' => 'Das ausgewählte Attribut :attribute ist ungültig.', + 'integer' => ':attribute muss eine Zahl sein.', + 'ip' => ':attribute muss eine gültige IP Adresse sein.', + 'json' => ':attribute muss ein gültiger JSON String sein.', + 'max' => [ + 'array' => ':attribute darf nicht aus mehr als :max Elementen bestehen.', + 'file' => ':attribute darf nicht größer als :max Kilobytes sein.', + 'numeric' => ':attribute darf nicht größer als :max sein.', + 'string' => ':attribute darf nicht mehr als :max Zeichen lang sein.', + ], + 'mimes' => ':attribute muss eine Datei des Typs :values sein.', + 'min' => [ + 'array' => ':attribute muss aus mindestens :min Elementen bestehen.', + 'file' => ':attribute muss mindestens :min Kilobytes sein.', + 'numeric' => ':attribute muss mindestens :min sein.', + 'string' => ':attribute muss mindestens :min Zeichen lang sein.', + ], + 'not_in' => 'Das ausgewählte Attribut :attribute ist ungültig.', + 'numeric' => ':attribute muss eine Zahl sein.', + 'regex' => ':attribute Format ungültig.', + 'required' => ':attribute ist erforderlich.', + 'required_if' => ':attribute ist erforderlich wenn :other gleich :value ist.', + 'required_with' => ':attribute ist erforderlich wenn eines von :values gesetzt ist.', + 'required_without' => ':attribute ist erforderlich wenn :values nicht gesetzt ist.', + 'required_without_all' => ':attribute ist erforderlich wenn keines von :values gesetzt ist.', + 'required_with_all' => ':attribute ist erforderlich wenn :values gesetzt ist.', + 'same' => ':attribute und :other müssen übereinstimmen.', + 'size' => [ + 'array' => ':attribute muss mindestens :size Elemente enthalten.', + 'file' => ':attribute muss :size Kilobytes groß sein.', + 'numeric' => ':attribute muss :size groß sein.', + 'string' => ':attribute muss :size Zeichen lang sein.', + ], + 'string' => ':attribute muss eine Zeichenkette sein.', + 'timezone' => ':attribute muss eine gültige Zeitzone sein.', + 'totp' => 'totp Token ist ungültig. Ist es abgelaufen?', + 'unique' => ':attribute wurde bereits verwendet.', + 'url' => ':attribute Format ungültig.', ]; diff --git a/resources/lang/en-GB/auth.php b/resources/lang/en-GB/auth.php new file mode 100644 index 000000000..2cf29496b --- /dev/null +++ b/resources/lang/en-GB/auth.php @@ -0,0 +1,5 @@ + 'Reset Password', +]; diff --git a/resources/lang/en-GB/base.php b/resources/lang/en-GB/base.php new file mode 100644 index 000000000..b62512838 --- /dev/null +++ b/resources/lang/en-GB/base.php @@ -0,0 +1,4 @@ + - * Some Modifications (c) 2015 Dylan Seidt . - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ + return [ - - /* - |-------------------------------------------------------------------------- - | Authentication Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines are used during authentication for various - | messages that we need to display to the user. You are free to modify - | these language lines according to your application's requirements. - | - */ - - 'failed' => 'These credentials do not match our records.', - 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', - 'errorencountered' => 'There was an error encountered while attempting to process this request.', - 'resetpassword' => 'Reset Password', 'confirmpassword' => 'Confirm Password', - 'sendlink' => 'Send Password Reset Link', 'emailsent' => 'Your password reset email is on its way.', + 'errorencountered' => 'There was an error encountered while attempting to process this request.', + 'failed' => 'These credentials do not match our records.', 'remeberme' => 'Remember Me', + 'resetpassword' => 'Reset Password', + 'sendlink' => 'Send Password Reset Link', + 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', 'totp_failed' => 'The TOTP token provided was invalid. Please ensure that the token generated by your device was valid.', - ]; diff --git a/resources/lang/en/base.php b/resources/lang/en/base.php index efcb96d25..4bd457576 100644 --- a/resources/lang/en/base.php +++ b/resources/lang/en/base.php @@ -1,71 +1,31 @@ - * Some Modifications (c) 2015 Dylan Seidt . - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ + return [ - - /* - |-------------------------------------------------------------------------- - | Base Pterodactyl Language - |-------------------------------------------------------------------------- - | - | These base strings are used throughout the front-end of Pterodactyl but - | not on pages that are used when viewing a server. Those keys are in server.php - | - */ - - 'validation_error' => 'An error occured while validating the data you submitted:', - - 'confirm' => 'Are you sure?', - 'failed' => 'These credentials do not match our records.', - 'throttle' => 'Too many login attempts. Please try again in :seconds seconds.', - 'view_as_admin' => 'You are viewing this server listing as an admin. As such, all servers installed on the system are displayed. Any servers that you are set as the owner of are marked with a blue dot to the left of their name.', - 'server_name' => 'Server Name', - 'no_servers' => 'You do not currently have any servers listed on your account.', - 'form_error' => 'The following errors were encountered while trying to process this request.', - 'password_req' => 'Passwords must meet the following requirements: at least one uppercase character, one lowercase character, one digit, and be at least 8 characters in length.', - 'account' => [ - 'totp_header' => 'Two-Factor Authentication', - 'totp_qr' => 'TOTP QR Code', - 'totp_enable_help' => 'It appears that you do not have Two-Factor authentication enabled. This method of authentication adds an additional barrier preventing unauthorized entry to your account. If you enable it you will be required to input a code generated on your phone or other TOTP supporting device before finishing your login.', - 'totp_apps' => 'You must have a TOTP supporting application (e.g Google Authenticator, DUO Mobile, Authy, Enpass) to use this option.', - 'totp_enable' => 'Enable Two-Factor Authentication', - 'totp_disable' => 'Disable Two-Factor Authentication', - 'totp_token' => 'TOTP Token', - 'totp_disable_help' => 'In order to disable TOTP on this account you will need to provide a valid TOTP token. Once validated TOTP protection on this account will be disabled.', - 'totp_checkpoint_help' => 'Please verify your TOTP settings by scanning the QR Code to the right with your phone\'s authenticator application, and then enter the 6 number code generated by the application in the box below. Press the enter key when finished.', - 'totp_enabled' => 'Your account has been enabled with TOTP verification. Please click the close button on this box to finish.', - 'totp_enabled_error' => 'The TOTP token provided was unable to be verified. Please try again.', - - 'email_password' => 'Email Password', - 'update_user' => 'Update User', 'delete_user' => 'Delete User', - 'update_email' => 'Update Email', + 'email_password' => 'Email Password', 'new_email' => 'New Email', 'new_password' => 'New Password', + 'totp_apps' => 'You must have a TOTP supporting application (e.g Google Authenticator, DUO Mobile, Authy, Enpass) to use this option.', + 'totp_checkpoint_help' => "Please verify your TOTP settings by scanning the QR Code to the right with your phone's authenticator application, and then enter the 6 number code generated by the application in the box below. Press the enter key when finished.", + 'totp_disable' => 'Disable Two-Factor Authentication', + 'totp_disable_help' => 'In order to disable TOTP on this account you will need to provide a valid TOTP token. Once validated TOTP protection on this account will be disabled.', + 'totp_enable' => 'Enable Two-Factor Authentication', + 'totp_enabled' => 'Your account has been enabled with TOTP verification. Please click the close button on this box to finish.', + 'totp_enabled_error' => 'The TOTP token provided was unable to be verified. Please try again.', + 'totp_enable_help' => 'It appears that you do not have Two-Factor authentication enabled. This method of authentication adds an additional barrier preventing unauthorized entry to your account. If you enable it you will be required to input a code generated on your phone or other TOTP supporting device before finishing your login.', + 'totp_header' => 'Two-Factor Authentication', + 'totp_qr' => 'TOTP QR Code', + 'totp_token' => 'TOTP Token', + 'update_email' => 'Update Email', 'update_pass' => 'Update Password', - + 'update_user' => 'Update User', ], - + 'confirm' => 'Are you sure?', + 'form_error' => 'The following errors were encountered while trying to process this request.', + 'no_servers' => 'You do not currently have any servers listed on your account.', + 'password_req' => 'Passwords must meet the following requirements: at least one uppercase character, one lowercase character, one digit, and be at least 8 characters in length.', + 'server_name' => 'Server Name', + 'validation_error' => 'An error occured while validating the data you submitted:', + 'view_as_admin' => 'You are viewing this server listing as an admin. As such, all servers installed on the system are displayed. Any servers that you are set as the owner of are marked with a blue dot to the left of their name.', ]; diff --git a/resources/lang/en/pagination.php b/resources/lang/en/pagination.php index 0f9f83b5a..7a45bc115 100644 --- a/resources/lang/en/pagination.php +++ b/resources/lang/en/pagination.php @@ -1,51 +1,17 @@ . - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ + return [ - - /* - |-------------------------------------------------------------------------- - | Pagination Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines are used by the paginator library to build - | the simple pagination links. You are free to change them to anything - | you want to customize your views to better match your application. - | - */ - + 'next' => 'Next »', 'previous' => '« Previous', - 'next' => 'Next »', - 'sidebar' => [ + 'sidebar' => [ 'account_controls' => 'Account Controls', - 'account_settings' => 'Account Settings', 'account_security' => 'Account Security', - 'server_controls' => 'Server Controls', - 'servers' => 'Your Servers', - 'overview' => 'Server Overview', + 'account_settings' => 'Account Settings', 'files' => 'File Manager', - 'subusers' => 'Manage Sub-Users', 'manage' => 'Manage Server', + 'overview' => 'Server Overview', + 'servers' => 'Your Servers', + 'server_controls' => 'Server Controls', + 'subusers' => 'Manage Sub-Users', ], - ]; diff --git a/resources/lang/en/passwords.php b/resources/lang/en/passwords.php index c98ddd550..046c90f30 100644 --- a/resources/lang/en/passwords.php +++ b/resources/lang/en/passwords.php @@ -1,43 +1,9 @@ . - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ + return [ - - /* - |-------------------------------------------------------------------------- - | Password Reminder Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines are the default lines which match reasons - | that are given by the password broker for a password update attempt - | has failed, such as for an invalid token or invalid new password. - | - */ - 'password' => 'Passwords must be at least six characters and match the confirmation.', 'reset' => 'Your password has been reset!', 'sent' => 'We have e-mailed your password reset link!', 'token' => 'This password reset token is invalid.', 'user' => "We can't find a user with that e-mail address.", - ]; diff --git a/resources/lang/en/server.php b/resources/lang/en/server.php index ecb941332..322eff2c6 100644 --- a/resources/lang/en/server.php +++ b/resources/lang/en/server.php @@ -1,59 +1,29 @@ - * Some Modifications (c) 2015 Dylan Seidt . - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ + return [ - - /* - |-------------------------------------------------------------------------- - | Pterodactyl Language Strings for /server/{server} Routes - |-------------------------------------------------------------------------- - */ - 'ajax' => [ 'socket_error' => 'We were unable to connect to the main Socket.IO server, there may be network issues currently. The panel may not work as expected.', - 'socket_status' => 'This server\'s power status has changed to', + 'socket_status' => "This server's power status has changed to", 'socket_status_crashed' => 'This server has been detected as CRASHED.', ], + 'files' => [ + 'back' => 'Back to File Manager', + 'loading' => 'Loading file listing, this might take a few seconds...', + 'saved' => 'File has successfully been saved.', + 'yaml_notice' => "You are currently editing a YAML file. These files do not accept tabs, they must use spaces. We've gone ahead and made it so that hitting tab will insert :dropdown spaces.", + ], 'index' => [ 'add_new' => 'Add New Server', - 'memory_use' => 'Memory Usage', - 'cpu_use' => 'CPU Usage', - 'xaxis' => 'Time (2s Increments)', - 'server_info' => 'Server Information', - 'connection' => 'Default Connection', - 'mem_limit' => 'Memory Limit', - 'disk_space' => 'Disk Space', - 'control' => 'Control Server', - 'usage' => 'Usage', 'allocation' => 'Allocation', 'command' => 'Enter Console Command', + 'connection' => 'Default Connection', + 'control' => 'Control Server', + 'cpu_use' => 'CPU Usage', + 'disk_space' => 'Disk Space', + 'memory_use' => 'Memory Usage', + 'mem_limit' => 'Memory Limit', + 'server_info' => 'Server Information', + 'usage' => 'Usage', + 'xaxis' => 'Time (2s Increments)', ], - 'files' => [ - 'loading' => 'Loading file listing, this might take a few seconds...', - 'yaml_notice' => 'You are currently editing a YAML file. These files do not accept tabs, they must use spaces. We\'ve gone ahead and made it so that hitting tab will insert :dropdown spaces.', - 'back' => 'Back to File Manager', - 'saved' => 'File has successfully been saved.', - ], - ]; diff --git a/resources/lang/en/strings.php b/resources/lang/en/strings.php index a1c102111..03e4ffc0d 100644 --- a/resources/lang/en/strings.php +++ b/resources/lang/en/strings.php @@ -1,61 +1,31 @@ - * Some Modifications (c) 2015 Dylan Seidt . - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ + return [ - - /* - |-------------------------------------------------------------------------- - | Standalone Pterodactyl Language Strings - |-------------------------------------------------------------------------- - */ - - 'login' => 'Login', - 'password' => 'Password', - 'email' => 'Email', - 'whoops' => 'Whoops', - 'success' => 'Success', - 'location' => 'Location', - 'node' => 'Node', - 'connection' => 'Connection', - 'language' => 'Language', - 'close' => 'Close', - 'start' => 'Start', - 'stop' => 'Stop', - 'restart' => 'Restart', - 'save' => 'Save', - 'enabled' => 'Enabled', - 'disabled' => 'Disabled', - 'submit' => 'Submit', - 'current_password' => 'Current Password', 'again' => 'Again', - 'registered' => 'Registered', - 'root_administrator' => 'Root Administrator', - 'yes' => 'Yes', - 'no' => 'No', - 'memory' => 'Memory', + 'close' => 'Close', + 'connection' => 'Connection', 'cpu' => 'CPU', - 'status' => 'Status', + 'current_password' => 'Current Password', + 'disabled' => 'Disabled', + 'email' => 'Email', + 'enabled' => 'Enabled', + 'language' => 'Language', + 'location' => 'Location', + 'login' => 'Login', + 'memory' => 'Memory', + 'no' => 'No', + 'node' => 'Node', + 'password' => 'Password', 'players' => 'Players', - + 'registered' => 'Registered', + 'restart' => 'Restart', + 'root_administrator' => 'Root Administrator', + 'save' => 'Save', + 'start' => 'Start', + 'status' => 'Status', + 'stop' => 'Stop', + 'submit' => 'Submit', + 'success' => 'Success', + 'whoops' => 'Whoops', + 'yes' => 'Yes', ]; diff --git a/resources/lang/en/validation.php b/resources/lang/en/validation.php index 74c0e7c2f..8cbf9a83c 100644 --- a/resources/lang/en/validation.php +++ b/resources/lang/en/validation.php @@ -1,110 +1,71 @@ 'The :attribute must be accepted.', - 'active_url' => 'The :attribute is not a valid URL.', - 'after' => 'The :attribute must be a date after :date.', - 'alpha' => 'The :attribute may only contain letters.', - 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', - 'alpha_num' => 'The :attribute may only contain letters and numbers.', - 'array' => 'The :attribute must be an array.', - 'before' => 'The :attribute must be a date before :date.', - 'between' => [ + 'accepted' => 'The :attribute must be accepted.', + 'active_url' => 'The :attribute is not a valid URL.', + 'after' => 'The :attribute must be a date after :date.', + 'alpha' => 'The :attribute may only contain letters.', + 'alpha_dash' => 'The :attribute may only contain letters, numbers, and dashes.', + 'alpha_num' => 'The :attribute may only contain letters and numbers.', + 'array' => 'The :attribute must be an array.', + 'before' => 'The :attribute must be a date before :date.', + 'between' => [ + 'array' => 'The :attribute must have between :min and :max items.', + 'file' => 'The :attribute must be between :min and :max kilobytes.', 'numeric' => 'The :attribute must be between :min and :max.', - 'file' => 'The :attribute must be between :min and :max kilobytes.', - 'string' => 'The :attribute must be between :min and :max characters.', - 'array' => 'The :attribute must have between :min and :max items.', + 'string' => 'The :attribute must be between :min and :max characters.', ], - 'boolean' => 'The :attribute field must be true or false.', - 'confirmed' => 'The :attribute confirmation does not match.', - 'date' => 'The :attribute is not a valid date.', - 'date_format' => 'The :attribute does not match the format :format.', - 'different' => 'The :attribute and :other must be different.', - 'digits' => 'The :attribute must be :digits digits.', - 'digits_between' => 'The :attribute must be between :min and :max digits.', - 'email' => 'The :attribute must be a valid email address.', - 'exists' => 'The selected :attribute is invalid.', - 'filled' => 'The :attribute field is required.', - 'image' => 'The :attribute must be an image.', - 'in' => 'The selected :attribute is invalid.', - 'integer' => 'The :attribute must be an integer.', - 'ip' => 'The :attribute must be a valid IP address.', - 'json' => 'The :attribute must be a valid JSON string.', - 'max' => [ - 'numeric' => 'The :attribute may not be greater than :max.', - 'file' => 'The :attribute may not be greater than :max kilobytes.', - 'string' => 'The :attribute may not be greater than :max characters.', - 'array' => 'The :attribute may not have more than :max items.', - ], - 'mimes' => 'The :attribute must be a file of type: :values.', - 'min' => [ - 'numeric' => 'The :attribute must be at least :min.', - 'file' => 'The :attribute must be at least :min kilobytes.', - 'string' => 'The :attribute must be at least :min characters.', - 'array' => 'The :attribute must have at least :min items.', - ], - 'not_in' => 'The selected :attribute is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values is present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', - 'size' => [ - 'numeric' => 'The :attribute must be :size.', - 'file' => 'The :attribute must be :size kilobytes.', - 'string' => 'The :attribute must be :size characters.', - 'array' => 'The :attribute must contain :size items.', - ], - 'string' => 'The :attribute must be a string.', - 'totp' => 'The totp token is invalid. Did it expire?', - 'timezone' => 'The :attribute must be a valid zone.', - 'unique' => 'The :attribute has already been taken.', - 'url' => 'The :attribute format is invalid.', - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute.rule" to name the lines. This makes it quick to - | specify a specific custom language line for a given attribute rule. - | - */ - + 'boolean' => 'The :attribute field must be true or false.', + 'confirmed' => 'The :attribute confirmation does not match.', 'custom' => [ 'attribute-name' => [ 'rule-name' => 'custom-message', ], ], - - /* - |-------------------------------------------------------------------------- - | Custom Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as E-Mail Address instead - | of "email". This simply helps us make messages a little cleaner. - | - */ - - 'attributes' => [], - + 'date' => 'The :attribute is not a valid date.', + 'date_format' => 'The :attribute does not match the format :format.', + 'different' => 'The :attribute and :other must be different.', + 'digits' => 'The :attribute must be :digits digits.', + 'digits_between' => 'The :attribute must be between :min and :max digits.', + 'exists' => 'The selected :attribute is invalid.', + 'filled' => 'The :attribute field is required.', + 'image' => 'The :attribute must be an image.', + 'in' => 'The selected :attribute is invalid.', + 'integer' => 'The :attribute must be an integer.', + 'ip' => 'The :attribute must be a valid IP address.', + 'json' => 'The :attribute must be a valid JSON string.', + 'max' => [ + 'array' => 'The :attribute may not have more than :max items.', + 'file' => 'The :attribute may not be greater than :max kilobytes.', + 'numeric' => 'The :attribute may not be greater than :max.', + 'string' => 'The :attribute may not be greater than :max characters.', + ], + 'mimes' => 'The :attribute must be a file of type: :values.', + 'min' => [ + 'array' => 'The :attribute must have at least :min items.', + 'file' => 'The :attribute must be at least :min kilobytes.', + 'numeric' => 'The :attribute must be at least :min.', + 'string' => 'The :attribute must be at least :min characters.', + ], + 'not_in' => 'The selected :attribute is invalid.', + 'numeric' => 'The :attribute must be a number.', + 'regex' => 'The :attribute format is invalid.', + 'required' => 'The :attribute field is required.', + 'required_if' => 'The :attribute field is required when :other is :value.', + 'required_with' => 'The :attribute field is required when :values is present.', + 'required_without' => 'The :attribute field is required when :values is not present.', + 'required_without_all' => 'The :attribute field is required when none of :values are present.', + 'required_with_all' => 'The :attribute field is required when :values is present.', + 'same' => 'The :attribute and :other must match.', + 'size' => [ + 'array' => 'The :attribute must contain :size items.', + 'file' => 'The :attribute must be :size kilobytes.', + 'numeric' => 'The :attribute must be :size.', + 'string' => 'The :attribute must be :size characters.', + ], + 'string' => 'The :attribute must be a string.', + 'timezone' => 'The :attribute must be a valid zone.', + 'totp' => 'The totp token is invalid. Did it expire?', + 'unique' => 'The :attribute has already been taken.', + 'url' => 'The :attribute format is invalid.', ]; diff --git a/resources/lang/es/auth.php b/resources/lang/es/auth.php new file mode 100644 index 000000000..b62512838 --- /dev/null +++ b/resources/lang/es/auth.php @@ -0,0 +1,4 @@ + 'Kinnita salasõna', + 'emailsent' => 'Teie salasõna algväärtustus link on teel', + 'errorencountered' => 'Selle protsessi toimumisel toimus viga', + 'failed' => 'Sisestus ei klapi meie andmetega', + 'remeberme' => 'Mäleta mind', + 'resetpassword' => 'Algväärtusta salasõna', + 'sendlink' => 'Saada salasõna algväärtustamise link', + 'throttle' => 'Liiga palju sisselogimiskatseid. Palun proovi uuesti :seconds sekundi pärast', + 'totp_failed' => 'Sinu Kahe-kihilise autentimise tooken oli väär. Palun veendu, et genereeritud tooken on õige.', +]; diff --git a/resources/lang/et/base.php b/resources/lang/et/base.php new file mode 100644 index 000000000..99310f3dd --- /dev/null +++ b/resources/lang/et/base.php @@ -0,0 +1,32 @@ + [ + 'delete_user' => 'Kustuta kasutaja', + 'email_password' => 'Email Salasõna', + 'new_email' => 'Uus Email', + 'new_password' => 'Uus salasõna', + 'totp_apps' => 'Teil peab olema Kahe-kihilise autentimeerimine (Google Authenticator, DUO Mobile, Authy, Enpass) olema lubatud, et kasutada seda valikut', + 'totp_checkpoint_help' => 'Palun kinnita oma Kahe-kihilise autentiseerimise seaded üle, kas skännides QR kood või sisestades 6 numbriline kood ', + 'totp_disable' => 'Keela Kahe-kihiline autentimine', + 'totp_disable_help' => 'Selleks, et keelata Kahe-kihiline autenteerimine sellel kasutajal sisesta õige tooken. ', + 'totp_enable' => 'Luba Kahe-kihiline autentimine +', + 'totp_enabled' => 'Teie kontol on aktiveeritud Kahe-kihiline autentimine. Palun sulge see kast, et lõpetada', + 'totp_enabled_error' => 'Sisestatud Kahe-kihilse autentimise tookenit ei olnud võimalik kinnitada. Palun proovi uuesti', + 'totp_enable_help' => 'Paistab, et Teil pole Kahe-kihiline autentimine lubatud. See autentimise meetod lisab kaitsva kihi teie konto peale võimalikude rünnakute eest. Lubamisel on teil vaja sisestada kood, enne kui saate sisselogitud', + 'totp_header' => 'Kahe-kihiline autenteerimine', + 'totp_qr' => 'Kahe-kihilse autentimissüsteemi QR kood', + 'totp_token' => 'Kahe-kihilise autentimise tooken', + 'update_email' => 'Uuenda Emaili', + 'update_pass' => 'Uuenda salasõna', + 'update_user' => 'Uuenda kasutajat', + ], + 'confirm' => 'Oled kindel?', + 'form_error' => 'Järgmised errorid tekkisid proovides täita seda protsessi', + 'no_servers' => 'Teil ei ole hetkel ühtegi serverit ühendatud kontoga.', + 'password_req' => 'Salasõna peab koosnema järgmisest: Üks suuretäht, üks väiketäht, üks number ja vähemalt 8 tähemärki pikk', + 'server_name' => 'Serveri nimi', + 'validation_error' => 'Andmete valideerimisel tekkis viga', + 'view_as_admin' => 'Te vaatate seda serverit, kui admin. Seetõttu kõik serverid, mis on installitud on nähtaval. Iga server, mida Te omate on märgitud siniselt nime kõrval.', +]; diff --git a/resources/lang/et/pagination.php b/resources/lang/et/pagination.php new file mode 100644 index 000000000..ba10ed506 --- /dev/null +++ b/resources/lang/et/pagination.php @@ -0,0 +1,17 @@ + 'Järgmine »', + 'previous' => '« Eelmine', + 'sidebar' => [ + 'account_controls' => 'Kasutaja seaded', + 'account_security' => 'Kasutaja turvalisus', + 'account_settings' => 'Kasutaja seaded', + 'files' => 'Faili haldur', + 'manage' => 'Halda serverit', + 'overview' => 'Serveri ülevaade', + 'servers' => 'Teie serverid', + 'server_controls' => 'Serveri seaded', + 'subusers' => 'Halda kasutajaid', + ], +]; diff --git a/resources/lang/et/passwords.php b/resources/lang/et/passwords.php new file mode 100644 index 000000000..a2039b5cf --- /dev/null +++ b/resources/lang/et/passwords.php @@ -0,0 +1,9 @@ + 'Salasõna peab olema vähemalt 6 tähte ja peab klappima kinnitusega', + 'reset' => 'Teie salasõna on algväärtustatud', + 'sent' => 'Me oleme meilinud sulle salasõna algväärtustamise lingi', + 'token' => 'Salasõna algväärtustamise tooken on väär', + 'user' => 'Me ei leia kasutaja selle Emailiga', +]; diff --git a/resources/lang/et/server.php b/resources/lang/et/server.php new file mode 100644 index 000000000..f21d72e0c --- /dev/null +++ b/resources/lang/et/server.php @@ -0,0 +1,29 @@ + [ + 'socket_error' => 'Me ei saanud ühendust peamise Socket.IO serveriga, selle tõttu võib olla internetiga probleeme. Paneel võib toimida valesti.', + 'socket_status' => 'Selle serveri staatus on muutunud - ', + 'socket_status_crashed' => 'Serveri staatuseks on märgitud: hävinud', + ], + 'files' => [ + 'back' => 'Tagasi faili haldurisse', + 'loading' => 'Faili listi laadimine võib võtta mõned sekundid', + 'saved' => 'Fail on edukalt salvestatud', + 'yaml_notice' => 'Praegu sa muudad YAML faili. Need failid ei aksepteeri TABi, nad peavad kasutama tühikut. Seetõttu muutsime me TABi vajutamisel :dropdown tühikut', + ], + 'index' => [ + 'add_new' => 'Lisa uus server', + 'allocation' => 'Jaotus', + 'command' => 'Sisesta konsooli käsk', + 'connection' => 'Vaikimisi ühendus', + 'control' => 'Kontrolli serverit', + 'cpu_use' => 'CPU kasutus', + 'disk_space' => 'Kõvaketta ruum', + 'memory_use' => 'Mälu kasutus', + 'mem_limit' => 'Mälu limiit', + 'server_info' => 'Serveri informatsioon', + 'usage' => 'Kasutus', + 'xaxis' => 'Aeg (2s vahedega)', + ], +]; diff --git a/resources/lang/et/strings.php b/resources/lang/et/strings.php new file mode 100644 index 000000000..a71c1127b --- /dev/null +++ b/resources/lang/et/strings.php @@ -0,0 +1,30 @@ + 'Uuesti', + 'close' => 'Sulge', + 'connection' => 'Ühendus', + 'cpu' => 'CPU', + 'current_password' => 'Praegune salasõna', + 'disabled' => 'Välja lülitatud', + 'email' => 'Email', + 'enabled' => 'Lubatud', + 'language' => 'Keel', + 'location' => 'Asukoht', + 'login' => 'Logi sisse', + 'memory' => 'Mälu', + 'no' => 'Ei', + 'node' => 'Node', + 'players' => 'Mängijad', + 'registered' => 'Registreeritud', + 'restart' => 'Taaskäivita', + 'root_administrator' => 'Juur Administraator', + 'save' => 'Salvesta', + 'start' => 'Start', + 'status' => 'Staatus', + 'stop' => 'Peata', + 'submit' => 'Sisesta', + 'success' => 'Õnnestus', + 'whoops' => 'Oihhh', + 'yes' => 'Jah', +]; diff --git a/resources/lang/et/validation.php b/resources/lang/et/validation.php new file mode 100644 index 000000000..af304fdae --- /dev/null +++ b/resources/lang/et/validation.php @@ -0,0 +1,71 @@ + ':attribute oeab olema aksepteeritud', + 'active_url' => ':attribute ei ole õige URL', + 'after' => ':attribute peab olema kuupäev pärast :date', + 'alpha' => ':attribute tohib sisaldada ainult numbreid', + 'alpha_dash' => ':attribute tohib sisaldada ainult tähti, numbreid ja sidekriipse', + 'alpha_num' => ':attribute tohib ainult sisaldada tähti ja numbreid', + 'array' => ':attribute peab olema massiiv', + 'before' => ':attribute peab olema kuupäev enne :date', + 'between' => [ + 'array' => ':attribute peab jääma :min ja :max eseme vahele', + 'file' => ':attribute peab jääma :min ja :max kilobaidi vahele', + 'numeric' => ':attribute peab olema vahemikus :min ja :max', + 'string' => ':attribute peab jääma :min ja :max vahele', + ], + 'boolean' => ':attribute peab olema kas tõene või väär', + 'confirmed' => ':attribute kinnitus ei klapi', + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'Kohandatud-sõnum', + ], + ], + 'date' => ':attribute ei ole õige kuupäeva formaat', + 'date_format' => ':attribute ei klapi formaadiga :format', + 'different' => ':attribute ja :other peavad olema erinevad', + 'digits' => ':attribute peab olema :digits numbrit', + 'digits_between' => ':attribute peab olema :min ja :max numbrit', + 'exists' => 'Valitud :attribute on väär', + 'filled' => ':attribute väli on kohustuslik', + 'image' => ':attribute peab olema pilt', + 'in' => ':attribute on vale valik', + 'integer' => ':attribute peab olema täisarv', + 'ip' => ':attribute peab olema õige IP aadress', + 'json' => ':attribute peab olema lubatud JSON vektor', + 'max' => [ + 'array' => ':attribute ei tohi sisaldada rohkem, kui :max eset', + 'file' => ':attribute ei tohi olla suurem, kui :max kilobaiti', + 'numeric' => ':attribute ei tohi olla suurem, kui :max', + 'string' => ':attribute ei tohi olla suurem, kui :max tähte', + ], + 'mimes' => ':attribute peab olema :values tüüpi fail', + 'min' => [ + 'array' => ':attribute peab sisaldama vähemalt :min eset', + 'file' => ':attribute peab olema vähemalt :min kilobaiti', + 'numeric' => ':attribute peab olema vähemalt :min', + 'string' => ':attribute peab olema vähemalt :min tähemärgi pikkusega', + ], + 'not_in' => ':attribute on väär valik', + 'numeric' => ':attribute peab olema number', + 'regex' => ':attribute formaat on vale', + 'required' => ':attribute väli on kohustuslik', + 'required_if' => ':attribute on vajalik, kui :other on :value', + 'required_with' => ':attribute väli peab olema täidetud, kui :values on olemas', + 'required_without' => ':attribute väli peab olema täidetud, kui :values puudub', + 'required_without_all' => ':attribute on vajalik, kui ükski :values ei ole olemas', + 'required_with_all' => ':attribute väli on vajalik, kui :attribute on olemas', + 'same' => ':attribute ja :other peavad klappima', + 'size' => [ + 'array' => ':attribute peab sisaldama :size esemet', + 'file' => ':attribute peab olema :size kilobaiti', + 'numeric' => ':attribute peab olema :size suurusa', + 'string' => ':attribute peab olema :size märki', + ], + 'string' => ':attribute peab olema vektor', + 'timezone' => ':attribute peab olema õige ala', + 'totp' => 'Kahe-kihilise autentimisesüsteemi tooken on väär, kas see aegus?', + 'unique' => ':attribute on juba võetud.', + 'url' => ':attribute on vale formaat', +]; diff --git a/resources/lang/fr/auth.php b/resources/lang/fr/auth.php new file mode 100644 index 000000000..b62512838 --- /dev/null +++ b/resources/lang/fr/auth.php @@ -0,0 +1,4 @@ + [ + 'totp_header' => 'Authentification à deux facteurs', + ], +]; diff --git a/resources/lang/fr/pagination.php b/resources/lang/fr/pagination.php new file mode 100644 index 000000000..b62512838 --- /dev/null +++ b/resources/lang/fr/pagination.php @@ -0,0 +1,4 @@ + 'Langage', + 'save' => 'Sauvegarder', + 'status' => 'Status', +]; diff --git a/resources/lang/fr/validation.php b/resources/lang/fr/validation.php new file mode 100644 index 000000000..f7ea9b7c0 --- /dev/null +++ b/resources/lang/fr/validation.php @@ -0,0 +1,6 @@ + ':attribute doit être une date antérieur a :date.', + 'ip' => ':attribute doit être une adresse IP valide.', +]; diff --git a/resources/lang/nb/auth.php b/resources/lang/nb/auth.php new file mode 100644 index 000000000..34bb66a27 --- /dev/null +++ b/resources/lang/nb/auth.php @@ -0,0 +1,11 @@ + 'Bekreft passord', + 'emailsent' => 'Din epost om å endre passord er på vei.', + 'errorencountered' => 'Det skjedde en feil under forsøket på utføre denne oppgaven.', + 'failed' => 'Denne påloggingsinformasjonen samsvarer ikke med våre opplysninger.', + 'remeberme' => 'Husk meg', + 'resetpassword' => 'Tilbakestill passord', + 'sendlink' => 'Send link for tilbakestilling av passord', +]; diff --git a/resources/lang/nb/base.php b/resources/lang/nb/base.php new file mode 100644 index 000000000..6938ff4f6 --- /dev/null +++ b/resources/lang/nb/base.php @@ -0,0 +1,27 @@ + [ + 'delete_user' => 'Slett bruker', + 'email_password' => 'Epost passord', + 'new_email' => 'Ny epost', + 'new_password' => 'Nytt passord', + 'totp_apps' => 'Du må ha en TOTP støttet applikasjon (F.eks. Google Authenticator, DUO Mobile, Authy, Enpass) for å benytte dette alternativet.', + 'totp_checkpoint_help' => 'Vennligst bekreft dine TOTP instillinger ved å skanne QR-Koden til høyre med din telefons autenitseringsapplikasjon, og skriv inn den 6 sifrede koden generert av applikasjonen i boksen under. Trykk enter når du er ferdig.', + 'totp_disable' => 'Deaktiver to-faktor autentisering', + 'totp_enable' => 'Aktiver to-faktor autentisering', + 'totp_enabled' => 'Din konto har blitt aktivert med TOTP verifikasjon. Vennligst trykk på lukk knappen for å fullføre.', + 'totp_enabled_error' => 'TOTP nøkkelen kunne ikke verifiseres. Vennligst prøv igjen.', + 'totp_enable_help' => 'Det ser ut til at du ikke har slått på to-faktor autentisering. Denne autentiseringsmetoden legger til ett ekstra lag, som forhindrer uatorisert tilgang til din konto. Hvis du aktiverer dette, vil det kreves en kode generert på telefonen din, eller en annen TOTP støttet enhet før du fullfører innlogging.', + 'totp_header' => 'To-faktor autentisering', + 'totp_qr' => 'TOTP QR-Kode', + 'totp_token' => 'TOTP nøkkel', + 'update_email' => 'Oppdater epost', + 'update_pass' => 'Oppdater passord', + 'update_user' => 'Oppdater bruker', + ], + 'confirm' => 'Er du sikker?', + 'form_error' => 'Følgende feilmeldinger dukket opp da forspørselen ble behandlet.', + 'no_servers' => 'Du har for øyeblikket ingen servere registrert på din konto.', + 'server_name' => 'Servernavn', +]; diff --git a/resources/lang/nb/pagination.php b/resources/lang/nb/pagination.php new file mode 100644 index 000000000..efeba11a5 --- /dev/null +++ b/resources/lang/nb/pagination.php @@ -0,0 +1,17 @@ + 'Neste »', + 'previous' => '« Forrige', + 'sidebar' => [ + 'account_controls' => 'Kontokontroll', + 'account_security' => 'Kontosikkerhet', + 'account_settings' => 'Kontoinstillinger', + 'files' => 'Filbehandling', + 'manage' => 'Administrer server', + 'overview' => 'Serveroversikt', + 'servers' => 'Dine servere', + 'server_controls' => 'Serverkontroll', + 'subusers' => 'Administrer underbrukere', + ], +]; diff --git a/resources/lang/nb/passwords.php b/resources/lang/nb/passwords.php new file mode 100644 index 000000000..77694293a --- /dev/null +++ b/resources/lang/nb/passwords.php @@ -0,0 +1,8 @@ + 'Passordet må ha minimum 6 tegn, og matche bekreftelsen.', + 'reset' => 'Passordet ditt har blitt tilbakestilt!', + 'sent' => 'Vi har sendt deg en epost med link til å tilbakestille passord!', + 'user' => 'Vi kan ikke finne noen bruker med denne epost adressen.', +]; diff --git a/resources/lang/nb/server.php b/resources/lang/nb/server.php new file mode 100644 index 000000000..a9d7a04eb --- /dev/null +++ b/resources/lang/nb/server.php @@ -0,0 +1,27 @@ + [ + 'socket_status' => 'Serverens strømstatus er endret til', + 'socket_status_crashed' => 'Serveren har blitt oppdaget som kræsjet.', + ], + 'files' => [ + 'back' => 'Tilbake til filbehandling', + 'loading' => 'Laster filliste, dette kan ta et par sekunder...', + 'saved' => 'Filen har blitt lagret!', + ], + 'index' => [ + 'add_new' => 'Legg til ny server', + 'allocation' => 'Tildeling', + 'command' => 'Skriv inn konsollkommando', + 'connection' => 'Standard tilkobling', + 'control' => 'Serverkontroll', + 'cpu_use' => 'Prosessorbruk', + 'disk_space' => 'Diskplass', + 'memory_use' => 'Minnebruk', + 'mem_limit' => 'Minnegrense', + 'server_info' => 'Serverinformasjon', + 'usage' => 'Bruk', + 'xaxis' => 'Tid (2s intervaller)', + ], +]; diff --git a/resources/lang/nb/strings.php b/resources/lang/nb/strings.php new file mode 100644 index 000000000..5cca2cacf --- /dev/null +++ b/resources/lang/nb/strings.php @@ -0,0 +1,29 @@ + 'Lukk', + 'connection' => 'Tilkobling', + 'cpu' => 'Prosessor', + 'current_password' => 'Nåværende passord', + 'disabled' => 'Deaktivert', + 'email' => 'Epost', + 'enabled' => 'Aktivert', + 'language' => 'Språk', + 'location' => 'Plassering', + 'login' => 'Logg inn', + 'memory' => 'Minne', + 'no' => 'Nei', + 'node' => 'Node', + 'players' => 'Spillere', + 'registered' => 'Registrert', + 'restart' => 'Omstart', + 'root_administrator' => 'Hovedadministrator', + 'save' => 'Lagre', + 'start' => 'Start', + 'status' => 'Status', + 'stop' => 'Stopp', + 'submit' => 'Send inn', + 'success' => 'Suksess', + 'whoops' => 'Ooops', + 'yes' => 'Ja', +]; diff --git a/resources/lang/nb/validation.php b/resources/lang/nb/validation.php new file mode 100644 index 000000000..436e6b348 --- /dev/null +++ b/resources/lang/nb/validation.php @@ -0,0 +1,29 @@ + ':attribute må være en dato etter :date.', + 'between' => [ + 'file' => ':attribute må være mellom :min og :max kilobyte.', + ], + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'egendefinert melding', + ], + ], + 'date' => ':attribute er ikke en gyldig dato.', + 'different' => ':attribute og :other må være forskjellige.', + 'image' => ':attribute må være et bilde.', + 'max' => [ + 'string' => ':attribute må være større enn :max tegn.', + ], + 'min' => [ + 'string' => ':attribute må være minst :min tegn.', + ], + 'numeric' => ':attribute må være et tall.', + 'required_with_all' => ':attribute feltet er på krevd nå :values er til stede.', + 'size' => [ + 'array' => ':attribute må inneholde :size elementer.', + ], + 'totp' => 'TOTP nøkkelen er ugyldig. Har den gått ut på dato?', + 'url' => ':attribute fomatet er ikke gyldig.', +]; diff --git a/resources/lang/nl/auth.php b/resources/lang/nl/auth.php new file mode 100644 index 000000000..96599b726 --- /dev/null +++ b/resources/lang/nl/auth.php @@ -0,0 +1,13 @@ + 'Bevestig wachtwoord', + 'emailsent' => 'Jouw wachtwoord herstel e-mail is onderweg.', + 'errorencountered' => 'Er was een probleem tijdens het verwerken van dit verzoek.', + 'failed' => 'De ingevulde gegevens komen niet overeen met onze gegevens.', + 'remeberme' => 'Onthoud mij', + 'resetpassword' => 'Wachtwoord herstellen', + 'sendlink' => 'Verstuur wachtwoord herstel link', + 'throttle' => 'Te veel inlog pogingen. Probeer het opnieuw in :seconds seconden.', + 'totp_failed' => 'De TOTP token verstrekt is ongeldig. Controleer alsjeblieft of de token die door jouw apparaat is gegenereerd geldig is.', +]; diff --git a/resources/lang/nl/base.php b/resources/lang/nl/base.php new file mode 100644 index 000000000..a90fbf7a9 --- /dev/null +++ b/resources/lang/nl/base.php @@ -0,0 +1,31 @@ + [ + 'delete_user' => 'Verwijder gebruiker', + 'email_password' => 'Email wachtwoord', + 'new_email' => 'Nieuw e-mail adres', + 'new_password' => 'Nieuw wachtwoord', + 'totp_apps' => 'Je moet een TOTP ondersteunende applicatie (bv. Google Authenticator, DUO Mobile, Authy, Enpass) hebben om deze optie te gebruiken.', + 'totp_checkpoint_help' => 'Verifieer alsjeblieft jouw TOTP instellingen door de QR Code aan de rechterkant te scannen met de authenticatie applicatie van jouw telefoon. Vul daarna de door de applicatie gegenereerde 6 cijferige code in het vak hier onder in. Druk op enter wanneer je klaar bent.', + 'totp_disable' => 'Schakel Two-Factor Authenticatie uit', + 'totp_disable_help' => 'Om TOTP uit te schakelen is een geldige TOTP token nodig. Zodra deze is bevestigd zal TOTP beveiliging worden uitgeschakeld op dit account.', + 'totp_enable' => 'Schakel Two-Factor Authenticatie in', + 'totp_enabled' => 'TOTP verificatie is geactiveerd op jouw account. Klik alsjeblieft op de sluiten knop.', + 'totp_enabled_error' => 'De verstrekt TOTP token kon niet worden geverifeerd. Probeer het alsjeblieft nog een keer.', + 'totp_enable_help' => 'Het lijkt er op dat je Two-Factor authenticatie niet aan hebt staan. Deze methode van authenticatie voegt een extra barrière toe en voorkomt daarmee ongeautoriseerde toegang tot jouw account. Indien je het inschakelt zal je een code gegenereerd vanaf jouw telefoon of ander TOTP ondersteunend apparaat moeten ingeven om succesvol te kunnen inloggen.', + 'totp_header' => 'Two-Factor Authenticatie', + 'totp_qr' => 'TOTP QR Code', + 'totp_token' => 'TOTP Token', + 'update_email' => 'E-mail updaten', + 'update_pass' => 'Wachtwoord updaten', + 'update_user' => 'Gebruikers updaten', + ], + 'confirm' => 'Weet je het zeker?', + 'form_error' => 'Tijdens het verwerken van dit verzoek zijn we de volgende problemen tegen gekomen:', + 'no_servers' => 'Je hebt op dit moment geen servers gekoppeld aan jouw account.', + 'password_req' => 'Wachtwoorden moeten voldoen aan de volgende eisen: minimaal één hoofdletter, één kleine letter, één getal, en minimaal 8 karakters lang.', + 'server_name' => 'Server naam', + 'validation_error' => 'Er is een probleem opgetreden tijdens het valideren van de data die je verzond:', + 'view_as_admin' => 'Je bekijkt deze server als administrator. Hierdoor zie je alle servers geïnstalleerd op het systeem. Servers waarvan jij de eigenaar bent hebben een blauw rondje aan de linkerkant van hun naam.', +]; diff --git a/resources/lang/nl/pagination.php b/resources/lang/nl/pagination.php new file mode 100644 index 000000000..2fd057a4d --- /dev/null +++ b/resources/lang/nl/pagination.php @@ -0,0 +1,17 @@ + 'Volgende', + 'previous' => 'Vorige', + 'sidebar' => [ + 'account_controls' => 'Account beheer', + 'account_security' => 'Account beveiliging', + 'account_settings' => 'Account instellingen', + 'files' => 'Bestanden beheerder', + 'manage' => 'Beheer server', + 'overview' => 'Server overzicht', + 'servers' => 'Jouw servers', + 'server_controls' => 'Server Bediening', + 'subusers' => 'Beheer sub-gebruiker', + ], +]; diff --git a/resources/lang/nl/passwords.php b/resources/lang/nl/passwords.php new file mode 100644 index 000000000..77cc241ad --- /dev/null +++ b/resources/lang/nl/passwords.php @@ -0,0 +1,9 @@ + 'Wachtwoord moet minimaal zes karakters lang zijn en de bevestiging moet overeenkomen.', + 'reset' => 'Jouw wachtwoord is hersteld!', + 'sent' => 'We hebben jouw wachtwoord reset link naar je gemaild!', + 'token' => 'Deze token wachtwoord reset token is ongeldig.', + 'user' => 'We kunnen geen gebruiker vinden met dat e-mail adres.', +]; diff --git a/resources/lang/nl/server.php b/resources/lang/nl/server.php new file mode 100644 index 000000000..527cca078 --- /dev/null +++ b/resources/lang/nl/server.php @@ -0,0 +1,29 @@ + [ + 'socket_error' => 'Het was niet mogelijk om met de hoofd Socket.IO server te verbinden. Er is mogelijk op het moment een netwerk probleem. Het panel werkt mogelijk niet zoals verwacht.', + 'socket_status' => 'De status van deze server is veranderd naar', + 'socket_status_crashed' => 'Deze server is gedetecteerd als gecrasht.', + ], + 'files' => [ + 'back' => 'Terug naar Bestanden Beheer', + 'loading' => 'Bestandenlijst wordt geladen, dit kan even duren...', + 'saved' => 'Bestand is succesvol opgeslagen.', + 'yaml_notice' => "Je bent bezig met het bewerken van een YAML bestand. Zo'n bestand accepteer geen tabs, er moeten spaties worden gebruikt. We hebben er voor gezorgd dat als je op tab drukt, er automatisch spaties worden toegevoegd.", + ], + 'index' => [ + 'add_new' => 'Nieuwe server toevoegen', + 'allocation' => 'Allocatie', + 'command' => 'Vul een console commando in', + 'connection' => 'Standaard verbinding', + 'control' => 'Beheer server', + 'cpu_use' => 'CPU gebruik', + 'disk_space' => 'Schijfruimte', + 'memory_use' => 'Geheugen gebruik', + 'mem_limit' => 'Geheugen limiet', + 'server_info' => 'Server informatie', + 'usage' => 'Gebruik', + 'xaxis' => 'Tijd (neemt elke 2 seconden toe)', + ], +]; diff --git a/resources/lang/nl/strings.php b/resources/lang/nl/strings.php new file mode 100644 index 000000000..376feba7f --- /dev/null +++ b/resources/lang/nl/strings.php @@ -0,0 +1,30 @@ + 'Opnieuw', + 'close' => 'Sluiten', + 'connection' => 'Connectie', + 'cpu' => 'CPU', + 'current_password' => 'Huidig wachtwoord', + 'disabled' => 'Uitgeschakeld', + 'email' => 'E-mail', + 'enabled' => 'Ingeschakeld', + 'language' => 'Taal', + 'location' => 'Locatie', + 'login' => 'Inloggen', + 'memory' => 'Geheugen', + 'no' => 'Nee', + 'node' => 'Node', + 'players' => 'Spelers', + 'registered' => 'Geregistreerd', + 'restart' => 'Herstarten', + 'root_administrator' => 'Root Administrator', + 'save' => 'Opslaan', + 'start' => 'Start', + 'status' => 'Status', + 'stop' => 'Stop', + 'submit' => 'Verzenden', + 'success' => 'Succes', + 'whoops' => 'Oeps', + 'yes' => 'Ja', +]; diff --git a/resources/lang/nl/validation.php b/resources/lang/nl/validation.php new file mode 100644 index 000000000..88cff69ac --- /dev/null +++ b/resources/lang/nl/validation.php @@ -0,0 +1,71 @@ + ':attribute moet worden geaccepteerd.', + 'active_url' => ':attribute is geen geldige URL.', + 'after' => ':attribute moet een datum zijn na :date.', + 'alpha' => ':attribute mag alleen letters bevatten.', + 'alpha_dash' => ':attribute mag alleen letters, cijfers, en streepjes bevatten.', + 'alpha_num' => ':attribute mag alleen letters en cijfers bevatten.', + 'array' => ':attribute moet een reeks zijn.', + 'before' => ':attribute moet een datum zijn voor :date.', + 'between' => [ + 'array' => ':attribute moet tussen minimaal :min en maximaal :max delen hebben.', + 'file' => ':attribute moet tussen :min en :max kilobytes groot zijn.', + 'numeric' => ':attribute moet tussen :min en :max zijn.', + 'string' => ':attribute moet minimaal :min en maximaal :max karakters lang zijn.', + ], + 'boolean' => 'Het :attribute veld moet waar of niet waar zijn.', + 'confirmed' => ':attribute bevestiging komt niet overeen.', + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'aangepast-bericht', + ], + ], + 'date' => ':attribute is geen geldige datum.', + 'date_format' => ':attribute komt niet overeen met het formaat :format.', + 'different' => ':attribute en :other moeten verschillend zijn.', + 'digits' => ':attribute moet :digits cijfers lang zijn.', + 'digits_between' => ':attribute moet tussen :min en :max cijfers zijn.', + 'exists' => 'Geselecteerde :attribute is ongeldig.', + 'filled' => 'Het :attribute veld is verplicht.', + 'image' => ':attribute moet een afbeelding zijn.', + 'in' => 'Geselecteerde :attribute is ongeldig.', + 'integer' => ':attribute moet een integer zijn.', + 'ip' => ':attribute moet een geldig IP adres zijn.', + 'json' => ':attribute moet ene geldige JSON string zijn.', + 'max' => [ + 'array' => ':attribute mag niet langer zijn dan maximaal :max delen.', + 'file' => ':attribute mag niet groter zijn dan :max kilobytes.', + 'numeric' => ':attribute mag niet groter zijn dan :max.', + 'string' => ':attribute mag niet groter zijn dan :max karakters.', + ], + 'mimes' => ':attribute moet een bestand van het type: :values zijn.', + 'min' => [ + 'array' => ':attribute moet minimaal :min delen hebben.', + 'file' => ':attribute moet minimaal :min kilobytes groot zijn.', + 'numeric' => ':attribute moet minimaal :min zijn.', + 'string' => ':attribute moet minimaal :min karakters lang zijn.', + ], + 'not_in' => 'Geselecteerd :attribute is ongeldig.', + 'numeric' => ':attribute moet een cijfer zijn.', + 'regex' => 'Het formaat van :attribute is ongeldig.', + 'required' => 'Het veld :attribute is verplicht.', + 'required_if' => 'Het :attribute veld is verplicht wanneer :other :value is', + 'required_with' => 'Het :attribute veld is verplicht wanneer :values aanwezig is.', + 'required_without' => 'Het :attribute veld is verplicht wanneer :values niet aanwezig is.', + 'required_without_all' => 'Het :attribute veld is verplicht wanneer geen :values aanwezig zijn.', + 'required_with_all' => 'Het :attribute veld is verplicht wanneer :values aanwezig is.', + 'same' => ':attribute en :other moeten overeenkomen.', + 'size' => [ + 'array' => ':attribute moet :size delen bevatten.', + 'file' => ':attribute moet :size kilobytes zijn.', + 'numeric' => ':attribute moet :size zijn.', + 'string' => ':attribute moet :size karakters zijn.', + ], + 'string' => ':attribute moet een string zijn.', + 'timezone' => ':attribute moet een geldige zone zijn.', + 'totp' => 'De TOTP token is ongeldig. Is hij verlopen?', + 'unique' => ':attribute is al in gebruik.', + 'url' => 'Het :attribute formaat is ongeldig.', +]; diff --git a/resources/lang/nn/auth.php b/resources/lang/nn/auth.php new file mode 100644 index 000000000..b62512838 --- /dev/null +++ b/resources/lang/nn/auth.php @@ -0,0 +1,4 @@ +. - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ + return [ - /* - |-------------------------------------------------------------------------- - | Authentication Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines are used during authentication for various - | messages that we need to display to the user. You are free to modify - | these language lines according to your application's requirements. - | - */ - 'failed' => 'Estas credenciais não estão de acordo com os nossos registros.', - 'throttle' => 'Muitas tentativas de login. Por favor tente novamente em :seconds segundos.', - 'errorencountered' => 'Ocorreu um erro durante a tentativa de processar esse pedido.', - 'resetpassword' => 'Trocar senha', 'confirmpassword' => 'Confirmar senha', - 'sendlink' => 'Enviar link de troca de senha', 'emailsent' => 'O seu email para trocar de senha está a caminho.', + 'errorencountered' => 'Ocorreu um erro durante a tentativa de processar esse pedido.', + 'failed' => 'Estas credenciais não estão de acordo com os nossos registros.', 'remeberme' => 'Lembre-me', + 'resetpassword' => 'Trocar senha', + 'sendlink' => 'Enviar link de troca de senha', + 'throttle' => 'Muitas tentativas de login. Por favor tente novamente em :seconds segundos.', 'totp_failed' => 'O token TOTP dado é inválido. Por favor tenha certeza que o token gerado pelo seu dispositivo era correto.', ]; diff --git a/resources/lang/pt/base.php b/resources/lang/pt/base.php index ce5f7138d..9860ce422 100644 --- a/resources/lang/pt/base.php +++ b/resources/lang/pt/base.php @@ -1,64 +1,31 @@ . - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ + return [ - /* - |-------------------------------------------------------------------------- - | Base Pterodactyl Language - |-------------------------------------------------------------------------- - | - | These base strings are used throughout the front-end of Pterodactyl but - | not on pages that are used when viewing a server. Those keys are in server.php - | - */ - 'validation_error' => 'Um erro ocorreu durante a validação de suas informações:', - 'confirm' => 'Você tem certeza?', - 'failed' => 'Essas credenciais não estão nos nossos registros.', - 'throttle' => 'Muitas tentativas de login. Por favor tente novamente em :seconds segundos.', - 'view_as_admin' => 'Você está vendo a lista de servidores como administrador. Assim, todos os servidores no sistema são mostrados. Qualquer servidor em que você esteja marcado como dono será mostrado com um ponto azul à esquerda de seu nome.', - 'server_name' => 'Nome do Servidor', - 'no_servers' => 'Você não tem nenhum servidor na sua conta atualmente.', - 'form_error' => 'Os seguintes erros ocorreram durante o processo do seu pedido.', - 'password_req' => 'Senhas devem cumprir o seguinte requiriso: pelo menos uma letra maiúscula, um minúscula, um dígito, e ter 8 caracteres no total.', - 'root_administrator' => 'Mudar isso para "Sim" dará ao usuário permissões completas administrativas ao PufferPanel.', 'account' => [ - 'totp_header' => 'Autenticação em Duas Etapas', - 'totp_qr' => 'QR Code TOTP', - 'totp_enable_help' => 'Você não parece ter a autenticação em duas etapas ativada. Esse método de autenticação adiciona uma barreira adicional prevenindo acesso não autorizado à sua conta. Se você ativar, será necessário fornecer um código gerado no seu celular ou outro dispositivo com suporte a TOTP antes de terminar o login.', - 'totp_apps' => 'Você precisa ter uma aplicação com suporte a TOTP (exemplo: Google Authenticator, DUO Mobile, Authy) para usar essa opção.', - 'totp_enable' => 'Ativar Autenticação em Duas Etapas', - 'totp_disable' => 'Desativar Autenticação em Duas Etapas', - 'totp_token' => 'Token TOTP', - 'totp_disable_help' => 'Para desativar o TOTP nesta conta será necessário fornecer um código TOTP válido. Uma vez validado, a autenticação em duas etapas nesta conta será desativada.', - 'totp_checkpoint_help' => 'Por favor verifique suas configurações de TOTP escanenando o QR Code à direita com o seu aplicativo de TOTP, e então forneça o código de 6 digitos dado pleo aplicativo na caixa abaixo. Aperte a tecla Enter quando tiver acabado.', - 'totp_enabled' => 'Sua conta foi ativada com autenticação TOTP. Por favor clique no botão de fechar desta caixa para finalizar.', - 'totp_enabled_error' => 'O código TOTP fornecido não foi autenticado. Por favor tente novamente.', - 'email_password' => 'Senha do Email', - 'update_user' => 'Atualizar Usuário', 'delete_user' => 'Deletar Usuário', - 'update_email' => 'Atualizar Email', + 'email_password' => 'Senha do Email', 'new_email' => 'Novo Email', 'new_password' => 'Nova Senha', + 'totp_apps' => 'Você precisa ter uma aplicação com suporte a TOTP (exemplo: Google Authenticator, DUO Mobile, Authy) para usar essa opção.', + 'totp_checkpoint_help' => 'Por favor verifique suas configurações de TOTP escanenando o QR Code à direita com o seu aplicativo de TOTP, e então forneça o código de 6 digitos dado pleo aplicativo na caixa abaixo. Aperte a tecla Enter quando tiver acabado.', + 'totp_disable' => 'Desativar Autenticação em Duas Etapas', + 'totp_disable_help' => 'Para desativar o TOTP nesta conta será necessário fornecer um código TOTP válido. Uma vez validado, a autenticação em duas etapas nesta conta será desativada.', + 'totp_enable' => 'Ativar Autenticação em Duas Etapas', + 'totp_enabled' => 'Sua conta foi ativada com autenticação TOTP. Por favor clique no botão de fechar desta caixa para finalizar.', + 'totp_enabled_error' => 'O código TOTP fornecido não foi autenticado. Por favor tente novamente.', + 'totp_enable_help' => 'Você não parece ter a autenticação em duas etapas ativada. Esse método de autenticação adiciona uma barreira adicional prevenindo acesso não autorizado à sua conta. Se você ativar, será necessário fornecer um código gerado no seu celular ou outro dispositivo com suporte a TOTP antes de terminar o login.', + 'totp_header' => 'Autenticação em Duas Etapas', + 'totp_qr' => 'QR Code TOTP', + 'totp_token' => 'Token TOTP', + 'update_email' => 'Atualizar Email', 'update_pass' => 'Atualizar Senha', + 'update_user' => 'Atualizar Usuário', ], + 'confirm' => 'Você tem certeza?', + 'form_error' => 'Os seguintes erros ocorreram durante o processo do seu pedido.', + 'no_servers' => 'Você não tem nenhum servidor na sua conta atualmente.', + 'password_req' => 'Senhas devem cumprir o seguinte requiriso: pelo menos uma letra maiúscula, um minúscula, um dígito, e ter 8 caracteres no total.', + 'server_name' => 'Nome do Servidor', + 'validation_error' => 'Um erro ocorreu durante a validação de suas informações:', + 'view_as_admin' => 'Você está vendo a lista de servidores como administrador. Assim, todos os servidores no sistema são mostrados. Qualquer servidor em que você esteja marcado como dono será mostrado com um ponto azul à esquerda de seu nome.', ]; diff --git a/resources/lang/pt/pagination.php b/resources/lang/pt/pagination.php index 0c3f1baac..b0e58c78b 100644 --- a/resources/lang/pt/pagination.php +++ b/resources/lang/pt/pagination.php @@ -1,48 +1,17 @@ . - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ + return [ - /* - |-------------------------------------------------------------------------- - | Pagination Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines are used by the paginator library to build - | the simple pagination links. You are free to change them to anything - | you want to customize your views to better match your application. - | - */ + 'next' => 'Próximo »', 'previous' => '« Anteriro', - 'next' => 'Próximo »', - 'sidebar' => [ + 'sidebar' => [ 'account_controls' => 'Controle de Conta', - 'account_settings' => 'Configuração da Conta', 'account_security' => 'Segurança da conta', - 'server_controls' => 'Controles do Servidor', - 'servers' => 'Seus Servidores', - 'overview' => 'Visão Geral dos Servidores', + 'account_settings' => 'Configuração da Conta', 'files' => 'Gerenciador de Arquivos', - 'subusers' => 'Configurar Sub-Usuários', 'manage' => 'Configurar Server', + 'overview' => 'Visão Geral dos Servidores', + 'servers' => 'Seus Servidores', + 'server_controls' => 'Controles do Servidor', + 'subusers' => 'Configurar Sub-Usuários', ], ]; diff --git a/resources/lang/pt/passwords.php b/resources/lang/pt/passwords.php index f1e0a2c9c..0b438005f 100644 --- a/resources/lang/pt/passwords.php +++ b/resources/lang/pt/passwords.php @@ -1,37 +1,6 @@ . - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ + return [ - /* - |-------------------------------------------------------------------------- - | Password Reminder Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines are the default lines which match reasons - | that are given by the password broker for a password update attempt - | has failed, such as for an invalid token or invalid new password. - | - */ 'password' => 'Senhas precisam ter ao menos 6 caracteres e combinar com a confirmação.', 'reset' => 'Sua senha foi resetada!', 'sent' => 'Nós te enviamos um email com o link para resetar sua senha!', diff --git a/resources/lang/pt/server.php b/resources/lang/pt/server.php index aff709072..557d61f09 100644 --- a/resources/lang/pt/server.php +++ b/resources/lang/pt/server.php @@ -1,55 +1,29 @@ . - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ + return [ - /* - |-------------------------------------------------------------------------- - | Pterodactyl Language Strings for /server/{server} Routes - |-------------------------------------------------------------------------- - */ 'ajax' => [ 'socket_error' => 'Nós não conseguimos se conectar ao servidor principal do Socket.IO, talvez tenha problemas de conexão acontecendo. O painel pode não funcionar como esperado.', 'socket_status' => 'O estado desse servidor foi alterado para', 'socket_status_crashed' => 'Esse server foi detectado como CRASHED.', ], + 'files' => [ + 'back' => 'Voltar ao Gerenciador de Arquivos', + 'loading' => 'Carregando lista de arquivos, isso pode levar alguns segundos...', + 'saved' => 'Arquivo salvo com sucesso.', + 'yaml_notice' => 'Você está atualmente editando um arquivo YAML. Esses arquivos não aceitam tabs, eles precisam usar espaços. Nós fomos além disso e quando você aprtar tab :dropdown espaços serão colocados.', + ], 'index' => [ 'add_new' => 'Adicionar novo servidor', - 'memory_use' => 'Uso de Memória', - 'cpu_use' => 'Uso de CPU', - 'xaxis' => 'Tempo (Incremento de 2s)', - 'server_info' => 'Informações do Servidor', - 'connection' => 'Conexão Padrão', - 'mem_limit' => 'Limite de Memória', - 'disk_space' => 'Espaço em Disco', - 'control' => 'Controlar Servidor', - 'usage' => 'Uso', 'allocation' => 'Alocação', 'command' => 'Enviar Comando de Console', - ], - 'files' => [ - 'loading' => 'Carregando lista de arquivos, isso pode levar alguns segundos...', - 'yaml_notice' => 'Você está atualmente editando um arquivo YAML. Esses arquivos não aceitam tabs, eles precisam usar espaços. Nós fomos além disso e quando você aprtar tab :dropdown espaços serão colocados.', - 'back' => 'Voltar ao Gerenciador de Arquivos', - 'saved' => 'Arquivo salvo com sucesso.', + 'connection' => 'Conexão Padrão', + 'control' => 'Controlar Servidor', + 'cpu_use' => 'Uso de CPU', + 'disk_space' => 'Espaço em Disco', + 'memory_use' => 'Uso de Memória', + 'mem_limit' => 'Limite de Memória', + 'server_info' => 'Informações do Servidor', + 'usage' => 'Uso', + 'xaxis' => 'Tempo (Incremento de 2s)', ], ]; diff --git a/resources/lang/pt/strings.php b/resources/lang/pt/strings.php index 9d96200cc..d139db6be 100644 --- a/resources/lang/pt/strings.php +++ b/resources/lang/pt/strings.php @@ -1,57 +1,30 @@ . - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ + return [ - /* - |-------------------------------------------------------------------------- - | Standalone Pterodactyl Language Strings - |-------------------------------------------------------------------------- - */ - 'login' => 'Login', - 'password' => 'Senha', - 'email' => 'Email', - 'whoops' => 'Opa', - 'success' => 'Sucesso', - 'location' => 'Localização', - 'node' => 'Node', - 'connection' => 'Conexão', - 'language' => 'Língua', - 'close' => 'Fechar', - 'start' => 'Iniciar', - 'stop' => 'Parar', - 'restart' => 'Reiniciar', - 'save' => 'Salvar', - 'enabled' => 'Ativado', - 'disabled' => 'Desativado', - 'submit' => 'Enviar', - 'current_password' => 'Senha Atual', 'again' => 'Novamente', - 'registered' => 'Registrado', - 'root_administrator' => 'Administrador Root', - 'yes' => 'Sim', - 'no' => 'Não', - 'memory' => 'Memória', + 'close' => 'Fechar', + 'connection' => 'Conexão', 'cpu' => 'CPU', - 'status' => 'Status', + 'current_password' => 'Senha Atual', + 'disabled' => 'Desativado', + 'email' => 'O :attribute precisa ser um endereço de email válido.', + 'enabled' => 'Ativado', + 'language' => 'Língua', + 'location' => 'Localização', + 'login' => 'Login', + 'memory' => 'Memória', + 'no' => 'Não', + 'node' => 'Node', 'players' => 'Jogadores', + 'registered' => 'Registrado', + 'restart' => 'Reiniciar', + 'root_administrator' => 'Mudar isso para "Sim" dará ao usuário permissões completas administrativas ao PufferPanel.', + 'save' => 'Salvar', + 'start' => 'Iniciar', + 'status' => 'Status', + 'stop' => 'Parar', + 'submit' => 'Enviar', + 'success' => 'Sucesso', + 'whoops' => 'Opa', + 'yes' => 'Sim', ]; diff --git a/resources/lang/pt/validation.php b/resources/lang/pt/validation.php index bb8d1abbf..3a7a80ab1 100644 --- a/resources/lang/pt/validation.php +++ b/resources/lang/pt/validation.php @@ -1,124 +1,71 @@ . - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ + return [ - /* - |-------------------------------------------------------------------------- - | Validation Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines contain the default error messages used by - | the validator class. Some of these rules have multiple versions such - | as the size rules. Feel free to tweak each of these messages here. - | - */ - 'accepted' => 'O :attribute precisa ser aceito.', - 'active_url' => 'O :attribute não é uma URL válida.', - 'after' => 'O :attribute precisa ser uma data após :date.', - 'alpha' => 'O :attribute só pode conter letras.', - 'alpha_dash' => 'O :attribute pode apenas conter letras, números, e hífens.', - 'alpha_num' => 'O :attribute pode apenas conter letras e números.', - 'array' => 'O :attribute precisa ser uma lista.', - 'before' => 'O :attribute precisa ser uma data antes de :date.', - 'between' => [ + 'accepted' => 'O :attribute precisa ser aceito.', + 'active_url' => 'O :attribute não é uma URL válida.', + 'after' => 'O :attribute precisa ser uma data após :date.', + 'alpha' => 'O :attribute só pode conter letras.', + 'alpha_dash' => 'O :attribute pode apenas conter letras, números, e hífens.', + 'alpha_num' => 'O :attribute pode apenas conter letras e números.', + 'array' => 'O :attribute precisa ser uma lista.', + 'before' => 'O :attribute precisa ser uma data antes de :date.', + 'between' => [ + 'array' => 'O :attribute precisa estar entre :min e :max itens.', + 'file' => 'O :attribute precisa estar entre :min e :max kilobytes.', 'numeric' => 'O :attribute precisa estar entre :min e :max.', - 'file' => 'O :attribute precisa estar entre :min e :max kilobytes.', - 'string' => 'O :attribute precisa estar entre :min e :max caracteres.', - 'array' => 'O :attribute precisa estar entre :min e :max itens.', + 'string' => 'O :attribute precisa estar entre :min e :max caracteres.', ], - 'boolean' => 'O :attribute precisa ser falso ou verdadeiro.', - 'confirmed' => 'O :attribute de confirmação não combina.', - 'date' => 'O :attribute não é uma data válida.', - 'date_format' => 'O :attribute não combina com o formato :format.', - 'different' => 'O :attribute e :other precisam ser diferentes.', - 'digits' => 'O :attribute precisa ter :digits dígitos.', - 'digits_between' => 'O :attribute precisa estar entre :min e :max dígitos.', - 'email' => 'O :attribute precisa ser um endereço de email válido.', - 'exists' => 'O :attribute selecionado é inválido.', - 'filled' => 'O campo :attribute é obrigatório.', - 'image' => 'O :attribute precisa ser uma imagem.', - 'in' => 'O :attribute é inválido.', - 'integer' => 'O :attribute precisa ser um número inteiro.', - 'ip' => 'O :attribute precisa ser um endereço IP válido.', - 'json' => 'O :attribute precia ser um texto JSON válido.', - 'max' => [ - 'numeric' => 'O :attribute não pode ser maior que :max.', - 'file' => 'O :attribute não pode ser maior que :max kilobytes.', - 'string' => 'O :attribute não pode ter mais do que :max caracteres.', - 'array' => 'O :attribute não pode ter mais do que :max itens.', - ], - 'mimes' => 'O :attribute precisa ser um arquivo do tipo: :values.', - 'min' => [ - 'numeric' => 'O :attribute precisa ser ao menos :min.', - 'file' => 'O :attribute precisa ser ao menos :min kilobytes.', - 'string' => 'O :attribute precisa ter ao menos :min caracteres.', - 'array' => 'O :attribute precisa ter ao menos :min itens.', - ], - 'not_in' => 'O :attribute selecionado é inválido.', - 'numeric' => 'O :attribute precisa ser um número.', - 'regex' => 'O formato de :attribute é inválido.', - 'required' => 'O campo :attribute é obrigatório.', - 'required_if' => 'O campo :attribute é obrigatório quando :other é :value.', - 'required_with' => 'O campo :attribute é obrigatório quando :values está presente.', - 'required_with_all' => 'O campo :attribute é obrigatório quando :values estão presentes.', - 'required_without' => 'O campo :attribute é obrigatório quando :values não estão presentes.', - 'required_without_all' => 'O campo :attribute é obrigatório quando nenhum de :values estão presentes.', - 'same' => 'O campo :attribute e :other precisam combinar.', - 'size' => [ - 'numeric' => 'O :attribute precisa ser :size.', - 'file' => 'O :attribute precisa ser :size kilobytes.', - 'string' => 'O :attribute precisa ser :size caracteres.', - 'array' => 'O :attribute precisa conter :size itens.', - ], - 'string' => 'O :attribute precisa ser um texto.', - 'totp' => 'O token TOTP é inválido. Ele expirou?', - 'timezone' => 'O :attribute precisa ser um fuso horário válido.', - 'unique' => 'O :attribute já foi pego.', - 'url' => 'O formato de :attribute é inválido.', - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute.rule" to name the lines. This makes it quick to - | specify a specific custom language line for a given attribute rule. - | - */ + 'boolean' => 'O :attribute precisa ser falso ou verdadeiro.', + 'confirmed' => 'O :attribute de confirmação não combina.', 'custom' => [ 'attribute-name' => [ 'rule-name' => 'custom-message', ], ], - /* - |-------------------------------------------------------------------------- - | Custom Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap attribute place-holders - | with something more reader friendly such as E-Mail Address instead - | of "email". This simply helps us make messages a little cleaner. - | - */ - 'attributes' => [], + 'date' => 'O :attribute não é uma data válida.', + 'date_format' => 'O :attribute não combina com o formato :format.', + 'different' => 'O :attribute e :other precisam ser diferentes.', + 'digits' => 'O :attribute precisa ter :digits dígitos.', + 'digits_between' => 'O :attribute precisa estar entre :min e :max dígitos.', + 'exists' => 'O :attribute selecionado é inválido.', + 'filled' => 'O campo :attribute é obrigatório.', + 'image' => 'O :attribute precisa ser uma imagem.', + 'in' => 'O :attribute é inválido.', + 'integer' => 'O :attribute precisa ser um número inteiro.', + 'ip' => 'O :attribute precisa ser um endereço IP válido.', + 'json' => 'O :attribute precia ser um texto JSON válido.', + 'max' => [ + 'array' => 'O :attribute não pode ter mais do que :max itens.', + 'file' => 'O :attribute não pode ser maior que :max kilobytes.', + 'numeric' => 'O :attribute não pode ser maior que :max.', + 'string' => 'O :attribute não pode ter mais do que :max caracteres.', + ], + 'mimes' => 'O :attribute precisa ser um arquivo do tipo: :values.', + 'min' => [ + 'array' => 'O :attribute precisa ter ao menos :min itens.', + 'file' => 'O :attribute precisa ser ao menos :min kilobytes.', + 'numeric' => 'O :attribute precisa ser ao menos :min.', + 'string' => 'O :attribute precisa ter ao menos :min caracteres.', + ], + 'not_in' => 'O :attribute selecionado é inválido.', + 'numeric' => 'O :attribute precisa ser um número.', + 'regex' => 'O formato de :attribute é inválido.', + 'required' => 'O campo :attribute é obrigatório.', + 'required_if' => 'O campo :attribute é obrigatório quando :other é :value.', + 'required_with' => 'O campo :attribute é obrigatório quando :values está presente.', + 'required_without' => 'O campo :attribute é obrigatório quando :values não estão presentes.', + 'required_without_all' => 'O campo :attribute é obrigatório quando nenhum de :values estão presentes.', + 'required_with_all' => 'O campo :attribute é obrigatório quando :values estão presentes.', + 'same' => 'O campo :attribute e :other precisam combinar.', + 'size' => [ + 'array' => 'O :attribute precisa conter :size itens.', + 'file' => 'O :attribute precisa ser :size kilobytes.', + 'numeric' => 'O :attribute precisa ser :size.', + 'string' => 'O :attribute precisa ser :size caracteres.', + ], + 'string' => 'O :attribute precisa ser um texto.', + 'timezone' => 'O :attribute precisa ser um fuso horário válido.', + 'totp' => 'O token TOTP é inválido. Ele expirou?', + 'unique' => 'O :attribute já foi pego.', + 'url' => 'O formato de :attribute é inválido.', ]; diff --git a/resources/lang/ro/auth.php b/resources/lang/ro/auth.php new file mode 100644 index 000000000..5dc0237a1 --- /dev/null +++ b/resources/lang/ro/auth.php @@ -0,0 +1,13 @@ + 'Confirmă Parola', + 'emailsent' => 'Emailul de resetare al parolei va fi trimis.', + 'errorencountered' => 'S-a întâmpinat o problema la procesarea cererii tale.', + 'failed' => 'Aceste detalii nu corespund valorilor noastre.', + 'remeberme' => 'Reține-mă', + 'resetpassword' => 'Resetează Parola', + 'sendlink' => 'Trimite Link de Resetare al Parolei', + 'throttle' => 'Prea multe încercări de logare. Încearcă iar în :seconds secunde.', + 'totp_failed' => 'Codul TOTP introdus nu este valid. Asigură-te că ai introdus corect codul generat de dispozitiv.', +]; diff --git a/resources/lang/ro/base.php b/resources/lang/ro/base.php new file mode 100644 index 000000000..dcd4abc48 --- /dev/null +++ b/resources/lang/ro/base.php @@ -0,0 +1,31 @@ + [ + 'delete_user' => 'Șterge Utilizatorul', + 'email_password' => 'Trimite Parola prin Email', + 'new_email' => 'Email Nou', + 'new_password' => 'Parola Nouă', + 'totp_apps' => 'Trebuie să ai o aplicație care suportă TOTP (ex. Google Authentificator, DUO Mobile, Authy, Enpass) să folosești această funcție.', + 'totp_checkpoint_help' => 'Te rog verifică setările tale TOTP scanând Codul QR cu aplicația ta de autentificare de pe telefon, și după introdu codul de 6 cifre generat de aplicație în spațiul următor. Apasă butonul trimite când ai terminat.', + 'totp_disable' => 'Dezactivează Autentificarea în 2 Pași', + 'totp_disable_help' => 'Ca să dezactivezi TOTP pe acest cont, trebuie să introduci un Cod TOTP valid. O dată validat, protecția TOTP pe acest cont va fi dezactivată.', + 'totp_enable' => 'Activează Autentificarea prin 2 Pași', + 'totp_enabled' => 'Verificarea TOTP a fost activată pe contul tău. Te rog apasă să închizi această fereastră pentru a finaliza.', + 'totp_enabled_error' => 'Codul introdus nu a putut fi verificat. Te rog încearcă iar.', + 'totp_enable_help' => 'Nu ai Autentificarea prin 2 Pași activată. Această modalitate de autentificare adaugă un plus de protecție contului tău. Dacă ai activat asta, va fi necesar să introduci un Cod generat de aplicația de pe telefonul tău înainte de a te loga.', + 'totp_header' => 'Autentificare prin 2 Pași', + 'totp_qr' => 'Codul QR TOTP', + 'totp_token' => 'Codul TOTP', + 'update_email' => 'Actualizează Emailul', + 'update_pass' => 'Actualizează Parola', + 'update_user' => 'Actualizează Utilizatorul', + ], + 'confirm' => 'Ești sigur?', + 'form_error' => 'S-au întâmpinat următoarele erori la validarea cererii trimise.', + 'no_servers' => 'Nu există nici un server atribuit contului tău.', + 'password_req' => 'Parola trebuie să respecte următoarele cerințe: cel puțin o literă mare, o literă mică, o cifră, și să fie în total din cel puțin 8 caractere.', + 'server_name' => 'Numele Serverului', + 'validation_error' => 'S-a întâmpinat o problema la validarea datelor introduse:', + 'view_as_admin' => 'Vezi acestă listă cu servere deoarece ești admin. De asemenea, vezi toate serverele instalate în sistem. Orice Server la care ești setat proprietar o să apare un punct albastru în fața numelui.', +]; diff --git a/resources/lang/ro/pagination.php b/resources/lang/ro/pagination.php new file mode 100644 index 000000000..0277e92d9 --- /dev/null +++ b/resources/lang/ro/pagination.php @@ -0,0 +1,17 @@ + 'Următorul »', + 'previous' => '« Precedent', + 'sidebar' => [ + 'account_controls' => 'Setările Contului', + 'account_security' => 'Securitatea Contului', + 'account_settings' => 'Setările Contului', + 'files' => 'Manager de Fișiere', + 'manage' => 'Controlează Serverul', + 'overview' => 'Interfața Serverului', + 'servers' => 'Serverele Tale', + 'server_controls' => 'Controlează Serverul', + 'subusers' => 'Setează Sub-Utilizatorii', + ], +]; diff --git a/resources/lang/ro/passwords.php b/resources/lang/ro/passwords.php new file mode 100644 index 000000000..9836dc25c --- /dev/null +++ b/resources/lang/ro/passwords.php @@ -0,0 +1,9 @@ + 'Parola trebuie să conțină cel puțin 6 caractere și să o confirmi corect.', + 'reset' => 'Parola ta a fost resetată!', + 'sent' => 'Ți-am trimis pe e-mail linkul de resetare al parolei!', + 'token' => 'Acest cod de resetare al parolei este invalid.', + 'user' => 'Nu s-a găsit nici un utilizator cu acestă adresă de e-mail.', +]; diff --git a/resources/lang/ro/server.php b/resources/lang/ro/server.php new file mode 100644 index 000000000..11bc07b12 --- /dev/null +++ b/resources/lang/ro/server.php @@ -0,0 +1,29 @@ + [ + 'socket_error' => 'Nu s-a putut conecta la Serverul Socket.IO, pot exista probleme de conectivitate. Panoul poate să nu funcționeze corect.', + 'socket_status' => 'Statusul acestui server a fost schimbat în: ', + 'socket_status_crashed' => 'Serverul a fost detectat ca CRASHED.', + ], + 'files' => [ + 'back' => 'Înapoi la Managerul de Fișiere', + 'loading' => 'Se încarcă lista de fișiere, poate dura câteva secunde...', + 'saved' => 'Fișierul a fost salvat cu succes.', + 'yaml_notice' => 'Editezi un fișier YAML. Aceste fișiere nu acceptă taburi, ele trebuie să folosească spații. De aceea, dacă vei apasă tab se vor insera :dropdown spații.', + ], + 'index' => [ + 'add_new' => 'Adaugă un Server Nou', + 'allocation' => 'Alocarea', + 'command' => 'Introdu Comanda', + 'connection' => 'Conexiune de bază', + 'control' => 'Controlează Serverul', + 'cpu_use' => 'Utilizarea CPU', + 'disk_space' => 'Spațiu pe Disc', + 'memory_use' => 'Utilizarea Memoriei', + 'mem_limit' => 'Limita Memoriei', + 'server_info' => 'Informațiile Serverului', + 'usage' => 'Utilizare', + 'xaxis' => 'Timp (2s adăugate)', + ], +]; diff --git a/resources/lang/ro/strings.php b/resources/lang/ro/strings.php new file mode 100644 index 000000000..beabdeb37 --- /dev/null +++ b/resources/lang/ro/strings.php @@ -0,0 +1,30 @@ + 'Iar', + 'close' => 'Închide', + 'connection' => 'Conexiunea', + 'cpu' => 'CPU', + 'current_password' => 'Parola Curentă', + 'disabled' => 'Dezactivat', + 'email' => 'Email', + 'enabled' => 'Activat', + 'language' => 'Limba', + 'location' => 'Locația', + 'login' => 'Loghează-te', + 'memory' => 'Memorie', + 'no' => 'Nu', + 'node' => 'Nod', + 'players' => 'Jucători', + 'registered' => 'Înregistrat', + 'restart' => 'Repornește', + 'root_administrator' => 'Administrator cu Acces Total', + 'save' => 'Salvează', + 'start' => 'Pornește', + 'status' => 'Status', + 'stop' => 'Oprește', + 'submit' => 'Trimite', + 'success' => 'Succes', + 'whoops' => 'Ups', + 'yes' => 'Da', +]; diff --git a/resources/lang/ro/validation.php b/resources/lang/ro/validation.php new file mode 100644 index 000000000..56a7a18d4 --- /dev/null +++ b/resources/lang/ro/validation.php @@ -0,0 +1,71 @@ + ':attribute trebuie să fie acceptat.', + 'active_url' => ':attribute nu e un URL valid.', + 'after' => ':attribute trebuie să fie o dată după :date.', + 'alpha' => ':attribute trebuie să conțină doar litere.', + 'alpha_dash' => ':attribute trebuie să conțină doar litere, cifre și spații.', + 'alpha_num' => ':attribute trebuie să conțină doar litere și numere.', + 'array' => ':attribute trebuie să fie mai multe.', + 'before' => ':attribute trebuie să fie o dată după :date.', + 'between' => [ + 'array' => ':attribute trebuie să aibă între :min și :max elemente.', + 'file' => ':attribute trebuie să fie între :min și :max kilobytes.', + 'numeric' => ':attribute trebuie să fie între :min și :max.', + 'string' => ':attribute trebuie să fie între :min și :max caractere.', + ], + 'boolean' => 'Câmpul :attribute trebuie să fie true sau false.', + 'confirmed' => 'Confirmarea :attribute nu corespunde.', + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], + 'date' => ':attribute nu e o dată validă.', + 'date_format' => ':attribute nu respectă formatul :format.', + 'different' => ':attribute și :other trebuie să difere.', + 'digits' => ':attribute trebuie să fie din :digits cifre.', + 'digits_between' => ':attribute trebuie să între :min și :max caractere.', + 'exists' => ':attribute selectat este invalid.', + 'filled' => 'Câmpul :attribute este necesar să fie completat.', + 'image' => ':attribute trebuie să fie o imagine.', + 'in' => ':attibute selectat este invalid.', + 'integer' => ':attribute trebuie să fie un întreg.', + 'ip' => ':attribute trebuie să fie o adresă IP validă.', + 'json' => ':attribute trebuie să fie un șir JSON validă.', + 'max' => [ + 'array' => ':attribute nu trebuie să aibă mai mult de :max elemente.', + 'file' => ':attribute nu trebuie să fie mai mare de :max kilobytes.', + 'numeric' => ':attribute nu trebuie să fie mai mare de :max.', + 'string' => ':attribute nu trebuie să fie mai mare de :max caractere.', + ], + 'mimes' => ':attribute trebuie să fie un fișier de tip: :values.', + 'min' => [ + 'array' => ':attribute trebuie să aibă cel puțin :min elemente.', + 'file' => ':attribute trebuie să fie mai mic de :min kilobytes.', + 'numeric' => ':attribute trebuie să fie cel puțin :min.', + 'string' => ':attribute trebuie să fie cel puțin din :min caractere.', + ], + 'not_in' => ':attribute selectat nu este valid.', + 'numeric' => ':attribute nu e un număr.', + 'regex' => 'Formatul :attribute este invalid.', + 'required' => 'Câmpul :attribute este necesar să fie completat.', + 'required_if' => 'Câmpul :attribute este necesar să fie completat când :other este :value.', + 'required_with' => 'Câmpul :attribute e necesar să fie completat când :values este prezent.', + 'required_without' => 'Câmpul :attribute este necesar să fie completat când :values nu este prezent.', + 'required_without_all' => 'Câmpul :attribute este necesar să fie completat când niciunul din :values este prezent.', + 'required_with_all' => 'Câmpul :attribute este necesar să fie completat când :values este prezent.', + 'same' => ':attribute și :other nu corespund.', + 'size' => [ + 'array' => ':attribute trebuie să conțină :size elemente.', + 'file' => ':attribute trebuie să aibă :size kilobytes.', + 'numeric' => ':attribute trebuie să fie din :size.', + 'string' => ':attribute trebuie să fie din :size caractere.', + ], + 'string' => ':attribute trebuie să fie un șir/serie.', + 'timezone' => ':attribute trebuie să fie o zonă validă.', + 'totp' => 'Codul TOTP este invalid. Verifică dacă a expirat.', + 'unique' => ':attribute este deja folosit.', + 'url' => 'Formatul :attribute este invalid.', +]; diff --git a/resources/lang/ru/auth.php b/resources/lang/ru/auth.php new file mode 100644 index 000000000..b51b9bf78 --- /dev/null +++ b/resources/lang/ru/auth.php @@ -0,0 +1,13 @@ + 'Подтвердить пароль', + 'emailsent' => 'Письмо со сбросом пароля Вам отправлено.', + 'errorencountered' => 'Произошла ошибка при попытке обработать этот запрос.', + 'failed' => 'Эти учетные данные не соответствуют нашим записям.', + 'remeberme' => 'Запомнить меня', + 'resetpassword' => 'Сброс пароля', + 'sendlink' => 'Выслать ссылку для сброса пароля', + 'throttle' => 'Слишком много попыток входа. Попробуйте снова через :seconds секунд.', + 'totp_failed' => 'TOTP токен недействителен. Пожалуйста, убедитесь, что токен, сформированный устройством является действительным.', +]; diff --git a/resources/lang/ru/base.php b/resources/lang/ru/base.php new file mode 100644 index 000000000..468968c65 --- /dev/null +++ b/resources/lang/ru/base.php @@ -0,0 +1,31 @@ + [ + 'delete_user' => 'Удалить пользователя', + 'email_password' => 'Пароль Email', + 'new_email' => 'Новое письмо', + 'new_password' => 'Новый пароль', + 'totp_apps' => 'Вы должны воспользоваться TOTP приложением (т.е. Google Authenticator, DUO Mobile, Authy, Enpass) для использования этой опции.', + 'totp_checkpoint_help' => 'Пожалуйста, проверьте настройки TOTP путем сканирования QR-код приложением аутентификатором, введите код из 6 цифр, которые сгенерированы приложением.', + 'totp_disable' => 'Отключить двухфакторную аутентификацию', + 'totp_disable_help' => 'Для того, чтобы отключить TOTP на этот аккаунте Вам необходимо предоставить действительный токен TOTP.', + 'totp_enable' => 'Включить двухфакторную аутентификацию', + 'totp_enabled' => 'К Вашей учетной записи подключена проверка TOTP. Пожалуйста, нажмите на кнопку закрыть.', + 'totp_enabled_error' => 'TOTP токен невозможно проверить. Пожалуйста, попробуйте снова.', + 'totp_enable_help' => 'У Вас ещё не включена функция двухфакторной проверки подлинности. Этот метод аутентификации добавляет дополнительный условие, предотвращающий несанкционированный доступ к вашей учетной записи. Если вы включите его - вам потребуется ввести код, сформированный на вашем телефоне или другом устройстве с поддержкой TOTP.', + 'totp_header' => 'Двухфакторная аутентификация', + 'totp_qr' => 'TOTP QR Код', + 'totp_token' => 'TOTP Токен', + 'update_email' => 'Обновить Email', + 'update_pass' => 'Обновить пароль', + 'update_user' => 'Обновить пользователя', + ], + 'confirm' => 'Вы уверены?', + 'form_error' => 'Следующие ошибки были обнаружены при попытке обработать этот запрос.', + 'no_servers' => 'На этом аккаунте в настоящее время нет серверов.', + 'password_req' => 'Пароли должны отвечать следующим требованиям: по крайней мере, один символ верхнего регистра, один символ нижнего регистра, одна цифра, и быть не менее 8 символов в длину.', + 'server_name' => 'Имя сервера', + 'validation_error' => 'Произошла ошибка при проверке Ваших данных:', + 'view_as_admin' => 'Вы просматриваете список серверов как администратор. Отображаются все установленные сервера. Сервер, помеченный синей точкой, принадлежит этому владельцу.', +]; diff --git a/resources/lang/ru/pagination.php b/resources/lang/ru/pagination.php new file mode 100644 index 000000000..ad6e21878 --- /dev/null +++ b/resources/lang/ru/pagination.php @@ -0,0 +1,17 @@ + 'туда »', + 'previous' => '« сюда', + 'sidebar' => [ + 'account_controls' => 'Управление аккаунтом', + 'account_security' => 'Безопасность аккаунта', + 'account_settings' => 'Настройка аккаунта', + 'files' => 'Файл Менеджер', + 'manage' => 'Управление сервером', + 'overview' => 'Обзор сервера', + 'servers' => 'Ваши сервера', + 'server_controls' => 'Управление сервером', + 'subusers' => 'Управление суб-пользователями', + ], +]; diff --git a/resources/lang/ru/passwords.php b/resources/lang/ru/passwords.php new file mode 100644 index 000000000..86e9821a3 --- /dev/null +++ b/resources/lang/ru/passwords.php @@ -0,0 +1,9 @@ + 'Пароли должны быть не менее шести символов.', + 'reset' => 'Ваш пароль был сброшен!', + 'sent' => 'Мы отправили ссылку сброса пароля!', + 'token' => 'Токен сброса пароля недействителен.', + 'user' => 'Мы не можем найти пользователя с таким email.', +]; diff --git a/resources/lang/ru/server.php b/resources/lang/ru/server.php new file mode 100644 index 000000000..bca9a2a81 --- /dev/null +++ b/resources/lang/ru/server.php @@ -0,0 +1,29 @@ + [ + 'socket_error' => 'Нам не удалось подключиться к Socket.IO сервера, из за проблемы сети. Панель может работать не так, как ожидалось.', + 'socket_status' => 'Этот сервер изменил статус на', + 'socket_status_crashed' => 'Этот сервер определен как CRASHED.', + ], + 'files' => [ + 'back' => 'Обратно в Файлменеджер', + 'loading' => 'Загружается список файлов, подождите несколько секунд...', + 'saved' => 'Файл успешно сохранен.', + 'yaml_notice' => 'Вы редактируете YAML файл. Вместо символов табуляции используйте :dropdown пробелы.', + ], + 'index' => [ + 'add_new' => 'Добавить новый сервер', + 'allocation' => 'Распределение', + 'command' => 'Введите команду консоли', + 'connection' => 'Соединение по умолчанию', + 'control' => 'Управление сервером', + 'cpu_use' => 'Использование процессора', + 'disk_space' => 'Дисковое пространство', + 'memory_use' => 'Использование памяти', + 'mem_limit' => 'Лимит памяти', + 'server_info' => 'Информация о сервере', + 'usage' => 'Использование', + 'xaxis' => 'Время (2с интервал)', + ], +]; diff --git a/resources/lang/ru/strings.php b/resources/lang/ru/strings.php new file mode 100644 index 000000000..8a0413230 --- /dev/null +++ b/resources/lang/ru/strings.php @@ -0,0 +1,30 @@ + 'Снова', + 'close' => 'Закрыть', + 'connection' => 'Соединение', + 'cpu' => 'CPU', + 'current_password' => 'Текущий пароль', + 'disabled' => 'Отключено', + 'email' => 'Email', + 'enabled' => 'Включено', + 'language' => 'Язык', + 'location' => 'Местоположение', + 'login' => 'Логин', + 'memory' => 'Память', + 'no' => 'Нет', + 'node' => 'Нода', + 'players' => 'Игроков', + 'registered' => 'Зарегистрирован', + 'restart' => 'Рестарт', + 'root_administrator' => 'Главный администратор', + 'save' => 'Сохранить', + 'start' => 'Старт', + 'status' => 'Статус', + 'stop' => 'Стоп', + 'submit' => 'Отправить', + 'success' => 'Успешно', + 'whoops' => 'Whoops', + 'yes' => 'Да', +]; diff --git a/resources/lang/ru/validation.php b/resources/lang/ru/validation.php new file mode 100644 index 000000000..6ed7ed67e --- /dev/null +++ b/resources/lang/ru/validation.php @@ -0,0 +1,71 @@ + ':attribute должен быть принят.', + 'active_url' => ':attribute неверный URL.', + 'after' => ':attribute должно быть после даты :date.', + 'alpha' => ':attribute может содержать только буквы.', + 'alpha_dash' => ':attribute может содержать буквы, числа и тире.', + 'alpha_num' => ':attribute может содержать буквы и цифры.', + 'array' => ':attribute должен быть массивом.', + 'before' => ':attribute должен быть перед датой :date.', + 'between' => [ + 'array' => ':attribute должен быть между :min и :max.', + 'file' => ':attribute должен быть между :min и :max килобайт.', + 'numeric' => ':attribute должен быть между :min и :max.', + 'string' => ':attribute должен быть между :min и :max символов.', + ], + 'boolean' => ':attribute поле должно быть true или false.', + 'confirmed' => ':attribute подтверждение не совпадает.', + 'custom' => [ + 'attribute-name' => [ + 'rule-name' => 'custom-message', + ], + ], + 'date' => ':attribute неправильная дата.', + 'date_format' => ':attribute не соответствует формату :format.', + 'different' => ':attribute и :other должны бить различными.', + 'digits' => ':attributeдолжны быть :digits цифрами.', + 'digits_between' => ':attribute должны быть между :min и :max цифрами.', + 'exists' => 'Выбран недопустимый :attribute.', + 'filled' => ':attribute поле, обязательное для заполнения.', + 'image' => ':attribute должен быть изображением.', + 'in' => 'Выбран недопустимый :attribute.', + 'integer' => ':attribute должен быть целым числом.', + 'ip' => ':attribute должен быть IP адресом.', + 'json' => ':attribute должен быть JSON строкой.', + 'max' => [ + 'array' => ':attribute не может иметь более :max позиций.', + 'file' => ':attribute не может быть больше, чем :max килобайт.', + 'numeric' => ':attribute не может быть больше, чем :max.', + 'string' => ':attribute не может быть больше, че :max символов.', + ], + 'mimes' => ':attribute должен быть файлом: :values.', + 'min' => [ + 'array' => ':attribute должны иметь по крайней мере :min позиций.', + 'file' => ':attribute должен быть не менее :min килобайт.', + 'numeric' => ':attribute должен быть не менее :min.', + 'string' => ':attribute должен быть не менее :min символов.', + ], + 'not_in' => 'Выбран недопустимый :attribute.', + 'numeric' => ':attribute должен быть числом.', + 'regex' => ':attribute недопустимый формат.', + 'required' => ':attribute обязательно к заполнению.', + 'required_if' => ':attribute должно быть заполнено когда :other в :value.', + 'required_with' => ':attribute поле должно быть заполнено когда :values присутствует.', + 'required_without' => ':attribute должно быть заполнено когда :values не присутствует.', + 'required_without_all' => ':attribute должно быть заполнено когда пустое значение :values.', + 'required_with_all' => ':attribute должно быть заполнено когда :values присутствует.', + 'same' => ':attribute и :other должны совпадать.', + 'size' => [ + 'array' => ':attribute должен содержать :size позиций.', + 'file' => ':attribute должен быть :size килобайт.', + 'numeric' => ':attribute должен быть :size.', + 'string' => ':attribute должен быть :size символов.', + ], + 'string' => ':attribute должен быть строкой.', + 'timezone' => ':attribute должен быть часовым поясом.', + 'totp' => 'Тotp токен недействителен. Просрочен?', + 'unique' => ':attribute уже использован.', + 'url' => ':attribute недопустимый формат.', +]; diff --git a/resources/lang/sv/auth.php b/resources/lang/sv/auth.php new file mode 100644 index 000000000..d2492aef1 --- /dev/null +++ b/resources/lang/sv/auth.php @@ -0,0 +1,6 @@ + 'Återställ lösenord', + 'sendlink' => 'SendSkicka återställningslänk för att återställa dittt lösenord', +]; diff --git a/resources/lang/sv/base.php b/resources/lang/sv/base.php new file mode 100644 index 000000000..2df2cda31 --- /dev/null +++ b/resources/lang/sv/base.php @@ -0,0 +1,8 @@ + [ + 'totp_header' => 'Två-faktors autentisering', + ], + 'view_as_admin' => 'Du visar den här serverlistan som admin, därför är alla servrar installerade synliga. Serverar som du äger är markerade med en blå cirkel till vänster om servern.', +]; diff --git a/resources/lang/sv/pagination.php b/resources/lang/sv/pagination.php new file mode 100644 index 000000000..b62512838 --- /dev/null +++ b/resources/lang/sv/pagination.php @@ -0,0 +1,4 @@ +not simply copy and pasting the code below unless you know what you are doing. You should run the auto-installer or auto-updater to setup the daemon.
    -
    {
    -    "web": {
    -        "host": "0.0.0.0",
    -        "listen": {{ $node->daemonListen }},
    -        "ssl": {
    -            "enabled": {{ $node->scheme === 'https' ? 'true' : 'false' }},
    -            "certificate": "/etc/letsencrypt/live/{{ $node->fqdn }}/fullchain.pem",
    -            "key": "/etc/letsencrypt/live/{{ $node->fqdn }}/privkey.pem"
    -        }
    -    },
    -    "docker": {
    -        "socket": "/var/run/docker.sock",
    -        "autoupdate_images": true
    -    },
    -    "sftp": {
    -        "path": "{{ $node->daemonBase }}",
    -        "port": {{ $node->daemonSFTP }},
    -        "container": "ptdl-sftp"
    -    },
    -    "query": {
    -        "kill_on_fail": true,
    -        "fail_limit": 5
    -    },
    -    "logger": {
    -        "path": "logs/",
    -        "src": false,
    -        "level": "info",
    -        "period": "1d",
    -        "count": 3
    -    },
    -    "remote": {
    -        "base": "{{ config('app.url') }}",
    -        "download": "{{ route('remote.download') }}",
    -        "installed": "{{ route('remote.install') }}"
    -    },
    -    "uploads": {
    -        "size_limit": {{ $node->upload_size }}
    -    },
    -    "keys": [
    -        "{{ $node->daemonSecret }}"
    -    ]
    -}
    +

    To simplify the configuration of nodes it is possible to fetch the config from the panel. A token is required for this process. The button below will generate a token and provide you with the commands necessary for automatic configuration of the node. Be aware that these tokens are only valid for 5 minutes.

    +

    + +

    +
    +
    +
    {{ $node->getConfigurationAsJson(true) }}
    @@ -536,6 +501,27 @@ $(document).ready(function () { }); }); + $('#configTokenBtn').on('click', function (event) { + $.getJSON('{{ route('admin.nodes.configuration-token', $node->id) }}') + .done(function (data) { + swal({ + type: 'success', + title: 'Token created.', + text: 'Here is your token: '+data.token+'
    ' + + 'It will expire at ' + data.expires_at + '

    ' + + '

    To auto-configure your node run
    npm run configure -- --panel-url '+window.location.protocol+'//{{ config('app.url') }} --token '+data.token+'

    ', + html: true + }) + }) + .fail(function () { + swal({ + title: 'Error', + text: 'Something went wrong creating your token.', + type: 'error' + }); + }) + }) + $('.cloneElement').on('click', function (event) { event.preventDefault(); var rnd = randomKey(10); diff --git a/resources/views/admin/servers/new.blade.php b/resources/views/admin/servers/new.blade.php index 0aa691047..5eda226f2 100644 --- a/resources/views/admin/servers/new.blade.php +++ b/resources/views/admin/servers/new.blade.php @@ -43,7 +43,7 @@
    -

    Character limits: a-zA-Z0-9_- and [Space] (max 35 characters)

    +

    Character limits: a-z A-Z 0-9 _ - . and [Space] (max 200 characters).

    @@ -171,7 +171,7 @@
    -

    If you do not want to limit CPU usage set the value to 0. To determine a value, take the number physical cores and multiply it by 100. For example, on a quad core system (4 * 100 = 400) there is 400% available. To limit a server to using half of a single core, you would set the value to 50. To allow a server to use up to two physical cores, set the value to 200. BlockIO should be a value between 10 and 1000. Please see this documentation for more information about it.

    +

    If you do not want to limit CPU usage set the value to 0. To determine a value, take the number physical cores and multiply it by 100. For example, on a quad core system (4 * 100 = 400) there is 400% available. To limit a server to using half of a single core, you would set the value to 50. To allow a server to use up to two physical cores, set the value to 200. BlockIO should be a value between 10 and 1000. Please see this documentation for more information about it.

    diff --git a/resources/views/layouts/master.blade.php b/resources/views/layouts/master.blade.php index f7c7d383d..1f6feb8e0 100644 --- a/resources/views/layouts/master.blade.php +++ b/resources/views/layouts/master.blade.php @@ -208,14 +208,12 @@ @if (null !== Auth::user() && Auth::user()->root_admin == 1) diff --git a/resources/views/server/files/index.blade.php b/resources/views/server/files/index.blade.php index c664414ba..987556b63 100644 --- a/resources/views/server/files/index.blade.php +++ b/resources/views/server/files/index.blade.php @@ -58,9 +58,13 @@ - - - +@if(App::environment('production')) + {!! Theme::js('js/filemanager.min.js') !!} +@else + {!! Theme::js('js/files/index.js') !!} + {!! Theme::js('js/files/contextmenu.js') !!} + {!! Theme::js('js/files/actions.js') !!} +@endif + {!! Theme::js('js/plugins/minecraft/eula.js') !!} @endif