Merge branch 'develop' into feature/vuejs

This commit is contained in:
Dane Everitt 2019-03-09 11:19:07 -08:00
commit a66d7a3417
No known key found for this signature in database
GPG Key ID: EEA66103B3D71F53
73 changed files with 1867 additions and 558 deletions

View File

@ -1,9 +1,17 @@
---
name: "\U0001F41B Bug Report"
about: Create a report to help us resolve a bug or error
about: For reporting code or design bugs with the software. DO NOT REPORT APACHE/NGINX/PHP CONFIGURATION ISSUES.
---
DO NOT REPORT ISSUES CONFIGURING: SSL, PHP, APACHE, NGINX, YOUR MACHINE, SSH, SFTP, ETC. ON THIS GITHUB TRACKER.
For assistance installating this software, as well as debugging issues with dependencies, please use our discord server: https://discord.gg/pterodactyl
You MUST complete all of the below information when reporting a bug, failure to do so will result in closure of your issue. PLEASE stop spamming our tracker with "bugs" that are not related to this project.
**STOP: READ FIRST, AND THEN DELETE THE ABOVE LINES**
**Background (please complete the following information):**
* Panel or Daemon:
* Version of Panel/Daemon:

View File

@ -6,3 +6,9 @@ about: 'Visit our Discord for installation help: https://pterodactyl.io/discord'
We use GitHub issues only to discuss about Pterodactyl bugs and new features. For
this kind of questions about using Pterodactyl, please visit our Discord for assistance: https://pterodactyl.io/discord
DO NOT REPORT ISSUES CONFIGURING: SSL, PHP, APACHE, NGINX, YOUR MACHINE, SSH, SFTP, ETC. ON THIS GITHUB TRACKER.
For assistance installating this software, as well as debugging issues with dependencies, please use our discord server: https://discord.gg/pterodactyl
PLEASE stop spamming our tracker with "bugs" that are not related to this project.

View File

@ -3,17 +3,45 @@ 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.7.13 (Derelict Dermodactylus)
### Fixed
* Fixes a bug with the location update API endpoint throwing an error due to an unexected response value.
* Fixes bug where node creation API endpoint was not correctly requiring the `disk_overallocate` key.
* Prevents an exception from being thrown when a database with the same name is created on two different hosts.
* Fixes the redis password not saving correctly when setting up the environment from the command line.
* Fixes a bug with transaction handling in many areas of the application that would cause validation error messages
and other session data to not be persisted properly when using the database as the session driver.
* Fix a bug introduced at some point in the past that causes internal data integrity exceptions to not bubble up to
the user correctly, leading to extraneous and confusing exception messages.
* Fixes a bug causing servers to not be marked as having failed installation in some cases.
### Changed
* `allocation_limit` for servers now defaults to a null value, and is not required in PATCH/POST requests when adding
a server through the API.
* The `PATCH` endpoint for `/api/applications/servers/{server}/build` now accepts an array called `limits` to match
the response from the server `GET` endpoint.
### Added
* The server listing for a node is now paginated to 25 servers per page to improve performance on large nodes.
## v0.7.12 (Derelict Dermodactylus)
### Fixed
* Fixes an issue with the locations API endpoint referencing an invalid namespace.
* Fixes the `store()` function on the locations API not working due to an incorrect return typehint.
* Fixes daemon secrets not being able to be reset on a Node.
* Fixes an issue where files were not editable due to missing URL encoding in the file manager.
* Fixed checking of language changes
* Fixed Spigot egg not building versions other than `latest`.
* Fixed the Forge egg install script.
* Fixes a bug that would ignore the `skip_scripts` setting when creating or editing a server.
### Updated
* Upgraded core to use Laravel `5.7.14`.
* Updated Simplified Chinese translation pack.
### Added
* Added support for opening and editing Python files through the web editor.
* Adds Russian translation.
## v0.7.11 (Derelict Dermodactylus)
### Fixed

View File

@ -178,9 +178,7 @@ class AppSettingsCommand extends Command
if ($askForRedisPassword) {
$this->output->comment(trans('command/messages.environment.app.redis_pass_help'));
$this->variables['REDIS_PASSWORD'] = $this->option('redis-pass') ?? $this->output->askHidden(
trans('command/messages.environment.app.redis_password'), function () {
return '';
}
trans('command/messages.environment.app.redis_password')
);
}

View File

@ -55,16 +55,6 @@ interface NodeRepositoryInterface extends RepositoryInterface, SearchableInterfa
*/
public function loadNodeAllocations(Node $node, bool $refresh = false): Node;
/**
* Return a node with all of the servers attached to that node.
*
* @param int $id
* @return \Pterodactyl\Models\Node
*
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
*/
public function getNodeServers(int $id): Node;
/**
* Return a collection of nodes for all locations to use in server creation UI.
*

View File

@ -152,4 +152,14 @@ interface ServerRepositoryInterface extends RepositoryInterface, SearchableInter
* @return int
*/
public function getSuspendedServersCount(): int;
/**
* Returns all of the servers that exist for a given node in a paginated response.
*
* @param int $node
* @param int $limit
*
* @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
*/
public function loadAllServersForNode(int $node, int $limit): LengthAwarePaginator;
}

View File

@ -6,6 +6,7 @@ use Exception;
use PDOException;
use Psr\Log\LoggerInterface;
use Illuminate\Container\Container;
use Illuminate\Database\Connection;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Session\TokenMismatchException;
use Illuminate\Validation\ValidationException;
@ -14,6 +15,7 @@ use Illuminate\Database\Eloquent\ModelNotFoundException;
use Symfony\Component\HttpKernel\Exception\HttpException;
use Pterodactyl\Exceptions\Repository\RecordNotFoundException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
class Handler extends ExceptionHandler
{
@ -137,6 +139,41 @@ class Handler extends ExceptionHandler
*/
public function render($request, Exception $exception)
{
$connections = Container::getInstance()->make(Connection::class);
// If we are currently wrapped up inside a transaction, we will roll all the way
// back to the beginning. This needs to happen, otherwise session data does not
// get properly persisted.
//
// This is kind of a hack, and ideally things like this should be handled as
// much as possible at the code level, but there are a lot of spots that do a
// ton of actions and were written before this bug discovery was made.
//
// @see https://github.com/pterodactyl/panel/pull/1468
if ($connections->transactionLevel()) {
$connections->rollBack(0);
}
// Because of some breaking change snuck into a Laravel update that didn't get caught
// by any of the tests, exceptions implementing the HttpExceptionInterface get marked
// as being HttpExceptions, but aren't actually implementing the HttpException abstract.
//
// This is incredibly annoying because we can't just temporarily override the handler to
// allow these (at least without taking on a high maintenance cost). Laravel 5.8 fixes this,
// so when we update (or have updated) this code can be removed.
//
// @see https://github.com/laravel/framework/pull/25975
// @todo remove this code when upgrading to Laravel 5.8
if ($exception instanceof HttpExceptionInterface && ! $exception instanceof HttpException) {
$exception = new HttpException(
$exception->getStatusCode(),
$exception->getMessage(),
$exception,
$exception->getHeaders(),
$exception->getCode()
);
}
return parent::render($request, $exception);
}

View File

@ -2,19 +2,28 @@
namespace Pterodactyl\Exceptions\Repository;
class RecordNotFoundException extends RepositoryException
use Illuminate\Http\Response;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
class RecordNotFoundException extends RepositoryException implements HttpExceptionInterface
{
/**
* Handle request to render this exception to a user. Returns the default
* 404 page view.
* Returns the status code.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
* @return int
*/
public function render($request)
public function getStatusCode()
{
if (! config('app.debug')) {
return response()->view('errors.404', [], 404);
}
return Response::HTTP_NOT_FOUND;
}
/**
* Returns response headers.
*
* @return array
*/
public function getHeaders()
{
return [];
}
}

View File

@ -24,6 +24,7 @@ use Pterodactyl\Services\Allocations\AssignmentService;
use Pterodactyl\Services\Helpers\SoftwareVersionService;
use Pterodactyl\Http\Requests\Admin\Node\NodeFormRequest;
use Pterodactyl\Contracts\Repository\NodeRepositoryInterface;
use Pterodactyl\Contracts\Repository\ServerRepositoryInterface;
use Pterodactyl\Http\Requests\Admin\Node\AllocationFormRequest;
use Pterodactyl\Services\Allocations\AllocationDeletionService;
use Pterodactyl\Contracts\Repository\LocationRepositoryInterface;
@ -32,6 +33,11 @@ use Pterodactyl\Http\Requests\Admin\Node\AllocationAliasFormRequest;
class NodesController extends Controller
{
/**
* @var \Pterodactyl\Services\Allocations\AllocationDeletionService
*/
protected $allocationDeletionService;
/**
* @var \Prologue\Alerts\AlertsMessageBag
*/
@ -72,6 +78,11 @@ class NodesController extends Controller
*/
protected $repository;
/**
* @var \Pterodactyl\Contracts\Repository\ServerRepositoryInterface
*/
protected $serverRepository;
/**
* @var \Pterodactyl\Services\Nodes\NodeUpdateService
*/
@ -81,10 +92,6 @@ class NodesController extends Controller
* @var \Pterodactyl\Services\Helpers\SoftwareVersionService
*/
protected $versionService;
/**
* @var \Pterodactyl\Services\Allocations\AllocationDeletionService
*/
private $allocationDeletionService;
/**
* NodesController constructor.
@ -98,6 +105,7 @@ class NodesController extends Controller
* @param \Pterodactyl\Services\Nodes\NodeDeletionService $deletionService
* @param \Pterodactyl\Contracts\Repository\LocationRepositoryInterface $locationRepository
* @param \Pterodactyl\Contracts\Repository\NodeRepositoryInterface $repository
* @param \Pterodactyl\Contracts\Repository\ServerRepositoryInterface $serverRepository
* @param \Pterodactyl\Services\Nodes\NodeUpdateService $updateService
* @param \Pterodactyl\Services\Helpers\SoftwareVersionService $versionService
*/
@ -111,6 +119,7 @@ class NodesController extends Controller
NodeDeletionService $deletionService,
LocationRepositoryInterface $locationRepository,
NodeRepositoryInterface $repository,
ServerRepositoryInterface $serverRepository,
NodeUpdateService $updateService,
SoftwareVersionService $versionService
) {
@ -123,6 +132,7 @@ class NodesController extends Controller
$this->deletionService = $deletionService;
$this->locationRepository = $locationRepository;
$this->repository = $repository;
$this->serverRepository = $serverRepository;
$this->updateService = $updateService;
$this->versionService = $versionService;
}
@ -178,8 +188,6 @@ class NodesController extends Controller
*
* @param \Pterodactyl\Models\Node $node
* @return \Illuminate\View\View
*
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
*/
public function viewIndex(Node $node)
{
@ -235,19 +243,17 @@ class NodesController extends Controller
/**
* Shows the server listing page for a specific node.
*
* @param int $node
* @param \Pterodactyl\Models\Node $node
* @return \Illuminate\View\View
*
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
*/
public function viewServers($node)
public function viewServers(Node $node)
{
$node = $this->repository->getNodeServers($node);
$servers = $this->serverRepository->loadAllServersForNode($node->id, 25);
Javascript::put([
'node' => collect($node->makeVisible('daemonSecret'))->only(['scheme', 'fqdn', 'daemonListen', 'daemonSecret']),
]);
return view('admin.nodes.view.servers', ['node' => $node]);
return view('admin.nodes.view.servers', ['node' => $node, 'servers' => $servers]);
}
/**

View File

@ -13,8 +13,8 @@ use Pterodactyl\Transformers\Api\Application\LocationTransformer;
use Pterodactyl\Http\Controllers\Api\Application\ApplicationApiController;
use Pterodactyl\Http\Requests\Api\Application\Locations\GetLocationRequest;
use Pterodactyl\Http\Requests\Api\Application\Locations\GetLocationsRequest;
use Pterodactyl\Http\Requests\Api\Application\Locations\DeleteLocationRequest;
use Pterodactyl\Http\Requests\Api\Application\Locations\StoreLocationRequest;
use Pterodactyl\Http\Requests\Api\Application\Locations\DeleteLocationRequest;
use Pterodactyl\Http\Requests\Api\Application\Locations\UpdateLocationRequest;
class LocationController extends ApplicationApiController

View File

@ -5,10 +5,14 @@ namespace Pterodactyl\Http\Controllers\Daemon;
use Cache;
use Illuminate\Http\Request;
use Pterodactyl\Models\Node;
use Illuminate\Http\Response;
use Pterodactyl\Models\Server;
use Illuminate\Http\JsonResponse;
use Pterodactyl\Http\Controllers\Controller;
use Pterodactyl\Repositories\Eloquent\ServerRepository;
use Pterodactyl\Events\Server\Installed as ServerInstalled;
use Illuminate\Contracts\Events\Dispatcher as EventDispatcher;
use Pterodactyl\Exceptions\Repository\RecordNotFoundException;
class ActionController extends Controller
{
@ -16,15 +20,21 @@ class ActionController extends Controller
* @var \Illuminate\Contracts\Events\Dispatcher
*/
private $eventDispatcher;
/**
* @var \Pterodactyl\Repositories\Eloquent\ServerRepository
*/
private $repository;
/**
* ActionController constructor.
*
* @param \Illuminate\Contracts\Events\Dispatcher $eventDispatcher
* @param \Pterodactyl\Repositories\Eloquent\ServerRepository $repository
* @param \Illuminate\Contracts\Events\Dispatcher $eventDispatcher
*/
public function __construct(EventDispatcher $eventDispatcher)
public function __construct(ServerRepository $repository, EventDispatcher $eventDispatcher)
{
$this->eventDispatcher = $eventDispatcher;
$this->repository = $repository;
}
/**
@ -32,34 +42,47 @@ class ActionController extends Controller
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*
* @throws \Pterodactyl\Exceptions\Model\DataValidationException
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
*/
public function markInstall(Request $request)
public function markInstall(Request $request): JsonResponse
{
$server = Server::where('uuid', $request->input('server'))->with('node')->first();
if (! $server) {
return response()->json([
try {
/** @var \Pterodactyl\Models\Server $server */
$server = $this->repository->findFirstWhere([
'uuid' => $request->input('server'),
]);
} catch (RecordNotFoundException $exception) {
return JsonResponse::create([
'error' => 'No server by that ID was found on the system.',
], 422);
], Response::HTTP_UNPROCESSABLE_ENTITY);
}
if (! $server->relationLoaded('node')) {
$server->load('node');
}
$hmac = $request->input('signed');
$status = $request->input('installed');
if (! hash_equals(base64_decode($hmac), hash_hmac('sha256', $server->uuid, $server->node->daemonSecret, true))) {
return response()->json([
if (! hash_equals(base64_decode($hmac), hash_hmac('sha256', $server->uuid, $server->getRelation('node')->daemonSecret, true))) {
return JsonResponse::create([
'error' => 'Signed HMAC was invalid.',
], 403);
], Response::HTTP_FORBIDDEN);
}
$server->installed = ($status === 'installed') ? 1 : 2;
$server->save();
$this->repository->update($server->id, [
'installed' => ($status === 'installed') ? 1 : 2,
], true, true);
// Only fire event if server installed successfully.
if ($server->installed === 1) {
if ($status === 'installed') {
$this->eventDispatcher->dispatch(new ServerInstalled($server));
}
return response()->json([]);
// Don't use a 204 here, the daemon is hard-checking for a 200 code.
return JsonResponse::create([]);
}
/**

View File

@ -2,6 +2,8 @@
namespace Pterodactyl\Http\Requests\Admin\Servers\Databases;
use Illuminate\Validation\Rule;
use Illuminate\Database\Query\Builder;
use Pterodactyl\Http\Requests\Admin\AdminFormRequest;
class StoreServerDatabaseRequest extends AdminFormRequest
@ -14,7 +16,15 @@ class StoreServerDatabaseRequest extends AdminFormRequest
public function rules(): array
{
return [
'database' => 'required|string|min:1|max:24',
'database' => [
'required',
'string',
'min:1',
'max:24',
Rule::unique('databases')->where(function (Builder $query) {
$query->where('database_host_id', $this->input('database_host_id') ?? 0);
}),
],
'remote' => 'required|string|regex:/^[0-9%.]{1,15}$/',
'database_host_id' => 'required|integer|exists:database_hosts,id',
];

View File

@ -30,6 +30,6 @@ class UpdateLocationRequest extends StoreLocationRequest
return collect(Location::getUpdateRulesForId($locationId))->only([
'short',
'long',
]);
])->toArray();
}
}

View File

@ -36,7 +36,7 @@ class StoreNodeRequest extends ApplicationApiRequest
'memory',
'memory_overallocate',
'disk',
'disk_overallocation',
'disk_overallocate',
'upload_size',
'daemonListen',
'daemonSFTP',

View File

@ -2,6 +2,8 @@
namespace Pterodactyl\Http\Requests\Api\Application\Servers\Databases;
use Illuminate\Validation\Rule;
use Illuminate\Database\Query\Builder;
use Pterodactyl\Services\Acl\Api\AdminAcl;
use Pterodactyl\Http\Requests\Api\Application\ApplicationApiRequest;
@ -25,7 +27,15 @@ class StoreServerDatabaseRequest extends ApplicationApiRequest
public function rules(): array
{
return [
'database' => 'required|string|min:1|max:24',
'database' => [
'required',
'string',
'min:1',
'max:24',
Rule::unique('databases')->where(function (Builder $query) {
$query->where('database_host_id', $this->input('host') ?? 0);
}),
],
'remote' => 'required|string|regex:/^[0-9%.]{1,15}$/',
'host' => 'required|integer|exists:database_hosts,id',
];

View File

@ -3,6 +3,7 @@
namespace Pterodactyl\Http\Requests\Api\Application\Servers;
use Pterodactyl\Models\Server;
use Illuminate\Support\Collection;
class UpdateServerBuildConfigurationRequest extends ServerWriteRequest
{
@ -17,15 +18,29 @@ class UpdateServerBuildConfigurationRequest extends ServerWriteRequest
return [
'allocation' => $rules['allocation_id'],
'memory' => $rules['memory'],
'swap' => $rules['swap'],
'io' => $rules['io'],
'cpu' => $rules['cpu'],
'disk' => $rules['disk'],
'limits' => 'sometimes|array',
'limits.memory' => $this->requiredToOptional('memory', $rules['memory'], true),
'limits.swap' => $this->requiredToOptional('swap', $rules['swap'], true),
'limits.io' => $this->requiredToOptional('io', $rules['io'], true),
'limits.cpu' => $this->requiredToOptional('cpu', $rules['cpu'], true),
'limits.disk' => $this->requiredToOptional('disk', $rules['disk'], true),
// Legacy rules to maintain backwards compatable API support without requiring
// a major version bump.
//
// @see https://github.com/pterodactyl/panel/issues/1500
'memory' => $this->requiredToOptional('memory', $rules['memory']),
'swap' => $this->requiredToOptional('swap', $rules['swap']),
'io' => $this->requiredToOptional('io', $rules['io']),
'cpu' => $this->requiredToOptional('cpu', $rules['cpu']),
'disk' => $this->requiredToOptional('disk', $rules['disk']),
'add_allocations' => 'bail|array',
'add_allocations.*' => 'integer',
'remove_allocations' => 'bail|array',
'remove_allocations.*' => 'integer',
'feature_limits' => 'required|array',
'feature_limits.databases' => $rules['database_limit'],
'feature_limits.allocations' => $rules['allocation_limit'],
@ -46,6 +61,15 @@ class UpdateServerBuildConfigurationRequest extends ServerWriteRequest
$data['allocation_limit'] = $data['feature_limits']['allocations'];
unset($data['allocation'], $data['feature_limits']);
// Adjust the limits field to match what is expected by the model.
if (! empty($data['limits'])) {
foreach ($data['limits'] as $key => $value) {
$data[$key] = $value;
}
unset($data['limits']);
}
return $data;
}
@ -65,4 +89,30 @@ class UpdateServerBuildConfigurationRequest extends ServerWriteRequest
'feature_limits.allocations' => 'Allocation Limit',
];
}
/**
* Converts existing rules for certain limits into a format that maintains backwards
* compatability with the old API endpoint while also supporting a more correct API
* call.
*
* @param string $field
* @param array $rules
* @param bool $limits
* @return array
*
* @see https://github.com/pterodactyl/panel/issues/1500
*/
protected function requiredToOptional(string $field, array $rules, bool $limits = false)
{
if (! in_array('required', $rules)) {
return $rules;
}
return (new Collection($rules))
->filter(function ($value) {
return $value !== 'required';
})
->prepend($limits ? 'required_with:limits' : 'required_without:limits')
->toArray();
}
}

View File

@ -59,6 +59,7 @@ class AccountDataFormRequest extends FrontendUserFormRequest
'name_first' => array_get($modelRules, 'name_first'),
'name_last' => array_get($modelRules, 'name_last'),
'username' => array_get($modelRules, 'username'),
'language' => array_get($modelRules, 'language'),
];
break;
default:

View File

@ -63,7 +63,7 @@ class Server extends Model implements CleansAttributes, ValidableContract
'image' => 'required',
'startup' => 'required',
'database_limit' => 'present',
'allocation_limit' => 'present',
'allocation_limit' => 'sometimes',
];
/**
@ -87,7 +87,7 @@ class Server extends Model implements CleansAttributes, ValidableContract
'startup' => 'string',
'skip_scripts' => 'boolean',
'image' => 'string|max:255',
'installed' => 'boolean',
'installed' => 'in:0,1,2',
'database_limit' => 'nullable|integer|min:0',
'allocation_limit' => 'nullable|integer|min:0',
];

View File

@ -6,10 +6,8 @@ use Generator;
use Pterodactyl\Models\Node;
use Illuminate\Support\Collection;
use Pterodactyl\Repositories\Concerns\Searchable;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
use Pterodactyl\Contracts\Repository\NodeRepositoryInterface;
use Pterodactyl\Exceptions\Repository\RecordNotFoundException;
class NodeRepository extends EloquentRepository implements NodeRepositoryInterface
{
@ -140,25 +138,6 @@ class NodeRepository extends EloquentRepository implements NodeRepositoryInterfa
return $node;
}
/**
* Return a node with all of the servers attached to that node.
*
* @param int $id
* @return \Pterodactyl\Models\Node
*
* @throws \Pterodactyl\Exceptions\Repository\RecordNotFoundException
*/
public function getNodeServers(int $id): Node
{
try {
return $this->getBuilder()->with([
'servers.user', 'servers.nest', 'servers.egg',
])->findOrFail($id, $this->getColumns());
} catch (ModelNotFoundException $exception) {
throw new RecordNotFoundException;
}
}
/**
* Return a collection of nodes for all locations to use in server creation UI.
*

View File

@ -2,6 +2,7 @@
namespace Pterodactyl\Repositories\Eloquent;
use Pterodactyl\Models\Node;
use Pterodactyl\Models\User;
use Webmozart\Assert\Assert;
use Pterodactyl\Models\Server;
@ -338,4 +339,20 @@ class ServerRepository extends EloquentRepository implements ServerRepositoryInt
{
return $this->getBuilder()->where('suspended', true)->count();
}
/**
* Returns all of the servers that exist for a given node in a paginated response.
*
* @param int $node
* @param int $limit
*
* @return \Illuminate\Contracts\Pagination\LengthAwarePaginator
*/
public function loadAllServersForNode(int $node, int $limit): LengthAwarePaginator
{
return $this->getBuilder()
->with(['user', 'nest', 'egg'])
->where('node_id', '=', $node)
->paginate($limit);
}
}

View File

@ -2,5 +2,4 @@ coverage:
status:
project: off
patch: off
comment:
layout: "diff"
comment: false

View File

@ -21,7 +21,7 @@
"doctrine/dbal": "^2.5",
"fideloper/proxy": "^4.0",
"guzzlehttp/guzzle": "^6.3",
"hashids/hashids": "^2.0",
"hashids/hashids": "^3.0",
"igaster/laravel-theme": "^2.0.6",
"laracasts/utilities": "^3.0",
"laravel/framework": "~5.7.14",
@ -37,8 +37,8 @@
"sofa/eloquence-base": "v5.6.2",
"sofa/eloquence-validable": "v5.6",
"spatie/laravel-fractal": "^5.4",
"webmozart/assert": "^1.2",
"znck/belongs-to-through": "^2.3"
"staudenmeir/belongs-to-through": "~2.3.0",
"webmozart/assert": "^1.2"
},
"require-dev": {
"barryvdh/laravel-debugbar": "^3.2",

View File

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

View File

@ -0,0 +1,40 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class FixUniqueIndexToAccountForHost extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('databases', function (Blueprint $table) {
$table->dropUnique(['database']);
$table->dropUnique(['username']);
$table->unique(['database_host_id', 'database']);
$table->unique(['database_host_id', 'username']);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('databases', function (Blueprint $table) {
$table->dropUnique(['database_host_id', 'database']);
$table->dropUnique(['database_host_id', 'username']);
$table->unique(['database']);
$table->unique(['username']);
});
}
}

View File

@ -17,7 +17,7 @@ class NestSeeder extends Seeder
private $repository;
/**
* MinecraftNestSeeder constructor.
* NestSeeder constructor.
*
* @param \Pterodactyl\Services\Nests\NestCreationService $creationService
* @param \Pterodactyl\Contracts\Repository\NestRepositoryInterface $repository

View File

@ -18,7 +18,7 @@
"scripts": {
"installation": {
"script": "#!\/bin\/ash\n# Bungeecord Installation Script\n#\n# Server Files: \/mnt\/server\napk update\napk add curl\n\ncd \/mnt\/server\n\nif [ -z \"${BUNGEE_VERSION}\" ] || [ \"${BUNGEE_VERSION}\" == \"latest\" ]; then\n BUNGEE_VERSION=\"lastStableBuild\"\nfi\n\ncurl -o ${SERVER_JARFILE} https:\/\/ci.md-5.net\/job\/BungeeCord\/${BUNGEE_VERSION}\/artifact\/bootstrap\/target\/BungeeCord.jar",
"container": "alpine:3.4",
"container": "alpine:3.9",
"entrypoint": "ash"
}
},
@ -42,4 +42,4 @@
"rules": "required|regex:\/^([\\w\\d._-]+)(\\.jar)$\/"
}
]
}
}

View File

@ -3,7 +3,7 @@
"meta": {
"version": "PTDL_v1"
},
"exported_at": "2018-06-25T15:47:07-04:00",
"exported_at": "2019-02-07T07:47:35-05:00",
"name": "Forge Minecraft",
"author": "support@pterodactyl.io",
"description": "Minecraft Forge Server. Minecraft Forge is a modding API (Application Programming Interface), which makes it easier to create mods, and also make sure mods are compatible with each other.",
@ -17,8 +17,8 @@
},
"scripts": {
"installation": {
"script": "#!\/bin\/ash\r\n# Forge Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napk update\r\napk add curl\r\n\r\nif [ -z \"$MC_VERSION\" ] || [ \"$MC_VERSION\" == \"latest\" ]; then\r\n FORGE_VERSION=$(curl -sl http:\/\/files.minecraftforge.net\/maven\/net\/minecraftforge\/forge\/ | grep -A1 Latest | grep -o -e '[1]\\.[0-9][0-9]]\\?\\.\\?[0-9]\\?[0-9] - [0-9][0-9]\\.[0-9][0-9]\\.[0-9]\\?[0-9]\\.[0-9][0-9][0-9][0-9]' | sed 's\/ \/\/g')\r\nelse\r\n FORGE_VERSION=$(curl -sl http:\/\/files.minecraftforge.net\/maven\/net\/minecraftforge\/forge\/index_$MC_VERSION.html | grep -A1 Latest | grep -o -e '[1]\\.[0-9][0-9]]\\?\\.\\?[0-9]\\?[0-9] - [0-9][0-9]\\.[0-9][0-9]\\.[0-9]\\?[0-9]\\.[0-9][0-9][0-9][0-9]' | sed 's\/ \/\/g')\r\nfi\r\n\r\ncd \/mnt\/server\r\n\r\necho -e \"\\nDownloading Forge Version $FORGE_VERSION\\n\"\r\ncurl -sS http:\/\/files.minecraftforge.net\/maven\/net\/minecraftforge\/forge\/$FORGE_VERSION\/forge-$FORGE_VERSION-installer.jar -o installer.jar\r\ncurl -sS http:\/\/files.minecraftforge.net\/maven\/net\/minecraftforge\/forge\/$FORGE_VERSION\/forge-$FORGE_VERSION-universal.jar -o $SERVER_JARFILE\r\n\r\necho -e \"\\nInstalling forge server usint the installer jar file.\\n\"\r\njava -jar installer.jar --installServer\r\n\r\necho -e \"\\nDeleting installer jar file and cleaning up.\\n\"\r\nrm -rf installer.jar",
"container": "frolvlad\/alpine-oraclejdk8:cleaned",
"script": "#!\/bin\/ash\r\n# Forge Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napk update\r\napk add curl\r\n\r\nif [ -z \"$MC_VERSION\" ] || [ \"$MC_VERSION\" == \"latest\" ]; then\r\n FORGE_VERSION=$(echo $(curl -sSl http:\/\/files.minecraftforge.net\/maven\/net\/minecraftforge\/forge\/ | grep -A2 Latest | grep small) | grep -o -e '[1].[0-9]*.[0-9]* - [0-9]*.[0-9]*.[0-9]*.[0-9]*' | sed 's\/ \/\/g')\r\nelse\r\n FORGE_VERSION=$(echo $(curl -sl http:\/\/files.minecraftforge.net\/maven\/net\/minecraftforge\/forge\/index_$MC_VERSION.html | grep -A2 Latest | grep small) | grep -o -e '[1].[0-9]*.[0-9]* - [0-9]*.[0-9]*.[0-9]*.[0-9]*' | sed 's\/ \/\/g')\r\nfi\r\n\r\ncd \/mnt\/server\r\n\r\necho -e \"\\nDownloading Forge Version $FORGE_VERSION\\n\"\r\ncurl -sS http:\/\/files.minecraftforge.net\/maven\/net\/minecraftforge\/forge\/$FORGE_VERSION\/forge-$FORGE_VERSION-installer.jar -o installer.jar\r\ncurl -sS http:\/\/files.minecraftforge.net\/maven\/net\/minecraftforge\/forge\/$FORGE_VERSION\/forge-$FORGE_VERSION-universal.jar -o $SERVER_JARFILE\r\n\r\necho -e \"\\nInstalling forge server usint the installer jar file.\\n\"\r\njava -jar installer.jar --installServer\r\n\r\necho -e \"\\nDeleting installer jar file and cleaning up.\\n\"\r\nrm -rf installer.jar",
"container": "openjdk:8-alpine",
"entrypoint": "ash"
}
},
@ -42,4 +42,4 @@
"rules": "required|string|max:20"
}
]
}
}

View File

@ -0,0 +1,63 @@
{
"_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO",
"meta": {
"version": "PTDL_v1"
},
"exported_at": "2019-02-27T22:23:55-05:00",
"name": "Paper",
"author": "parker@pterodactyl.io",
"description": "High performance Spigot fork that aims to fix gameplay and mechanics inconsistencies.",
"image": "quay.io\/pterodactyl\/core:java",
"startup": "java -Xms128M -Xmx{{SERVER_MEMORY}}M -jar {{SERVER_JARFILE}}",
"config": {
"files": "{\r\n \"server.properties\": {\r\n \"parser\": \"properties\",\r\n \"find\": {\r\n \"server-ip\": \"0.0.0.0\",\r\n \"server-port\": \"{{server.build.default.port}}\"\r\n }\r\n }\r\n}",
"startup": "{\r\n \"done\": \")! For help, type \",\r\n \"userInteraction\": [\r\n \"Go to eula.txt for more info.\"\r\n ]\r\n}",
"logs": "{}",
"stop": "stop"
},
"scripts": {
"installation": {
"script": "#!\/bin\/ash\r\n# Paper Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napk add --no-cache --update curl jq\r\n\r\nif [ -n \"${DL_PATH}\" ]; then\r\n echo -e \"using supplied download url\"\r\n DOWNLOAD_URL=`eval echo $(echo ${DL_PATH} | sed -e 's\/{{\/${\/g' -e 's\/}}\/}\/g')`\r\nelse\r\n VER_EXISTS=`curl -s https:\/\/papermc.io\/api\/v1\/paper | jq -r --arg VERSION $MINECRAFT_VERSION '.versions[] | IN($VERSION)' | grep true`\r\n LATEST_PAPER_VERSION=`curl -s https:\/\/papermc.io\/api\/v1\/paper | jq -r '.versions' | jq -r '.[0]'`\r\n \r\n if [ \"${VER_EXISTS}\" == \"true\" ]; then\r\n echo -e \"Version is valid. Using version ${MINECRAFT_VERSION}\"\r\n else\r\n echo -e \"Using the latest paper version\"\r\n MINECRAFT_VERSION=${LATEST_PAPER_VERSION}\r\n fi\r\n \r\n BUILD_EXISTS=`curl -s https:\/\/papermc.io\/api\/v1\/paper\/${MINECRAFT_VERSION} | jq -r --arg BUILD ${BUILD_NUMBER} '.builds.all[] | IN($BUILD)' | grep true`\r\n LATEST_PAPER_BUILD=`curl -s https:\/\/papermc.io\/api\/v1\/paper\/${MINECRAFT_VERSION} | jq -r '.builds.latest'`\r\n \r\n if [ \"${BUILD_EXISTS}\" == \"true\" ] || [ ${BUILD_NUMBER} == \"latest\" ]; then\r\n echo -e \"Build is valid. Using version ${BUILD_NUMBER}\"\r\n else\r\n echo -e \"Using the latest paper build\"\r\n BUILD_NUMBER=${LATEST_PAPER_BUILD}\r\n fi\r\n \r\n echo \"Version being downloaded\"\r\n echo -e \"MC Version: ${MINECRAFT_VERSION}\"\r\n echo -e \"Build: ${BUILD_NUMBER}\"\r\n DOWNLOAD_URL=https:\/\/papermc.io\/api\/v1\/paper\/${MINECRAFT_VERSION}\/${BUILD_NUMBER}\/download \r\nfi\r\n\r\ncd \/mnt\/server\r\n\r\necho -e \"running curl -o ${SERVER_JARFILE} ${DOWNLOAD_URL}\"\r\n\r\ncurl -o ${SERVER_JARFILE} ${DOWNLOAD_URL}\r\n\r\necho -e \"Downloading MC server.properties\"\r\ncurl -o server.properties https:\/\/raw.githubusercontent.com\/parkervcp\/eggs\/master\/minecraft_java\/server.properties",
"container": "alpine:3.9",
"entrypoint": "ash"
}
},
"variables": [
{
"name": "Minecraft Version",
"description": "The version of minecraft to download. \r\n\r\nLeave at latest to always get the latest version. Invalid versions will default to latest.",
"env_variable": "MINECRAFT_VERSION",
"default_value": "latest",
"user_viewable": 1,
"user_editable": 0,
"rules": "nullable|string|max:20"
},
{
"name": "Server Jar File",
"description": "The name of the server jarfile to run the server with.",
"env_variable": "SERVER_JARFILE",
"default_value": "server.jar",
"user_viewable": 1,
"user_editable": 1,
"rules": "required|string|max:20"
},
{
"name": "Download Path",
"description": "A URL to use to download a server.jar rather than the ones in the install script. This is not user viewable.",
"env_variable": "DL_PATH",
"default_value": "",
"user_viewable": 0,
"user_editable": 0,
"rules": "nullable|string"
},
{
"name": "Build Number",
"description": "The build number for the paper release.\r\n\r\nLeave at latest to always get the latest version. Invalid versions will default to latest.",
"env_variable": "BUILD_NUMBER",
"default_value": "latest",
"user_viewable": 1,
"user_editable": 0,
"rules": "required|string|max:20"
}
]
}

View File

@ -1,54 +0,0 @@
{
"_comment": "DO NOT EDIT: FILE GENERATED AUTOMATICALLY BY PTERODACTYL PANEL - PTERODACTYL.IO",
"meta": {
"version": "PTDL_v1"
},
"exported_at": "2018-11-16T02:14:51-05:00",
"name": "Spigot",
"author": "support@pterodactyl.io",
"description": "Spigot is the most widely-used modded Minecraft server software in the world. It powers many of the top Minecraft server networks around to ensure they can cope with their huge player base and ensure the satisfaction of their players. Spigot works by reducing and eliminating many causes of lag, as well as adding in handy features and settings that help make your job of server administration easier.",
"image": "quay.io\/pterodactyl\/core:java-glibc",
"startup": "java -Xms128M -Xmx{{SERVER_MEMORY}}M -jar {{SERVER_JARFILE}}",
"config": {
"files": "{\r\n \"server.properties\": {\r\n \"parser\": \"properties\",\r\n \"find\": {\r\n \"server-ip\": \"0.0.0.0\",\r\n \"enable-query\": \"true\",\r\n \"server-port\": \"{{server.build.default.port}}\",\r\n \"query.port\": \"{{server.build.default.port}}\"\r\n }\r\n }\r\n}",
"startup": "{\r\n \"done\": \")! For help, type \",\r\n \"userInteraction\": [\r\n \"Go to eula.txt for more info.\"\r\n ]\r\n}",
"logs": "{\r\n \"custom\": false,\r\n \"location\": \"logs\/latest.log\"\r\n}",
"stop": "stop"
},
"scripts": {
"installation": {
"script": "#!\/bin\/ash\r\n# Spigot Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\n\r\n## Only download if a path is provided, otherwise continue.\r\nif [ ! -z \"${DL_PATH}\" ]; then\r\n apk update\r\n apk add curl\r\n\r\n cd \/mnt\/server\r\n\r\n MODIFIED_DOWNLOAD=`eval echo $(echo ${DL_PATH} | sed -e 's\/{{\/${\/g' -e 's\/}}\/}\/g')`\r\n curl -sSL -o ${SERVER_JARFILE} ${MODIFIED_DOWNLOAD}\r\nelse\r\n apk add --no-cache curl git openjdk8 openssl bash\r\n \r\n cd \/srv\/\r\n \r\n wget https:\/\/hub.spigotmc.org\/jenkins\/job\/BuildTools\/lastSuccessfulBuild\/artifact\/target\/BuildTools.jar\r\n \r\n mv BuildTools.jar \/srv\/\r\n\r\n java -jar BuildTools.jar --rev ${DL_VERSION}\r\n\r\n mv spigot-*.jar \/mnt\/server\/${SERVER_JARFILE}\r\nfi",
"container": "alpine:3.7",
"entrypoint": "ash"
}
},
"variables": [
{
"name": "Server Jar File",
"description": "The name of the server jarfile to run the server with.",
"env_variable": "SERVER_JARFILE",
"default_value": "server.jar",
"user_viewable": 1,
"user_editable": 1,
"rules": "required|regex:\/^([\\w\\d._-]+)(\\.jar)$\/"
},
{
"name": "Spigot Version",
"description": "The version of Spigot to download (using the --rev tag). Use \"latest\" for latest.",
"env_variable": "DL_VERSION",
"default_value": "latest",
"user_viewable": 1,
"user_editable": 1,
"rules": "required|string|between:3,7"
},
{
"name": "Download Path",
"description": "A URL to use to download Spigot rather than building it on the server. This is not user viewable. Use <code>{{DL_VERSION}}<\/code> in the URL to automatically insert the assigned version into the URL. If you do not enter a URL Spigot will build directly in the container (this will fail on low memory containers).",
"env_variable": "DL_PATH",
"default_value": "",
"user_viewable": 0,
"user_editable": 0,
"rules": "nullable|string"
}
]
}

View File

@ -18,7 +18,7 @@
"scripts": {
"installation": {
"script": "#!\/bin\/ash\n# Sponge Installation Script\n#\n# Server Files: \/mnt\/server\n\napk update\napk add curl\n\ncd \/mnt\/server\n\ncurl -sSL \"https:\/\/repo.spongepowered.org\/maven\/org\/spongepowered\/spongevanilla\/${SPONGE_VERSION}\/spongevanilla-${SPONGE_VERSION}.jar\" -o ${SERVER_JARFILE}",
"container": "alpine:3.4",
"container": "alpine:3.9",
"entrypoint": "ash"
}
},
@ -42,4 +42,4 @@
"rules": "required|regex:\/^([\\w\\d._-]+)(\\.jar)$\/"
}
]
}
}

View File

@ -18,7 +18,7 @@
"scripts": {
"installation": {
"script": "#!\/bin\/ash\r\n# Vanilla MC Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napk update\r\napk add curl jq\r\n\r\ncd \/mnt\/server\r\n\r\nLATEST_VERSION=`curl https:\/\/launchermeta.mojang.com\/mc\/game\/version_manifest.json | jq -r '.latest.release'`\r\n\r\nif [ -z \"$VANILLA_VERSION\" ] || [ \"$VANILLA_VERSION\" == \"latest\" ]; then\r\n MANIFEST_URL=$(curl https:\/\/launchermeta.mojang.com\/mc\/game\/version_manifest.json | jq .versions | jq -r '.[] | select(.id == \"'$LATEST_VERSION'\") | .url')\r\nelse\r\n MANIFEST_URL=$(curl https:\/\/launchermeta.mojang.com\/mc\/game\/version_manifest.json | jq .versions | jq -r '.[] | select(.id == \"'$VANILLA_VERSION'\") | .url')\r\nfi\r\n\r\nDOWNLOAD_URL=`curl $MANIFEST_URL | jq .downloads.server | jq -r '. | .url'`\r\n\r\ncurl -o ${SERVER_JARFILE} $DOWNLOAD_URL",
"container": "alpine:3.7",
"container": "alpine:3.9",
"entrypoint": "ash"
}
},

View File

@ -8,7 +8,7 @@
"author": "support@pterodactyl.io",
"description": "The only aim in Rust is to survive. To do this you will need to overcome struggles such as hunger, thirst and cold. Build a fire. Build a shelter. Kill animals for meat. Protect yourself from other players, and kill them for meat. Create alliances with other players and form a town. Do whatever it takes to survive.",
"image": "quay.io\/pterodactyl\/core:rust",
"startup": ".\/RustDedicated -batchmode +server.port {{SERVER_PORT}} +server.identity \"rust\" +rcon.port {{RCON_PORT}} +rcon.web true +server.hostname \\\"{{HOSTNAME}}\\\" +server.level \\\"{{LEVEL}}\\\" +server.description \\\"{{DESCRIPTION}}\\\" +server.url \\\"{{SERVER_URL}}\\\" +server.headerimage \\\"{{SERVER_IMG}}\\\" +server.worldsize \\\"{{WORLD_SIZE}}\\\" +server.seed \\\"{{WORLD_SEED}}\\\" +server.maxplayers {{MAX_PLAYERS}} +rcon.password \\\"{{RCON_PASS}}\\\" {{ADDITIONAL_ARGS}}",
"startup": ".\/RustDedicated -batchmode +server.port {{SERVER_PORT}} +server.identity \"rust\" +rcon.port {{RCON_PORT}} +rcon.web true +server.hostname \\\"{{HOSTNAME}}\\\" +server.level \\\"{{LEVEL}}\\\" +server.description \\\"{{DESCRIPTION}}\\\" +server.url \\\"{{SERVER_URL}}\\\" +server.headerimage \\\"{{SERVER_IMG}}\\\" +server.worldsize \\\"{{WORLD_SIZE}}\\\" +server.seed \\\"{{WORLD_SEED}}\\\" +server.maxplayers {{MAX_PLAYERS}} +rcon.password \\\"{{RCON_PASS}}\\\" +server.saveinterval {{SAVEINTERVAL}} {{ADDITIONAL_ARGS}}",
"config": {
"files": "{}",
"startup": "{\r\n \"done\": \"Server startup complete\",\r\n \"userInteraction\": []\r\n}",
@ -108,7 +108,7 @@
"name": "RCON Port",
"description": "Port for RCON connections.",
"env_variable": "RCON_PORT",
"default_value": "8401",
"default_value": "28016",
"user_viewable": 1,
"user_editable": 0,
"rules": "required|integer"
@ -122,6 +122,15 @@
"user_editable": 1,
"rules": "required|string|max:64"
},
{
"name": "Save Interval",
"description": "Sets the servers auto-save interval in seconds.",
"env_variable": "SAVEINTERVAL",
"default_value": "60",
"user_viewable": 1,
"user_editable": 1,
"rules": "required|integer"
},
{
"name": "Additional Arguments",
"description": "Add additional startup parameters to the server.",
@ -132,4 +141,4 @@
"rules": "nullable|string"
}
]
}
}

View File

@ -3,7 +3,7 @@
"meta": {
"version": "PTDL_v1"
},
"exported_at": "2018-07-06T11:27:32+02:00",
"exported_at": "2019-02-13T12:30:54-05:00",
"name": "Ark: Survival Evolved",
"author": "support@pterodactyl.io",
"description": "As a man or woman stranded, naked, freezing, and starving on the unforgiving shores of a mysterious island called ARK, use your skill and cunning to kill or tame and ride the plethora of leviathan dinosaurs and other primeval creatures roaming the land. Hunt, harvest resources, craft items, grow crops, research technologies, and build shelters to withstand the elements and store valuables, all while teaming up with (or preying upon) hundreds of other players to survive, dominate... and escape! \u2014 Gamepedia: ARK",
@ -11,7 +11,7 @@
"startup": ".\/ShooterGame\/Binaries\/Linux\/ShooterGameServer {{SERVER_MAP}}?listen?ServerPassword={{ARK_PASSWORD}}?ServerAdminPassword={{ARK_ADMIN_PASSWORD}}?Port={{SERVER_PORT}}?MaxPlayers={{SERVER_MAX_PLAYERS}}",
"config": {
"files": "{}",
"startup": "{\r\n \"done\": \"gameserver Steam ID\",\r\n \"userInteraction\": []\r\n}",
"startup": "{\r\n \"done\": \"Setting breakpad minidump AppID = 346110\",\r\n \"userInteraction\": []\r\n}",
"logs": "{\r\n \"custom\": true,\r\n \"location\": \"logs\/latest.log\"\r\n}",
"stop": "quit"
},
@ -60,4 +60,4 @@
"rules": "required|string|max:20"
}
]
}
}

View File

@ -3,12 +3,12 @@
"meta": {
"version": "PTDL_v1"
},
"exported_at": "2018-06-19T07:46:27-04:00",
"exported_at": "2019-02-16T14:20:52-05:00",
"name": "Garrys Mod",
"author": "support@pterodactyl.io",
"description": "Garrys Mod, is a sandbox physics game created by Garry Newman, and developed by his company, Facepunch Studios.",
"image": "quay.io\/pterodactyl\/core:source",
"startup": ".\/srcds_run -game garrysmod -console -port {{SERVER_PORT}} +ip 0.0.0.0 +map {{SRCDS_MAP}} -strictportbind -norestart +sv_setsteamaccount {{STEAM_ACC}}",
"startup": ".\/srcds_run -game garrysmod -console -port {{SERVER_PORT}} +ip 0.0.0.0 +map {{SRCDS_MAP}} +gamemode {{GAMEMODE}} -strictportbind -norestart +sv_setsteamaccount {{STEAM_ACC}} +host_workshop_collection {{WORKSHOP_ID}} +maxplayers {{MAX_PLAYERS}} -tickrate {{TICKRATE}}",
"config": {
"files": "{}",
"startup": "{\r\n \"done\": \"gameserver Steam ID\",\r\n \"userInteraction\": []\r\n}",
@ -17,7 +17,7 @@
},
"scripts": {
"installation": {
"script": "#!\/bin\/bash\n# Garry's Mod Installation Script\n#\n# Server Files: \/mnt\/server\napt -y update\napt -y --no-install-recommends install curl lib32gcc1 ca-certificates\n\ncd \/tmp\ncurl -sSL -o steamcmd.tar.gz http:\/\/media.steampowered.com\/installer\/steamcmd_linux.tar.gz\n\nmkdir -p \/mnt\/server\/steamcmd\ntar -xzvf steamcmd.tar.gz -C \/mnt\/server\/steamcmd\ncd \/mnt\/server\/steamcmd\n\n# SteamCMD fails otherwise for some reason, even running as root.\n# This is changed at the end of the install process anyways.\nchown -R root:root \/mnt\n\nexport HOME=\/mnt\/server\n.\/steamcmd.sh +login anonymous +force_install_dir \/mnt\/server +app_update 4020 +quit\n\nmkdir -p \/mnt\/server\/.steam\/sdk32\ncp -v linux32\/steamclient.so ..\/.steam\/sdk32\/steamclient.so",
"script": "#!\/bin\/bash\r\n# Garry's Mod Installation Script\r\n#\r\n# Server Files: \/mnt\/server\r\napt -y update\r\napt -y --no-install-recommends install curl lib32gcc1 ca-certificates\r\n\r\ncd \/tmp\r\ncurl -sSL -o steamcmd.tar.gz http:\/\/media.steampowered.com\/installer\/steamcmd_linux.tar.gz\r\n\r\nmkdir -p \/mnt\/server\/steamcmd\r\ntar -xzvf steamcmd.tar.gz -C \/mnt\/server\/steamcmd\r\ncd \/mnt\/server\/steamcmd\r\n\r\n# SteamCMD fails otherwise for some reason, even running as root.\r\n# This is changed at the end of the install process anyways.\r\nchown -R root:root \/mnt\r\n\r\nexport HOME=\/mnt\/server\r\n.\/steamcmd.sh +login anonymous +force_install_dir \/mnt\/server +app_update 4020 +quit\r\n\r\nmkdir -p \/mnt\/server\/.steam\/sdk32\r\ncp -v linux32\/steamclient.so ..\/.steam\/sdk32\/steamclient.so\r\n\r\n# Creating needed default files for the game\r\ncd \/mnt\/server\/garrysmod\/lua\/autorun\/server\r\necho '\r\n-- Docs: https:\/\/wiki.garrysmod.com\/page\/resource\/AddWorkshop\r\n-- Place the ID of the workshop addon you want to be downloaded to people who join your server, not the collection ID\r\n-- Use https:\/\/beta.configcreator.com\/create\/gmod\/resources.lua to easily create a list based on your collection ID\r\n\r\nresource.AddWorkshop( \"\" )\r\n' > workshop.lua\r\n\r\ncd \/mnt\/server\/garrysmod\/cfg\r\necho '\r\n\/\/ Please do not set RCon in here, use the startup parameters.\r\n\r\nhostname\t\t\"New Gmod Server\"\r\nsv_password\t\t\"\"\r\nsv_loadingurl \"\"\r\n\r\n\/\/ Steam Server List Settings\r\nsv_region \"255\"\r\nsv_lan \"0\"\r\nsv_max_queries_sec_global \"30000\"\r\nsv_max_queries_window \"45\"\r\nsv_max_queries_sec \"5\"\r\n\r\n\/\/ Server Limits\r\nsbox_maxprops\t\t100\r\nsbox_maxragdolls\t5\r\nsbox_maxnpcs\t\t10\r\nsbox_maxballoons\t10\r\nsbox_maxeffects\t\t10\r\nsbox_maxdynamite\t10\r\nsbox_maxlamps\t\t10\r\nsbox_maxthrusters\t10\r\nsbox_maxwheels\t\t10\r\nsbox_maxhoverballs\t10\r\nsbox_maxvehicles\t20\r\nsbox_maxbuttons\t\t10\r\nsbox_maxsents\t\t20\r\nsbox_maxemitters\t5\r\nsbox_godmode\t\t0\r\nsbox_noclip\t\t 0\r\n\r\n\/\/ Network Settings - Please keep these set to default.\r\n\r\nsv_minrate\t\t75000\r\nsv_maxrate\t\t0\r\ngmod_physiterations\t2\r\nnet_splitpacket_maxrate\t45000\r\ndecalfrequency\t\t12 \r\n\r\n\/\/ Execute Ban Files - Please do not edit\r\nexec banned_ip.cfg \r\nexec banned_user.cfg \r\n\r\n\/\/ Add custom lines under here\r\n' > server.cfg",
"container": "ubuntu:16.04",
"entrypoint": "bash"
}
@ -39,7 +39,7 @@
"default_value": "",
"user_viewable": 1,
"user_editable": 1,
"rules": "required|string|alpha_num|size:32"
"rules": "nullable|string|alpha_num|size:32"
},
{
"name": "Source AppID",
@ -49,6 +49,42 @@
"user_viewable": 0,
"user_editable": 0,
"rules": "required|string|max:20"
},
{
"name": "Workshop ID",
"description": "The ID of your workshop collection (the numbers at the end of the URL)",
"env_variable": "WORKSHOP_ID",
"default_value": "",
"user_viewable": 1,
"user_editable": 1,
"rules": "nullable|integer"
},
{
"name": "Gamemode",
"description": "The gamemode of your server.",
"env_variable": "GAMEMODE",
"default_value": "sandbox",
"user_viewable": 1,
"user_editable": 1,
"rules": "required|string"
},
{
"name": "Max Players",
"description": "The maximum amount of players allowed on your game server.",
"env_variable": "MAX_PLAYERS",
"default_value": "32",
"user_viewable": 1,
"user_editable": 1,
"rules": "required|integer|max:128"
},
{
"name": "Tickrate",
"description": "The tickrate defines how fast the server will update each entities location.",
"env_variable": "TICKRATE",
"default_value": "22",
"user_viewable": 1,
"user_editable": 1,
"rules": "required|integer|max:100"
}
]
}

View File

@ -18,7 +18,7 @@
"scripts": {
"installation": {
"script": "#!\/bin\/ash\n# TShock Installation Script\n#\n# Server Files: \/mnt\/server\napk update\napk add curl unzip\n\ncd \/tmp\n\ncurl -sSLO https:\/\/github.com\/NyxStudios\/TShock\/releases\/download\/v${T_VERSION}\/tshock_${T_VERSION}.zip\n\nunzip -o tshock_${T_VERSION}.zip -d \/mnt\/server",
"container": "alpine:3.4",
"container": "alpine:3.9",
"entrypoint": "ash"
}
},
@ -42,4 +42,4 @@
"rules": "required|numeric|digits_between:1,3"
}
]
}
}

View File

@ -18,7 +18,7 @@
"scripts": {
"installation": {
"script": "#!\/bin\/ash\n# Mumble Installation Script\n#\n# Server Files: \/mnt\/server\napk update\napk add tar curl\n\ncd \/tmp\n\ncurl -sSLO https:\/\/github.com\/mumble-voip\/mumble\/releases\/download\/${MUMBLE_VERSION}\/murmur-static_x86-${MUMBLE_VERSION}.tar.bz2\n\ntar -xjvf murmur-static_x86-${MUMBLE_VERSION}.tar.bz2\ncp -r murmur-static_x86-${MUMBLE_VERSION}\/* \/mnt\/server",
"container": "alpine:3.4",
"container": "alpine:3.9",
"entrypoint": "ash"
}
},
@ -42,4 +42,4 @@
"rules": "required|regex:\/^([0-9_\\.-]{5,8})$\/"
}
]
}
}

View File

@ -18,7 +18,7 @@
"scripts": {
"installation": {
"script": "#!\/bin\/ash\n# TS3 Installation Script\n#\n# Server Files: \/mnt\/server\napk update\napk add tar curl\n\ncd \/mnt\/server\n\ncurl http:\/\/dl.4players.de\/ts\/releases\/${TS_VERSION}\/teamspeak3-server_linux_amd64-${TS_VERSION}.tar.bz2 | tar xj --strip-components=1",
"container": "alpine:3.4",
"container": "alpine:3.9",
"entrypoint": "ash"
}
},

View File

@ -0,0 +1,33 @@
<?php
/**
* Pterodactyl - Panel
* Copyright (c) 2015 - 2017 Dane Everitt <dane@daneeveritt.com>.
*
* This software is licensed under the terms of the MIT license.
* https://opensource.org/licenses/MIT
*/
return [
'notices' => [
'created' => 'Новое гнездо :name успешно создано.',
'deleted' => 'Успешно удалили запрошенное гнездо с панели.',
'updated' => 'Успешно обновлены параметры конфигурации гнезда.',
],
'eggs' => [
'notices' => [
'imported' => 'Успешно импортировано это яйцо и связанные с ним переменные.',
'updated_via_import' => 'Это яйцо было обновлено с использованием предоставленного файла.',
'deleted' => 'Успешно удалили запрошенное яйцо из панели.',
'updated' => 'Конфигурация яйца успешно обновлена.',
'script_updated' => 'Сценарий установки Egg обновлен и будет запускаться всякий раз, когда будут установлены серверы.',
'egg_created' => 'Новое яйцо было добавлено успешно. Вам нужно будет перезапустить все работающие демоны, чтобы применить это новое яйцо.',
],
],
'variables' => [
'notices' => [
'variable_deleted' => 'Переменная ":variable" была удалена и больше не будет доступна серверам после восстановления.',
'variable_updated' => 'Переменная ":variable" была обновлена. Вам нужно будет перестроить все серверы, использующие эту переменную, чтобы применить изменения.',
'variable_created' => 'Новая переменная была успешно создана и назначена этому яйцу.',
],
],
];

View File

@ -0,0 +1,23 @@
<?php
/**
* Pterodactyl - Panel
* Copyright (c) 2015 - 2017 Dane Everitt <dane@daneeveritt.com>.
*
* This software is licensed under the terms of the MIT license.
* https://opensource.org/licenses/MIT
*/
return [
'validation' => [
'fqdn_not_resolvable' => 'Указанное полное доменное имя или IP-адрес не преобразуется в действительный IP-адрес.',
'fqdn_required_for_ssl' => 'Для использования SSL для этого узла требуется полное доменное имя, которое разрешается в публичный IP-адрес.',
],
'notices' => [
'allocations_added' => 'Локации успешно добавлены в этот узел.',
'node_deleted' => 'Узел успешно удален с панели.',
'location_required' => 'У вас должно быть настроено хотя бы одно местоположение, прежде чем вы сможете добавить узел на эту панель.',
'node_created' => 'Успешно создан новый узел. Вы можете автоматически настроить демон на этом компьютере, посетив вкладку \'Configuration\'. <strong> Прежде чем вы сможете добавить какие-либо серверы, вы должны сначала выделить как минимум один IP-адрес и порт.</strong>',
'node_updated' => 'Информация об узле обновлена. Если какие-либо настройки демона были изменены, вам нужно будет перезагрузить их, чтобы эти изменения вступили в силу.',
'unallocated_deleted' => 'Удалил все нераспределенные порты для <code>:ip</code>.',
],
];

View File

@ -0,0 +1,16 @@
<?php
/**
* Pterodactyl - Panel
* Copyright (c) 2015 - 2017 Dane Everitt <dane@daneeveritt.com>.
*
* This software is licensed under the terms of the MIT license.
* https://opensource.org/licenses/MIT
*/
return [
'notices' => [
'pack_updated' => 'Пак успешно обновлен.',
'pack_deleted' => 'Успешно удален пакет ":name" из системы.',
'pack_created' => 'Новый пакет был успешно создан в системе и теперь доступен для развертывания на серверах.',
],
];

View File

@ -0,0 +1,31 @@
<?php
/**
* Pterodactyl - Panel
* Copyright (c) 2015 - 2017 Dane Everitt <dane@daneeveritt.com>.
*
* This software is licensed under the terms of the MIT license.
* https://opensource.org/licenses/MIT
*/
return [
'exceptions' => [
'no_new_default_allocation' => 'Вы пытаетесь удалить выделение по умолчанию для этого сервера, но резервное выделение для использования отсутствует.',
'marked_as_failed' => 'Этот сервер был помечен как Проблемный предыдущей установки. Текущий статус не может быть переключен в этом состоянии.',
'bad_variable' => 'Произошла ошибка проверки с переменной :name.',
'daemon_exception' => 'При попытке установить связь с демоном возникла исключительная ситуация, в результате которой был получен код ответа HTTP / :code. Это исключение было зарегистрировано.',
'default_allocation_not_found' => 'Запрошенное распределение по умолчанию не было найдено в выделениях этого сервера.',
],
'alerts' => [
'startup_changed' => 'Начальная конфигурация для этого сервера была обновлена. Если гнездо или яйцо этого сервера было изменено, то теперь будет происходить переустановка.',
'server_deleted' => 'Сервер успешно удален из системы.',
'server_created' => 'Сервер буспешно создан из панели. Пожалуйста, дайте демону несколько минут, чтобы полностью установить этот сервер.',
'build_updated' => 'Детали сборки для этого сервера были обновлены. Некоторые изменения могут потребовать перезагрузки для вступления в силу.',
'suspension_toggled' => 'Состояние приостановки сервера изменено на :status.',
'rebuild_on_boot' => 'Этот сервер был помечен как требующий перестройки Docker Container. Это произойдет при следующем запуске сервера.',
'install_toggled' => 'Состояние установки для этого сервера переключено.',
'server_reinstalled' => 'Этот сервер поставлен в очередь для начала переустановки.',
'details_updated' => 'Данные сервера успешно обновлены.',
'docker_image_updated' => 'Успешно изменен образ Docker по умолчанию для использования на этом сервере. Чтобы применить это изменение, требуется перезагрузка.',
'node_required' => 'У вас должен быть настроен хотя бы один узел, прежде чем вы сможете добавить сервер на эту панель.',
],
];

View File

@ -0,0 +1,18 @@
<?php
/**
* Pterodactyl - Panel
* Copyright (c) 2015 - 2017 Dane Everitt <dane@daneeveritt.com>.
*
* This software is licensed under the terms of the MIT license.
* https://opensource.org/licenses/MIT
*/
return [
'exceptions' => [
'user_has_servers' => 'Невозможно удалить пользователя с активными серверами, подключенными к его учетной записи. Пожалуйста, удалите их серверы, прежде чем продолжить.',
],
'notices' => [
'account_created' => 'Аккаунт успешно создан.',
'account_updated' => 'Аккаунт успешно обновлен.',
],
];

View File

@ -0,0 +1,22 @@
<?php
return [
'not_authorized' => 'Вы не авторизованы для выполнения этого действия.',
'auth_error' => 'Произошла ошибка при попытке войти.',
'authentication_required' => 'Для продолжения требуется Аутентификация.',
'remember_me' => 'Запомнить меня',
'sign_in' => 'Войти в систему',
'forgot_password' => 'Я забыл свой пароль!',
'request_reset_text' => 'Забыли пароль учетной записи? Это не конец света, просто укажите свой адрес электронной почты.',
'reset_password_text' => 'Сбросить пароль вашей учетной записи.',
'reset_password' => 'Сбросить пароль учетной записи',
'email_sent' => 'Вам отправлено электронное письмо с дальнейшими инструкциями по восстановлению пароля.',
'failed' => 'Предоставленные учетные данные не совпадают с теми, которые есть у нас в записи, или предоставленный токен 2FA недействителен.',
'throttle' => 'Слишком много попыток входа в систему. Пожалуйста, повторите попытку через :seconds секунд.',
'password_requirements' => 'Пароли должны содержать как минимум одну заглавную, строчную букву, цифры и содержать не менее 8 символов.',
'request_reset' => 'Найти аккаунт',
'2fa_required' => 'Двухфакторная аутентификация',
'2fa_failed' => 'Указанный токен 2FA недействителен.',
'totp_failed' => 'Произошла ошибка при попытке проверить TOTP.',
'2fa_must_be_enabled' => 'Администратор потребовал, чтобы для вашей учетной записи была включена двухфакторная аутентификация, чтобы использовать панель.',
];

View File

@ -0,0 +1,89 @@
<?php
return [
'validation_error' => 'Произошла ошибка с одним или несколькими полями в запросе.',
'errors' => [
'return' => 'Вернуться на предыдущую страницу',
'home' => 'Домой',
'403' => [
'header' => 'Запрещено',
'desc' => 'У вас нет прав доступа к ресурсам на этом сервере.',
],
'404' => [
'header' => 'Файл не найден',
'desc' => 'Нам не удалось найти запрошенный ресурс на сервере.',
],
'installing' => [
'header' => 'Установка сервера',
'desc' => 'Запрошенный сервер все еще завершает процесс установки. Пожалуйста, зайдите через несколько минут, вы должны получить электронное письмо, как только этот процесс будет завершен.',
],
'suspended' => [
'header' => 'Сервер приостановлен',
'desc' => 'Этот сервер был приостановлен и недоступен.',
],
'maintenance' => [
'header' => 'Узел в обслуживании',
'title' => 'Временно недоступен',
'desc' => 'Этот узел находится на обслуживании, поэтому ваш сервер может быть временно недоступен.',
],
],
'index' => [
'header' => 'Ваши серверы',
'header_sub' => 'Серверы, к которым у вас есть доступ.',
'list' => 'Список серверов',
],
'api' => [
'index' => [
'list' => 'Ваши ключи',
'header' => 'API аккаунта',
'header_sub' => 'Управляйте клавишами доступа, которые позволяют вам выполнять действия с панелью.',
'create_new' => 'Создать новый ключ API',
'keypair_created' => 'Ключ API был успешно сгенерирован и показан ниже.',
],
'new' => [
'header' => 'овый ключ API',
'header_sub' => 'Создайте новый ключ доступа к учетной записи.',
'form_title' => 'Подробности',
'descriptive_memo' => [
'title' => 'Описание',
'description' => 'Введите краткое описание этого ключа, которое будет полезно для справки.',
],
'allowed_ips' => [
'title' => 'Разрешенные IP-адреса',
'description' => 'Введите разделенный строкой список IP-адресов, которым разрешен доступ к API с помощью этого ключа. Нотация CIDR разрешена. Оставьте пустым, чтобы разрешить любой IP.',
],
],
],
'account' => [
'details_updated' => 'Данные вашей учетной записи успешно обновлены.',
'invalid_password' => 'Пароль для вашей учетной записи недействителен.',
'header' => 'Ваш аккаунт',
'header_sub' => 'Управляйте данными своей учетной записи.',
'update_pass' => 'Обновить пароль',
'update_email' => 'Обновить адрес электронной почты',
'current_password' => 'Текущий пароль',
'new_password' => 'Новый пароль',
'new_password_again' => 'Повторите новый пароль',
'new_email' => 'Новый E-mail адрес',
'first_name' => 'Имя',
'last_name' => 'Фамилия',
'update_identity' => 'Обновить данные',
'username_help' => 'Ваше имя пользователя должно быть уникальным для вашей учетной записи и может содержать только следующие символы: :requirements.',
'language' => 'Язык',
],
'security' => [
'session_mgmt_disabled' => 'Ваш хост не включил возможность управлять сеансами аккаунта через этот интерфейс.',
'header' => 'Безопасность аккаунта',
'header_sub' => 'Контроль активных сессий и 2-х факторной аутентификации.',
'sessions' => 'Активная сессия',
'2fa_header' => '2-х факторная аутентификация',
'2fa_token_help' => 'Введите токен 2FA, созданный вашим приложением (Google Authenticator, Authy, и так далее.).',
'disable_2fa' => 'Отключить двухфакторную аутентификацию',
'2fa_enabled' => 'В этой учетной записи включена двухфакторная аутентификация, которая потребуется для входа в панель. Если вы хотите отключить 2FA, просто введите действительный токен ниже и отправьте форму.',
'2fa_disabled' => 'Двухфакторная аутентификация отключена на вашем аккаунте! Вы должны включить 2FA, чтобы добавить дополнительный уровень защиты для вашей учетной записи.',
'enable_2fa' => 'Включить двухфакторную аутентификацию',
'2fa_qr' => 'Настройте 2FA на вашем устройстве',
'2fa_checkpoint_help' => 'Используйте приложение 2FA на своем телефоне, чтобы сделать снимок QR-кода, или вручную введите код под ним. После этого сгенерируйте токен и введите его ниже.',
'2fa_disable_error' => 'Указанный токен 2FA недействителен. Защита не была отключена для этой учетной записи.',
],
];

View File

@ -0,0 +1,97 @@
<?php
return [
'key' => [
'warning' => 'Похоже, вы уже настроили ключ шифрования приложения. Продолжая этот процесс с перезаписать этот ключ и вызвать повреждение данных для любых существующих зашифрованных данных. НЕ ПРОДОЛЖАЙТЕ, ЕСЛИ ВЫ НЕ ЗНАЕТЕ, ЧТО ВЫ ДЕЛАЕТЕ.',
'confirm' => 'Я понимаю последствия выполнения этой команды и принимаю на себя всю ответственность за потерю зашифрованных данных.',
'final_confirm' => 'Вы уверены, что хотите продолжить? Изменение ключа шифрования приложения приведет к потере данных.',
],
'location' => [
'no_location_found' => 'Не удалось найти запись, соответствующую предоставленному короткому коду.',
'ask_short' => 'Короткий код местоположения',
'ask_long' => 'Описание местоположения',
'created' => 'Успешно создано новое местоположение (:name) с идентификатором :id.',
'deleted' => 'Успешно удалено запрошенное местоположение.',
],
'user' => [
'search_users' => 'Введите имя пользователя, UUID или адрес электронной почты',
'select_search_user' => 'ID пользователя для удаления (Enter \'0\' to re-search)',
'deleted' => 'Пользователь успешно удален из Панели.',
'confirm_delete' => 'Вы уверены, что хотите удалить этого пользователя с панели?',
'no_users_found' => 'По данному запросу не найдено ни одного пользователя.',
'multiple_found' => 'Для предоставленного пользователя было найдено несколько учетных записей, не удалось удалить пользователя из-за --no-interaction flag.',
'ask_admin' => 'Является ли этот пользователь администратором?',
'ask_email' => 'Адрес электронной почты',
'ask_username' => 'Ник пользователя',
'ask_name_first' => 'Имя',
'ask_name_last' => 'Фамилия',
'ask_password' => 'Пароль',
'ask_password_tip' => 'Если вы хотите создать учетную запись со случайным паролем, отправленным пользователю по электронной почте, повторите команду (CTRL + C) и передайте `--no-password` flag.',
'ask_password_help' => 'Пароли должны быть длиной не менее 8 символов и содержать как минимум одну заглавную букву и цифру.',
'2fa_help_text' => [
'Эта команда отключит двухфакторную аутентификацию для учетной записи пользователя, если она включена. Это следует использовать только в качестве команды восстановления учетной записи, если пользователь заблокирован в своей учетной записи.',
'Если это не то, что вы хотели сделать, нажмите CTRL + C, чтобы выйти из этого процесса.',
],
'2fa_disabled' => 'Двухфакторная аутентификация была отключена для :email.',
],
'schedule' => [
'output_line' => 'Диспетчерская работа для первой задачи в `:schedule` (:hash).',
],
'maintenance' => [
'deleting_service_backup' => 'Удаление файла резервной копии службы :file.',
],
'server' => [
'rebuild_failed' => 'Запрос на перестроение для ":name" (#:id) на узле ":node" завершился ошибкой: :message',
'power' => [
'confirm' => 'Вы собираетесь выполнить :action против :count серверов. Вы хотите продолжить?',
'action_failed' => 'Запрос на действие питания для ":name" (#:id) на узле ":node" завершился ошибкой: :message',
],
],
'environment' => [
'mail' => [
'ask_smtp_host' => 'SMTP Хост (e.g. smtp.gmail.com)',
'ask_smtp_port' => 'SMTP Порт',
'ask_smtp_username' => 'SMTP Пользователь',
'ask_smtp_password' => 'SMTP Password',
'ask_mailgun_domain' => 'Почтовый Домен',
'ask_mailgun_secret' => 'Mailgun Secret',
'ask_mandrill_secret' => 'Mandrill Secret',
'ask_postmark_username' => 'Postmark API Key',
'ask_driver' => 'Какой драйвер следует использовать для отправки писем?',
'ask_mail_from' => 'Адреса электронной почты должны исходить от',
'ask_mail_name' => 'Имя, с которого должны начинаться электронные письма',
'ask_encryption' => 'Метод шифрования для использования',
],
'database' => [
'host_warning' => 'Настоятельно рекомендуется не использовать "localhost" в качестве хоста базы данных, поскольку мы часто сталкиваемся с проблемами подключения к сокету. Если вы хотите использовать локальное соединение, вы должны использовать "127.0.0.1".',
'host' => 'Хост базы данных',
'port' => 'Порт базы данных',
'database' => 'Название базы данных',
'username_warning' => 'Использование учетной записи "root" для подключений MySQL не только не одобряется, но и не допускается этим приложением. Вам нужно создать пользователя MySQL для этого программного обеспечения.',
'username' => 'Имя пользователя базы данных',
'password_defined' => 'Похоже, вы уже определили пароль для подключения к MySQL, хотите изменить его?',
'password' => 'Пароль базы данных',
'connection_error' => 'Невозможно подключиться к серверу MySQL с использованием предоставленных учетных данных. Возвращенная ошибка ":error".',
'creds_not_saved' => 'Ваши учетные данные НЕ были сохранены. Вам нужно будет предоставить действительную информацию о соединении, прежде чем продолжить.',
'try_again' => 'Вернуться и попробуйте снова?',
],
'app' => [
'settings' => 'Включить редактор настроек на основе интерфейса?',
'author' => 'E-mail автора яйца',
'author_help' => 'Укажите адрес электронной почты, с которого должны быть отправлены яйца, экспортируемые этой панелью. Это должен быть действительный адрес электронной почты.',
'app_url_help' => 'URL приложения ДОЛЖЕН начинаться с https:// или http:// в зависимости от того, используете ли вы SSL или нет. Если вы не включите схему, ваши электронные письма и другой контент будут ссылаться на неправильное местоположение.',
'app_url' => 'URL приложения',
'timezone_help' => 'Часовой пояс должен соответствовать одному из поддерживаемых часовых поясов PHP. Если вы не уверены, пожалуйста перейдите по ссылке http://php.net/manual/en/timezones.php.',
'timezone' => 'Часовой пояс приложения',
'cache_driver' => 'Драйвер кеша',
'session_driver' => 'Драйвер сеанса',
'queue_driver' => 'Драйвер очереди ',
'using_redis' => 'Вы выбрали драйвер Redis для одного или нескольких параметров. Пожалуйста, предоставьте действительную информацию о подключении ниже. В большинстве случаев вы можете использовать предоставленные значения по умолчанию, если только вы не изменили настройки.',
'redis_host' => 'Ност Redis',
'redis_password' => 'Пароль Redis',
'redis_pass_help' => 'По умолчанию экземпляр сервера Redis не имеет пароля, поскольку он работает локально и недоступен для внешнего мира. Если это так, просто нажмите Enter, не вводя значение.',
'redis_port' => 'Порт Redis',
'redis_pass_defined' => 'Кажется, пароль для Redis уже определен, вы хотите его изменить?',
],
],
];

View File

@ -0,0 +1,68 @@
<?php
return [
'daemon_connection_failed' => 'При попытке установить связь с демоном возникла исключительная ситуация, в результате которой был получен код ответа HTTP /:code. Это исключение было зарегистрировано.',
'node' => [
'servers_attached' => 'Узел не должен иметь серверов, связанных с ним, для удаления.',
'daemon_off_config_updated' => 'Конфигурация демона <strong>была обновлена</strong>, однако при попытке автоматического обновления файла конфигурации в демоне произошла ошибка. Вам нужно будет вручную обновить файл конфигурации (core.json), чтобы демон применил эти изменения.',
],
'allocations' => [
'server_using' => 'Сервер в настоящее время назначен на это распределение. Распределение может быть удалено, только если в данный момент не назначен сервер.',
'too_many_ports' => 'Добавление более 1000 портов в одном диапазоне одновременно не поддерживается.',
'invalid_mapping' => 'Отображение, предусмотренное для :port, было недействительным и не могло быть обработано.',
'cidr_out_of_range' => 'Нотация CIDR допускает маски только от / 25 до / 32.',
'port_out_of_range' => 'Порты в распределении должны быть больше 1024 и меньше или равны 65535.',
],
'nest' => [
'delete_has_servers' => 'Гнездо с подключенными к нему активными серверами нельзя удалить с панели.',
'egg' => [
'delete_has_servers' => 'Яйцо с подключенными к нему активными серверами нельзя удалить с панели.',
'invalid_copy_id' => 'Яйцо, выбранное для копирования скрипта, либо не существует, либо копирует сам скрипт.',
'must_be_child' => 'Директива "Copy Settings From" для этого яйца должна быть дочерней для выбранного гнезда.',
'has_children' => 'Это яйцо является родителем одного или нескольких других яиц. Пожалуйста, удалите эти яйца перед удалением этого яйца.',
],
'variables' => [
'env_not_unique' => 'Переменная окружения :name должно быть уникальным для этого яйца.',
'reserved_name' => 'Переменная среды :name защищено и не может быть присвоено переменной.',
'bad_validation_rule' => 'Правило проверки ":rule" не является допустимым правилом для этого приложения.',
],
'importer' => [
'json_error' => 'Произошла ошибка при попытке проанализировать файл JSON: :error.',
'file_error' => 'Предоставленный файл JSON недействителен.',
'invalid_json_provided' => 'Предоставленный файл JSON не в формате, который может быть распознан.',
],
],
'packs' => [
'delete_has_servers' => 'Невозможно удалить пакет, прикрепленный к активным серверам.',
'update_has_servers' => 'Невозможно изменить идентификатор связанной опции, когда серверы в данный момент подключены к пакету.',
'invalid_upload' => 'Предоставленный файл не является действительным.',
'invalid_mime' => 'Предоставленный файл не соответствует требуемому типу :type',
'unreadable' => 'Предоставленный архив не может быть открыт сервером.',
'zip_extraction' => 'Возникла исключительная ситуация при попытке извлечь архив, предоставленный на сервер.',
'invalid_archive_exception' => 'В архиве пакета отсутствует требуемый файл archive.tar.gz или import.json в базовом каталоге.',
],
'subusers' => [
'editing_self' => 'Редактирование вашей учетной записи подпользователя запрещено.',
'user_is_owner' => 'Вы не можете добавить владельца сервера в качестве подпользователя для этого сервера.',
'subuser_exists' => 'Пользователь с таким адресом электронной почты уже назначен в качестве подпользователя для этого сервера.',
],
'databases' => [
'delete_has_databases' => 'Невозможно удалить хост-сервер базы данных, с которым связаны активные базы данных.',
],
'tasks' => [
'chain_interval_too_long' => 'Максимальный интервал времени для связанной задачи составляет 15 минут.',
],
'locations' => [
'has_nodes' => 'Невозможно удалить местоположение, к которому прикреплены активные узлы.',
],
'users' => [
'node_revocation_failed' => 'Не удалось отозвать ключи на <a href=":link">Node #:node</a>. :error',
],
'deployment' => [
'no_viable_nodes' => 'Узлы, удовлетворяющие требованиям, указанным для автоматического развертывания, не найдены.',
'no_viable_allocations' => 'Местоположений, удовлетворяющих требованиям для автоматического развертывания, обнаружено не было.',
],
'api' => [
'resource_not_found' => 'Запрашиваемый ресурс не существует на этом сервере.',
],
];

View File

@ -0,0 +1,32 @@
<?php
return [
'home' => 'Главная',
'account' => [
'header' => 'УПРАВЛЕНИЕ АККАУНТОМ',
'my_account' => 'Мой аккаунт',
'security_controls' => 'Контроль безопасности',
'api_access' => 'API аккаунта',
'my_servers' => 'Мои серверы',
],
'server' => [
'header' => 'УПРАВЛЕНИЕ СЕРВЕРАМИ',
'console' => 'Консоль',
'console-pop' => 'Полноэкранная консоль',
'file_management' => 'Управление файлами',
'file_browser' => 'Браузер файлов',
'create_file' => 'Создать файл',
'upload_files' => 'Загрузить файлы',
'subusers' => 'Подпользователь',
'schedules' => 'Расписание',
'configuration' => 'Конфигурация',
'port_allocations' => 'Настройки портов',
'sftp_settings' => 'Настройки SFTP',
'startup_parameters' => 'Параметры запуска',
'databases' => 'Базы данных',
'edit_file' => 'Редактировать файл',
'admin_header' => 'АДМИНИСТРАТИВНЫЕ',
'admin' => 'Конфигурация сервера',
'server_name' => 'Название сервера',
],
];

View File

@ -0,0 +1,17 @@
<?php
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.
|
*/
'previous' => '&laquo; Предыдущий',
'next' => 'Следующий &raquo;',
];

View File

@ -0,0 +1,19 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reset 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' => 'Пароли должны содержать не менее шести символов и соответствовать подтверждению.',
'reset' => 'Ваш пароль сброшен!',
'sent' => 'Мы отправили вам ссылку для сброса пароля по электронной почте!',
'token' => 'Этот токен сброса пароля недействителен.',
'user' => 'Мы не можем найти пользователя с таким адресом электронной почты.',
];

View File

@ -0,0 +1,334 @@
<?php
return [
'index' => [
'title' => 'Просмотр сервера :name',
'header' => 'Консоль сервера',
'header_sub' => 'Контролируйте свой сервер в режиме реального времени.',
],
'schedule' => [
'header' => 'Диспетчер расписаний',
'header_sub' => 'Управляйте всеми расписаниями этого сервера в одном месте.',
'current' => 'Текущие расписания',
'new' => [
'header' => 'Создать новое расписание',
'header_sub' => 'Создайте новый набор запланированных задач для этого сервера.',
'submit' => 'Создать расписание',
],
'manage' => [
'header' => 'Управление расписанием',
'submit' => 'Обновить расписание',
'delete' => 'Удалить расписание',
],
'task' => [
'time' => 'После',
'action' => 'Выполнить действие',
'payload' => 'С полезной нагрузкой',
'add_more' => 'Добавить еще одну задачу',
],
'actions' => [
'command' => 'Отправить команду',
'power' => 'Управление питанием',
],
'toggle' => 'Переключить статус',
'run_now' => 'Расписание запуска',
'schedule_created' => 'Успешно создано новое расписание для этого сервера.',
'schedule_updated' => 'Расписание обновлено.',
'unnamed' => 'Расписание без имени',
'setup' => 'Настройка расписания',
'day_of_week' => 'День недели',
'day_of_month' => 'День месяца',
'hour' => 'Час дня',
'minute' => 'Минута часа',
'time_help' => 'Система расписаний поддерживает использование синтаксиса Cronjob при определении момента начала выполнения задач. Используйте поля выше, чтобы указать, когда эти задачи должны начать выполняться, или выберите параметры в меню множественного выбора.',
'task_help' => 'Время выполнения заданий относительно ранее определенного задания. Каждому расписанию может быть назначено не более 5 задач, а задачи не могут быть запланированы с интервалом более 15 минут.',
],
'tasks' => [
'task_created' => 'Успешно создано новое задание на панели.',
'task_updated' => 'Задача успешно обновлена. Любые действия задачи, поставленные в очередь, будут отменены и запущены снова в следующее определенное время.',
'header' => 'Запланированные задачи',
'header_sub' => 'Автоматизируйте свой сервер.',
'current' => 'Текущие запланированные задачи',
'actions' => [
'command' => 'Отправить команду',
'power' => 'Опция управленя питанием ',
],
'new_task' => 'Добавить новую задачу',
'toggle' => 'Переключить статус',
'new' => [
'header' => 'Новое задание',
'header_sub' => 'Создайте новое запланированное задание для этого сервера.',
'task_name' => 'Название задачи',
'day_of_week' => 'День недели',
'custom' => 'Пользовательское значение',
'day_of_month' => 'День месяца',
'hour' => 'Час',
'minute' => 'Минута',
'sun' => 'Воскресенье',
'mon' => 'Понедельник',
'tues' => 'Вторник',
'wed' => 'Среда',
'thurs' => 'Четверг',
'fri' => 'Пятница',
'sat' => 'Суббота',
'submit' => 'Создать задачу',
'type' => 'Тип задачи',
'chain_then' => 'Затем после',
'chain_do' => 'Выполнять',
'chain_arguments' => 'С аргументами',
'payload' => 'Задача Полезная нагрузка',
'payload_help' => 'Например, если вы выбрали <code>Send Command</code>, введите команду здесь. Если вы выбрали <code>Send Power Option</code>, укажите здесь действие power (например, <code>restart</code>).',
],
'edit' => [
'header' => 'Управление задачей',
'submit' => 'Обновить задачу',
],
],
'users' => [
'header' => 'Управление пользователями',
'header_sub' => 'Контроль, кто может получить доступ к вашему серверу.',
'configure' => 'Настроить разрешения',
'list' => 'Аккаунты с доступом',
'add' => 'Добавить нового пользователя',
'update' => 'Обновить пользователя',
'user_assigned' => 'Успешно назначен новый пользователь на этот сервер.',
'user_updated' => 'Успешно обновлены разрешения.',
'edit' => [
'header' => 'Редактировать пользователя',
'header_sub' => 'Изменить доступ пользователя к серверу.',
],
'new' => [
'header' => 'Добавить нового пользователя',
'header_sub' => 'Добавьте нового пользователя с разрешениями на этот сервер.',
'email' => 'Адрес электронной почты',
'email_help' => 'Введите адрес электронной почты для пользователя, которого вы хотите пригласить для управления этим сервером.',
'power_header' => 'Управление питанием',
'file_header' => 'Управление файлами',
'subuser_header' => 'Управление пользователями',
'server_header' => 'Управление сервером',
'task_header' => 'Управление расписанием',
'database_header' => 'Управление базой данных',
'power_start' => [
'title' => 'Запустить сервер',
'description' => 'Позволяет пользователю запустить сервер.',
],
'power_stop' => [
'title' => 'Остановить сервер.',
'description' => 'Позволяет пользователю остановить сервер.',
],
'power_restart' => [
'title' => 'Перезагрузить сервер',
'description' => 'Позволяет пользователю перезапустить сервер.',
],
'power_kill' => [
'title' => 'Убить Сервер',
'description' => 'Позволяет пользователю убить процесс сервера.',
],
'send_command' => [
'title' => 'Отправить консольную команду',
'description' => 'Позволяет отправить команду из консоли. Если у пользователя нет разрешений на остановку или перезапуск, он не может отправить команду stop',
],
'access_sftp' => [
'title' => 'SFTP разрешения',
'description' => 'Позволяет пользователю подключаться к SFTP-серверу, предоставленному демоном.',
],
'list_files' => [
'title' => 'Список файлов',
'description' => 'Позволяет пользователю перечислять все файлы и папки на сервере, но не просматривать содержимое файла.',
],
'edit_files' => [
'title' => 'Редактировать файлы',
'description' => 'Позволяет пользователю открыть файл только для просмотра. SFTP не влияет на это разрешение.',
],
'save_files' => [
'title' => 'Сохранить файлы',
'description' => 'По',
],
'move_files' => [
'title' => 'Переименовать и переместить файлы',
'description' => 'Позволяет пользователю перемещать и переименовывать файлы и папки в файловой системе.',
],
'copy_files' => [
'title' => 'Копировать файлы',
'description' => 'Позволяет пользователю копировать файлы и папки в файловой системе.',
],
'compress_files' => [
'title' => 'Сжатие файлов',
'description' => 'Позволяет пользователю создавать архивы файлов и папок в системе.',
],
'decompress_files' => [
'title' => 'Распаковать файлы',
'description' => 'Позволяет пользователю распаковать архивы .zip и .tar (.gz).',
],
'create_files' => [
'title' => 'Создать файлы',
'description' => 'Позволяет пользователю создавать новый файл в панели.',
],
'upload_files' => [
'title' => 'Загрузить файлы',
'description' => 'Позволяет пользователю загружать файлы через файловый менеджер.',
],
'delete_files' => [
'title' => 'Удалить файлы',
'description' => 'Позволяет пользователю удалять файлы из системы.',
],
'download_files' => [
'title' => 'Скачать файлы',
'description' => 'Позволяет пользователю загружать файлы. Если пользователю дано это разрешение, он может загружать и просматривать содержимое файла, даже если это разрешение не назначено на панели.',
],
'list_subusers' => [
'title' => 'Список пользователей',
'description' => 'Позволяет пользователю просматривать список всех суб-пользователей, назначенных серверу.',
],
'view_subuser' => [
'title' => 'Просмотр пользователей',
'description' => 'Позволяет пользователю просматривать разрешения, назначенные для пользователей.',
],
'edit_subuser' => [
'title' => 'Редактировать пользователей',
'description' => 'Позволяет пользователю редактировать разрешения, назначенные другим пользователям.',
],
'create_subuser' => [
'title' => 'Создать пользователя',
'description' => 'Позволяет пользователю создавать дополнительных пользователей на сервере.',
],
'delete_subuser' => [
'title' => 'Удалить пользователя',
'description' => 'Позволяет пользователю удалять других пользователей на сервере.',
],
'view_allocations' => [
'title' => 'Посмотреть распределение',
'description' => 'Позволяет пользователю просматривать все IP-адреса и порты, назначенные серверу.',
],
'edit_allocation' => [
'title' => 'Изменить подключение по умолчанию',
'description' => 'Позволяет пользователю изменять распределение соединения по умолчанию для использования на сервере.',
],
'view_startup' => [
'title' => 'Просмотреть команду запуска',
'description' => 'Позволяет пользователю просматривать команду запуска и связанные переменные для сервера.',
],
'edit_startup' => [
'title' => 'Редактировать команду запуска',
'description' => 'Позволяет пользователю изменять переменные запуска для сервера.',
],
'list_schedules' => [
'title' => 'Список расписаний',
'description' => 'Позволяет пользователю посмотреть все расписания (включенные и отключенные) для этого сервера.',
],
'view_schedule' => [
'title' => 'Посмотреть расписание',
'description' => 'Позволяет пользователю просматривать детали конкретного расписания, включая все назначенные задачи.',
],
'toggle_schedule' => [
'title' => 'Переключить Расписание',
'description' => 'Позволяет пользователю переключать расписание на активные или неактивные.',
],
'queue_schedule' => [
'title' => 'Очередь Расписаний',
'description' => 'Позволяет пользователю ставить в очередь расписание для выполнения его задач в следующем цикле процесса.',
],
'edit_schedule' => [
'title' => 'Изменить расписание',
'description' => 'Позволяет пользователю редактировать расписание, включая все задачи расписания. Это позволит пользователю удалять отдельные задачи, но не удалять само расписание.',
],
'create_schedule' => [
'title' => 'Создать расписание',
'description' => 'Позволяет пользователю создавать новое расписание.',
],
'delete_schedule' => [
'title' => 'Удалить расписание',
'description' => 'Позволяет пользователю удалить расписание с сервера.',
],
'view_databases' => [
'title' => 'Просмотр базы данных',
'description' => 'Позволяет пользователю просматривать все базы данных, связанные с этим сервером, включая имена пользователей и пароли для баз данных.',
],
'reset_db_password' => [
'title' => 'Сбросить пароль базы данных',
'description' => 'Позволяет пользователю сбросить пароли для баз данных.',
],
'delete_database' => [
'title' => 'Удалить базы данных',
'description' => 'Позволяет пользователю удалять базы данных для этого сервера.',
],
'create_database' => [
'title' => 'Создать базу данных',
'description' => 'Позволяет пользователю создавать дополнительные базы данных для этого сервера.',
],
],
],
'allocations' => [
'mass_actions' => 'Массовые акции',
'delete' => 'Удалить распределение',
],
'files' => [
'exceptions' => [
'invalid_mime' => 'Этот тип файла не может быть отредактирован через встроенный редактор.',
'max_size' => 'Этот файл слишком велик для редактирования через встроенный редактор.',
],
'header' => 'Файловый менеджер',
'header_sub' => 'Управляйте всеми своими файлами прямо из Интернета.',
'loading' => 'Загрузка исходной файловой структуры, это может занять несколько секунд.',
'path' => 'При настройке любых путей к файлам в плагинах или настройках вашего сервера вы должны использовать :path в качестве базового пути. Максимальный размер загрузки файлов через Интернет на этот узел: :size.',
'seconds_ago' => 'секунд назад',
'file_name' => 'Имя файла',
'size' => 'Размер',
'last_modified' => 'Последнее изменение',
'add_new' => 'Добавить новый файл',
'add_folder' => 'Добавить новую папку',
'mass_actions' => 'Массовые акции',
'delete' => 'Удалить файлы',
'edit' => [
'header' => 'Редактировать файл',
'header_sub' => 'Внесите изменения в файл из Интернета.',
'save' => 'Сохранить файл',
'return' => 'Вернуться в файловый менеджер',
],
'add' => [
'header' => 'Новый файл',
'header_sub' => 'Создайте новый файл на вашем сервере.',
'name' => 'Имя файла',
'create' => 'Создать файл',
],
],
'config' => [
'name' => [
'header' => 'Название сервера',
'header_sub' => 'Измените имя этого сервера.',
'details' => 'Имя сервера является только ссылкой на этот сервер на панели и не влияет на какие-либо конкретные конфигурации серверов, которые могут отображаться для пользователей в играх.',
],
'startup' => [
'header' => 'Начать настройку',
'header_sub' => 'Управляйте аргументами запуска сервера.',
'command' => 'Команда запуска',
'edit_params' => 'Изменить параметры',
'update' => 'Обновить параметры запуска',
'startup_regex' => 'Правила ввода',
'edited' => 'Переменные запуска были успешно отредактированы. Они вступят в силу при следующем запуске этого сервера.',
],
'sftp' => [
'header' => 'Конфигурация SFTP',
'header_sub' => 'Данные учетной записи для SFTP-соединений.',
'details' => 'Подробности SFTP',
'conn_addr' => 'Адрес подключения',
'warning' => 'Пароль SFTP - это пароль вашей учетной записи. Убедитесь, что ваш клиент настроен на использование SFTP, а не FTP или FTPS для соединений, между протоколами есть разница.',
],
'database' => [
'header' => 'Базы данных',
'header_sub' => 'Все базы данных доступные для этого сервера.',
'your_dbs' => 'Настройки базы данных',
'host' => 'MySQL Хост',
'reset_password' => 'Сброс пароля',
'no_dbs' => 'Для этого сервера нет баз данных.',
'add_db' => 'Добавить новую базу данных.',
],
'allocation' => [
'header' => 'Порты сервера',
'header_sub' => 'Управляйте IP-адресами и портами, доступными на этом сервере.',
'available' => 'Доступные Распределения',
'help' => 'Справка по Распределению портов.',
'help_text' => 'Список включает в себя все доступные IP-адреса и порты, которые открыты для вашего сервера, чтобы использовать для входящих подключений.',
],
],
];

View File

@ -0,0 +1,88 @@
<?php
return [
'email' => 'Эл. адрес',
'user_identifier' => 'Имя пользователя или адрес электронной почты',
'password' => 'Пароль',
'confirm_password' => 'Подтвердите Пароль',
'login' => 'Войти',
'home' => 'Домой',
'servers' => 'Серверы',
'id' => 'ID',
'name' => 'Название',
'node' => 'Узел',
'connection' => 'Подключение',
'memory' => 'Память',
'cpu' => 'Процессор',
'status' => 'Статус',
'search' => 'Поиск',
'suspended' => 'Приостановленный',
'account' => 'Аккаунт',
'security' => 'Безопасность',
'ip' => 'IP адрес',
'last_activity' => 'Последняя активность',
'revoke' => 'Отменить',
'2fa_token' => 'Токен аутентификации',
'submit' => 'Отправить',
'close' => 'Закрыть',
'settings' => 'Настройки',
'configuration' => 'Конфигурация',
'sftp' => 'SFTP',
'databases' => 'База данных',
'memo' => 'Напоминание',
'created' => 'Созданный',
'expires' => 'Истекает',
'public_key' => 'Токен',
'api_access' => 'Доступ к API',
'never' => 'никогда',
'sign_out' => 'Выход',
'admin_control' => 'Админ панель',
'required' => 'Необходимо',
'port' => 'Порт',
'username' => 'Имя пользователя',
'database' => 'База данных',
'new' => 'Новый',
'danger' => 'Опасность',
'create' => 'Создать',
'select_all' => 'Выбрать все',
'select_none' => 'Выберат ни одного',
'alias' => 'Псевдоним',
'primary' => 'Основной',
'make_primary' => 'Сделать основным',
'none' => 'Никто',
'cancel' => 'Отмена',
'created_at' => 'Создан в',
'action' => 'Действие',
'data' => 'Дата',
'queued' => 'Очередь',
'last_run' => 'Последний запуск',
'next_run' => 'Следующий запуск',
'not_run_yet' => 'Еще не работает',
'yes' => 'Да',
'no' => 'Нет',
'delete' => 'Удалить',
'2fa' => '2FA',
'logout' => 'Выйти',
'admin_cp' => 'Панель управления администратора',
'optional' => 'Опциональный',
'read_only' => 'Только чтение',
'relation' => 'Зависимость',
'owner' => 'Владелец',
'admin' => 'Администратор',
'subuser' => 'Доп-пользователь',
'captcha_invalid' => 'Капча недействительна.',
'tasks' => 'Задачи',
'seconds' => 'Секунд',
'minutes' => 'Минут',
'under_maintenance' => 'На техобслуживании',
'days' => [
'sun' => 'Воскресенье',
'mon' => 'Понедельник',
'tues' => 'Вторник',
'wed' => 'Среда',
'thurs' => 'Черверг',
'fri' => 'Пятница',
'sat' => 'Суббота',
],
'last_used' => 'Последний раз был использован',
];

View File

@ -0,0 +1,105 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| following language lines contain default error messages used by
| validator class. Some of these rules have multiple versions such
| as size rules. Feel free to tweak each of these messages here.
|
*/
'accepted' => ':attribute должен быть принят.',
'active_url' => ':attribute не является допустимым URL.',
'after' => ':attribute должен быть датой после :date.',
'after_or_equal' => ':attribute должен быть датой после или равен :date.',
'alpha' => ':attribute может содержать только буквы.',
'alpha_dash' => ':attribute может содержать только буквы, цифры и тире.',
'alpha_num' => ':attribute может содержать только буквы и цифры.',
'array' => ':attribute должен быть массивом.',
'before' => ':attribute должен быть датой до :date.',
'before_or_equal' => ':attribute должен быть датой до или равен :date.',
'between' => [
'numeric' => ':attribute должен быть между :min и :max.',
'file' => ':attribute должен быть между :min и :max килобайт.',
'string' => ':attribute должен быть между :min и :max символами.',
'array' => ':attribute должен содержать от :min до :max элементов.',
],
'boolean' => ':attribute должно быть true или false.',
'confirmed' => ':attribute Подтверждение не совпадает.',
'date' => ':attribute не является допустимой датой.',
'date_format' => ':attribute не соответствует формату :format.',
'different' => ':attribute и :other должен быть другим.',
'digits' => ':attribute должен быть :digits цифровым.',
'digits_between' => ':attribute должен быть между :min и :max цифрами.',
'dimensions' => ':attribute имеет недопустимые размеры изображения.',
'distinct' => ':attribute имеет повторяющееся значение.',
'email' => ':attribute должен быть действительным адресом электронной почты.',
'exists' => 'выбранный :attribute недействителен.',
'file' => ':attribute должен быть файлом.',
'filled' => 'поле :attribute обязательно для заполнения.',
'image' => ':attribute должен быть изображением.',
'in' => 'выбранный :attribute недействителен.',
'in_array' => 'поле :attribute не существует в :other.',
'integer' => ':attribute должен быть целым числом.',
'ip' => ':attribute должен быть действительным IP-адресом.',
'json' => ':attribute должен быть допустимой строкой JSON.',
'max' => [
'numeric' => ':attribute не может быть больше чем :max.',
'file' => ':attribute не может быть больше, чем :max килобайт.',
'string' => ':attribute не может быть больше, чем :max символов.',
'array' => ':attribute может содержать не более :max предметов.',
],
'mimes' => ':attribute должен быть файл типа: :values.',
'mimetypes' => ':attribute должен быть файл типа: :values.',
'min' => [
'numeric' => ':attribute должен быть не менее :min.',
'file' => ':attribute должно быть не менее :min килобайт.',
'string' => ':attribute должно быть не менее :min символов.',
'array' => ':attribute должно иметь как минимум :min предметов.',
],
'not_in' => 'выбранный :attribute недействителен.',
'numeric' => ':attribute должен быть числом.',
'present' => ':attribute поле должно присутствовать.',
'regex' => ':attribute Формат неверен.',
'required' => ':attribute Поле, обязательное для заполнения.',
'required_if' => ':attribute Поле обязательно для заполнения, когда :other является :value.',
'required_unless' => ':attribute Поле обязательно для заполнения, если :other не находится в :values.',
'required_with' => ':attribute Поле обязательно для заполнения, когда :values присутствуют.',
'required_with_all' => ':attribute Поле обязательно для заполнения, когда :values присутствуют.',
'required_without' => ':attribute Поле обязательно для заполнения, когда :values отсутствуют.',
'required_without_all' => ':attribute поле обязательно для заполнения, когда нет ни одного из :values.',
'same' => ':attribute и :other должены совпадать.',
'size' => [
'numeric' => ':attribute должно быть :size.',
'file' => ':attribute должно быть :size килобайт.',
'string' => ':attribute должно быть :size символов.',
'array' => ':attribute должен содержать :size предметов.',
],
'string' => ':attribute должен быть строкой.',
'timezone' => ':attribute должна быть действительной зоной.',
'unique' => ':attribute уже занят.',
'uploaded' => ':attribute не удалось загрузить.',
'url' => ':attribute Формат неверен.',
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| 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' => [],
// Internal validation logic for Pterodactyl
'internal' => [
'variable_value' => ':env переменная',
],
];

View File

@ -9,25 +9,25 @@
return [
'notices' => [
'created' => '一个新的管理模块, :name, 已成功创建。',
'deleted' => '成功从面板删除指定的管理模块。',
'updated' => '成功更新管理模块选项。',
'created' => '已成功创建 :name 。',
'deleted' => '成功从面板删除指定的管理模块。',
'updated' => '成功更新管理模块选项。',
],
'eggs' => [
'notices' => [
'imported' => '成功导入一个管理模板。',
'updated_via_import' => '管理模板已按照上传的文件完成更新。',
'deleted' => '成功删除指定的管路模板。',
'updated' => '成功更新管理模板的配置。',
'script_updated' => '管理模板的安装脚本已经成功更新并且会在安装新服务器时被执行。',
'imported' => '成功导入管理模板。',
'updated_via_import' => '管理模板已按照上传的文件完成更新。',
'deleted' => '成功删除指定的管路模板。',
'updated' => '成功更新管理模板的配置。',
'script_updated' => '已成功更新孵化蛋安装脚本且将于服务器安装时自动执行。',
'egg_created' => '一个管理模板已经成功创建. 你需要重启所有正在运行的节点受控端来使该模板生效。',
],
],
'variables' => [
'notices' => [
'variable_deleted' => '参数 ":variable" 已被移除,在服务器重装之后将不在有效。',
'variable_updated' => '参数 ":variable" 已更新。 你需要重装所有服务器来使该参数生效.',
'variable_created' => '新的参数已经创建并被赋值,该操作会影响此管理模板下的所有服务器',
'variable_deleted' => '已移除变量 ":variable" 且其在重构服务器镜像后将会失效。 ',
'variable_updated' => '已更新变量 ":variable" 。您需要重构使用此变量的服务器以应用更改。',
'variable_created' => '已成功创建新变量并分配给此孵化蛋。',
],
],
];

View File

@ -9,15 +9,15 @@
return [
'validation' => [
'fqdn_not_resolvable' => '提供的域名或地址没有解析到一个合法的IP地址.',
'fqdn_required_for_ssl' => '这个节点要求解析到一个公共IP的域名必须使用SSL',
'fqdn_not_resolvable' => '提供的正式域名FQDN或 IP 地址未解析到有效的 IP 地址。',
'fqdn_required_for_ssl' => '此节点需要解析到公网 IP 地址的正式域名才能使用 SSL。',
],
'notices' => [
'allocations_added' => '配额已经成功的被添加到这个节点.',
'node_deleted' => '节点成功从面板中移除.',
'location_required' => '在你可以添加一个节点之前必须至少有一个可用区配置。',
'node_created' => '节点新建成功! 使用 \'Configuration\' 标签,你可以在此节点上自动配置受控端. <strong>在你可以创建服务器之前你必须至少分配一个IP和端口</strong>',
'node_updated' => '节点信息更新成功!如果任何节点受控端的设置更改了,您需要重启受控端来使设置生效.',
'unallocated_deleted' => '已删除 <code>:ip</code> 上的所有未分配的端口',
'allocations_added' => '已成功为此节点分配地址。',
'node_deleted' => '已成功从面板中移除节点。',
'location_required' => '您必须至少配置一个区域才能添加节点至面板。',
'node_created' => '已成功新建节点!您可通过\'配置\'选项卡已自动配置此机器上的守护程序。<strong>在您添加服务器前,您必须先分配一个 IP 地址及端口。</strong>',
'node_updated' => '已更新节点信息。若守护程序设置更改,您需要重启守护程序才能生效。',
'unallocated_deleted' => '已为 <code>:ip</code> 删除所有未分配的端口。',
],
];

View File

@ -9,8 +9,8 @@
return [
'notices' => [
'pack_updated' => '整合包已经被更新。',
'pack_deleted' => '成功删除整合包: ":name" 。',
'pack_created' => '一个整合包成功创建,现在可以用它来部署服务器了。',
'pack_updated' => '已成功更新整合包。',
'pack_deleted' => '已成功从系统中删除整合包 “:name”。',
'pack_created' => '已成功在系统上创建整合包现在可以使用它来部署服务器了。',
],
];

View File

@ -9,23 +9,23 @@
return [
'exceptions' => [
'no_new_default_allocation' => '你正在尝试删除此服务器的默认配额,但是该服务器没有足够的后备配额。',
'marked_as_failed' => '这个服务器目前被标记为安装失败。 当前状态不能改变为此状态。',
'bad_variable' => '变量 :name 有一个已确认的错误 。',
'daemon_exception' => '连接受控端时发生意外 返回错误码 HTTP/:code response code. 此错误已被记录。',
'default_allocation_not_found' => '请求的默认配额没有在这台服务器上找到。',
'no_new_default_allocation' => '您正在尝试删除此服务器的默认分配地址,但此服务器可用的备选分配地址。',
'marked_as_failed' => '此服务器被标记为安装失败。当前状态无法在面板中被改变。',
'bad_variable' => '变量 :name 有验证错误。',
'daemon_exception' => '连接守护程序时返回 HTTP/:code 反馈码。此错误已被记录。',
'default_allocation_not_found' => '未在此服务器上找到请求的默认分配地址。',
],
'alerts' => [
'startup_changed' => '该服务器的启动配置已被更新. 如果此服务器所属的管理模块或管理模板更改,此时将发生一次配置重设',
'server_deleted' => '成功从系统中删除服务器',
'server_created' => '创建服务器成功。 请稍后几分钟,受控端将尽快完成服务器安装',
'build_updated' => '启动参数已更改。 一些修改需要重启该服务器后生效。',
'suspension_toggled' => '服务器状态已更改为 :status.',
'rebuild_on_boot' => '此服务器已被标记为需要在Docker容器中启动。 此操作会在下次重启后生效。',
'install_toggled' => '此服务器的安装状态已被更改',
'server_reinstalled' => '此服务器目前已置于重装队列中,即将开始重装',
'details_updated' => '服务器信息成功被更新',
'docker_image_updated' => '成功更改用于该服务器的默认的Docker镜像。 此操作需要重启后生效',
'node_required' => '你需要至少一个节点才能开始添加服务器',
'startup_changed' => '已更新此服务器的启动配置。若此服务器的启动模板被更改,其将被重新安装。',
'server_deleted' => '成功从系统中删除服务器',
'server_created' => '已成功在面板中创建服务器。请稍等面板完全安装服务器完毕。',
'build_updated' => '已更新此服务器的构建参数。部分更改可能需要重启才能生效。启动参数已更改。',
'suspension_toggled' => '服务器停用状态已更改为 :status.',
'rebuild_on_boot' => '此服务器已被标记为需要重新构建 Docker 容器。此操作会在下次启动服务器后生效。',
'install_toggled' => '此服务器的安装状态已被更改',
'server_reinstalled' => '此服务器已置于即将开始重装队列中。',
'details_updated' => '已成功更新服务器信息。',
'docker_image_updated' => '已成功更改此服务器使用的默认 Docker 镜像。此操作需要重启以应用更改。',
'node_required' => '您需要配置至少一个节点以添加服务器至面板。',
],
];

View File

@ -9,10 +9,10 @@
return [
'exceptions' => [
'user_has_servers' => '无法删除一个拥有活动状态服务器的用户. 请在继续此操作前删除他的服务器',
'user_has_servers' => '无法删除已绑定活跃服务器的账户。请删除服务器后继续。',
],
'notices' => [
'account_created' => '成功创建用户',
'account_updated' => '成功更新用户',
'account_created' => '成功创建用户',
'account_updated' => '成功更新用户',
],
];

View File

@ -2,21 +2,21 @@
return [
'not_authorized' => '您无权执行此操作。',
'auth_error' => '尝试登录时发生错误.',
'authentication_required' => '需要认证才能继续操作',
'auth_error' => '登录时发生错误。',
'authentication_required' => '需要认证以继续',
'remember_me' => '记住我',
'sign_in' => '登陆',
'forgot_password' => '忘记密码',
'request_reset_text' => '忘记密码? 请在下方填入您的Email.',
'reset_password_text' => '重设账户密码.',
'request_reset_text' => '忘记密码了吗?请在下方填入您的电子邮件地址。',
'reset_password_text' => '重设账户密码',
'reset_password' => '重设密码',
'email_sent' => '一封帮助您重置密码的电子邮件已发出,请查收并按提示操作(如未收到请检查垃圾箱)',
'failed' => '用户名或密码错误, 或者两步验证失败.',
'throttle' => '太多次登陆失败. 请在 :seconds 秒后尝试',
'password_requirements' => '密码至少包含大写字母小写字母数字并且在8位以上.',
'email_sent' => '一封含有重置密码指引的邮件已发送至您的电子邮箱地址。',
'failed' => '所提供的凭证与我们所记录的不符,或可能两步验证失败。',
'throttle' => '登录尝试次数过多。请 :seconds 秒后重试。',
'password_requirements' => '密码必须含有一位大写字母、小写字母及数字且长度至少为八位。',
'request_reset' => '查找账户',
'2fa_required' => '两步验证',
'2fa_failed' => '两步验证密码错误',
'totp_failed' => '错误的TOTP验证.',
'2fa_must_be_enabled' => '管理员要求您的账户必须开启两步验证才能使用此面板.',
'totp_failed' => '尝试进行两步验证时发生错误。',
'2fa_must_be_enabled' => '管理员要求您启用两步验证才能使用面板。',
];

View File

@ -3,86 +3,87 @@
return [
'validation_error' => '请求中有一个或多个字段出错',
'errors' => [
'return' => '返回上一个',
'return' => '返回上页',
'home' => '返回主页',
'403' => [
'header' => '禁止访问',
'desc' => '您没有权限访问此服务器上的资源.',
'desc' => '您没有访问此服务器上的资源的权限。',
],
'404' => [
'header' => 'Not Found',
'desc' => '未找到资源.',
'header' => '文件未找到',
'desc' => '我们无法在此服务器上找到所请求的资源。',
],
'installing' => [
'header' => '服务器正在安装',
'desc' => '请求的服务器仍然在部署中,请稍等几分钟,完成后您将收到一封电子邮件',
'header' => '服务器安装',
'desc' => '请求的服务器正在完成安装进程。请几分钟后再来查看,您将在此过程完成后收到电子邮件提醒。',
],
'suspended' => [
'header' => '服务器已停',
'desc' => '此服务器已被暂停,无法访问,请联系管理员',
'header' => '服务器已',
'desc' => '此服务器已停用且无法访问。',
],
'maintenance' => [
'header' => '节点维护中',
'title' => '暂时不可用',
'desc' => '此节点正在维护,当前无法访问.',
'desc' => '此节点正在维护,当前无法访问',
],
],
'index' => [
'header' => '您的服务器',
'header_sub' => '您当前可访问的服务器.',
'header_sub' => '您有权限访问的服务器。',
'list' => '服务器列表',
],
'api' => [
'index' => [
'list' => '您的密钥',
'header' => '账户 API',
'header_sub' => '管理访问密钥允许您使用API操作面板.',
'header_sub' => '管理允许您对面板执行操作的 API 密钥。',
'create_new' => '新建 API 密钥',
'keypair_created' => '新建API密钥成功.',
'keypair_created' => '已成功生成 API 密钥并列于下方。',
],
'new' => [
'header' => '新建 API 密钥',
'header_sub' => '创建一个新的账户API密钥.',
'form_title' => '选项',
'header_sub' => '新建账户访问密钥。',
'form_title' => '详细信息',
'descriptive_memo' => [
'title' => '描述',
'description' => '添加一个关于此密钥的描述.',
'description' => '请输入便于分辨此密钥的描述信息。',
],
'allowed_ips' => [
'title' => '允许的IP',
'description' => '添加IP地址限制来保护API安全. CIDR 标记是被允许的. 留空将允许所有IP.',
'title' => '许可 IP',
'description' => '输入允许使用此密钥的 IP 地址列表。此功能支持无类别域间路由。留空将允许所有 IP 使用。',
],
],
],
'account' => [
'details_updated' => '您账户的信息成功更新.',
'invalid_password' => '您提供的密码不正确.',
'details_updated' => '已成功更新您的账户信息。',
'invalid_password' => '您提供的密码无效。',
'header' => '您的账户',
'header_sub' => '管理您的账户信息.',
'update_pass' => '修改密码',
'update_email' => '修改 Email 地址',
'update_email' => '修改电子邮件地址',
'current_password' => '当前密码',
'new_password' => '新密码',
'new_password_again' => '重复密码',
'new_email' => '新 Email 地址',
'first_name' => '姓',
'last_name' => '名',
'new_email' => '新电子邮件地址',
'first_name' => '姓',
'last_name' => '名',
'update_identity' => '更新个人信息',
'username_help' => '您的用户名必须唯一(未被使用),并满足以下要求: :requirements.',
'username_help' => '您的用户名必须未被他人使用,且仅包含下列字符::requirements。',
'language' => '语言',
],
'security' => [
'session_mgmt_disabled' => '为了安全原因,您的此次会话无法访问用户管理.',
'session_mgmt_disabled' => '您的托管商未启用此界面来管理账户会话。',
'header' => '账户安全',
'header_sub' => '管理活动会话和两步认证.',
'sessions' => '活动中的会话',
'header_sub' => '管理活跃中的会话与两步验证。',
'sessions' => '活会话',
'2fa_header' => '两步验证',
'2fa_token_help' => '填入您两步验证生成器生成的密码 (Google Authenticator, Authy, etc.).',
'2fa_token_help' => '请填入由应用程序所生成的两步验证密钥Google 身份验证器、Authy 等)。',
'disable_2fa' => '关闭两步验证',
'2fa_enabled' => '两步验证已开启,在您登陆面板时会要求两步验证.如果您想关闭两步验证,只需输入两步验证的密码即可',
'2fa_disabled' => '两步验证已关闭! 您应该开启两步验证将其作为您账户的额外防护',
'enable_2fa' => '启两步验证',
'2fa_qr' => '在您的设备上配置两步验证',
'2fa_checkpoint_help' => '使用两步验证需要用您的应用扫左侧二维码, 或手动输入下方的代码.完成后请将生成的密码输入下方方框.',
'2fa_disable_error' => '两步验证密码错误. 关闭两步验证失败.',
'2fa_enabled' => '已为此账户启用两步验证,您将需要验证以登录至此账户。若您想关闭两步验证,您只需在下方输入密钥并提交即可。',
'2fa_disabled' => '已关闭两步验证!您应启用此功能来作为此账户的附加防护手段。',
'enable_2fa' => '两步验证',
'2fa_qr' => '在您的设备上配置两步验证',
'2fa_checkpoint_help' => '在您的手机上使用两步验证应用程序扫描左侧的二维码或直接输入下方的代码。录入后,请在下方输入应用程序生成的密码。',
'2fa_disable_error' => '提供的两步验证密钥无效。未关闭此账户的两步验证。两步验证密码错误. 关闭两步验证失败.',
],
];

View File

@ -2,54 +2,54 @@
return [
'key' => [
'warning' => '貌似您已经拥有一个应用加密密钥了. 继续操作会导致之前的密钥被覆盖,所有的加密文件都将损坏。 !!!危险操作,请注意文件安全',
'confirm' => '我已了解此操作的后果,可以承受丢失文件的风险,请继续。',
'final_confirm' => '确定继续操作? 更改应用加密密钥 !!将会导致数据丢失!!.',
'warning' => '似乎您已配置应用程序加密密钥。继续此操作将覆盖密钥并损坏已加密数据。请了解您所执行的操作后再决定是否继续',
'confirm' => '我已了解执行此操作的后果并承受丢失加密数据的风险,请继续。',
'final_confirm' => '确您是否决定继续?更改应用程序加密密钥将导致数据丢失!!!',
],
'location' => [
'no_location_found' => '可用区ID错误无发找到该可用区',
'ask_short' => '可用区ID',
'ask_long' => '可用区描述',
'created' => '成功创建可用区 (:name) 可用区ID :id.',
'deleted' => '成功删除指定的可用区。',
'no_location_found' => '无法找到与提供的代码匹配的记录。',
'ask_short' => '地区代码',
'ask_long' => '区描述',
'created' => '已成功创建地区(:name编号为 :id。',
'deleted' => '已成功删除请求的地区。',
],
'user' => [
'search_users' => '输入用户名, UUID, 或 Email 地址',
'select_search_user' => '要删除的用户ID (键入 \'0\' 来重新搜索)',
'deleted' => '成功删除用户。',
'confirm_delete' => '确定要删除此用户吗',
'no_users_found' => '未找到指定的用户',
'multiple_found' => '找到多个用户, 无法删除用户,原因: --no-interaction 参数。',
'ask_admin' => '此用户是管理员',
'search_users' => '请输入用户名、UUID 或电子邮件地址',
'select_search_user' => '待删除的用户编号(请键入 \'0\' 来重新搜索)',
'deleted' => '成功从面板删除用户。',
'confirm_delete' => '您是否想从面板中删除此用户?',
'no_users_found' => '未找到匹配搜索项的用户。',
'multiple_found' => '已找到多个匹配搜索项的用户,由于 --no-interaction 参数而无法删除。',
'ask_admin' => '此用户是否为管理员?',
'ask_email' => '电子邮件地址',
'ask_username' => '用户名',
'ask_name_first' => '姓',
'ask_name_last' => '名',
'ask_name_first' => '姓',
'ask_name_last' => '名',
'ask_password' => '密码',
'ask_password_tip' => '如果您想创建一个随机密码的用户,请重新执行指令(CTRL+C) 并输入 `--no-password` 参数.',
'ask_password_help' => '密码至少8位并包含一个字母和数字',
'ask_password_tip' => '若您想创建用户并稍后发送生成的随机密码给用户请重新运行此命令CTRL+C并添加 `--no-password` 参数。',
'ask_password_help' => '密码长度必须至少为八位且包含至少一位大写字母和数字。',
'2fa_help_text' => [
'此命令会关闭一个用户的两步验证(如果他打开了). 此命令应仅用于用户恢复或解锁(两步验证无法成功情况下)。',
'如果您不想这么做, 情书用 CTRL+C 退出此操作。',
'此命令将关闭账户的两步验证(若启用)。此命令应作为账户被锁定时的恢复措施。',
'若您不想这么做,请使用 CTRL+C 退出进程。',
],
'2fa_disabled' => '已成功禁用以下账户的两步验证: :email.',
'2fa_disabled' => '已成功为 :email 禁用两步验证。',
],
'schedule' => [
'output_line' => '第一次任务已计划于 `:schedule` (:hash).',
'output_line' => '首次任务将于 `:schedule`:hash后执行。',
],
'maintenance' => [
'deleting_service_backup' => '正在删除服务备份文件 :file.',
'deleting_service_backup' => '正在删除服务备份文件 :file',
],
'server' => [
'rebuild_failed' => '重构操作 ":name" (#:id) ,位于节点 ":node" 失败,错误信息: :message',
'rebuild_failed' => '节点 ":node" 上的重构操作 ":name"#:id 发生了 :message 错误。',
'power' => [
'confirm' => '您即将执行 :action 在 :count 个服务器. 是否继续?',
'action_failed' => '电源命令 ":name" (#:id) 位于节点 ":node" 失败,错误信息: :message',
'confirm' => '您将在 :count 台服务器上执行 :action 操作。是否继续?',
'action_failed' => '节点 ":node" 上的电源命令 ":name"#:id 发生了 :message 错误。',
],
],
'environment' => [
'mail' => [
'ask_smtp_host' => 'SMTP 主机 (e.g. smtp.gmail.com)',
'ask_smtp_host' => 'SMTP 主机(如 smtp.gmail.com',
'ask_smtp_port' => 'SMTP 端口',
'ask_smtp_username' => 'SMTP 用户名',
'ask_smtp_password' => 'SMTP 密码',
@ -57,41 +57,41 @@ return [
'ask_mailgun_secret' => 'Mailgun 密钥',
'ask_mandrill_secret' => 'Mandrill 密钥',
'ask_postmark_username' => 'Postmark API 密钥',
'ask_driver' => '哪个引擎应该用于发送邮件?',
'ask_mail_from' => 'Email来自哪个邮箱',
'ask_mail_name' => 'Email应该由谁发送发送者姓名',
'ask_encryption' => '应该使用的加密方法',
'ask_driver' => '应使用哪款引擎发送邮件?',
'ask_mail_from' => '电子邮件地址的邮件发信人为',
'ask_mail_name' => '电子邮件的显示发信人为',
'ask_encryption' => '加密方法',
],
'database' => [
'host_warning' => '极度推荐不使用localhost作为主机地址可能有bug. 如果确实要使用本机作为MySQL地址请使用 "127.0.0.1".',
'host_warning' => '由于经常发生套接字连接错误,我们极度不推荐您使用 “localhost” 作为数据库主机地址。若您仍想使用本地连接则应使用 “127.0.0.1”。',
'host' => '数据库主机',
'port' => '数据库端口',
'database' => '数据库名',
'username_warning' => '使用 "root" 账户会导致安全漏洞, 翼龙面板不允许此账户作为面板数据库账户. 你应该为此程序创建MySQL庄户',
'username_warning' => '不仅翼龙面板不允许使用 "root" 账户连接 MySQL 数据库,且这将产生严重安全漏洞。您应为此软件单独创建 MySQL 账户。',
'username' => '数据库用户名',
'password_defined' => '您似乎已经指定了MySQL连接密码你想更改它吗',
'password_defined' => '您似乎已创建了带有密码的 MySQL 连接,您是否想更改?',
'password' => '数据库密码',
'connection_error' => '无法连接数据库. 返回错误: ":error".',
'creds_not_saved' => '您的数据库访问信息未保存. 在继续之前您将需要提供有效的信息',
'try_again' => '返回再试一次',
'connection_error' => '无法使用提供的凭证连接 MySQL 服务器。 返回的错误为 ":error"。',
'creds_not_saved' => '您的数据库访问凭证尚未保存。您需要在继续前提供有效的连接信息。',
'try_again' => '是否返回重试',
],
'app' => [
'settings' => '启用基于UI的设置编辑器?',
'author' => '管理模板作者Email',
'author_help' => '提供此面板到处的管理模板作者的电子邮件地址. 这应该是一个合法的电子邮件地址',
'app_url_help' => '这个应用的URL必须以 https:// or http:// 开头取决于是否启用SSL. 如果不包含这些您的电子邮件地址和其他内容可能会指向错误的地址.',
'app_url' => '应用 URL',
'timezone_help' => '设置的时区应该满足PHP支持的时区. 如果您不确定,请参阅 http://php.net/manual/en/timezones.php.',
'timezone' => '应用时区',
'cache_driver' => 'Cache Driver',
'session_driver' => 'Session Driver',
'queue_driver' => 'Queue Driver',
'using_redis' => '如果您选择使用Redis, 请在下方提供有效的连接信息. 一般使用默认信息即可,除非您更改过设置.',
'settings' => '是否启用可视化设置编辑器?',
'author' => '管理模板作者电子邮件地址',
'author_help' => '提供从此面板导出管理模板人员的电子邮件地址。此电子邮件地址必须合法。',
'app_url_help' => '根据您是否启用 SSL 来决定此应用程序的 URL 应为 https:// 或 http://。若您选择错误,您的电子邮件及其他内容将指向到错误地址。',
'app_url' => '应用程序 URL',
'timezone_help' => '时区应匹配 PHP 所支持的时区。 如果您不确定,请参阅 http://php.net/manual/en/timezones.php。',
'timezone' => '应用程序时区',
'cache_driver' => '缓存驱动程序',
'session_driver' => '会话驱动程序',
'queue_driver' => '队列驱动程序',
'using_redis' => '若您选择使用 Redis请在下方提供有效的连接信息。在您未更改设置的大多数情况下您均可使用默认值。',
'redis_host' => 'Redis 主机',
'redis_password' => 'Redis 密码',
'redis_pass_help' => '默认情况下Redis数据库不需要密码,且仅运行于本地. 这种情况下,您什么都不用填.',
'redis_pass_help' => '默认情况下Redis 服务器实例无需密码且在本地运行禁止外界访问。这种情况下,您只需回车即可。',
'redis_port' => 'Redis 端口',
'redis_pass_defined' => '似乎您已经设置过Redis密码了您需要更改吗?',
'redis_pass_defined' => '您似乎已为 Redis 配置了密码,您是否想更改?',
],
],
];

View File

@ -1,68 +1,68 @@
<?php
return [
'daemon_connection_failed' => '连接受控端时发生意外 返回错误码 HTTP/:code response code. 此错误已被记录',
'daemon_connection_failed' => '尝试连接守护程序是发生错误,状态码 HTTP/:code。此错误已被记录。',
'node' => [
'servers_attached' => '节点删除必须按先移除其所有的服务器.',
'daemon_off_config_updated' => '受控端配置 <strong>已被更新</strong>, 但是自动更新受控端上的配置文件时发生错误. 你需要手动将配置文件 (core.json) 更新至受控端来完成更新.',
'servers_attached' => '要删除节点,您必须先取消其与其他服务器的关联。',
'daemon_off_config_updated' => '<strong>已更新</strong>守护程序配置但在尝试自动更新守护程序配置文件时发生错误。您需要手动更新守护程序的配置文件core.json以应用更改。',
],
'allocations' => [
'server_using' => '一个服务器已分配该地址. 一个地址只有在无服务器使用时才能删除.',
'too_many_ports' => '一次添加1000个以上的端口是不被支持的.',
'invalid_mapping' => '提供的端口: :port 无效,无法继续操作.',
'cidr_out_of_range' => 'CIDR 标记 只允许掩码在 /25 到 /32之间。',
'port_out_of_range' => '端口超过范围,范围必须在 1024 到 65535 之间.',
'server_using' => '已有服务器被分配到该地址。您必须先解除关联才能删除此地址。',
'too_many_ports' => '不支持单次添加多于 1000 个端口。',
'invalid_mapping' => '所提供的端口 :port 无效,无法继续操作。',
'cidr_out_of_range' => '类别域间路由仅允许介于 /25 和 /32 之间的掩码。',
'port_out_of_range' => '分配端口的范围必须介于 1024 至 65535 之间。',
],
'nest' => [
'delete_has_servers' => '活动服务器使用的管理模块不能被删除.',
'delete_has_servers' => '无法删除附着到活跃服务器上的管理模块。',
'egg' => [
'delete_has_servers' => '活动服务器使用的管理模板不能被删除.',
'invalid_copy_id' => '管理模板复制的脚本ID无效.',
'must_be_child' => ' "复制设置自"选项指定的目标必须是管理模块的附属.',
'has_children' => '此管理模版附属有一个或多个管理模板. 在删除之前请先删除所有附属.',
'delete_has_servers' => '无法删除附着到活跃服务器上的管理模块。',
'invalid_copy_id' => '用于复制脚本的管理模板不存在,或脚本本身不存在。',
'must_be_child' => '“复制设置自”选项指定的目标必须为所选管理模块的子选项。',
'has_children' => '此管理模版为一个或多个管理模板的母模板。请先删除其他管理模板再删除此模板。',
],
'variables' => [
'env_not_unique' => '环境变量 :name 必须唯一.',
'reserved_name' => '环境变量 :name 是被保护的,无法指定为变量.',
'bad_validation_rule' => '环境变量规则 ":rule" 对于这个应用不是一个有效的规则.',
'env_not_unique' => '此管理面板的环境变量 :name 必须唯一。',
'reserved_name' => '环境变量 :name 被保护的且无法被分配至其他变量。',
'bad_validation_rule' => '验证规则 “:rule” 不是此应用程序的有效规则。',
],
'importer' => [
'json_error' => '尝试导入JSON 文件时发生错误: :error.',
'file_error' => '提供的JSON文件不合法.',
'invalid_json_provided' => '提供的JSON文件格式不正确,无法被解析。',
'json_error' => '导入 JSON 文件时发生错误::error.',
'file_error' => '所提供的 JSON 文件无效。',
'invalid_json_provided' => '提供的 JSON 文件格式无法被解析。',
],
],
'packs' => [
'delete_has_servers' => '活动服务器使用的整合包不能被删除',
'update_has_servers' => '当前有服务器附属于包时无法修改关联选项的ID.',
'invalid_upload' => '上传的文件不合法.',
'invalid_mime' => '上传的文件不符合要求的文件类型 :type',
'unreadable' => '服务器无法打开该压缩包.',
'zip_extraction' => '解压时发生错误.',
'invalid_archive_exception' => '压缩包缺失archive.tar.gz 或 import.json 文件在根目录.',
'delete_has_servers' => '无法删除依附到活跃服务器的整合包。',
'update_has_servers' => '无法在有服务器依附至整合包时修改关联选项编号。',
'invalid_upload' => '所提供的文件格式无效。',
'invalid_mime' => '提供的文件不符合所需文件类型 :type',
'unreadable' => '服务器无法打开所提供的归档文件。',
'zip_extraction' => '提取归档文件至服务器时发生错误。',
'invalid_archive_exception' => '整合包归档文件的根目录似乎缺少 archive.tar.gz 或 import.json。',
],
'subusers' => [
'editing_self' => '编辑您自己的子用户时不被允许的.',
'user_is_owner' => '子用户无法添加服主.',
'subuser_exists' => '那个电子邮件的用户已经是此服务器的子用户了.',
'editing_self' => '您无法作为子用户编辑您自己的子用户账号。',
'user_is_owner' => '您无法作为子用户来添加为此服务器的服主。',
'subuser_exists' => '使用该电子邮件地址的用户已被分配为此服务器的子用户。',
],
'databases' => [
'delete_has_databases' => '无法删除一个拥有活跃数据库的数据库服务器.',
'delete_has_databases' => '无法删除关联至活跃数据库的数据库服务器。',
],
'tasks' => [
'chain_interval_too_long' => '链接任务的最大间隔时间为15分钟。',
'chain_interval_too_long' => '连环任务的最大时间间隔为 15 分钟。',
],
'locations' => [
'has_nodes' => '活动节点附属的可用区无法被删除.',
'has_nodes' => '无法删除被依附活动节点的区域。',
],
'users' => [
'node_revocation_failed' => '吊销密钥失败 <a href=":link">节点 #:node</a>. :error',
'node_revocation_failed' => '注销<a href=":link">节点 #:node</a> 的密钥失败::error',
],
'deployment' => [
'no_viable_nodes' => '没有合适的节点来自动部署服务器',
'no_viable_allocations' => '没有合适的地址来自动部署服务器',
'no_viable_nodes' => '无法找到满足自动化部署需求的节点。',
'no_viable_allocations' => '无法找到满足自动化部署需求的分配地址。',
],
'api' => [
'resource_not_found' => '需求的资源未找到.',
'resource_not_found' => '服务器上不存在所请求的资源。',
],
];

View File

@ -1,7 +1,7 @@
<?php
return [
'home' => '页',
'home' => '页',
'account' => [
'header' => '账户管理',
'my_account' => '我的账户',

View File

@ -12,6 +12,6 @@ return [
|
*/
'previous' => '&laquo; 上一步',
'next' => '下一步 &raquo;',
'previous' => '&laquo; 上',
'next' => '下 &raquo;',
];

View File

@ -11,9 +11,9 @@ return [
| has failed, such as for an invalid token or invalid new password.
|
*/
'password' => '密码至少六位数,并且两次输入的密码一致.',
'reset' => '您的密码已重设!',
'sent' => '我们已发送密码重设电子邮件!',
'token' => '此密码重设连接的令牌已过期.',
'user' => '无法找到此Email的用户.',
'password' => '密码必须至少包含六位字符且与确认密码匹配。',
'reset' => '已重设您的密码!',
'sent' => '我们已发送密码重设链接至您的电子邮件地址!',
'token' => '此密码重设令牌无效。',
'user' => '我们无法找到使用此电子邮件地址的用户。',
];

View File

@ -2,17 +2,17 @@
return [
'index' => [
'title' => '服务器状态 :name',
'title' => '查看服务器 :name ',
'header' => '服务器控制台',
'header_sub' => '实时控制您的服务器.',
'header_sub' => '实时掌控您的服务器。',
],
'schedule' => [
'header' => '计划任务',
'header_sub' => '在一处,轻松管理服务器任务.',
'header_sub' => '一处轻松掌管服务器任务。',
'current' => '当前计划',
'new' => [
'header' => '创建新任务',
'header_sub' => '创建一个新的定时任务.',
'header' => '新建计划',
'header_sub' => '为此服务器新建一组计划任务。',
'submit' => '创建任务',
],
'manage' => [
@ -21,63 +21,63 @@ return [
'delete' => '删除任务',
],
'task' => [
'time' => '在。。。之后',
'time' => '在···之后',
'action' => '执行操作',
'payload' => '任务内容',
'add_more' => '添加另一个任务',
'add_more' => '添加其他任务',
],
'actions' => [
'command' => '发送命令',
'power' => '电源命令',
],
'toggle' => '更改状态',
'run_now' => '触发任务(现在)',
'schedule_created' => '成功在服务器上创建一个计划任务.',
'schedule_updated' => '任务已被更新.',
'run_now' => '触发任务',
'schedule_created' => '已成功在此服务器上新建计划任务。',
'schedule_updated' => '已更新计划任务。',
'unnamed' => '未命名任务',
'setup' => '任务创建',
'setup' => '任务配置',
'day_of_week' => '星期',
'day_of_month' => '日',
'hour' => '时',
'minute' => '分',
'time_help' => '任务系统在定义任务应该何时开始运行时支持使用Cronjob语法。 使用上面的字段指定何时应开始运行这些任务,或从多个选择菜单中选择选项。',
'task_help' => '任务的时间与先前定义的任务相关。 每个计划任务可能分配的任务不超过5个任务可能不会超过15分钟的时间安排。',
'hour' => '时',
'minute' => '分',
'time_help' => '计划任务系统支持使用 Cronjob 语法来定义任务启动时间。使用上方的字段来指定计划任务的开始时间或选择多选菜单中的多个选项。',
'task_help' => '任务时间与先前定义的任务紧密相关。每个计划最多可分配 5 项任务且任务时间间隔不得超过 15 分钟。',
],
'tasks' => [
'task_created' => '成功在面板上创建一个新任务',
'task_updated' => '任务成功被更新. 列表中的所有任务会被取消,并在下一次设定的时间运行.',
'header' => '计划任务',
'header_sub' => '自动化你的服务器.',
'current' => '当前计划任务',
'task_created' => '已成功在面板上新建任务。',
'task_updated' => '已成功更新任务。现有的所有队列中的任务操作将被取消并于下个定义时间执行。',
'header' => '计划任务',
'header_sub' => '自动化您的服务器。',
'current' => '当前计划任务',
'actions' => [
'command' => '发送命令',
'power' => '发送电源令',
'power' => '发送电源令',
],
'new_task' => '添加新任务',
'new_task' => '任务',
'toggle' => '更改状态',
'new' => [
'header' => '新任务',
'header_sub' => '为这个服务器创建一个新任务。',
'task_name' => '任务名',
'header' => '新任务',
'header_sub' => '为此服务器新建计划任务。',
'task_name' => '任务名',
'day_of_week' => '星期',
'custom' => '自定义',
'day_of_month' => '日',
'hour' => '时',
'hour' => '时',
'minute' => '分',
'sun' => '日',
'mon' => '一',
'tues' => '二',
'wed' => '三',
'thurs' => '四',
'fri' => '五',
'sat' => '六',
'sun' => '星期日',
'mon' => '星期一',
'tues' => '星期二',
'wed' => '星期三',
'thurs' => '星期四',
'fri' => '星期五',
'sat' => '星期六',
'submit' => '创建任务',
'type' => '任务类型',
'chain_then' => '然后, 之后',
'chain_then' => '先···再···',
'chain_do' => '执行',
'chain_arguments' => '参数',
'chain_arguments' => '使用参数',
'payload' => '任务内容',
'payload_help' => '例如, 如果你选择 <code>发送命令</code> ,就在此处填写要发送的命令. 如果您选择 <code>发送电源命令</code> 在这里填入电源命令 (e.g. <code>restart</code>).',
'payload_help' => '例如,若您选择<code>发送命令</code>,请在此处填写要发送的命令。若您选择<code>发送电源指令</code>,请在此处填写电源命令(如<code>重启</code>.',
],
'edit' => [
'header' => '任务管理',
@ -86,22 +86,22 @@ return [
],
'users' => [
'header' => '用户管理',
'header_sub' => '控制访问你服务器的用户.',
'header_sub' => '掌控谁能访问您的服务器。',
'configure' => '配置权限',
'list' => '权限用户列表',
'add' => '添加一个新的子用户',
'update' => '修改子用户',
'user_assigned' => '成功连接到一个子用户连接到服务器.',
'user_updated' => '成功更新权限.',
'list' => '权限用户',
'add' => '新增子用户',
'update' => '更新子用户',
'user_assigned' => '已成功分配新子用户至此服务器。',
'user_updated' => '已成功更新权限。',
'edit' => [
'header' => '编辑子用户',
'header_sub' => '管理用户在此服务器的访问权限.',
'header_sub' => '编辑此用户的服务器访问权限。',
],
'new' => [
'header' => '添加新用户',
'header_sub' => '添加一个允许访问此服务器的用户.',
'email' => 'Email 地址',
'email_help' => '填入你希望邀请的协助您管理服务器的人的Email地址.',
'header' => '新增新用户',
'header_sub' => '新增允许访问此服务器的用户。',
'email' => '电子邮件地址',
'email_help' => '输入您邀请管理此服务器用户的电子邮件地址。',
'power_header' => '电源管理',
'file_header' => '文件管理',
'subuser_header' => '子用户管理',
@ -110,180 +110,184 @@ return [
'database_header' => '数据库管理',
'power_start' => [
'title' => '启动服务器',
'description' => '允许该用户启动服务器.',
'description' => '允许此用户启动服务器。',
],
'power_stop' => [
'title' => '停止服务器',
'description' => '允许该用户停止服务器.',
'description' => '允许此用户停止服务器。',
],
'power_restart' => [
'title' => '重新启动服务器',
'description' => '允许该用户重新启动服务器',
'description' => '允许此用户重新启动服务器。',
],
'power_kill' => [
'title' => '强制结束服务器',
'description' => '允许该用户强行关闭服务器',
'title' => '强制关闭服务器',
'description' => '允许此用户强行关闭服务器。',
],
'send_command' => [
'title' => '发送控制台命令',
'description' => '允许用户发送控制台. 如果用户没有"停止服务器"权限那么他无法使用stop命令',
'description' => '允许用户发送控制台命令。若用户没有“停止服务器”权限,则其 stop 命令。',
],
'access_sftp' => [
'title' => 'SFTP 权限',
'description' => '允许用户连接到受控端提供的SFTP服务器.',
'description' => '允许用户连接到守护程序所提供的 SFTP 服务器。',
],
'list_files' => [
'title' => '列出文件',
'description' => '允许用户列出所有文件及文件夹列表,但是无权访问文件.',
'description' => '允许用户列出服务器上所有文件及文件夹,但是无法查看文件内容。',
],
'edit_files' => [
'title' => '编辑文件',
'description' => '允许用户访问文件内容(但更改后无法保存). SFTP 不受此权限影响.',
'description' => '允许用户打开文件查看内容。SFTP 不受此权限影响。',
],
'save_files' => [
'title' => 'Save Files',
'description' => '允许用户保存文件(和编辑文件权限联动). SFTP 不受此权限影响.',
'title' => '保存文件',
'description' => '允许用户保存编辑过的文件内容。SFTP 不受此权限影响。',
],
'move_files' => [
'title' => '重命名移动文件',
'description' => '允许用户在文件系统中重命名和移动文件及文件夹.',
'title' => '重命名移动文件',
'description' => '允许用户在文件系统上重命名与移动文件及文件夹。',
],
'copy_files' => [
'title' => '复制文件',
'description' => '允许用户在文件系统中复制文件及文件夹.',
'description' => '允许用户在文件系统上复制文件及文件夹。',
],
'compress_files' => [
'title' => '压缩文件',
'description' => '允许用户在文件系统中压缩文件及文件夹',
'description' => '允许用户在文件系统上压缩文件及文件夹。',
],
'decompress_files' => [
'title' => '解压文件',
'description' => '允许用户解压 .zip 和 .tar(.gz) 压缩文件.',
'description' => '允许用户解压 .zip 和 .tar.gz归档文件。',
],
'create_files' => [
'title' => '创建文件',
'description' => '允许用户通过面板创建文件.',
'description' => '允许用户通过面板创建文件',
],
'upload_files' => [
'title' => '上传文件',
'description' => '允许用户通过文件管理上传文件.',
'description' => '允许用户通过文件管理上传文件',
],
'delete_files' => [
'title' => '删除文件',
'description' => '允许用户在文件系统中删除文件.',
'description' => '允许用户删除文件系统上的文件。',
],
'download_files' => [
'title' => '下载文件s',
'description' => '允许用户下载文件. 如果为用户分配该权限,那么他将自动拥有下载和查看文件内容的权限.',
'title' => '下载文件',
'description' => '允许用户下载文件。若用户被给予此权限,其可以在下载后查看文件而无需所需面板权限。',
],
'list_subusers' => [
'title' => '列出子用户',
'description' => '允许用户访问此服务器的子用户列表.',
'description' => '允许用户访问此服务器的子用户列表',
],
'view_subuser' => [
'title' => '访问子用户',
'description' => '允许用户查看子用户的权限.',
'title' => '查看子用户',
'description' => '允许用户查看子用户的权限',
],
'edit_subuser' => [
'title' => '编辑子用户',
'description' => '允许用户编辑此服务器上的子用户权限.',
'description' => '允许用户编辑此服务器上的子用户权限',
],
'create_subuser' => [
'title' => '创建子用户',
'description' => '允许用户在此服务器上添加子用户.',
'description' => '允许用户在此服务器上添加子用户',
],
'delete_subuser' => [
'title' => '删除子用户',
'description' => '允许用户删除此服务器上的子用户.',
'description' => '允许用户删除此服务器上的子用户',
],
'view_allocations' => [
'title' => '访问分配表',
'description' => '允许用户访问所有分配到此服务器上的IP和端口列表.',
'title' => '查看分配',
'description' => '允许用户查看所有分配到此服务器上的 IP 及端口。',
],
'edit_allocation' => [
'title' => '编辑默认连接',
'description' => '允许用户更改连接到此服务器的默认连接地址.',
'description' => '允许用户更改此服务器的默认连接地址。',
],
'view_startup' => [
'title' => '访问启动参数',
'description' => '允许用户访问服务器的启动参数和变量.',
'title' => '查看启动参数',
'description' => '允许用户访问服务器的启动参数和相关变量。',
],
'edit_startup' => [
'title' => '编辑启动参数',
'description' => '允许用户更改服务器的启动参数和变量.',
'description' => '允许用户更改服务器的启动参数',
],
'list_schedules' => [
'title' => '列出计划任务',
'description' => '允许用户列出服务器上的所有计划任务 (无论是否启用) .',
'description' => '允许用户列出服务器上的所有计划任务(无论是否启用)。',
],
'view_schedule' => [
'title' => '访问计划任务',
'description' => '允许用户查看一个计划任务的具体信息,包括其执行的时间和命令.',
'title' => '查看计划',
'description' => '允许用户查看计划任务的详细信息,包含执行时间及分配任务。',
],
'toggle_schedule' => [
'title' => '开关计划任务',
'description' => '允许用户更改计划任务的启用或禁用状态.',
'title' => '开关计划',
'description' => '允许用户启用或禁用计划的。',
],
'queue_schedule' => [
'title' => '队列计划任务',
'description' => '允许用户将一个计划任务队列,以便在下一个周期执行.',
'title' => '队列计划',
'description' => '允许用户将计划纳入队列在下个周期执行。',
],
'edit_schedule' => [
'title' => '编辑计划任务',
'description' => '允许用户编辑计划任务. 此权限允许用户删除所有的执行任务,但无法删除计划任务本身.',
'title' => '编辑计划',
'description' => '允许用户编辑计划,包括所有的执行任务。这将允许用户移除单个任务,但无法移除计划本身。',
],
'create_schedule' => [
'title' => '创建计划任务',
'description' => '允许用户创建一个计划任务.',
'title' => '创建计划',
'description' => '允许用户新建计划任务。',
],
'delete_schedule' => [
'title' => '删除计划任务',
'description' => '允许用户从服务器删除一个计划任务.',
'title' => '删除计划',
'description' => '允许用户从服务器删除计划。',
],
'view_databases' => [
'title' => '访问数据库信息',
'description' => '允许用户访问附属于此服务器的数据库信息,包含数据库的地址,用户名和密码',
'title' => '查看数据库信息',
'description' => '允许用户查看所有与此服务器相关联的数据库及其用户名与密码信息。',
],
'reset_db_password' => [
'title' => '重数据库',
'description' => '允许用户重新设置服务器数据库的密码.',
'title' => '重数据库',
'description' => '允许用户重置服务器数据库密码。',
],
'delete_database' => [
'title' => '删除数据库',
'description' => '允许用户从面板删除此服务器的数据库.',
'description' => '允许用户从面板删除此服务器数据库。',
],
'create_database' => [
'title' => '新建数据库',
'description' => '允许用户为这个服务器创建一个数据库.',
'description' => '允许用户为此服务器新建数据库。',
],
],
],
'allocations' => [
'mass_actions' => '批量操作',
'delete' => '删除分配地址',
],
'files' => [
'exceptions' => [
'invalid_mime' => '这种类型的文件无法使用面板内建编辑器编辑.',
'max_size' => '此文件太大,无法使用面板内建编辑器编辑.',
'invalid_mime' => '此类型文件无法通过面板内置编辑器编辑。',
'max_size' => '此文件过大,无法使用面板内置编辑器编辑。',
],
'header' => '文件管理',
'header_sub' => '从网页直接管理您所有的文件.',
'loading' => '正在加载初始文件结构,这可能需要几秒钟.',
'path' => '当你在配置任何插件或服务器设置的文件路径时 :path 应该为您的根目录. 此节点的网页上传最大文件限制为 :size.',
'seconds_ago' => '几秒之前',
'header_sub' => '从网页直接管理您的所有文件。',
'loading' => '正在加载初始文件结构,这可能需要几秒钟',
'path' => '当您配置插件或服务器设置的文件路径时,您应使用 :path 作为您的根目录。此节点通过网页上传的最大文件限制为 :size。',
'seconds_ago' => '数秒前',
'file_name' => '文件名',
'size' => '大小',
'last_modified' => '最后修改',
'add_new' => '新建文件',
'add_folder' => '新建文件夹',
'mass_actions' => '更多操作',
'mass_actions' => '批量操作',
'delete' => '删除文件',
'edit' => [
'header' => '编辑文件',
'header_sub' => '从网页更改一个文件.',
'header_sub' => '从网页编辑文件。',
'save' => '保存文件',
'return' => '返回文件管理',
],
'add' => [
'header' => '新建文件',
'header_sub' => '在您服务器上创建一个新文件.',
'header_sub' => '在您服务器上新建新文件。',
'name' => '文件名',
'create' => '创建文件',
],
@ -291,40 +295,40 @@ return [
'config' => [
'name' => [
'header' => '服务器名',
'header_sub' => '更改服务器名称。',
'details' => '此服务器名只是为了让你更好的管理服务器,并不会对服务器内的玩家有所影响.',
'header_sub' => '更改服务器名称。',
'details' => '此服务器名只是为了让您更好的管理服务器,并不会对向游戏内玩家显示的服务器配置造成影响。',
],
'startup' => [
'header' => '启动配置',
'header_sub' => '控制服务器的启动参数.',
'header_sub' => '控制服务器的启动参数',
'command' => '启动命令',
'edit_params' => '编辑参数',
'update' => '更新启动参数',
'startup_regex' => '输入规则',
'edited' => '启动参数已成功更新. 更新的内容会在下一次启动时生效.',
'edited' => '已成功编辑启动变量。这将在下次服务器启动时发挥功用。',
],
'sftp' => [
'header' => 'SFTP 配置',
'header_sub' => 'SFTP 连接所需要的信息.',
'header_sub' => 'SFTP 连接所需的账户信息。',
'details' => 'SFTP 信息',
'conn_addr' => '连接地址',
'warning' => 'SFTP密码就是您的用户密码. 请确认你使用的时SFTP不是FTP,也不是FTPS, 这些都是不同的协议.',
'warning' => 'SFTP 密码为您的账户密码。请确保您的客户端被设置为使用 SFTP 而非 FTP 或 FTPS这些协议间存在差异。',
],
'database' => [
'header' => '数据库',
'header_sub' => '此服务器可用的数据库.',
'header_sub' => '此服务器的所有可用数据库。',
'your_dbs' => '已配置的数据库',
'host' => 'MySQL 主机',
'reset_password' => '重密码',
'no_dbs' => '没有此服务器可用的数据库.',
'add_db' => '创建一个新数据库.',
'reset_password' => '重密码',
'no_dbs' => '此服务器没有可用的数据库。',
'add_db' => '新建新数据库。',
],
'allocation' => [
'header' => '服务器连接信息',
'header_sub' => '控制此服务器可用的IP和端口.',
'available' => '可用的连接信息',
'help' => '连接信息版主',
'help_text' => '左边列出的所有IP和端口都是开放的是您连接到您服务器的地址',
'header' => '服务器地址分配',
'header_sub' => '控制此服务器可使用的 IP 地址和端口。',
'available' => '可用分配地址',
'help' => '分配地址帮助',
'help_text' => '左方列表列出了您可用于传入连接的所有可用 IP 地址及端口。',
],
],
];

View File

@ -1,14 +1,14 @@
<?php
return [
'email' => 'Email',
'user_identifier' => '用户名 或 Email',
'email' => '电子邮件地址',
'user_identifier' => '用户名或电子邮件地址',
'password' => '密码',
'confirm_password' => '确认密码',
'login' => '登',
'home' => '页',
'login' => '登',
'home' => '页',
'servers' => '服务器',
'id' => 'ID',
'id' => '编号',
'name' => '名称',
'node' => '节点',
'connection' => '连接',
@ -16,12 +16,12 @@ return [
'cpu' => 'CPU',
'status' => '状态',
'search' => '搜索',
'suspended' => '已停',
'suspended' => '已',
'account' => '用户',
'security' => '安全',
'ip' => 'IP 地址',
'last_activity' => '上次活动',
'revoke' => '销',
'revoke' => '销',
'2fa_token' => '认证密钥',
'submit' => '确认',
'close' => '关闭',
@ -29,11 +29,11 @@ return [
'configuration' => '配置',
'sftp' => 'SFTP',
'databases' => '数据库',
'memo' => 'Memo',
'memo' => '描述',
'created' => '已创建',
'expires' => '过期',
'public_key' => '令牌',
'api_access' => 'Api 访问',
'api_access' => 'API 访问',
'never' => '从未',
'sign_out' => '登出',
'admin_control' => '管理员面板',
@ -64,25 +64,25 @@ return [
'2fa' => '两步验证',
'logout' => '登出',
'admin_cp' => '管理员控制面板',
'optional' => '可选',
'optional' => '可选',
'read_only' => '只读',
'relation' => '关系',
'owner' => '所有者',
'admin' => '管理员',
'subuser' => '子用户',
'captcha_invalid' => '输入的验证码错误.',
'captcha_invalid' => '验证码无效',
'tasks' => '任务',
'seconds' => '秒',
'minutes' => '分',
'under_maintenance' => '维护中',
'days' => [
'sun' => '周日',
'mon' => '一',
'tues' => '二',
'wed' => '三',
'thurs' => '四',
'fri' => '五',
'sat' => '六',
'sun' => '星期天',
'mon' => '星期一',
'tues' => '星期二',
'wed' => '星期三',
'thurs' => '星期四',
'fri' => '星期五',
'sat' => '星期六',
],
'last_used' => '上次使用',
];

View File

@ -12,78 +12,78 @@ return [
|
*/
'accepted' => ' :attribute 被接受.',
'active_url' => ' :attribute 不是一个有效的URL.',
'after' => ' :attribute 必须是一个位于 :date 之后的日期.',
'after_or_equal' => ' :attribute 必须是 :date 之后或同样的日期.',
'alpha' => ' :attribute 只能含有字母.',
'alpha_dash' => ':attribute 只能含有数字字母和分隔线.',
'alpha_num' => ' :attribute 只能含有数字和字母.',
'array' => ' :attribute 必须是个数组.',
'before' => ' :attribute 必须是一个位于 :date 之前的日前.',
'before_or_equal' => ' :attribute 必须是 :date 之前或同样的日期.',
'accepted' => 'The :attribute must be accepted.',
'active_url' => 'The :attribute is not a valid URL.',
'after' => 'The :attribute must be a date after :date.',
'after_or_equal' => 'The :attribute must be a date after or equal to :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.',
'before_or_equal' => 'The :attribute must be a date before or equal to :date.',
'between' => [
'numeric' => ' :attribute 必须在 :min 到 :max 之间.',
'file' => ' :attribute 必须在 :min 到 :max KB 之间.',
'string' => ' :attribute m必须在 :min 到 :max 个字符之间.',
'array' => ' :attribute 必须在 :min 到 :max 个项目之间.',
'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.',
],
'boolean' => ' :attribute 填入的必须为 true 或 false.',
'confirmed' => ' :attribute 确认不匹配.',
'date' => ' :attribute 不是一个合法的日期.',
'date_format' => ' :attribute 不是正确的格式: :format.',
'different' => ' :attribute 和 :other 必须不同.',
'digits' => ' :attribute 必须为 :digits 个数字.',
'digits_between' => ' :attribute 必须在 :min 到 :max 个数字间.',
'dimensions' => ' :attribute 有一个非法的镜像大小.',
'distinct' => ' :attribute 填入了一个重复的值.',
'email' => ' :attribute 必须是一个合法的Email地址.',
'exists' => '所选择的 :attribute 无效.',
'file' => ' :attribute 必须为一个文件.',
'filled' => ' :attribute 为必填项目.',
'image' => ' :attribute 必须是一个镜像.',
'in' => '所选择的 :attribute 无效.',
'in_array' => ' :attribute 填入的信息在 :other 不存在.',
'integer' => ' :attribute 必须是一个整数.',
'ip' => ' :attribute 必须是一个合法的IP地址.',
'json' => ' :attribute 必须是一个合法的JSON字符串.',
'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.',
'dimensions' => 'The :attribute has invalid image dimensions.',
'distinct' => 'The :attribute field has a duplicate value.',
'email' => 'The :attribute must be a valid email address.',
'exists' => 'The selected :attribute is invalid.',
'file' => 'The :attribute must be a file.',
'filled' => 'The :attribute field is required.',
'image' => 'The :attribute must be an image.',
'in' => 'The selected :attribute is invalid.',
'in_array' => 'The :attribute field does not exist in :other.',
'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' => ' :attribute 不能大于 :max.',
'file' => ' :attribute 不能大于 :max KB.',
'string' => ' :attribute 不能多于 :max 个字符.',
'array' => ' :attribute 不能多于 :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' => ' :attribute 文件类型必须为: :values.',
'mimetypes' => ' :attribute 文件类型必须为: :values.',
'mimes' => 'The :attribute must be a file of type: :values.',
'mimetypes' => 'The :attribute must be a file of type: :values.',
'min' => [
'numeric' => ' :attribute 至少应在 :min.',
'file' => ' :attribute 至少应在 :min KB.',
'string' => ' :attribute 至少应在 :min 个字符.',
'array' => ' :attribute 至少应有 :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' => '所选择的 :attribute 不正确.',
'numeric' => ' :attribute 必须是个数字.',
'present' => ' :attribute 填入的必须存在.',
'regex' => ' :attribute 格式不正确.',
'required' => ' :attribute 为必填.',
'required_if' => ' :attribute 被要求填入, 当 :other 为 :value 的时候.',
'required_unless' => ' :attribute 被要求填入,除非 :other 为 :values.',
'required_with' => ' :attribute 被要求填入,当 :values 存在的时候.',
'required_with_all' => ' :attribute 被要求填入,当 :values 存在.',
'required_without' => ' :attribute 被要求填入,当 :values 不存在.',
'required_without_all' => ' :attribute 被要求填入,当 :values 都不存在.',
'same' => ' :attribute 和 :other 必须相同.',
'not_in' => 'The selected :attribute is invalid.',
'numeric' => 'The :attribute must be a number.',
'present' => 'The :attribute field must be present.',
'regex' => 'The :attribute format is invalid.',
'required' => 'The :attribute field is required.',
'required_if' => 'The :attribute field is required when :other is :value.',
'required_unless' => 'The :attribute field is required unless :other is in :values.',
'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' => ' :attribute 必须为 :size.',
'file' => ' :attribute 必须为 :size KB.',
'string' => ' :attribute 必须为 :size 个字符.',
'array' => ' :attribute 必须包含 :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' => ' :attribute 必须为字符串.',
'timezone' => ' :attribute 必须是一个有效的时区.',
'unique' => ' :attribute 已经被使用.',
'uploaded' => ' :attribute 上传失败.',
'url' => ' :attribute 格式不合法.',
'string' => 'The :attribute must be a string.',
'timezone' => 'The :attribute must be a valid zone.',
'unique' => 'The :attribute has already been taken.',
'uploaded' => 'The :attribute failed to upload.',
'url' => 'The :attribute format is invalid.',
/*
|--------------------------------------------------------------------------

View File

@ -51,7 +51,7 @@
<th class="text-center">CPU</th>
<th class="text-center">Status</th>
</tr>
@foreach($node->servers as $server)
@foreach($servers as $server)
<tr data-server="{{ $server->uuid }}">
<td><code>{{ $server->uuidShort }}</code></td>
<td><a href="{{ route('admin.servers.view', $server->id) }}">{{ $server->name }}</a></td>
@ -64,6 +64,11 @@
</tr>
@endforeach
</table>
@if($servers->hasPages())
<div class="box-footer with-border">
<div class="col-md-12 text-center">{!! $servers->render() !!}</div>
</div>
@endif
</div>
</div>
</div>

View File

@ -206,7 +206,7 @@
</div>
<div class="form-group col-xs-12">
<div class="checkbox checkbox-primary no-margin-bottom">
<input id="pSkipScripting" name="skip_scripting" type="checkbox" value="1" />
<input id="pSkipScripting" name="skip_scripts" type="checkbox" value="1" />
<label for="pSkipScripting" class="strong">Skip Egg Install Script</label>
</div>
<p class="small text-muted no-margin">If the selected Egg has an install script attached to it, the script will run during install after the pack is installed. If you would like to skip this step, check this box.</p>

View File

@ -102,7 +102,7 @@
</div>
<div class="form-group col-xs-12">
<div class="checkbox checkbox-primary no-margin-bottom">
<input id="pSkipScripting" name="skip_scripting" type="checkbox" value="1" @if($server->skip_scripts) checked @endif />
<input id="pSkipScripting" name="skip_scripts" type="checkbox" value="1" @if($server->skip_scripts) checked @endif />
<label for="pSkipScripting" class="strong">Skip Egg Install Script</label>
</div>
<p class="small text-muted no-margin">If the selected Egg has an install script attached to it, the script will run during install after the pack is installed. If you would like to skip this step, check this box.</p>

View File

@ -3,7 +3,7 @@
<div class="row">
<div class="col-xs-12">
<div class="alert alert-danger">
Your Panel is currently configured to read settings from the environment only. You will need to set <code>LOAD_ENVIRONMENT_ONLY=false</code> in your environment file in order to load settings dynamically.
Your Panel is currently configured to read settings from the environment only. You will need to set <code>APP_ENVIRONMENT_ONLY=false</code> in your environment file in order to load settings dynamically.
</div>
</div>
</div>

View File

@ -108,7 +108,7 @@
</div>
<div class="box-footer">
{!! csrf_field() !!}
<p class="text-muted small">You are currently using <strong>{{ count($databases) }}</strong> of <strong>{{ $server->database_limit ?? '&infin;' }}</strong> databases. A username and password for this database will be randomly generated after form submission.</p>
<p class="text-muted small">You are currently using <strong>{{ count($databases) }}</strong> of <strong>{{ $server->database_limit ?? '' }}</strong> databases. A username and password for this database will be randomly generated after form submission.</p>
<input type="submit" class="btn btn-sm btn-success pull-right" value="Create Database" />
</div>
</form>

View File

@ -141,7 +141,7 @@
<td data-identifier="name" data-name="{{ rawurlencode($file['entry']) }}" data-path="@if($file['directory'] !== ''){{ rawurlencode($file['directory']) }}@endif/">
@if(in_array($file['mime'], $editableMime))
@can('edit-files', $server)
<a href="/server/{{ $server->uuidShort }}/files/edit/@if($file['directory'] !== ''){{ $file['directory'] }}/@endif{{ $file['entry'] }}" class="edit_file">{{ $file['entry'] }}</a>
<a href="/server/{{ $server->uuidShort }}/files/edit/@if($file['directory'] !== ''){{ rawurlencode($file['directory']) }}/@endif{{ rawurlencode($file['entry']) }}" class="edit_file">{{ $file['entry'] }}</a>
@else
{{ $file['entry'] }}
@endcan