mirror of
https://github.com/pelican-dev/panel.git
synced 2025-05-28 10:24:45 +02:00
Merge branch 'main' into feature/72
This commit is contained in:
commit
eeee5779ba
@ -23,7 +23,7 @@ REDIS_PASSWORD=null
|
||||
REDIS_PORT=6379
|
||||
|
||||
CACHE_STORE=file
|
||||
QUEUE_CONNECTION=redis
|
||||
QUEUE_CONNECTION=sync
|
||||
SESSION_DRIVER=file
|
||||
|
||||
HASHIDS_SALT=
|
||||
@ -36,7 +36,7 @@ MAIL_USERNAME=
|
||||
MAIL_PASSWORD=
|
||||
MAIL_ENCRYPTION=tls
|
||||
MAIL_FROM_ADDRESS=no-reply@example.com
|
||||
MAIL_FROM_NAME="Panel Administrator"
|
||||
MAIL_FROM_NAME="Pelican Admin"
|
||||
# Set this to your domain to prevent it defaulting to 'localhost', causing mail servers such as Gmail to reject your mail
|
||||
# MAIL_EHLO_DOMAIN=panel.example.com
|
||||
SESSION_ENCRYPT=false
|
||||
|
1
.github/FUNDING.yml
vendored
1
.github/FUNDING.yml
vendored
@ -1 +1,2 @@
|
||||
github: pelican-dev
|
||||
custom: [https://buy.stripe.com/14kdU99SI4UT7ni9AB, https://buy.stripe.com/14kaHXc0Q9b9372eUU]
|
||||
|
3
.github/workflows/build.yaml
vendored
3
.github/workflows/build.yaml
vendored
@ -1,9 +1,6 @@
|
||||
name: Build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- '**'
|
||||
pull_request:
|
||||
branches:
|
||||
- '**'
|
||||
|
2
.github/workflows/ci.yaml
vendored
2
.github/workflows/ci.yaml
vendored
@ -1,7 +1,7 @@
|
||||
name: Tests
|
||||
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
branches:
|
||||
- '**'
|
||||
|
||||
|
30
.github/workflows/cla.yaml
vendored
Normal file
30
.github/workflows/cla.yaml
vendored
Normal file
@ -0,0 +1,30 @@
|
||||
name: "CLA Assistant"
|
||||
on:
|
||||
issue_comment:
|
||||
types: [created]
|
||||
pull_request_target:
|
||||
types: [opened,closed,synchronize]
|
||||
|
||||
permissions:
|
||||
actions: write
|
||||
contents: write
|
||||
pull-requests: write
|
||||
statuses: write
|
||||
|
||||
jobs:
|
||||
CLAAssistant:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: "CLA Assistant"
|
||||
if: (github.event.comment.body == 'recheck' || github.event.comment.body == 'I have read the CLA Document and I hereby sign the CLA') || github.event_name == 'pull_request_target'
|
||||
uses: contributor-assistant/github-action@v2.3.0
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
PERSONAL_ACCESS_TOKEN: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
|
||||
with:
|
||||
path-to-signatures: 'version1/cla.json'
|
||||
path-to-document: 'https://github.com/pelican-dev/panel/blob/3.x/contributor_license_agreement.md'
|
||||
branch: 'main'
|
||||
allowlist: dependabot[bot]
|
||||
remote-organization-name: pelican-dev
|
||||
remote-repository-name: cla-signatures
|
3
.github/workflows/lint.yaml
vendored
3
.github/workflows/lint.yaml
vendored
@ -1,9 +1,6 @@
|
||||
name: Lint
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- '**'
|
||||
pull_request:
|
||||
branches:
|
||||
- '**'
|
||||
|
@ -11,23 +11,23 @@ class AppSettingsCommand extends Command
|
||||
use EnvironmentWriterTrait;
|
||||
|
||||
public const CACHE_DRIVERS = [
|
||||
'redis' => 'Redis (recommended)',
|
||||
'redis' => 'Redis',
|
||||
'memcached' => 'Memcached',
|
||||
'file' => 'Filesystem',
|
||||
'file' => 'Filesystem (recommended)',
|
||||
];
|
||||
|
||||
public const SESSION_DRIVERS = [
|
||||
'redis' => 'Redis (recommended)',
|
||||
'redis' => 'Redis',
|
||||
'memcached' => 'Memcached',
|
||||
'database' => 'MySQL Database',
|
||||
'file' => 'Filesystem',
|
||||
'file' => 'Filesystem (recommended)',
|
||||
'cookie' => 'Cookie',
|
||||
];
|
||||
|
||||
public const QUEUE_DRIVERS = [
|
||||
'redis' => 'Redis (recommended)',
|
||||
'redis' => 'Redis',
|
||||
'database' => 'MySQL Database',
|
||||
'sync' => 'Sync',
|
||||
'sync' => 'Sync (recommended)',
|
||||
];
|
||||
|
||||
protected $description = 'Configure basic environment settings for the Panel.';
|
||||
@ -91,21 +91,21 @@ class AppSettingsCommand extends Command
|
||||
config('app.timezone')
|
||||
);
|
||||
|
||||
$selected = config('cache.default', 'redis');
|
||||
$selected = config('cache.default', 'file');
|
||||
$this->variables['CACHE_STORE'] = $this->option('cache') ?? $this->choice(
|
||||
'Cache Driver',
|
||||
self::CACHE_DRIVERS,
|
||||
array_key_exists($selected, self::CACHE_DRIVERS) ? $selected : null
|
||||
);
|
||||
|
||||
$selected = config('session.driver', 'redis');
|
||||
$selected = config('session.driver', 'file');
|
||||
$this->variables['SESSION_DRIVER'] = $this->option('session') ?? $this->choice(
|
||||
'Session Driver',
|
||||
self::SESSION_DRIVERS,
|
||||
array_key_exists($selected, self::SESSION_DRIVERS) ? $selected : null
|
||||
);
|
||||
|
||||
$selected = config('queue.default', 'redis');
|
||||
$selected = config('queue.default', 'sync');
|
||||
$this->variables['QUEUE_CONNECTION'] = $this->option('queue') ?? $this->choice(
|
||||
'Queue Driver',
|
||||
self::QUEUE_DRIVERS,
|
||||
|
@ -51,7 +51,7 @@ class UpgradeCommand extends Command
|
||||
}
|
||||
|
||||
if (is_null($this->option('user'))) {
|
||||
$userDetails = posix_getpwuid(fileowner('public'));
|
||||
$userDetails = function_exists('posix_getpwuid') ? posix_getpwuid(fileowner('public')) : [];
|
||||
$user = $userDetails['name'] ?? 'www-data';
|
||||
|
||||
if (!$this->confirm("Your webserver user has been detected as <fg=blue>[{$user}]:</> is this correct?", true)) {
|
||||
@ -67,7 +67,7 @@ class UpgradeCommand extends Command
|
||||
}
|
||||
|
||||
if (is_null($this->option('group'))) {
|
||||
$groupDetails = posix_getgrgid(filegroup('public'));
|
||||
$groupDetails = function_exists('posix_getgrgid') ? posix_getgrgid(filegroup('public')) : [];
|
||||
$group = $groupDetails['name'] ?? 'www-data';
|
||||
|
||||
if (!$this->confirm("Your webserver group has been detected as <fg=blue>[{$group}]:</> is this correct?", true)) {
|
||||
|
43
app/Enums/ContainerStatus.php
Normal file
43
app/Enums/ContainerStatus.php
Normal file
@ -0,0 +1,43 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums;
|
||||
|
||||
enum ContainerStatus: string
|
||||
{
|
||||
case Created = 'created';
|
||||
case Running = 'running';
|
||||
case Restarting = 'restarting';
|
||||
case Exited = 'exited';
|
||||
case Paused = 'paused';
|
||||
case Dead = 'dead';
|
||||
case Removing = 'removing';
|
||||
case Missing = 'missing';
|
||||
|
||||
public function icon(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::Created => 'tabler-heart-plus',
|
||||
self::Running => 'tabler-heartbeat',
|
||||
self::Restarting => 'tabler-heart-bolt',
|
||||
self::Exited => 'tabler-heart-exclamation',
|
||||
self::Paused => 'tabler-heart-pause',
|
||||
self::Dead => 'tabler-heart-x',
|
||||
self::Removing => 'tabler-heart-down',
|
||||
self::Missing => 'tabler-heart-question',
|
||||
};
|
||||
}
|
||||
|
||||
public function color(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::Created => 'primary',
|
||||
self::Running => 'success',
|
||||
self::Restarting => 'info',
|
||||
self::Exited => 'danger',
|
||||
self::Paused => 'warning',
|
||||
self::Dead => 'danger',
|
||||
self::Removing => 'warning',
|
||||
self::Missing => 'danger',
|
||||
};
|
||||
}
|
||||
}
|
37
app/Enums/ServerState.php
Normal file
37
app/Enums/ServerState.php
Normal file
@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums;
|
||||
|
||||
enum ServerState: string
|
||||
{
|
||||
case Normal = 'normal';
|
||||
case Installing = 'installing';
|
||||
case InstallFailed = 'install_failed';
|
||||
case ReinstallFailed = 'reinstall_failed';
|
||||
case Suspended = 'suspended';
|
||||
case RestoringBackup = 'restoring_backup';
|
||||
|
||||
public function icon(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::Normal => 'tabler-heart',
|
||||
self::Installing => 'tabler-heart-bolt',
|
||||
self::InstallFailed => 'tabler-heart-x',
|
||||
self::ReinstallFailed => 'tabler-heart-x',
|
||||
self::Suspended => 'tabler-heart-cancel',
|
||||
self::RestoringBackup => 'tabler-heart-up',
|
||||
};
|
||||
}
|
||||
|
||||
public function color(): string
|
||||
{
|
||||
return match ($this) {
|
||||
self::Normal => 'primary',
|
||||
self::Installing => 'info',
|
||||
self::InstallFailed => 'danger',
|
||||
self::ReinstallFailed => 'danger',
|
||||
self::Suspended => 'danger',
|
||||
self::RestoringBackup => 'info',
|
||||
};
|
||||
}
|
||||
}
|
@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Exceptions\Http\Server;
|
||||
|
||||
use App\Enums\ServerState;
|
||||
use App\Models\Server;
|
||||
use Symfony\Component\HttpKernel\Exception\ConflictHttpException;
|
||||
|
||||
@ -20,7 +21,7 @@ class ServerStateConflictException extends ConflictHttpException
|
||||
$message = 'The node of this server is currently under maintenance and the functionality requested is unavailable.';
|
||||
} elseif (!$server->isInstalled()) {
|
||||
$message = 'This server has not yet completed its installation process, please try again later.';
|
||||
} elseif ($server->status === Server::STATUS_RESTORING_BACKUP) {
|
||||
} elseif ($server->status === ServerState::RestoringBackup) {
|
||||
$message = 'This server is currently restoring from a backup, please try again later.';
|
||||
} elseif (!is_null($server->transfer)) {
|
||||
$message = 'This server is currently being transferred to a new machine, please try again later.';
|
||||
|
@ -7,6 +7,7 @@ use App\Models\Egg;
|
||||
use App\Models\Node;
|
||||
use App\Models\Server;
|
||||
use App\Models\User;
|
||||
use Filament\Actions\CreateAction;
|
||||
use Filament\Pages\Page;
|
||||
|
||||
class Dashboard extends Page
|
||||
@ -32,6 +33,50 @@ class Dashboard extends Page
|
||||
'nodesCount' => Node::query()->count(),
|
||||
'serversCount' => Server::query()->count(),
|
||||
'usersCount' => User::query()->count(),
|
||||
|
||||
'devActions' => [
|
||||
CreateAction::make()
|
||||
->label('Create Issue')
|
||||
->icon('tabler-brand-github')
|
||||
->url('https://github.com/pelican-dev/panel/issues/new/choose', true)
|
||||
->color('warning'),
|
||||
CreateAction::make()
|
||||
->label('Discuss Features')
|
||||
->icon('tabler-brand-github')
|
||||
->url('https://github.com/pelican-dev/panel/discussions', true)
|
||||
->color('primary'),
|
||||
],
|
||||
'nodeActions' => [
|
||||
CreateAction::make()
|
||||
->label('Create first Node in Pelican')
|
||||
->icon('tabler-server-2')
|
||||
->url(route('filament.admin.resources.nodes.create'))
|
||||
->color('primary'),
|
||||
],
|
||||
'supportActions' => [
|
||||
CreateAction::make()
|
||||
->label('Help Translate')
|
||||
->icon('tabler-language')
|
||||
->url('https://crowdin.com/project/pelican-dev', true)
|
||||
->color('info'),
|
||||
CreateAction::make()
|
||||
->label('Donate Directly')
|
||||
->icon('tabler-cash')
|
||||
->url('https://pelican.dev/donate', true)
|
||||
->color('success'),
|
||||
],
|
||||
'helpActions' => [
|
||||
CreateAction::make()
|
||||
->label('Read Documentation')
|
||||
->icon('tabler-speedboat')
|
||||
->url('https://pelican.dev/docs', true)
|
||||
->color('info'),
|
||||
CreateAction::make()
|
||||
->label('Get Help in Discord')
|
||||
->icon('tabler-brand-discord')
|
||||
->url('https://discord.gg/pelican-panel', true)
|
||||
->color('primary'),
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
@ -137,6 +137,7 @@ class EggResource extends Resource
|
||||
{
|
||||
return $table
|
||||
->defaultPaginationPageOption(25)
|
||||
->checkIfRecordIsSelectableUsing(fn (Egg $egg) => $egg->servers_count <= 0)
|
||||
->columns([
|
||||
Tables\Columns\TextColumn::make('id')
|
||||
->label('Id')
|
||||
@ -144,7 +145,7 @@ class EggResource extends Resource
|
||||
->searchable(),
|
||||
Tables\Columns\TextColumn::make('name')
|
||||
->icon('tabler-egg')
|
||||
->description(fn ($record): string => $record->description)
|
||||
->description(fn ($record): ?string => $record->description)
|
||||
->wrap()
|
||||
->searchable(),
|
||||
Tables\Columns\TextColumn::make('author')
|
||||
|
@ -21,11 +21,12 @@ class ListEggs extends ListRecords
|
||||
Actions\CreateAction::make(),
|
||||
|
||||
Actions\Action::make('import')
|
||||
->label('Import Egg')
|
||||
->label('Import')
|
||||
->form([
|
||||
Forms\Components\FileUpload::make('egg')
|
||||
->acceptedFileTypes(['application/json'])
|
||||
->storeFiles(false),
|
||||
->storeFiles(false)
|
||||
->multiple(),
|
||||
])
|
||||
->action(function (array $data): void {
|
||||
/** @var TemporaryUploadedFile $eggFile */
|
||||
@ -34,25 +35,25 @@ class ListEggs extends ListRecords
|
||||
/** @var EggImporterService $eggImportService */
|
||||
$eggImportService = resolve(EggImporterService::class);
|
||||
|
||||
try {
|
||||
$newEgg = $eggImportService->handle($eggFile);
|
||||
} catch (Exception $exception) {
|
||||
Notification::make()
|
||||
->title('Egg Import Failed')
|
||||
->danger()
|
||||
->send();
|
||||
foreach ($eggFile as $file) {
|
||||
try {
|
||||
$eggImportService->handle($file);
|
||||
} catch (Exception $exception) {
|
||||
Notification::make()
|
||||
->title('Import Failed')
|
||||
->danger()
|
||||
->send();
|
||||
|
||||
report($exception);
|
||||
report($exception);
|
||||
|
||||
return;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
Notification::make()
|
||||
->title("Egg Import Success: $newEgg->name")
|
||||
->title('Import Success')
|
||||
->success()
|
||||
->send();
|
||||
|
||||
redirect()->route('filament.admin.resources.eggs.edit', [$newEgg]);
|
||||
}),
|
||||
];
|
||||
}
|
||||
|
@ -3,6 +3,7 @@
|
||||
namespace App\Filament\Resources\NodeResource\Pages;
|
||||
|
||||
use App\Filament\Resources\NodeResource;
|
||||
use App\Models\Allocation;
|
||||
use App\Models\Node;
|
||||
use Filament\Actions;
|
||||
use Filament\Forms;
|
||||
@ -50,27 +51,115 @@ class EditNode extends EditRecord
|
||||
]),
|
||||
Tabs\Tab::make('Allocations')
|
||||
->icon('tabler-plug-connected')
|
||||
->columns(4)
|
||||
->columns([
|
||||
'default' => 1,
|
||||
'sm' => 2,
|
||||
'md' => 4,
|
||||
])
|
||||
->schema([
|
||||
Forms\Components\Section::make('Create Allocation')
|
||||
->columnSpan(4)
|
||||
->columns([
|
||||
'default' => 1,
|
||||
'sm' => 2,
|
||||
'md' => 4,
|
||||
'lg' => 5,
|
||||
])
|
||||
//->inlineLabel()
|
||||
->headerActions([
|
||||
Forms\Components\Actions\Action::make('submit')
|
||||
->color('success')
|
||||
->action(function () {
|
||||
// ...
|
||||
}),
|
||||
])
|
||||
->schema([
|
||||
Forms\Components\TextInput::make('ip')
|
||||
->columnSpan([
|
||||
'default' => 1,
|
||||
'sm' => 1,
|
||||
'md' => 2,
|
||||
'lg' => 2,
|
||||
])
|
||||
->label('IP Address')
|
||||
->placeholder('x.x.x.x')
|
||||
->helperText('IP address to assign ports to'),
|
||||
Forms\Components\TagsInput::make('port')
|
||||
->columnSpan([
|
||||
'default' => 1,
|
||||
'sm' => 1,
|
||||
'md' => 1,
|
||||
'lg' => 1,
|
||||
])
|
||||
->placeholder('25565')
|
||||
->helperText('Individual ports or port ranges here separated by spaces')
|
||||
->splitKeys(['Tab', ' ']),
|
||||
Forms\Components\TextInput::make('ip_alias')
|
||||
->columnSpan([
|
||||
'default' => 1,
|
||||
'sm' => 2,
|
||||
'md' => 1,
|
||||
'lg' => 2,
|
||||
])
|
||||
->label('Alias')
|
||||
->placeholder('minecraft.pelican.dev')
|
||||
->helperText('Display name to help you remember.'),
|
||||
]),
|
||||
Forms\Components\Repeater::make('allocations')
|
||||
->orderColumn('server_id')
|
||||
->columnSpan(1)
|
||||
->columns(4)
|
||||
->columnSpan(4)
|
||||
->columns([
|
||||
'default' => 1,
|
||||
'sm' => 3,
|
||||
'md' => 4,
|
||||
'lg' => 9,
|
||||
])
|
||||
->relationship()
|
||||
->addActionLabel('Create New Allocation')
|
||||
->addAction(fn ($action) => $action->color('info'))
|
||||
->schema([
|
||||
Forms\Components\TextInput::make('ip')
|
||||
->label('IP Address'),
|
||||
Forms\Components\TextInput::make('ip_alias')
|
||||
->label('Alias'),
|
||||
->label('IP Address')
|
||||
->placeholder('x.x.x.x')
|
||||
->columnSpan([
|
||||
'default' => 1,
|
||||
'sm' => 2,
|
||||
'md' => 3,
|
||||
'lg' => 2,
|
||||
]),
|
||||
Forms\Components\TextInput::make('port')
|
||||
->placeholder('25565')
|
||||
->columnSpan([
|
||||
'default' => 1,
|
||||
'sm' => 1,
|
||||
'md' => 1,
|
||||
'lg' => 1,
|
||||
])
|
||||
->minValue(0)
|
||||
->maxValue(65535)
|
||||
->numeric(),
|
||||
Forms\Components\Select::make('server_id')->relationship('server', 'name'),
|
||||
Forms\Components\TextInput::make('ip_alias')
|
||||
->placeholder('mincraft.pelican.dev')
|
||||
->columnSpan([
|
||||
'default' => 1,
|
||||
'sm' => 2,
|
||||
'md' => 2,
|
||||
'lg' => 3,
|
||||
])
|
||||
->label('Alias'),
|
||||
Forms\Components\TextInput::make('server')
|
||||
->columnSpan([
|
||||
'default' => 1,
|
||||
'sm' => 1,
|
||||
'md' => 2,
|
||||
'lg' => 3,
|
||||
])
|
||||
->formatStateUsing(fn (Allocation $allocation) => $allocation->server?->name)
|
||||
->activeUrl(true)
|
||||
->placeholder('Not assigned'),
|
||||
]),
|
||||
]),
|
||||
|
||||
]),
|
||||
]);
|
||||
}
|
||||
|
@ -2,6 +2,8 @@
|
||||
|
||||
namespace App\Filament\Resources;
|
||||
|
||||
use App\Enums\ContainerStatus;
|
||||
use App\Enums\ServerState;
|
||||
use App\Filament\Resources\ServerResource\Pages;
|
||||
use App\Models\Allocation;
|
||||
use App\Models\Egg;
|
||||
@ -52,21 +54,15 @@ class ServerResource extends Resource
|
||||
|
||||
return $details['state'] ?? 'unknown';
|
||||
})
|
||||
->options([
|
||||
'running' => 'Running',
|
||||
'starting' => 'Starting',
|
||||
'stopping' => 'Stopping',
|
||||
'offline' => 'Offline',
|
||||
'unknown' => 'Unknown',
|
||||
])
|
||||
|
||||
->colors([
|
||||
'running' => 'success',
|
||||
'offline' => 'danger',
|
||||
'starting' => 'primary',
|
||||
'stopping' => 'warning',
|
||||
'unknown' => 'primary',
|
||||
])
|
||||
->options(collect(ContainerStatus::cases())->mapWithKeys(
|
||||
fn (ContainerStatus $status) => [$status->value => str($status->value)->ucwords()]
|
||||
))
|
||||
->colors(collect(ContainerStatus::cases())->mapWithKeys(
|
||||
fn (ContainerStatus $status) => [$status->value => $status->color()]
|
||||
))
|
||||
->icons(collect(ContainerStatus::cases())->mapWithKeys(
|
||||
fn (ContainerStatus $status) => [$status->value => $status->icon()]
|
||||
))
|
||||
->grouped()
|
||||
->columnSpanFull()
|
||||
->inline(),
|
||||
@ -76,24 +72,16 @@ class ServerResource extends Resource
|
||||
->helperText('')
|
||||
->hiddenOn('create')
|
||||
->disableOptionWhen(fn ($state, $value) => $state !== $value)
|
||||
->formatStateUsing(fn ($state) => $state ?? 'none')
|
||||
->options([
|
||||
'none' => 'None',
|
||||
Server::STATUS_INSTALLING => str(Server::STATUS_INSTALLING)->title()->replace('_', ' '),
|
||||
Server::STATUS_INSTALL_FAILED => str(Server::STATUS_INSTALL_FAILED)->title()->replace('_', ' '),
|
||||
Server::STATUS_REINSTALL_FAILED => str(Server::STATUS_REINSTALL_FAILED)->title()->replace('_', ' '),
|
||||
Server::STATUS_SUSPENDED => str(Server::STATUS_SUSPENDED)->title()->replace('_', ' '),
|
||||
Server::STATUS_RESTORING_BACKUP => str(Server::STATUS_RESTORING_BACKUP)->title()->replace('_', ' '),
|
||||
])
|
||||
|
||||
->colors([
|
||||
'none' => 'primary',
|
||||
Server::STATUS_INSTALLING => 'primary',
|
||||
Server::STATUS_INSTALL_FAILED => 'danger',
|
||||
Server::STATUS_REINSTALL_FAILED => 'danger',
|
||||
Server::STATUS_SUSPENDED => 'danger',
|
||||
Server::STATUS_RESTORING_BACKUP => 'primary',
|
||||
])
|
||||
->formatStateUsing(fn ($state) => $state ?? ServerState::Normal)
|
||||
->options(collect(ServerState::cases())->mapWithKeys(
|
||||
fn (ServerState $state) => [$state->value => str($state->value)->replace('_', ' ')->ucwords()]
|
||||
))
|
||||
->colors(collect(ServerState::cases())->mapWithKeys(
|
||||
fn (ServerState $state) => [$state->value => $state->color()]
|
||||
))
|
||||
->icons(collect(ServerState::cases())->mapWithKeys(
|
||||
fn (ServerState $state) => [$state->value => $state->icon()]
|
||||
))
|
||||
->grouped()
|
||||
->columnSpanFull()
|
||||
->inline(),
|
||||
@ -184,22 +172,11 @@ class ServerResource extends Resource
|
||||
)
|
||||
->createOptionForm(fn (Forms\Get $get) => [
|
||||
Forms\Components\TextInput::make('allocation_ip')
|
||||
->ipv4()
|
||||
->datalist(function () use ($get) {
|
||||
$node = Node::find($get('node_id'));
|
||||
if (is_ip($node->fqdn)) {
|
||||
return [$node->fqdn];
|
||||
}
|
||||
|
||||
$validRecords = gethostbynamel($node->fqdn);
|
||||
if (!$validRecords) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return $validRecords ?: [];
|
||||
})
|
||||
->datalist(Node::find($get('node_id'))?->ipAddresses() ?? [])
|
||||
->label('IP Address')
|
||||
->ipv4()
|
||||
->helperText("Usually your machine's public IP unless you are port forwarding.")
|
||||
// ->selectablePlaceholder(false)
|
||||
->required(),
|
||||
Forms\Components\TextInput::make('allocation_alias')
|
||||
->label('Alias')
|
||||
@ -217,6 +194,54 @@ class ServerResource extends Resource
|
||||
They usually consist of the port forwarded ones.
|
||||
')
|
||||
->label('Ports')
|
||||
->live()
|
||||
->afterStateUpdated(function ($state, Forms\Set $set) {
|
||||
$ports = collect();
|
||||
$update = false;
|
||||
foreach ($state as $portEntry) {
|
||||
if (!str_contains($portEntry, '-')) {
|
||||
if (is_numeric($portEntry)) {
|
||||
$ports->push((int) $portEntry);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
// Do not add non numerical ports
|
||||
$update = true;
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
$update = true;
|
||||
[$start, $end] = explode('-', $portEntry);
|
||||
if (!is_numeric($start) || !is_numeric($end)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$start = max((int) $start, 0);
|
||||
$end = min((int) $end, 2 ** 16 - 1);
|
||||
for ($i = $start; $i <= $end; $i++) {
|
||||
$ports->push($i);
|
||||
}
|
||||
}
|
||||
|
||||
$uniquePorts = $ports->unique()->values();
|
||||
if ($ports->count() > $uniquePorts->count()) {
|
||||
$update = true;
|
||||
$ports = $uniquePorts;
|
||||
}
|
||||
|
||||
$sortedPorts = $ports->sort()->values();
|
||||
if ($sortedPorts->all() !== $ports->all()) {
|
||||
$update = true;
|
||||
$ports = $sortedPorts;
|
||||
}
|
||||
|
||||
if ($update) {
|
||||
$set('allocation_ports', $ports->all());
|
||||
}
|
||||
})
|
||||
->splitKeys(['Tab', ' ', ','])
|
||||
->required(),
|
||||
])
|
||||
->createOptionUsing(function (array $data, Forms\Get $get): int {
|
||||
@ -229,6 +254,7 @@ class ServerResource extends Resource
|
||||
Forms\Components\Repeater::make('allocation_additional')
|
||||
->label('Additional Allocations')
|
||||
->columnSpan(2)
|
||||
->addActionLabel('Add Allocation')
|
||||
->disabled(fn (Forms\Get $get) => $get('allocation_id') === null)
|
||||
// ->addable() TODO disable when all allocations are taken
|
||||
// ->addable() TODO disable until first additional allocation is selected
|
||||
@ -332,6 +358,15 @@ class ServerResource extends Resource
|
||||
->live()
|
||||
->label('Custom Image?')
|
||||
->default(false)
|
||||
->formatStateUsing(function ($state, Forms\Get $get) {
|
||||
if ($state !== null) {
|
||||
return $state;
|
||||
}
|
||||
|
||||
$images = Egg::find($get('egg_id'))->docker_images ?? [];
|
||||
|
||||
return !in_array($get('image'), $images);
|
||||
})
|
||||
->options([
|
||||
false => 'No',
|
||||
true => 'Yes',
|
||||
@ -563,6 +598,39 @@ class ServerResource extends Resource
|
||||
return $table
|
||||
->searchable(false)
|
||||
->columns([
|
||||
Tables\Columns\TextColumn::make('status')
|
||||
->default('unknown')
|
||||
->badge()
|
||||
->default(function (Server $server) {
|
||||
if ($server->status !== null) {
|
||||
return $server->status;
|
||||
}
|
||||
|
||||
$statuses = collect($server->retrieveStatus())
|
||||
->mapWithKeys(function ($status) {
|
||||
return [$status['configuration']['uuid'] => $status['state']];
|
||||
})->all();
|
||||
|
||||
return $statuses[$server->uuid] ?? 'node_fail';
|
||||
})
|
||||
->icon(fn ($state) => match ($state) {
|
||||
'node_fail' => 'tabler-server-off',
|
||||
'running' => 'tabler-heartbeat',
|
||||
'removing' => 'tabler-heart-x',
|
||||
'offline' => 'tabler-heart-off',
|
||||
'paused' => 'tabler-heart-pause',
|
||||
'installing' => 'tabler-heart-bolt',
|
||||
'suspended' => 'tabler-heart-cancel',
|
||||
default => 'tabler-heart-question',
|
||||
})
|
||||
->color(fn ($state): string => match ($state) {
|
||||
'running' => 'success',
|
||||
'installing', 'restarting' => 'primary',
|
||||
'paused', 'removing' => 'warning',
|
||||
'node_fail', 'install_failed', 'suspended' => 'danger',
|
||||
default => 'gray',
|
||||
}),
|
||||
|
||||
Tables\Columns\TextColumn::make('uuid')
|
||||
->hidden()
|
||||
->label('UUID')
|
||||
@ -584,9 +652,11 @@ class ServerResource extends Resource
|
||||
->label('Owner')
|
||||
->url(fn (Server $server): string => route('filament.admin.resources.users.edit', ['record' => $server->user]))
|
||||
->sortable(),
|
||||
Tables\Columns\SelectColumn::make('allocation.id')
|
||||
Tables\Columns\SelectColumn::make('allocation_id')
|
||||
->label('Primary Allocation')
|
||||
->options(fn ($state, Server $server) => [$server->allocation->id => $server->allocation->address])
|
||||
->options(fn ($state, Server $server) => $server->allocations->mapWithKeys(
|
||||
fn ($allocation) => [$allocation->id => $allocation->address])
|
||||
)
|
||||
->selectablePlaceholder(false)
|
||||
->sortable(),
|
||||
Tables\Columns\TextColumn::make('image')->hidden(),
|
||||
|
@ -4,7 +4,6 @@ namespace App\Filament\Resources\ServerResource\Pages;
|
||||
|
||||
use App\Filament\Resources\ServerResource;
|
||||
use App\Services\Servers\ServerCreationService;
|
||||
use Filament\Actions;
|
||||
use Filament\Resources\Pages\CreateRecord;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
@ -25,8 +24,8 @@ class CreateServer extends CreateRecord
|
||||
return $server;
|
||||
}
|
||||
|
||||
// protected function getRedirectUrl(): string
|
||||
// {
|
||||
// return $this->getResource()::getUrl('edit');
|
||||
// }
|
||||
// protected function getRedirectUrl(): string
|
||||
// {
|
||||
// return $this->getResource()::getUrl('edit');
|
||||
// }
|
||||
}
|
||||
|
@ -2,16 +2,27 @@
|
||||
|
||||
namespace App\Filament\Resources\UserResource\Pages;
|
||||
|
||||
use App\Facades\Activity;
|
||||
use App\Models\ActivityLog;
|
||||
use App\Models\ApiKey;
|
||||
use App\Models\User;
|
||||
use App\Services\Users\TwoFactorSetupService;
|
||||
use chillerlan\QRCode\Common\EccLevel;
|
||||
use chillerlan\QRCode\Common\Version;
|
||||
use chillerlan\QRCode\QRCode;
|
||||
use chillerlan\QRCode\QROptions;
|
||||
use Filament\Forms\Components\Actions\Action;
|
||||
use Filament\Forms\Components\Grid;
|
||||
use Filament\Forms\Components\Placeholder;
|
||||
use Filament\Forms\Components\Repeater;
|
||||
use Filament\Forms\Components\Section;
|
||||
use Filament\Forms\Components\Select;
|
||||
use Filament\Forms\Components\Tabs;
|
||||
use Filament\Forms\Components\TagsInput;
|
||||
use Filament\Forms\Components\Tabs\Tab;
|
||||
use Filament\Forms\Components\TextInput;
|
||||
use Filament\Forms\Get;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\HtmlString;
|
||||
use Illuminate\Validation\Rules\Password;
|
||||
@ -24,84 +35,192 @@ class EditProfile extends \Filament\Pages\Auth\EditProfile
|
||||
'form' => $this->form(
|
||||
$this->makeForm()
|
||||
->schema([
|
||||
Tabs::make()->schema([
|
||||
Tab::make('Account')
|
||||
->icon('tabler-user')
|
||||
->schema([
|
||||
TextInput::make('username')
|
||||
->disabled()
|
||||
->readOnly()
|
||||
->maxLength(191)
|
||||
->unique(ignoreRecord: true)
|
||||
->autofocus(),
|
||||
Tabs::make()->persistTabInQueryString()
|
||||
->schema([
|
||||
Tab::make('Account')
|
||||
->icon('tabler-user')
|
||||
->schema([
|
||||
TextInput::make('username')
|
||||
->disabled()
|
||||
->readOnly()
|
||||
->maxLength(191)
|
||||
->unique(ignoreRecord: true)
|
||||
->autofocus(),
|
||||
|
||||
TextInput::make('email')
|
||||
->email()
|
||||
->required()
|
||||
->maxLength(191)
|
||||
->unique(ignoreRecord: true),
|
||||
TextInput::make('email')
|
||||
->prefixIcon('tabler-mail')
|
||||
->email()
|
||||
->required()
|
||||
->maxLength(191)
|
||||
->unique(ignoreRecord: true),
|
||||
|
||||
TextInput::make('password')
|
||||
->password()
|
||||
->revealable(filament()->arePasswordsRevealable())
|
||||
->rule(Password::default())
|
||||
->autocomplete('new-password')
|
||||
->dehydrated(fn ($state): bool => filled($state))
|
||||
->dehydrateStateUsing(fn ($state): string => Hash::make($state))
|
||||
->live(debounce: 500)
|
||||
->same('passwordConfirmation'),
|
||||
TextInput::make('password')
|
||||
->password()
|
||||
->prefixIcon('tabler-password')
|
||||
->revealable(filament()->arePasswordsRevealable())
|
||||
->rule(Password::default())
|
||||
->autocomplete('new-password')
|
||||
->dehydrated(fn ($state): bool => filled($state))
|
||||
->dehydrateStateUsing(fn ($state): string => Hash::make($state))
|
||||
->live(debounce: 500)
|
||||
->same('passwordConfirmation'),
|
||||
|
||||
TextInput::make('passwordConfirmation')
|
||||
->password()
|
||||
->revealable(filament()->arePasswordsRevealable())
|
||||
->required()
|
||||
->visible(fn (Get $get): bool => filled($get('password')))
|
||||
->dehydrated(false),
|
||||
TextInput::make('passwordConfirmation')
|
||||
->password()
|
||||
->prefixIcon('tabler-password-fingerprint')
|
||||
->revealable(filament()->arePasswordsRevealable())
|
||||
->required()
|
||||
->visible(fn (Get $get): bool => filled($get('password')))
|
||||
->dehydrated(false),
|
||||
|
||||
Select::make('language')
|
||||
->required()
|
||||
->default('en')
|
||||
->options(fn (User $user) => $user->getAvailableLanguages()),
|
||||
]),
|
||||
Select::make('language')
|
||||
->required()
|
||||
->prefixIcon('tabler-flag')
|
||||
->live()
|
||||
->default('en')
|
||||
->helperText(fn (User $user, $state) => new HtmlString($user->isLanguageTranslated($state) ? '' : "
|
||||
Your language ($state) has not been translated yet!
|
||||
But never fear, you can help fix that by
|
||||
<a style='color: rgb(56, 189, 248)' href='https://crowdin.com/project/pelican-dev'>contributing directly here</a>.
|
||||
")
|
||||
)
|
||||
->options(fn (User $user) => $user->getAvailableLanguages()),
|
||||
]),
|
||||
|
||||
Tab::make('2FA')
|
||||
->icon('tabler-shield-lock')
|
||||
->schema([
|
||||
Placeholder::make('Coming soon!'),
|
||||
]),
|
||||
Tab::make('2FA')
|
||||
->icon('tabler-shield-lock')
|
||||
->schema(function () {
|
||||
|
||||
Tab::make('API Keys')
|
||||
->icon('tabler-key')
|
||||
->schema([
|
||||
Placeholder::make('Coming soon!'),
|
||||
TagsInput::make('allowed_ips')
|
||||
->placeholder('Example: 127.0.0.1 or 192.168.1.1')
|
||||
->label('Whitelisted IPv4 Addresses')
|
||||
->helperText('Press enter to add a new IP address or leave blank to allow any IP address')
|
||||
->columnSpanFull()
|
||||
->hidden()
|
||||
->default(null),
|
||||
]),
|
||||
|
||||
Tab::make('SSH Keys')
|
||||
->icon('tabler-lock-code')
|
||||
->schema([
|
||||
Placeholder::make('Coming soon!'),
|
||||
]),
|
||||
if ($this->getUser()->use_totp) {
|
||||
return [
|
||||
Placeholder::make('2FA already enabled!'),
|
||||
];
|
||||
}
|
||||
$setupService = app(TwoFactorSetupService::class);
|
||||
|
||||
Tab::make('Activity')
|
||||
->icon('tabler-history')
|
||||
->schema([
|
||||
Repeater::make('activity')
|
||||
->deletable(false)
|
||||
->addable(false)
|
||||
->relationship()
|
||||
['image_url_data' => $url] = $setupService->handle($this->getUser());
|
||||
|
||||
->schema([
|
||||
Placeholder::make('activity!')->label('')->content(fn (ActivityLog $log) => new HtmlString($log->htmlable())),
|
||||
$options = new QROptions([
|
||||
'svgLogo' => public_path('pelican.svg'),
|
||||
'addLogoSpace' => true,
|
||||
'logoSpaceWidth' => 13,
|
||||
'logoSpaceHeight' => 13,
|
||||
]);
|
||||
|
||||
// https://github.com/chillerlan/php-qrcode/blob/main/examples/svgWithLogo.php
|
||||
|
||||
// SVG logo options (see extended class)
|
||||
$options->svgLogo = public_path('pelican.svg'); // logo from: https://github.com/simple-icons/simple-icons
|
||||
$options->svgLogoScale = 0.05;
|
||||
// $options->svgLogoCssClass = 'dark';
|
||||
|
||||
// QROptions
|
||||
$options->version = Version::AUTO;
|
||||
// $options->outputInterface = QRSvgWithLogo::class;
|
||||
$options->outputBase64 = false;
|
||||
$options->eccLevel = EccLevel::H; // ECC level H is necessary when using logos
|
||||
$options->addQuietzone = true;
|
||||
// $options->drawLightModules = true;
|
||||
$options->connectPaths = true;
|
||||
$options->drawCircularModules = true;
|
||||
// $options->circleRadius = 0.45;
|
||||
|
||||
$options->svgDefs = '<linearGradient id="gradient" x1="100%" y2="100%">
|
||||
<stop stop-color="#7dd4fc" offset="0"/>
|
||||
<stop stop-color="#38bdf8" offset="0.5"/>
|
||||
<stop stop-color="#0369a1" offset="1"/>
|
||||
</linearGradient>
|
||||
<style><![CDATA[
|
||||
.dark{fill: url(#gradient);}
|
||||
.light{fill: #000;}
|
||||
]]></style>';
|
||||
|
||||
$image = (new QRCode($options))->render($url);
|
||||
|
||||
return [
|
||||
Placeholder::make('qr')
|
||||
->label('Scan QR Code')
|
||||
->content(fn () => new HtmlString("
|
||||
<div style='width: 300px'>$image</div>
|
||||
"))
|
||||
->default('asdfasdf'),
|
||||
];
|
||||
}),
|
||||
|
||||
Tab::make('API Keys')
|
||||
->icon('tabler-key')
|
||||
->schema([
|
||||
Grid::make('asdf')->columns(5)->schema([
|
||||
Section::make('Create API Key')->columnSpan(3)->schema([
|
||||
TextInput::make('description'),
|
||||
TagsInput::make('allowed_ips')
|
||||
->splitKeys([',', ' ', 'Tab'])
|
||||
->placeholder('Example: 127.0.0.1 or 192.168.1.1')
|
||||
->label('Whitelisted IP\'s')
|
||||
->helperText('Press enter to add a new IP address or leave blank to allow any IP address')
|
||||
->columnSpanFull(),
|
||||
])->headerActions([
|
||||
Action::make('Create')
|
||||
->successRedirectUrl('/panel/profile?tab=-api-keys-tab')
|
||||
->action(function (Get $get, Action $action) {
|
||||
$token = auth()->user()->createToken(
|
||||
$get('description'),
|
||||
$get('allowed_ips'),
|
||||
);
|
||||
|
||||
Activity::event('user:api-key.create')
|
||||
->subject($token->accessToken)
|
||||
->property('identifier', $token->accessToken->identifier)
|
||||
->log();
|
||||
|
||||
$action->success();
|
||||
}),
|
||||
]),
|
||||
Section::make('API Keys')->columnSpan(2)->schema([
|
||||
Repeater::make('keys')
|
||||
->relationship('apiKeys')
|
||||
->addable(false)
|
||||
->itemLabel(fn ($state) => $state['identifier'])
|
||||
->deleteAction(function (Action $action) {
|
||||
$action->requiresConfirmation()->action(function (array $arguments, Repeater $component) {
|
||||
$items = $component->getState();
|
||||
$key = $items[$arguments['item']];
|
||||
ApiKey::find($key['id'] ?? null)?->delete();
|
||||
|
||||
unset($items[$arguments['item']]);
|
||||
|
||||
$component->state($items);
|
||||
|
||||
$component->callAfterStateUpdated();
|
||||
});
|
||||
})
|
||||
->schema(fn () => [
|
||||
Placeholder::make('adf')->label(fn (ApiKey $key) => $key->memo),
|
||||
]),
|
||||
]),
|
||||
]),
|
||||
]),
|
||||
]),
|
||||
]),
|
||||
|
||||
Tab::make('SSH Keys')
|
||||
->icon('tabler-lock-code')
|
||||
->schema([
|
||||
Placeholder::make('Coming soon!'),
|
||||
]),
|
||||
|
||||
Tab::make('Activity')
|
||||
->icon('tabler-history')
|
||||
->schema([
|
||||
Repeater::make('activity')
|
||||
->deletable(false)
|
||||
->addable(false)
|
||||
->relationship(null, function (Builder $query) {
|
||||
$query->orderBy('timestamp', 'desc');
|
||||
})
|
||||
->schema([
|
||||
Placeholder::make('activity!')->label('')->content(fn (ActivityLog $log) => new HtmlString($log->htmlable())),
|
||||
]),
|
||||
]),
|
||||
]),
|
||||
])
|
||||
->operation('edit')
|
||||
->model($this->getUser())
|
||||
|
@ -2,12 +2,12 @@
|
||||
|
||||
namespace App\Http\Controllers\Admin\Servers;
|
||||
|
||||
use App\Enums\ServerState;
|
||||
use App\Models\DatabaseHost;
|
||||
use App\Models\Egg;
|
||||
use App\Models\Mount;
|
||||
use App\Models\Node;
|
||||
use Illuminate\View\View;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\Server;
|
||||
use App\Exceptions\DisplayException;
|
||||
use App\Http\Controllers\Controller;
|
||||
@ -22,14 +22,14 @@ class ServerViewController extends Controller
|
||||
* ServerViewController constructor.
|
||||
*/
|
||||
public function __construct(
|
||||
private EnvironmentService $environmentService,
|
||||
private readonly EnvironmentService $environmentService,
|
||||
) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the index view for a server.
|
||||
*/
|
||||
public function index(Request $request, Server $server): View
|
||||
public function index(Server $server): View
|
||||
{
|
||||
return view('admin.servers.view.index', compact('server'));
|
||||
}
|
||||
@ -37,7 +37,7 @@ class ServerViewController extends Controller
|
||||
/**
|
||||
* Returns the server details page.
|
||||
*/
|
||||
public function details(Request $request, Server $server): View
|
||||
public function details(Server $server): View
|
||||
{
|
||||
return view('admin.servers.view.details', compact('server'));
|
||||
}
|
||||
@ -45,7 +45,7 @@ class ServerViewController extends Controller
|
||||
/**
|
||||
* Returns a view of server build settings.
|
||||
*/
|
||||
public function build(Request $request, Server $server): View
|
||||
public function build(Server $server): View
|
||||
{
|
||||
$allocations = $server->node->allocations->toBase();
|
||||
|
||||
@ -59,7 +59,7 @@ class ServerViewController extends Controller
|
||||
/**
|
||||
* Returns the server startup management page.
|
||||
*/
|
||||
public function startup(Request $request, Server $server): View
|
||||
public function startup(Server $server): View
|
||||
{
|
||||
$variables = $this->environmentService->handle($server);
|
||||
$eggs = Egg::all()->keyBy('id');
|
||||
@ -76,7 +76,7 @@ class ServerViewController extends Controller
|
||||
/**
|
||||
* Returns all the databases that exist for the server.
|
||||
*/
|
||||
public function database(Request $request, Server $server): View
|
||||
public function database(Server $server): View
|
||||
{
|
||||
return view('admin.servers.view.database', [
|
||||
'hosts' => DatabaseHost::all(),
|
||||
@ -87,7 +87,7 @@ class ServerViewController extends Controller
|
||||
/**
|
||||
* Returns all the mounts that exist for the server.
|
||||
*/
|
||||
public function mounts(Request $request, Server $server): View
|
||||
public function mounts(Server $server): View
|
||||
{
|
||||
$server->load('mounts');
|
||||
|
||||
@ -108,9 +108,9 @@ class ServerViewController extends Controller
|
||||
*
|
||||
* @throws \App\Exceptions\DisplayException
|
||||
*/
|
||||
public function manage(Request $request, Server $server): View
|
||||
public function manage(Server $server): View
|
||||
{
|
||||
if ($server->status === Server::STATUS_INSTALL_FAILED) {
|
||||
if ($server->status === ServerState::InstallFailed) {
|
||||
throw new DisplayException('This server is in a failed install state and cannot be recovered. Please delete and re-create the server.');
|
||||
}
|
||||
|
||||
@ -135,7 +135,7 @@ class ServerViewController extends Controller
|
||||
/**
|
||||
* Returns the server deletion page.
|
||||
*/
|
||||
public function delete(Request $request, Server $server): View
|
||||
public function delete(Server $server): View
|
||||
{
|
||||
return view('admin.servers.view.delete', compact('server'));
|
||||
}
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
|
||||
use App\Enums\ServerState;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\User;
|
||||
use Illuminate\Http\Response;
|
||||
@ -71,11 +72,11 @@ class ServersController extends Controller
|
||||
*/
|
||||
public function toggleInstall(Server $server): RedirectResponse
|
||||
{
|
||||
if ($server->status === Server::STATUS_INSTALL_FAILED) {
|
||||
if ($server->status === ServerState::InstallFailed) {
|
||||
throw new DisplayException(trans('admin/server.exceptions.marked_as_failed'));
|
||||
}
|
||||
|
||||
$server->status = $server->isInstalled() ? Server::STATUS_INSTALLING : null;
|
||||
$server->status = $server->isInstalled() ? ServerState::Installing : null;
|
||||
$server->save();
|
||||
|
||||
$this->alert->success(trans('admin/server.alerts.install_toggled'))->flash();
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Http\Controllers\Api\Client\Servers;
|
||||
|
||||
use App\Enums\ServerState;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\Backup;
|
||||
use App\Models\Server;
|
||||
@ -212,7 +213,7 @@ class BackupController extends ClientApiController
|
||||
|
||||
// Update the status right away for the server so that we know not to allow certain
|
||||
// actions against it via the Panel API.
|
||||
$server->update(['status' => Server::STATUS_RESTORING_BACKUP]);
|
||||
$server->update(['status' => ServerState::RestoringBackup]);
|
||||
|
||||
$this->daemonRepository->setServer($server)->restore($backup, $url ?? null, $request->input('truncate'));
|
||||
});
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Http\Controllers\Api\Remote\Servers;
|
||||
|
||||
use App\Enums\ServerState;
|
||||
use App\Models\Backup;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\Server;
|
||||
@ -81,7 +82,7 @@ class ServerDetailsController extends Controller
|
||||
->latest('timestamp'),
|
||||
])
|
||||
->where('node_id', $node->id)
|
||||
->where('status', Server::STATUS_RESTORING_BACKUP)
|
||||
->where('status', ServerState::RestoringBackup)
|
||||
->get();
|
||||
|
||||
$this->connection->transaction(function () use ($node, $servers) {
|
||||
@ -108,7 +109,7 @@ class ServerDetailsController extends Controller
|
||||
// Update any server marked as installing or restoring as being in a normal state
|
||||
// at this point in the process.
|
||||
Server::query()->where('node_id', $node->id)
|
||||
->whereIn('status', [Server::STATUS_INSTALLING, Server::STATUS_RESTORING_BACKUP])
|
||||
->whereIn('status', [ServerState::Installing, ServerState::RestoringBackup])
|
||||
->update(['status' => null]);
|
||||
});
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Http\Controllers\Api\Remote\Servers;
|
||||
|
||||
use App\Enums\ServerState;
|
||||
use Illuminate\Http\Response;
|
||||
use App\Models\Server;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
@ -36,16 +37,16 @@ class ServerInstallController extends Controller
|
||||
|
||||
// Make sure the type of failure is accurate
|
||||
if (!$request->boolean('successful')) {
|
||||
$status = Server::STATUS_INSTALL_FAILED;
|
||||
$status = ServerState::InstallFailed;
|
||||
|
||||
if ($request->boolean('reinstall')) {
|
||||
$status = Server::STATUS_REINSTALL_FAILED;
|
||||
$status = ServerState::ReinstallFailed;
|
||||
}
|
||||
}
|
||||
|
||||
// Keep the server suspended if it's already suspended
|
||||
if ($server->status === Server::STATUS_SUSPENDED) {
|
||||
$status = Server::STATUS_SUSPENDED;
|
||||
if ($server->status === ServerState::Suspended) {
|
||||
$status = ServerState::Suspended;
|
||||
}
|
||||
|
||||
$previouslyInstalledAt = $server->installed_at;
|
||||
|
@ -19,6 +19,10 @@ class VerifyReCaptcha
|
||||
return $next($request);
|
||||
}
|
||||
|
||||
if (app()->isLocal()) {
|
||||
return $next($request);
|
||||
}
|
||||
|
||||
if ($request->filled('g-recaptcha-response')) {
|
||||
$client = new Client();
|
||||
$res = $client->post(config('recaptcha.domain'), [
|
||||
|
@ -139,6 +139,7 @@ class Egg extends Model
|
||||
'features' => 'array',
|
||||
'docker_images' => 'array',
|
||||
'file_denylist' => 'array',
|
||||
'tags' => 'array',
|
||||
];
|
||||
}
|
||||
|
||||
|
@ -5,6 +5,7 @@ namespace App\Models;
|
||||
use App\Exceptions\Service\HasActiveServersException;
|
||||
use App\Repositories\Daemon\DaemonConfigurationRepository;
|
||||
use Exception;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
use Illuminate\Support\Str;
|
||||
use Symfony\Component\Yaml\Yaml;
|
||||
use Illuminate\Notifications\Notifiable;
|
||||
@ -288,4 +289,36 @@ class Node extends Model
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public function serverStatuses(): array
|
||||
{
|
||||
return cache()->remember("nodes.$this->id.servers", now()->addMinute(), function () {
|
||||
try {
|
||||
return Http::daemon($this)->connectTimeout(1)->timeout(1)->get('/api/servers')->json();
|
||||
} catch (Exception) {
|
||||
return [];
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public function ipAddresses(): array
|
||||
{
|
||||
return cache()->remember("nodes.$this->id.ips", now()->addHour(), function () {
|
||||
$ips = collect();
|
||||
if (is_ip($this->fqdn)) {
|
||||
$ips = $ips->push($this->fqdn);
|
||||
} elseif ($dnsRecords = gethostbynamel($this->fqdn)) {
|
||||
$ips = $ips->concat($dnsRecords);
|
||||
}
|
||||
|
||||
try {
|
||||
$addresses = Http::daemon($this)->connectTimeout(1)->timeout(1)->get('/api/system/ips')->json();
|
||||
$ips = $ips->concat(fluent($addresses)->get('ip_addresses'));
|
||||
} catch (Exception) {
|
||||
// pass
|
||||
}
|
||||
|
||||
return $ips->all();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use App\Enums\ServerState;
|
||||
use App\Exceptions\Http\Connection\DaemonConnectionException;
|
||||
use GuzzleHttp\Exception\GuzzleException;
|
||||
use Illuminate\Notifications\Notifiable;
|
||||
@ -112,12 +113,6 @@ class Server extends Model
|
||||
*/
|
||||
public const RESOURCE_NAME = 'server';
|
||||
|
||||
public const STATUS_INSTALLING = 'installing';
|
||||
public const STATUS_INSTALL_FAILED = 'install_failed';
|
||||
public const STATUS_REINSTALL_FAILED = 'reinstall_failed';
|
||||
public const STATUS_SUSPENDED = 'suspended';
|
||||
public const STATUS_RESTORING_BACKUP = 'restoring_backup';
|
||||
|
||||
/**
|
||||
* The table associated with the model.
|
||||
*/
|
||||
@ -128,7 +123,7 @@ class Server extends Model
|
||||
* on server instances unless the user specifies otherwise in the request.
|
||||
*/
|
||||
protected $attributes = [
|
||||
'status' => self::STATUS_INSTALLING,
|
||||
'status' => ServerState::Installing,
|
||||
'oom_disabled' => true,
|
||||
'installed_at' => null,
|
||||
];
|
||||
@ -171,6 +166,7 @@ class Server extends Model
|
||||
{
|
||||
return [
|
||||
'node_id' => 'integer',
|
||||
'status' => ServerState::class,
|
||||
'skip_scripts' => 'boolean',
|
||||
'owner_id' => 'integer',
|
||||
'memory' => 'integer',
|
||||
@ -203,12 +199,12 @@ class Server extends Model
|
||||
|
||||
public function isInstalled(): bool
|
||||
{
|
||||
return $this->status !== self::STATUS_INSTALLING && $this->status !== self::STATUS_INSTALL_FAILED;
|
||||
return $this->status !== ServerState::Installing && $this->status !== ServerState::InstallFailed;
|
||||
}
|
||||
|
||||
public function isSuspended(): bool
|
||||
{
|
||||
return $this->status === self::STATUS_SUSPENDED;
|
||||
return $this->status === ServerState::Suspended;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -359,7 +355,7 @@ class Server extends Model
|
||||
$this->isSuspended() ||
|
||||
$this->node->isUnderMaintenance() ||
|
||||
!$this->isInstalled() ||
|
||||
$this->status === self::STATUS_RESTORING_BACKUP ||
|
||||
$this->status === ServerState::RestoringBackup ||
|
||||
!is_null($this->transfer)
|
||||
) {
|
||||
throw new ServerStateConflictException($this);
|
||||
@ -376,7 +372,7 @@ class Server extends Model
|
||||
{
|
||||
if (
|
||||
!$this->isInstalled() ||
|
||||
$this->status === self::STATUS_RESTORING_BACKUP ||
|
||||
$this->status === ServerState::RestoringBackup ||
|
||||
!is_null($this->transfer)
|
||||
) {
|
||||
throw new ServerStateConflictException($this);
|
||||
@ -398,4 +394,9 @@ class Server extends Model
|
||||
throw new DaemonConnectionException($exception);
|
||||
}
|
||||
}
|
||||
|
||||
public function retrieveStatus()
|
||||
{
|
||||
return $this->node->serverStatuses();
|
||||
}
|
||||
}
|
||||
|
@ -177,7 +177,7 @@ class User extends Model implements AuthenticatableContract, AuthorizableContrac
|
||||
protected static function booted(): void
|
||||
{
|
||||
static::creating(function (self $user) {
|
||||
$user->uuid = Str::uuid();
|
||||
$user->uuid = Str::uuid()->toString();
|
||||
|
||||
return true;
|
||||
});
|
||||
|
@ -28,9 +28,7 @@ class DaemonFileRepository extends DaemonRepository
|
||||
try {
|
||||
$response = $this->getHttpClient()->get(
|
||||
sprintf('/api/servers/%s/files/contents', $this->server->uuid),
|
||||
[
|
||||
'query' => ['file' => $path],
|
||||
]
|
||||
['file' => $path]
|
||||
);
|
||||
} catch (ClientException|TransferException $exception) {
|
||||
throw new DaemonConnectionException($exception);
|
||||
@ -55,13 +53,10 @@ class DaemonFileRepository extends DaemonRepository
|
||||
Assert::isInstanceOf($this->server, Server::class);
|
||||
|
||||
try {
|
||||
return $this->getHttpClient()->post(
|
||||
sprintf('/api/servers/%s/files/write', $this->server->uuid),
|
||||
[
|
||||
'query' => ['file' => $path],
|
||||
'body' => $content,
|
||||
]
|
||||
);
|
||||
return $this->getHttpClient()
|
||||
->withQueryParameters(['file' => $path])
|
||||
->withBody($content)
|
||||
->post(sprintf('/api/servers/%s/files/write', $this->server->uuid));
|
||||
} catch (TransferException $exception) {
|
||||
throw new DaemonConnectionException($exception);
|
||||
}
|
||||
@ -79,9 +74,7 @@ class DaemonFileRepository extends DaemonRepository
|
||||
try {
|
||||
$response = $this->getHttpClient()->get(
|
||||
sprintf('/api/servers/%s/files/list-directory', $this->server->uuid),
|
||||
[
|
||||
'query' => ['directory' => $path],
|
||||
]
|
||||
['directory' => $path]
|
||||
);
|
||||
} catch (TransferException $exception) {
|
||||
throw new DaemonConnectionException($exception);
|
||||
@ -125,10 +118,8 @@ class DaemonFileRepository extends DaemonRepository
|
||||
return $this->getHttpClient()->put(
|
||||
sprintf('/api/servers/%s/files/rename', $this->server->uuid),
|
||||
[
|
||||
'json' => [
|
||||
'root' => $root ?? '/',
|
||||
'files' => $files,
|
||||
],
|
||||
'root' => $root ?? '/',
|
||||
'files' => $files,
|
||||
]
|
||||
);
|
||||
} catch (TransferException $exception) {
|
||||
@ -275,9 +266,7 @@ class DaemonFileRepository extends DaemonRepository
|
||||
try {
|
||||
return $this->getHttpClient()->post(
|
||||
sprintf('/api/servers/%s/files/pull', $this->server->uuid),
|
||||
[
|
||||
array_filter($attributes, fn ($value) => !is_null($value)),
|
||||
]
|
||||
array_filter($attributes, fn ($value) => !is_null($value))
|
||||
);
|
||||
} catch (TransferException $exception) {
|
||||
throw new DaemonConnectionException($exception);
|
||||
|
@ -2,6 +2,8 @@
|
||||
|
||||
namespace App\Repositories\Daemon;
|
||||
|
||||
use App\Enums\ContainerStatus;
|
||||
use Exception;
|
||||
use Webmozart\Assert\Assert;
|
||||
use App\Models\Server;
|
||||
use GuzzleHttp\Exception\GuzzleException;
|
||||
@ -25,6 +27,8 @@ class DaemonServerRepository extends DaemonRepository
|
||||
);
|
||||
} catch (TransferException $exception) {
|
||||
throw new DaemonConnectionException($exception, false);
|
||||
} catch (Exception) {
|
||||
return ['state' => ContainerStatus::Missing->value];
|
||||
}
|
||||
|
||||
return $response->json();
|
||||
@ -147,7 +151,7 @@ class DaemonServerRepository extends DaemonRepository
|
||||
try {
|
||||
$this->getHttpClient()
|
||||
->post(sprintf('/api/servers/%s/ws/deny', $this->server->uuid), [
|
||||
'json' => ['jtis' => $jtis],
|
||||
'jtis' => $jtis,
|
||||
]);
|
||||
} catch (TransferException $exception) {
|
||||
throw new DaemonConnectionException($exception);
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Services\Servers;
|
||||
|
||||
use App\Enums\ServerState;
|
||||
use App\Models\Server;
|
||||
use Illuminate\Database\ConnectionInterface;
|
||||
use App\Repositories\Daemon\DaemonServerRepository;
|
||||
@ -25,7 +26,7 @@ class ReinstallServerService
|
||||
public function handle(Server $server): Server
|
||||
{
|
||||
return $this->connection->transaction(function () use ($server) {
|
||||
$server->fill(['status' => Server::STATUS_INSTALLING])->save();
|
||||
$server->fill(['status' => ServerState::Installing])->save();
|
||||
|
||||
$this->daemonServerRepository->setServer($server)->reinstall();
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Services\Servers;
|
||||
|
||||
use App\Enums\ServerState;
|
||||
use App\Models\ServerVariable;
|
||||
use Ramsey\Uuid\Uuid;
|
||||
use Illuminate\Support\Arr;
|
||||
@ -132,7 +133,7 @@ class ServerCreationService
|
||||
'node_id' => Arr::get($data, 'node_id'),
|
||||
'name' => Arr::get($data, 'name'),
|
||||
'description' => Arr::get($data, 'description') ?? '',
|
||||
'status' => Server::STATUS_INSTALLING,
|
||||
'status' => ServerState::Installing,
|
||||
'skip_scripts' => Arr::get($data, 'skip_scripts') ?? isset($data['skip_scripts']),
|
||||
'owner_id' => Arr::get($data, 'owner_id'),
|
||||
'memory' => Arr::get($data, 'memory'),
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Services\Servers;
|
||||
|
||||
use App\Enums\ServerState;
|
||||
use Webmozart\Assert\Assert;
|
||||
use App\Models\Server;
|
||||
use App\Repositories\Daemon\DaemonServerRepository;
|
||||
@ -44,7 +45,7 @@ class SuspensionService
|
||||
|
||||
// Update the server's suspension status.
|
||||
$server->update([
|
||||
'status' => $isSuspending ? Server::STATUS_SUSPENDED : null,
|
||||
'status' => $isSuspending ? ServerState::Suspended : null,
|
||||
]);
|
||||
|
||||
try {
|
||||
@ -53,7 +54,7 @@ class SuspensionService
|
||||
} catch (\Exception $exception) {
|
||||
// Rollback the server's suspension status if daemon fails to sync the server.
|
||||
$server->update([
|
||||
'status' => $isSuspending ? null : Server::STATUS_SUSPENDED,
|
||||
'status' => $isSuspending ? null : ServerState::Suspended,
|
||||
]);
|
||||
throw $exception;
|
||||
}
|
||||
|
@ -9,6 +9,22 @@ trait AvailableLanguages
|
||||
{
|
||||
private ?Filesystem $filesystem = null;
|
||||
|
||||
public const TRANSLATED = [
|
||||
'ar',
|
||||
'cz',
|
||||
'da',
|
||||
'de',
|
||||
'dk',
|
||||
'en',
|
||||
'es',
|
||||
'fi',
|
||||
'ja',
|
||||
'nl',
|
||||
'pl',
|
||||
'ru',
|
||||
'tr',
|
||||
];
|
||||
|
||||
/**
|
||||
* Return all the available languages on the Panel based on those
|
||||
* that are present in the language folder.
|
||||
@ -18,12 +34,17 @@ trait AvailableLanguages
|
||||
return collect($this->getFilesystemInstance()->directories(base_path('lang')))->mapWithKeys(function ($path) {
|
||||
$code = basename($path);
|
||||
|
||||
$value = Locale::getDisplayName($code, app()->currentLocale());
|
||||
$value = Locale::getDisplayName($code, $code);
|
||||
|
||||
return [$code => title_case($value)];
|
||||
})->toArray();
|
||||
}
|
||||
|
||||
public function isLanguageTranslated(string $countryCode = 'en'): bool
|
||||
{
|
||||
return in_array($countryCode, self::TRANSLATED, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return an instance of the filesystem for getting a folder listing.
|
||||
*/
|
||||
|
@ -8,10 +8,10 @@
|
||||
"ext-mbstring": "*",
|
||||
"ext-pdo": "*",
|
||||
"ext-pdo_mysql": "*",
|
||||
"ext-posix": "*",
|
||||
"ext-zip": "*",
|
||||
"abdelhamiderrahmouni/filament-monaco-editor": "^0.2.0",
|
||||
"aws/aws-sdk-php": "~3.288.1",
|
||||
"chillerlan/php-qrcode": "^5.0",
|
||||
"doctrine/dbal": "~3.6.0",
|
||||
"filament/filament": "^3.2",
|
||||
"guzzlehttp/guzzle": "^7.5",
|
||||
|
678
composer.lock
generated
678
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@ -92,7 +92,7 @@ return [
|
||||
|
||||
'cdn' => [
|
||||
'cache_time' => 60,
|
||||
'url' => 'https://cdn.example.com/releases/latest.json',
|
||||
'url' => 'https://cdn.pelican.dev/releases/latest.json',
|
||||
],
|
||||
|
||||
/*
|
||||
|
96
contributor_license_agreement.md
Normal file
96
contributor_license_agreement.md
Normal file
@ -0,0 +1,96 @@
|
||||
Thank you for your interest in Pelican ("Pelican Developers"). To clarify the intellectual property license
|
||||
granted with Contributions from any person or entity, the Pelican Developers
|
||||
must have on file a signed Contributor License Agreement ("CLA")
|
||||
from each Contributor, indicating agreement with the license
|
||||
terms below. This agreement is for your protection as a Contributor
|
||||
as well as the protection of the Pelican Developers and its users. It does not
|
||||
change your rights to use your own Contributions for any other purpose.
|
||||
|
||||
You accept and agree to the following terms and conditions for Your
|
||||
Contributions (present and future) that you submit to the Pelican Developers. In
|
||||
return, the Pelican Developers shall not use Your Contributions in a way that
|
||||
is contrary to the public benefit or inconsistent with its nonprofit
|
||||
status and bylaws in effect at the time of the Contribution. Except
|
||||
for the license granted herein to the Pelican Developers and recipients of
|
||||
software distributed by the Pelican Developers, You reserve all right, title,
|
||||
and interest in and to Your Contributions.
|
||||
1. Definitions.
|
||||
"You" (or "Your") shall mean the copyright owner or legal entity
|
||||
authorized by the copyright owner that is making this Agreement
|
||||
with the Pelican Developers. For legal entities, the entity making a
|
||||
Contribution and all other entities that control, are controlled
|
||||
by, or are under common control with that entity are considered to
|
||||
be a single Contributor. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
"Contribution" shall mean any original work of authorship,
|
||||
including any modifications or additions to an existing work, that
|
||||
is intentionally submitted by You to the Pelican Developers for inclusion
|
||||
in, or documentation of, any of the products owned or managed by
|
||||
the Pelican Developers (the "Work"). For the purposes of this definition,
|
||||
"submitted" means any form of electronic, verbal, or written
|
||||
communication sent to the Pelican Developers or its representatives,
|
||||
including but not limited to communication on electronic mailing
|
||||
lists, source code control systems, and issue tracking systems that
|
||||
are managed by, or on behalf of, the Pelican Developers for the purpose of
|
||||
discussing and improving the Work, but excluding communication that
|
||||
is conspicuously marked or otherwise designated in writing by You
|
||||
as "Not a Contribution."
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this Agreement, You hereby grant to the Pelican Developers and to
|
||||
recipients of software distributed by the Pelican Developers a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare derivative works of,
|
||||
publicly display, publicly perform, sublicense, and distribute Your
|
||||
Contributions and such derivative works.
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this Agreement, You hereby grant to the Pelican Developers and to
|
||||
recipients of software distributed by the Pelican Developers a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have
|
||||
made, use, offer to sell, sell, import, and otherwise transfer the
|
||||
Work, where such license applies only to those patent claims
|
||||
licensable by You that are necessarily infringed by Your
|
||||
Contribution(s) alone or by combination of Your Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If any
|
||||
entity institutes patent litigation against You or any other entity
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging
|
||||
that your Contribution, or the Work to which you have contributed,
|
||||
constitutes direct or contributory patent infringement, then any
|
||||
patent licenses granted to that entity under this Agreement for
|
||||
that Contribution or Work shall terminate as of the date such
|
||||
litigation is filed.
|
||||
4. You represent that you are legally entitled to grant the above
|
||||
license. If your employer(s) has rights to intellectual property
|
||||
that you create that includes your Contributions, you represent
|
||||
that you have received permission to make Contributions on behalf
|
||||
of that employer, that your employer has waived such rights for
|
||||
your Contributions to the Pelican Developers, or that your employer has
|
||||
executed a separate Corporate CLA with the Pelican Developers.
|
||||
5. You represent that each of Your Contributions is Your original
|
||||
creation (see section 7 for submissions on behalf of others). You
|
||||
represent that Your Contribution submissions include complete
|
||||
details of any third-party license or other restriction (including,
|
||||
but not limited to, related patents and trademarks) of which you
|
||||
are personally aware and which are associated with any part of Your
|
||||
Contributions.
|
||||
6. You are not expected to provide support for Your Contributions,
|
||||
except to the extent You desire to provide support. You may provide
|
||||
support for free, for a fee, or not at all. Unless required by
|
||||
applicable law or agreed to in writing, You provide Your
|
||||
Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
|
||||
OF ANY KIND, either express or implied, including, without
|
||||
limitation, any warranties or conditions of TITLE, NON-
|
||||
INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
7. Should You wish to submit work that is not Your original creation,
|
||||
You may submit it to the Pelican Developers separately from any
|
||||
Contribution, identifying the complete details of its source and of
|
||||
any license or other restriction (including, but not limited to,
|
||||
related patents, trademarks, and license agreements) of which you
|
||||
are personally aware, and conspicuously marking the work as
|
||||
"Submitted on behalf of a third-party: [named here]".
|
||||
8. You agree to notify the Pelican Developers of any facts or circumstances of
|
||||
which you become aware that would make these representations
|
||||
inaccurate in any respect.
|
11
crowdin.yml
Normal file
11
crowdin.yml
Normal file
@ -0,0 +1,11 @@
|
||||
files:
|
||||
- source: /lang/en/*.php
|
||||
translation: /lang/%two_letters_code%/%original_file_name%
|
||||
- source: /lang/en/admin
|
||||
translation: /lang/%two_letters_code%/admin/%original_file_name%
|
||||
- source: /lang/en/command
|
||||
translation: /lang/%two_letters_code%/command/%original_file_name%
|
||||
- source: /lang/en/dashboard
|
||||
translation: /lang/%two_letters_code%/dashboard/%original_file_name%
|
||||
- source: /lang/en/server
|
||||
translation: /lang/%two_letters_code%/server/%original_file_name%
|
@ -3,12 +3,30 @@
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Artisan;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('eggs', function (Blueprint $table) {
|
||||
$table->text('tags');
|
||||
});
|
||||
|
||||
DB::table('eggs')->update(['tags' => '[]']);
|
||||
|
||||
$eggsWithNests = DB::table('eggs')
|
||||
->select(['eggs.id', 'nests.name'])
|
||||
->join('nests', 'nests.id', '=', 'eggs.nest_id')
|
||||
->get();
|
||||
|
||||
foreach ($eggsWithNests as $egg) {
|
||||
DB::table('eggs')
|
||||
->where('id', $egg->id)
|
||||
->update(['tags' => "[\"$egg->name\"]"]);
|
||||
}
|
||||
|
||||
Schema::table('eggs', function (Blueprint $table) {
|
||||
$table->dropForeign('service_options_nest_id_foreign');
|
||||
$table->dropColumn('nest_id');
|
||||
@ -26,6 +44,7 @@ return new class extends Migration
|
||||
});
|
||||
}
|
||||
|
||||
// Not really reversible, but...
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('api_keys', function (Blueprint $table) {
|
||||
@ -42,6 +61,7 @@ return new class extends Migration
|
||||
});
|
||||
|
||||
Schema::table('eggs', function (Blueprint $table) {
|
||||
$table->dropColumn('tags');
|
||||
$table->mediumInteger('nest_id')->unsigned();
|
||||
$table->foreign(['nest_id'], 'service_options_nest_id_foreign');
|
||||
});
|
||||
|
@ -2,17 +2,33 @@
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('nodes', function (Blueprint $table) {
|
||||
$table->text('tags');
|
||||
});
|
||||
|
||||
DB::table('nodes')->update(['tags' => '[]']);
|
||||
|
||||
$nodesWithLocations = DB::table('nodes')
|
||||
->select(['nodes.id', 'locations.short'])
|
||||
->join('locations', 'locations.id', '=', 'nodes.location_id')
|
||||
->get();
|
||||
|
||||
foreach ($nodesWithLocations as $node) {
|
||||
DB::table('nodes')
|
||||
->where('id', $node->id)
|
||||
->update(['tags' => "[\"$node->short\"]"]);
|
||||
}
|
||||
|
||||
Schema::table('nodes', function (Blueprint $table) {
|
||||
$table->dropForeign('nodes_location_id_foreign');
|
||||
$table->dropColumn('location_id');
|
||||
});
|
||||
|
||||
Schema::drop('locations');
|
||||
@ -22,9 +38,7 @@ return new class extends Migration
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
// Not really reversible, but...
|
||||
public function down(): void
|
||||
{
|
||||
Schema::create('locations', function (Blueprint $table) {
|
||||
@ -34,6 +48,11 @@ return new class extends Migration
|
||||
$table->timestamps();
|
||||
});
|
||||
|
||||
Schema::table('nodes', function (Blueprint $table) {
|
||||
$table->unsignedInteger('location_id')->default(0);
|
||||
$table->foreign('location_id')->references('id')->on('locations');
|
||||
});
|
||||
|
||||
Schema::table('api_keys', function (Blueprint $table) {
|
||||
$table->unsignedTinyInteger('r_locations')->default(0);
|
||||
});
|
||||
|
130
lang/af/activity.php
Normal file
130
lang/af/activity.php
Normal file
@ -0,0 +1,130 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Contains all of the translation strings for different activity log
|
||||
* events. These should be keyed by the value in front of the colon (:)
|
||||
* in the event name. If there is no colon present, they should live at
|
||||
* the top level.
|
||||
*/
|
||||
return [
|
||||
'auth' => [
|
||||
'fail' => 'Kon nie aanmeld nie',
|
||||
'success' => 'Aangemeld',
|
||||
'password-reset' => 'Wagwoord herstel',
|
||||
'reset-password' => 'Versoek wagwoordterugstelling',
|
||||
'checkpoint' => 'Twee-faktor-stawing versoek',
|
||||
'recovery-token' => 'Gebruik twee-faktor-hersteltoken',
|
||||
'token' => 'Twee-faktor uitdaging opgelos',
|
||||
'ip-blocked' => 'Geblokkeerde versoek van ongelyste IP-adres vir :identifier',
|
||||
'sftp' => [
|
||||
'fail' => 'Kon nie SFTP aanmeld nie',
|
||||
],
|
||||
],
|
||||
'user' => [
|
||||
'account' => [
|
||||
'email-changed' => 'E-pos verander van :oud na :nuut',
|
||||
'password-changed' => 'Verander wagwoord',
|
||||
],
|
||||
'api-key' => [
|
||||
'create' => 'Skep nuwe API-sleutel:identifiseerder',
|
||||
'delete' => 'Geskrap API-sleutel:identifiseerder',
|
||||
],
|
||||
'ssh-key' => [
|
||||
'create' => 'SSH-sleutel :vingerafdruk by rekening gevoeg',
|
||||
'delete' => 'SSH-sleutel :vingerafdruk van rekening verwyder',
|
||||
],
|
||||
'two-factor' => [
|
||||
'create' => 'Geaktiveerde twee-faktor-autagtiging',
|
||||
'delete' => 'Gedeaktiveerde twee-faktor-aut',
|
||||
],
|
||||
],
|
||||
'server' => [
|
||||
'reinstall' => 'Herinstalleer bediener',
|
||||
'console' => [
|
||||
'command' => '":opdrag" op die bediener uitgevoer',
|
||||
],
|
||||
'power' => [
|
||||
'start' => 'Het die bediener begin',
|
||||
'stop' => 'Het die bediener gestop',
|
||||
'restart' => 'Het die bediener herbegin',
|
||||
'kill' => 'Het die bedienerproses doodgemaak',
|
||||
],
|
||||
'backup' => [
|
||||
'download' => 'Het die :name rugsteun afgelaai',
|
||||
'delete' => 'Het die :name rugsteun uitgevee',
|
||||
'restore' => 'Het die :name-rugsteun herstel (geskrap lêers: :truncate)',
|
||||
'restore-complete' => 'Voltooide herstel van die :name rugsteun',
|
||||
'restore-failed' => 'Kon nie die herstel van die :name rugsteun voltooi nie',
|
||||
'start' => 'Het \'n nuwe rugsteun :name begin',
|
||||
'complete' => 'Het die :name-rugsteun as voltooi gemerk',
|
||||
'fail' => 'Het die :name-rugsteun as voltooi gemerk',
|
||||
'lock' => 'Het die :name rugsteun uitgevee',
|
||||
'unlock' => 'Het die :name rugsteun afgelaai',
|
||||
],
|
||||
'database' => [
|
||||
'create' => 'Create new database file',
|
||||
'rotate-password' => 'Wagwoord geroteer vir databasis :naam',
|
||||
'delete' => 'Geskrap databasis :naam',
|
||||
],
|
||||
'file' => [
|
||||
'compress_one' => 'Saamgeperste :directory:lêer',
|
||||
'compress_other' => 'Saamgeperste :count lêers in :directory',
|
||||
'read' => 'Het die inhoud van :file bekyk',
|
||||
'copy' => 'Het \'n kopie van :file geskep',
|
||||
'create-directory' => 'Geskep gids :gids:naam',
|
||||
'decompress' => 'Gedekomprimeerde :lêers in :directory',
|
||||
'delete_one' => 'Geskrap :gids:lêers.0',
|
||||
'delete_other' => 'Saamgeperste :count lêers in :directory',
|
||||
'download' => 'Afgelaai: lêer',
|
||||
'pull' => 'Het \'n afstandlêer afgelaai vanaf :url na :directory',
|
||||
'rename_one' => 'Hernoem :gids:lêers.0.van na :gids:lêers.0.na',
|
||||
'rename_other' => 'Hernoem :count lêers in :directory',
|
||||
'write' => 'Het nuwe inhoud na :file geskryf',
|
||||
'upload' => 'Het \'n lêeroplaai begin',
|
||||
'uploaded' => 'Uploaded :directory:file',
|
||||
],
|
||||
'sftp' => [
|
||||
'denied' => 'Blocked SFTP access due to permissions',
|
||||
'create_one' => 'Created :files.0',
|
||||
'create_other' => 'Created :count new files',
|
||||
'write_one' => 'Modified the contents of :files.0',
|
||||
'write_other' => 'Modified the contents of :count files',
|
||||
'delete_one' => 'Deleted :files.0',
|
||||
'delete_other' => 'Deleted :count files',
|
||||
'create-directory_one' => 'Created the :files.0 directory',
|
||||
'create-directory_other' => 'Created :count directories',
|
||||
'rename_one' => 'Renamed :files.0.from to :files.0.to',
|
||||
'rename_other' => 'Renamed or moved :count files',
|
||||
],
|
||||
'allocation' => [
|
||||
'create' => 'Added :allocation to the server',
|
||||
'notes' => 'Updated the notes for :allocation from ":old" to ":new"',
|
||||
'primary' => 'Set :allocation as the primary server allocation',
|
||||
'delete' => 'Deleted the :allocation allocation',
|
||||
],
|
||||
'schedule' => [
|
||||
'create' => 'Created the :name schedule',
|
||||
'update' => 'Updated the :name schedule',
|
||||
'execute' => 'Manually executed the :name schedule',
|
||||
'delete' => 'Deleted the :name schedule',
|
||||
],
|
||||
'task' => [
|
||||
'create' => 'Created a new ":action" task for the :name schedule',
|
||||
'update' => 'Updated the ":action" task for the :name schedule',
|
||||
'delete' => 'Deleted a task for the :name schedule',
|
||||
],
|
||||
'settings' => [
|
||||
'rename' => 'Renamed the server from :old to :new',
|
||||
'description' => 'Changed the server description from :old to :new',
|
||||
],
|
||||
'startup' => [
|
||||
'edit' => 'Changed the :variable variable from ":old" to ":new"',
|
||||
'image' => 'Updated the Docker Image for the server from :old to :new',
|
||||
],
|
||||
'subuser' => [
|
||||
'create' => 'Added :email as a subuser',
|
||||
'update' => 'Updated the subuser permissions for :email',
|
||||
'delete' => 'Removed :email as a subuser',
|
||||
],
|
||||
],
|
||||
];
|
19
lang/af/admin/eggs.php
Normal file
19
lang/af/admin/eggs.php
Normal file
@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'notices' => [
|
||||
'imported' => 'Successfully imported this Egg and its associated variables.',
|
||||
'updated_via_import' => 'This Egg has been updated using the file provided.',
|
||||
'deleted' => 'Successfully deleted the requested egg from the Panel.',
|
||||
'updated' => 'Egg configuration has been updated successfully.',
|
||||
'script_updated' => 'Egg install script has been updated and will run whenever servers are installed.',
|
||||
'egg_created' => 'A new egg was laid successfully. You will need to restart any running daemons to apply this new egg.',
|
||||
],
|
||||
'variables' => [
|
||||
'notices' => [
|
||||
'variable_deleted' => 'The variable ":variable" has been deleted and will no longer be available to servers once rebuilt.',
|
||||
'variable_updated' => 'The variable ":variable" has been updated. You will need to rebuild any servers using this variable in order to apply changes.',
|
||||
'variable_created' => 'New variable has successfully been created and assigned to this egg.',
|
||||
],
|
||||
],
|
||||
];
|
15
lang/af/admin/node.php
Normal file
15
lang/af/admin/node.php
Normal file
@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'validation' => [
|
||||
'fqdn_not_resolvable' => 'The FQDN or IP address provided does not resolve to a valid IP address.',
|
||||
'fqdn_required_for_ssl' => 'A fully qualified domain name that resolves to a public IP address is required in order to use SSL for this node.',
|
||||
],
|
||||
'notices' => [
|
||||
'allocations_added' => 'Allocations have successfully been added to this node.',
|
||||
'node_deleted' => 'Node has been successfully removed from the panel.',
|
||||
'node_created' => 'Successfully created new node. You can automatically configure the daemon on this machine by visiting the \'Configuration\' tab. <strong>Before you can add any servers you must first allocate at least one IP address and port.</strong>',
|
||||
'node_updated' => 'Node information has been updated. If any daemon settings were changed you will need to reboot it for those changes to take effect.',
|
||||
'unallocated_deleted' => 'Deleted all un-allocated ports for <code>:ip</code>.',
|
||||
],
|
||||
];
|
27
lang/af/admin/server.php
Normal file
27
lang/af/admin/server.php
Normal file
@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'exceptions' => [
|
||||
'no_new_default_allocation' => 'You are attempting to delete the default allocation for this server but there is no fallback allocation to use.',
|
||||
'marked_as_failed' => 'This server was marked as having failed a previous installation. Current status cannot be toggled in this state.',
|
||||
'bad_variable' => 'There was a validation error with the :name variable.',
|
||||
'daemon_exception' => 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged. (request id: :request_id)',
|
||||
'default_allocation_not_found' => 'The requested default allocation was not found in this server\'s allocations.',
|
||||
],
|
||||
'alerts' => [
|
||||
'startup_changed' => 'The startup configuration for this server has been updated. If this server\'s egg was changed a reinstall will be occurring now.',
|
||||
'server_deleted' => 'Server has successfully been deleted from the system.',
|
||||
'server_created' => 'Server was successfully created on the panel. Please allow the daemon a few minutes to completely install this server.',
|
||||
'build_updated' => 'The build details for this server have been updated. Some changes may require a restart to take effect.',
|
||||
'suspension_toggled' => 'Server suspension status has been changed to :status.',
|
||||
'rebuild_on_boot' => 'This server has been marked as requiring a Docker Container rebuild. This will happen the next time the server is started.',
|
||||
'install_toggled' => 'The installation status for this server has been toggled.',
|
||||
'server_reinstalled' => 'This server has been queued for a reinstallation beginning now.',
|
||||
'details_updated' => 'Server details have been successfully updated.',
|
||||
'docker_image_updated' => 'Successfully changed the default Docker image to use for this server. A reboot is required to apply this change.',
|
||||
'node_required' => 'You must have at least one node configured before you can add a server to this panel.',
|
||||
'transfer_nodes_required' => 'You must have at least two nodes configured before you can transfer servers.',
|
||||
'transfer_started' => 'Server transfer has been started.',
|
||||
'transfer_not_viable' => 'The node you selected does not have the required disk space or memory available to accommodate this server.',
|
||||
],
|
||||
];
|
12
lang/af/admin/user.php
Normal file
12
lang/af/admin/user.php
Normal file
@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'exceptions' => [
|
||||
'user_has_servers' => 'Cannot delete a user with active servers attached to their account. Please delete their servers before continuing.',
|
||||
'user_is_self' => 'Cannot delete your own user account.',
|
||||
],
|
||||
'notices' => [
|
||||
'account_created' => 'Account has been created successfully.',
|
||||
'account_updated' => 'Account has been successfully updated.',
|
||||
],
|
||||
];
|
27
lang/af/auth.php
Normal file
27
lang/af/auth.php
Normal file
@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'sign_in' => 'Sign In',
|
||||
'go_to_login' => 'Go to Login',
|
||||
'failed' => 'No account matching those credentials could be found.',
|
||||
|
||||
'forgot_password' => [
|
||||
'label' => 'Forgot Password?',
|
||||
'label_help' => 'Enter your account email address to receive instructions on resetting your password.',
|
||||
'button' => 'Recover Account',
|
||||
],
|
||||
|
||||
'reset_password' => [
|
||||
'button' => 'Reset and Sign In',
|
||||
],
|
||||
|
||||
'two_factor' => [
|
||||
'label' => '2-Factor Token',
|
||||
'label_help' => 'This account requires a second layer of authentication in order to continue. Please enter the code generated by your device to complete this login.',
|
||||
'checkpoint_failed' => 'The two-factor authentication token was invalid.',
|
||||
],
|
||||
|
||||
'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',
|
||||
'password_requirements' => 'Password must be at least 8 characters in length and should be unique to this site.',
|
||||
'2fa_must_be_enabled' => 'The administrator has required that 2-Factor Authentication be enabled for your account in order to use the Panel.',
|
||||
];
|
59
lang/af/command/messages.php
Normal file
59
lang/af/command/messages.php
Normal file
@ -0,0 +1,59 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'user' => [
|
||||
'search_users' => 'Enter a Username, User ID, or Email Address',
|
||||
'select_search_user' => 'ID of user to delete (Enter \'0\' to re-search)',
|
||||
'deleted' => 'User successfully deleted from the Panel.',
|
||||
'confirm_delete' => 'Are you sure you want to delete this user from the Panel?',
|
||||
'no_users_found' => 'No users were found for the search term provided.',
|
||||
'multiple_found' => 'Multiple accounts were found for the user provided, unable to delete a user because of the --no-interaction flag.',
|
||||
'ask_admin' => 'Is this user an administrator?',
|
||||
'ask_email' => 'Email Address',
|
||||
'ask_username' => 'Username',
|
||||
'ask_name_first' => 'First Name',
|
||||
'ask_name_last' => 'Last Name',
|
||||
'ask_password' => 'Password',
|
||||
'ask_password_tip' => 'If you would like to create an account with a random password emailed to the user, re-run this command (CTRL+C) and pass the `--no-password` flag.',
|
||||
'ask_password_help' => 'Passwords must be at least 8 characters in length and contain at least one capital letter and number.',
|
||||
'2fa_help_text' => [
|
||||
'This command will disable 2-factor authentication for a user\'s account if it is enabled. This should only be used as an account recovery command if the user is locked out of their account.',
|
||||
'If this is not what you wanted to do, press CTRL+C to exit this process.',
|
||||
],
|
||||
'2fa_disabled' => '2-Factor authentication has been disabled for :email.',
|
||||
],
|
||||
'schedule' => [
|
||||
'output_line' => 'Dispatching job for first task in `:schedule` (:hash).',
|
||||
],
|
||||
'maintenance' => [
|
||||
'deleting_service_backup' => 'Deleting service backup file :file.',
|
||||
],
|
||||
'server' => [
|
||||
'rebuild_failed' => 'Rebuild request for ":name" (#:id) on node ":node" failed with error: :message',
|
||||
'reinstall' => [
|
||||
'failed' => 'Reinstall request for ":name" (#:id) on node ":node" failed with error: :message',
|
||||
'confirm' => 'You are about to reinstall against a group of servers. Do you wish to continue?',
|
||||
],
|
||||
'power' => [
|
||||
'confirm' => 'You are about to perform a :action against :count servers. Do you wish to continue?',
|
||||
'action_failed' => 'Power action request for ":name" (#:id) on node ":node" failed with error: :message',
|
||||
],
|
||||
],
|
||||
'environment' => [
|
||||
'mail' => [
|
||||
'ask_smtp_host' => 'SMTP Host (e.g. smtp.gmail.com)',
|
||||
'ask_smtp_port' => 'SMTP Port',
|
||||
'ask_smtp_username' => 'SMTP Username',
|
||||
'ask_smtp_password' => 'SMTP Password',
|
||||
'ask_mailgun_domain' => 'Mailgun Domain',
|
||||
'ask_mailgun_endpoint' => 'Mailgun Endpoint',
|
||||
'ask_mailgun_secret' => 'Mailgun Secret',
|
||||
'ask_mandrill_secret' => 'Mandrill Secret',
|
||||
'ask_postmark_username' => 'Postmark API Key',
|
||||
'ask_driver' => 'Which driver should be used for sending emails?',
|
||||
'ask_mail_from' => 'Email address emails should originate from',
|
||||
'ask_mail_name' => 'Name that emails should appear from',
|
||||
'ask_encryption' => 'Encryption method to use',
|
||||
],
|
||||
],
|
||||
];
|
28
lang/af/dashboard/account.php
Normal file
28
lang/af/dashboard/account.php
Normal file
@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'email' => [
|
||||
'title' => 'Update your email',
|
||||
'updated' => 'Your email address has been updated.',
|
||||
],
|
||||
'password' => [
|
||||
'title' => 'Change your password',
|
||||
'requirements' => 'Your new password should be at least 8 characters in length.',
|
||||
'updated' => 'Your password has been updated.',
|
||||
],
|
||||
'two_factor' => [
|
||||
'button' => 'Configure 2-Factor Authentication',
|
||||
'disabled' => 'Two-factor authentication has been disabled on your account. You will no longer be prompted to provide a token when logging in.',
|
||||
'enabled' => 'Two-factor authentication has been enabled on your account! From now on, when logging in, you will be required to provide the code generated by your device.',
|
||||
'invalid' => 'The token provided was invalid.',
|
||||
'setup' => [
|
||||
'title' => 'Setup two-factor authentication',
|
||||
'help' => 'Can\'t scan the code? Enter the code below into your application:',
|
||||
'field' => 'Enter token',
|
||||
],
|
||||
'disable' => [
|
||||
'title' => 'Disable two-factor authentication',
|
||||
'field' => 'Enter token',
|
||||
],
|
||||
],
|
||||
];
|
8
lang/af/dashboard/index.php
Normal file
8
lang/af/dashboard/index.php
Normal file
@ -0,0 +1,8 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'search' => 'Search for servers...',
|
||||
'no_matches' => 'There were no servers found matching the search criteria provided.',
|
||||
'cpu_title' => 'CPU',
|
||||
'memory_title' => 'Memory',
|
||||
];
|
55
lang/af/exceptions.php
Normal file
55
lang/af/exceptions.php
Normal file
@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'daemon_connection_failed' => 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged.',
|
||||
'node' => [
|
||||
'servers_attached' => 'A node must have no servers linked to it in order to be deleted.',
|
||||
'daemon_off_config_updated' => 'The daemon configuration <strong>has been updated</strong>, however there was an error encountered while attempting to automatically update the configuration file on the Daemon. You will need to manually update the configuration file (config.yml) for the daemon to apply these changes.',
|
||||
],
|
||||
'allocations' => [
|
||||
'server_using' => 'A server is currently assigned to this allocation. An allocation can only be deleted if no server is currently assigned.',
|
||||
'too_many_ports' => 'Adding more than 1000 ports in a single range at once is not supported.',
|
||||
'invalid_mapping' => 'The mapping provided for :port was invalid and could not be processed.',
|
||||
'cidr_out_of_range' => 'CIDR notation only allows masks between /25 and /32.',
|
||||
'port_out_of_range' => 'Ports in an allocation must be greater than 1024 and less than or equal to 65535.',
|
||||
],
|
||||
'egg' => [
|
||||
'delete_has_servers' => 'An Egg with active servers attached to it cannot be deleted from the Panel.',
|
||||
'invalid_copy_id' => 'The Egg selected for copying a script from either does not exist, or is copying a script itself.',
|
||||
'has_children' => 'This Egg is a parent to one or more other Eggs. Please delete those Eggs before deleting this Egg.',
|
||||
],
|
||||
'variables' => [
|
||||
'env_not_unique' => 'The environment variable :name must be unique to this Egg.',
|
||||
'reserved_name' => 'The environment variable :name is protected and cannot be assigned to a variable.',
|
||||
'bad_validation_rule' => 'The validation rule ":rule" is not a valid rule for this application.',
|
||||
],
|
||||
'importer' => [
|
||||
'json_error' => 'There was an error while attempting to parse the JSON file: :error.',
|
||||
'file_error' => 'The JSON file provided was not valid.',
|
||||
'invalid_json_provided' => 'The JSON file provided is not in a format that can be recognized.',
|
||||
],
|
||||
'subusers' => [
|
||||
'editing_self' => 'Editing your own subuser account is not permitted.',
|
||||
'user_is_owner' => 'You cannot add the server owner as a subuser for this server.',
|
||||
'subuser_exists' => 'A user with that email address is already assigned as a subuser for this server.',
|
||||
],
|
||||
'databases' => [
|
||||
'delete_has_databases' => 'Cannot delete a database host server that has active databases linked to it.',
|
||||
],
|
||||
'tasks' => [
|
||||
'chain_interval_too_long' => 'The maximum interval time for a chained task is 15 minutes.',
|
||||
],
|
||||
'locations' => [
|
||||
'has_nodes' => 'Cannot delete a location that has active nodes attached to it.',
|
||||
],
|
||||
'users' => [
|
||||
'node_revocation_failed' => 'Failed to revoke keys on <a href=":link">Node #:node</a>. :error',
|
||||
],
|
||||
'deployment' => [
|
||||
'no_viable_nodes' => 'No nodes satisfying the requirements specified for automatic deployment could be found.',
|
||||
'no_viable_allocations' => 'No allocations satisfying the requirements for automatic deployment were found.',
|
||||
],
|
||||
'api' => [
|
||||
'resource_not_found' => 'The requested resource does not exist on this server.',
|
||||
],
|
||||
];
|
17
lang/af/pagination.php
Normal file
17
lang/af/pagination.php
Normal 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' => '« Previous',
|
||||
'next' => 'Next »',
|
||||
];
|
19
lang/af/passwords.php
Normal file
19
lang/af/passwords.php
Normal 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' => 'Passwords must be at least six characters and match the confirmation.',
|
||||
'reset' => 'Your password has been reset!',
|
||||
'sent' => 'We have e-mailed your password reset link!',
|
||||
'token' => 'This password reset token is invalid.',
|
||||
'user' => 'We can\'t find a user with that e-mail address.',
|
||||
];
|
33
lang/af/server/users.php
Normal file
33
lang/af/server/users.php
Normal file
@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'permissions' => [
|
||||
'websocket_*' => 'Allows access to the websocket for this server.',
|
||||
'control_console' => 'Allows the user to send data to the server console.',
|
||||
'control_start' => 'Allows the user to start the server instance.',
|
||||
'control_stop' => 'Allows the user to stop the server instance.',
|
||||
'control_restart' => 'Allows the user to restart the server instance.',
|
||||
'control_kill' => 'Allows the user to kill the server instance.',
|
||||
'user_create' => 'Allows the user to create new user accounts for the server.',
|
||||
'user_read' => 'Allows the user permission to view users associated with this server.',
|
||||
'user_update' => 'Allows the user to modify other users associated with this server.',
|
||||
'user_delete' => 'Allows the user to delete other users associated with this server.',
|
||||
'file_create' => 'Allows the user permission to create new files and directories.',
|
||||
'file_read' => 'Allows the user to see files and folders associated with this server instance, as well as view their contents.',
|
||||
'file_update' => 'Allows the user to update files and folders associated with the server.',
|
||||
'file_delete' => 'Allows the user to delete files and directories.',
|
||||
'file_archive' => 'Allows the user to create file archives and decompress existing archives.',
|
||||
'file_sftp' => 'Allows the user to perform the above file actions using a SFTP client.',
|
||||
'allocation_read' => 'Allows access to the server allocation management pages.',
|
||||
'allocation_update' => 'Allows user permission to make modifications to the server\'s allocations.',
|
||||
'database_create' => 'Allows user permission to create a new database for the server.',
|
||||
'database_read' => 'Allows user permission to view the server databases.',
|
||||
'database_update' => 'Allows a user permission to make modifications to a database. If the user does not have the "View Password" permission as well they will not be able to modify the password.',
|
||||
'database_delete' => 'Allows a user permission to delete a database instance.',
|
||||
'database_view_password' => 'Allows a user permission to view a database password in the system.',
|
||||
'schedule_create' => 'Allows a user to create a new schedule for the server.',
|
||||
'schedule_read' => 'Allows a user permission to view schedules for a server.',
|
||||
'schedule_update' => 'Allows a user permission to make modifications to an existing server schedule.',
|
||||
'schedule_delete' => 'Allows a user to delete a schedule for the server.',
|
||||
],
|
||||
];
|
95
lang/af/strings.php
Normal file
95
lang/af/strings.php
Normal file
@ -0,0 +1,95 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'email' => 'Email',
|
||||
'email_address' => 'Email address',
|
||||
'user_identifier' => 'Username or Email',
|
||||
'password' => 'Password',
|
||||
'new_password' => 'New password',
|
||||
'confirm_password' => 'Confirm new password',
|
||||
'login' => 'Login',
|
||||
'home' => 'Home',
|
||||
'servers' => 'Servers',
|
||||
'id' => 'ID',
|
||||
'name' => 'Name',
|
||||
'node' => 'Node',
|
||||
'connection' => 'Connection',
|
||||
'memory' => 'Memory',
|
||||
'cpu' => 'CPU',
|
||||
'disk' => 'Disk',
|
||||
'status' => 'Status',
|
||||
'search' => 'Search',
|
||||
'suspended' => 'Suspended',
|
||||
'account' => 'Account',
|
||||
'security' => 'Security',
|
||||
'ip' => 'IP Address',
|
||||
'last_activity' => 'Last Activity',
|
||||
'revoke' => 'Revoke',
|
||||
'2fa_token' => 'Authentication Token',
|
||||
'submit' => 'Submit',
|
||||
'close' => 'Close',
|
||||
'settings' => 'Settings',
|
||||
'configuration' => 'Configuration',
|
||||
'sftp' => 'SFTP',
|
||||
'databases' => 'Databases',
|
||||
'memo' => 'Memo',
|
||||
'created' => 'Created',
|
||||
'expires' => 'Expires',
|
||||
'public_key' => 'Token',
|
||||
'api_access' => 'Api Access',
|
||||
'never' => 'never',
|
||||
'sign_out' => 'Sign out',
|
||||
'admin_control' => 'Admin Control',
|
||||
'required' => 'Required',
|
||||
'port' => 'Port',
|
||||
'username' => 'Username',
|
||||
'database' => 'Database',
|
||||
'new' => 'New',
|
||||
'danger' => 'Danger',
|
||||
'create' => 'Create',
|
||||
'select_all' => 'Select All',
|
||||
'select_none' => 'Select None',
|
||||
'alias' => 'Alias',
|
||||
'primary' => 'Primary',
|
||||
'make_primary' => 'Make Primary',
|
||||
'none' => 'None',
|
||||
'cancel' => 'Cancel',
|
||||
'created_at' => 'Created At',
|
||||
'action' => 'Action',
|
||||
'data' => 'Data',
|
||||
'queued' => 'Queued',
|
||||
'last_run' => 'Last Run',
|
||||
'next_run' => 'Next Run',
|
||||
'not_run_yet' => 'Not Run Yet',
|
||||
'yes' => 'Yes',
|
||||
'no' => 'No',
|
||||
'delete' => 'Delete',
|
||||
'2fa' => '2FA',
|
||||
'logout' => 'Logout',
|
||||
'admin_cp' => 'Admin Control Panel',
|
||||
'optional' => 'Optional',
|
||||
'read_only' => 'Read Only',
|
||||
'relation' => 'Relation',
|
||||
'owner' => 'Owner',
|
||||
'admin' => 'Admin',
|
||||
'subuser' => 'Subuser',
|
||||
'captcha_invalid' => 'The provided captcha is invalid.',
|
||||
'tasks' => 'Tasks',
|
||||
'seconds' => 'Seconds',
|
||||
'minutes' => 'Minutes',
|
||||
'under_maintenance' => 'Under Maintenance',
|
||||
'days' => [
|
||||
'sun' => 'Sunday',
|
||||
'mon' => 'Monday',
|
||||
'tues' => 'Tuesday',
|
||||
'wed' => 'Wednesday',
|
||||
'thurs' => 'Thursday',
|
||||
'fri' => 'Friday',
|
||||
'sat' => 'Saturday',
|
||||
],
|
||||
'last_used' => 'Last Used',
|
||||
'enable' => 'Enable',
|
||||
'disable' => 'Disable',
|
||||
'save' => 'Save',
|
||||
'copyright' => '® 2024 - :year Pelican',
|
||||
];
|
106
lang/af/validation.php
Normal file
106
lang/af/validation.php
Normal file
@ -0,0 +1,106 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Validation Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines contain the default error messages used by
|
||||
| the validator class. Some of these rules have multiple versions such
|
||||
| as the size rules. Feel free to tweak each of these messages here.
|
||||
|
|
||||
*/
|
||||
|
||||
'accepted' => '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' => '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' => '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' => 'The :attribute may not be greater than :max.',
|
||||
'file' => 'The :attribute may not be greater than :max kilobytes.',
|
||||
'string' => 'The :attribute may not be greater than :max characters.',
|
||||
'array' => 'The :attribute may not have more than :max items.',
|
||||
],
|
||||
'mimes' => 'The :attribute must be a file of type: :values.',
|
||||
'mimetypes' => 'The :attribute must be a file of type: :values.',
|
||||
'min' => [
|
||||
'numeric' => 'The :attribute must be at least :min.',
|
||||
'file' => 'The :attribute must be at least :min kilobytes.',
|
||||
'string' => 'The :attribute must be at least :min characters.',
|
||||
'array' => 'The :attribute must have at least :min items.',
|
||||
],
|
||||
'not_in' => 'The selected :attribute is invalid.',
|
||||
'numeric' => 'The :attribute must be a number.',
|
||||
'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' => 'The :attribute must be :size.',
|
||||
'file' => 'The :attribute must be :size kilobytes.',
|
||||
'string' => 'The :attribute must be :size characters.',
|
||||
'array' => 'The :attribute must contain :size items.',
|
||||
],
|
||||
'string' => 'The :attribute must be a string.',
|
||||
'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.',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Custom Validation Attributes
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines are used to swap attribute place-holders
|
||||
| with something more reader friendly such as E-Mail Address instead
|
||||
| of "email". This simply helps us make messages a little cleaner.
|
||||
|
|
||||
*/
|
||||
|
||||
'attributes' => [],
|
||||
|
||||
// Internal validation logic for Panel
|
||||
'internal' => [
|
||||
'variable_value' => ':env variable',
|
||||
'invalid_password' => 'The password provided was invalid for this account.',
|
||||
],
|
||||
];
|
130
lang/ar/activity.php
Normal file
130
lang/ar/activity.php
Normal file
@ -0,0 +1,130 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Contains all of the translation strings for different activity log
|
||||
* events. These should be keyed by the value in front of the colon (:)
|
||||
* in the event name. If there is no colon present, they should live at
|
||||
* the top level.
|
||||
*/
|
||||
return [
|
||||
'auth' => [
|
||||
'fail' => 'فشل تسجيل الدخول',
|
||||
'success' => 'تم تسجيل الدخول',
|
||||
'password-reset' => 'تم إعادة تعيين كلمة المرور',
|
||||
'reset-password' => 'طلب إعادة تعيين كلمة المرور',
|
||||
'checkpoint' => 'طلب التحقق ذو العاملين',
|
||||
'recovery-token' => 'استخدم رمز الاسترداد ذو العاملين',
|
||||
'token' => 'تم حل تحدي ذو العاملين',
|
||||
'ip-blocked' => 'تم حظر الطلب من عنوان IP غير مدرج لـ :identifier',
|
||||
'sftp' => [
|
||||
'fail' => 'فشل تسجيل الدخول عبر SFTP',
|
||||
],
|
||||
],
|
||||
'user' => [
|
||||
'account' => [
|
||||
'email-changed' => 'تغيير البريد الإلكتروني من :old إلى :new',
|
||||
'password-changed' => 'تم تغيير كلمة المرور',
|
||||
],
|
||||
'api-key' => [
|
||||
'create' => 'تم إنشاء مفتاح API جديد :identifier',
|
||||
'delete' => 'تم حذف مفتاح API :identifier',
|
||||
],
|
||||
'ssh-key' => [
|
||||
'create' => 'تم إضافة مفتاح SSH :fingerprint إلى الحساب',
|
||||
'delete' => 'تم إزالة مفتاح SSH :fingerprint من الحساب',
|
||||
],
|
||||
'two-factor' => [
|
||||
'create' => 'تم تفعيل التحقق ذو العاملين',
|
||||
'delete' => 'تم تعطيل التحقق ذو العاملين',
|
||||
],
|
||||
],
|
||||
'server' => [
|
||||
'reinstall' => 'تم إعادة تثبيت الخادم',
|
||||
'console' => [
|
||||
'command' => 'تنفيذ الأمر ":command" على الخادم',
|
||||
],
|
||||
'power' => [
|
||||
'start' => 'تم تشغيل الخادم',
|
||||
'stop' => 'تم إيقاف الخادم',
|
||||
'restart' => 'تم إعادة تشغيل الخادم',
|
||||
'kill' => 'تم إنهاء عملية الخادم',
|
||||
],
|
||||
'backup' => [
|
||||
'download' => 'تم تنزيل النسخة الاحتياطية :name',
|
||||
'delete' => 'تم حذف النسخة الاحتياطية :name',
|
||||
'restore' => 'تم استعادة النسخة الاحتياطية :name (تم حذف الملفات: :truncate)',
|
||||
'restore-complete' => 'تم إكمال استعادة النسخة الاحتياطية :name',
|
||||
'restore-failed' => 'فشل في إكمال استعادة النسخة الاحتياطية :name',
|
||||
'start' => 'تم بدء نسخة احتياطية جديدة :name',
|
||||
'complete' => 'تم وضع علامة على النسخة الاحتياطية :name كمكتملة',
|
||||
'fail' => 'تم وضع علامة على النسخة الاحتياطية :name كفاشلة',
|
||||
'lock' => 'تم قفل النسخة الاحتياطية :name',
|
||||
'unlock' => 'تم فتح قفل النسخة الاحتياطية :name',
|
||||
],
|
||||
'database' => [
|
||||
'create' => 'تم إنشاء قاعدة بيانات جديدة :name',
|
||||
'rotate-password' => 'تم تغيير كلمة المرور لقاعدة البيانات :name',
|
||||
'delete' => 'تم حذف قاعدة البيانات :name',
|
||||
],
|
||||
'file' => [
|
||||
'compress_one' => 'تم ضغط :directory:file',
|
||||
'compress_other' => 'تم ضغط :count ملف في :directory',
|
||||
'read' => 'تم عرض محتويات :file',
|
||||
'copy' => 'تم إنشاء نسخة من :file',
|
||||
'create-directory' => 'تم إنشاء الدليل :directory:name',
|
||||
'decompress' => 'تم فك ضغط :files في :directory',
|
||||
'delete_one' => 'تم حذف :directory:files.0',
|
||||
'delete_other' => 'تم حذف :count ملف في :directory',
|
||||
'download' => 'تم تنزيل :file',
|
||||
'pull' => 'تم تنزيل ملف من بعد من :url إلى :directory',
|
||||
'rename_one' => 'تم تغيير اسم :directory:files.0.from إلى :directory:files.0.to',
|
||||
'rename_other' => 'تم تغيير اسم :count ملف في :directory',
|
||||
'write' => 'تم كتابة محتوى جديد في :file',
|
||||
'upload' => 'بدء تحميل ملف',
|
||||
'uploaded' => 'تم رفع :directory:file',
|
||||
],
|
||||
'sftp' => [
|
||||
'denied' => 'تم حظر الوصول عبر SFTP بسبب الأذونات',
|
||||
'create_one' => 'تم إنشاء :files.0',
|
||||
'create_other' => 'تم إنشاء :count ملف جديد',
|
||||
'write_one' => 'تم تعديل محتويات :files.0',
|
||||
'write_other' => 'تم تعديل محتويات :count ملف',
|
||||
'delete_one' => 'تم حذف :files.0',
|
||||
'delete_other' => 'تم حذف :count ملف',
|
||||
'create-directory_one' => 'تم إنشاء دليل :files.0',
|
||||
'create-directory_other' => 'تم إنشاء :count مجلد',
|
||||
'rename_one' => 'تم تغيير اسم :files.0.from إلى :files.0.to',
|
||||
'rename_other' => 'تم تغيير اسم أو نقل :count ملف',
|
||||
],
|
||||
'allocation' => [
|
||||
'create' => 'تم إضافة :allocation إلى الخادم',
|
||||
'notes' => 'تم تحديث الملاحظات لـ :allocation من ":old" إلى ":new"',
|
||||
'primary' => 'تم تعيين :allocation كتخصيص أساسي للخادم',
|
||||
'delete' => 'تم حذف التخصيص :allocation',
|
||||
],
|
||||
'schedule' => [
|
||||
'create' => 'تم إنشاء جدول :name',
|
||||
'update' => 'تم تحديث جدول :name',
|
||||
'execute' => 'تم تنفيذ جدول :name يدويًا',
|
||||
'delete' => 'تم حذف جدول :name',
|
||||
],
|
||||
'task' => [
|
||||
'create' => 'تم إنشاء مهمة ":action" جديدة لجدول :name',
|
||||
'update' => 'تم تحديث مهمة ":action" لجدول :name',
|
||||
'delete' => 'تم حذف مهمة لجدول :name',
|
||||
],
|
||||
'settings' => [
|
||||
'rename' => 'تم تغيير اسم الخادم من :old إلى :new',
|
||||
'description' => 'تم تغيير وصف الخادم من :old إلى :new',
|
||||
],
|
||||
'startup' => [
|
||||
'edit' => 'تم تغيير متغير :variable من ":old" إلى ":new"',
|
||||
'image' => 'تم تحديث صورة Docker للخادم من :old إلى :new',
|
||||
],
|
||||
'subuser' => [
|
||||
'create' => 'تم إضافة :email كمستخدم فرعي',
|
||||
'update' => 'تم تحديث أذونات المستخدم الفرعي لـ :email',
|
||||
'delete' => 'تم إزالة :email كمستخدم فرعي',
|
||||
],
|
||||
],
|
||||
];
|
19
lang/ar/admin/eggs.php
Normal file
19
lang/ar/admin/eggs.php
Normal file
@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'notices' => [
|
||||
'imported' => 'تم استيراد هذا البيض والمتغيرات المرتبطة به بنجاح.',
|
||||
'updated_via_import' => 'تم تحديث هذا البيض باستخدام الملف المقدم.',
|
||||
'deleted' => 'تم حذف البيض المطلوب بنجاح من اللوحة.',
|
||||
'updated' => 'تم تحديث تكوين البيض بنجاح.',
|
||||
'script_updated' => 'تم تحديث سكريبت تثبيت البيض وسيتم تشغيله كلما تم تثبيت خوادم.',
|
||||
'egg_created' => 'تم وضع بيضة جديدة بنجاح. ستحتاج إلى إعادة تشغيل أي دايمونات جارية لتطبيق هذا البيض الجديد.',
|
||||
],
|
||||
'variables' => [
|
||||
'notices' => [
|
||||
'variable_deleted' => 'تم حذف المتغير ":variable" ولن يكون متاحًا بعد الآن للخوادم بمجرد إعادة بنائها.',
|
||||
'variable_updated' => 'تم تحديث المتغير ":variable". ستحتاج إلى إعادة بناء أي خوادم تستخدم هذا المتغير لتطبيق التغييرات.',
|
||||
'variable_created' => 'تم إنشاء متغير جديد بنجاح وتعيينه لهذا البيض.',
|
||||
],
|
||||
],
|
||||
];
|
15
lang/ar/admin/node.php
Normal file
15
lang/ar/admin/node.php
Normal file
@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'validation' => [
|
||||
'fqdn_not_resolvable' => 'النطاق (FQDN) أو عنوان IP المقدم لا يُحل إلى عنوان IP صالح.',
|
||||
'fqdn_required_for_ssl' => 'يتطلب اسم نطاق كامل يُحل إلى عنوان IP عام لاستخدام SSL لهذه العقدة.',
|
||||
],
|
||||
'notices' => [
|
||||
'allocations_added' => 'تم إضافة التخصيصات بنجاح إلى هذه العقدة.',
|
||||
'node_deleted' => 'تم إزالة العقدة بنجاح من اللوحة.',
|
||||
'node_created' => 'تم إنشاء عقدة جديدة بنجاح. يمكنك تكوين الدايمون تلقائيًا على هذه الآلة بزيارة علامة التبويب "التكوين". <strong>قبل أن تتمكن من إضافة أي خوادم يجب عليك أولاً تخصيص عنوان IP واحد على الأقل ومنفذ.</strong>',
|
||||
'node_updated' => 'تم تحديث معلومات العقدة. إذا تم تغيير أي إعدادات دايمون ستحتاج إلى إعادة تشغيله لكي تصبح هذه التغييرات فعالة.',
|
||||
'unallocated_deleted' => 'تم حذف جميع المنافذ غير المخصصة لـ <code>:ip</code>.',
|
||||
],
|
||||
];
|
27
lang/ar/admin/server.php
Normal file
27
lang/ar/admin/server.php
Normal file
@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'exceptions' => [
|
||||
'no_new_default_allocation' => 'أنت تحاول حذف التخصيص الافتراضي لهذا الخادم ولكن لا يوجد تخصيص بديل لاستخدامه.',
|
||||
'marked_as_failed' => 'تم تعليم هذا الخادم على أنه فشل في تثبيت سابق. لا يمكن تغيير الحالة الحالية في هذه الحالة.',
|
||||
'bad_variable' => 'كان هناك خطأ في التحقق من المتغير :name.',
|
||||
'daemon_exception' => 'حدث استثناء أثناء محاولة التواصل مع الدايمون مما أدى إلى رمز استجابة HTTP/:code. تم تسجيل هذا الاستثناء. (معرف الطلب: :request_id)',
|
||||
'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' => 'يجب أن يكون لديك عقدة واحدة على الأقل مكونة قبل أن تتمكن من إضافة خادم إلى هذه اللوحة.',
|
||||
'transfer_nodes_required' => 'يجب أن يكون لديك عقدتين على الأقل مكونتين قبل أن تتمكن من نقل الخوادم.',
|
||||
'transfer_started' => 'تم بدء نقل الخادم.',
|
||||
'transfer_not_viable' => 'العقدة التي اخترتها لا تملك مساحة القرص أو الذاكرة المطلوبة لاستيعاب هذا الخادم.',
|
||||
],
|
||||
];
|
12
lang/ar/admin/user.php
Normal file
12
lang/ar/admin/user.php
Normal file
@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'exceptions' => [
|
||||
'user_has_servers' => 'لا يمكن حذف مستخدم لديه خوادم نشطة مرتبطة بحسابه. يرجى حذف خوادمهم قبل المتابعة.',
|
||||
'user_is_self' => 'لا يمكنك حذف حساب المستخدم الخاص بك.',
|
||||
],
|
||||
'notices' => [
|
||||
'account_created' => 'تم إنشاء الحساب بنجاح.',
|
||||
'account_updated' => 'تم تحديث الحساب بنجاح.',
|
||||
],
|
||||
];
|
27
lang/ar/auth.php
Normal file
27
lang/ar/auth.php
Normal file
@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'sign_in' => 'تسجيل الدخول',
|
||||
'go_to_login' => 'الذهاب إلى صفحة الدخول',
|
||||
'failed' => 'لم يتم العثور على حساب يتطابق مع هذه البيانات.',
|
||||
|
||||
'forgot_password' => [
|
||||
'label' => 'نسيت كلمة المرور؟',
|
||||
'label_help' => 'أدخل عنوان بريدك الإلكتروني لتتلقى تعليمات حول إعادة تعيين كلمة المرور.',
|
||||
'button' => 'استعادة الحساب',
|
||||
],
|
||||
|
||||
'reset_password' => [
|
||||
'button' => 'إعادة تعيين وتسجيل الدخول',
|
||||
],
|
||||
|
||||
'two_factor' => [
|
||||
'label' => 'رمز التحقق ذو العاملين',
|
||||
'label_help' => 'هذا الحساب يتطلب طبقة ثانية من التحقق للمتابعة. الرجاء إدخال الرمز المولد على جهازك لإكمال هذا التسجيل.',
|
||||
'checkpoint_failed' => 'رمز التحقق ذو العاملين كان غير صالح.',
|
||||
],
|
||||
|
||||
'throttle' => 'عدد محاولات تسجيل الدخول كثيرة جداً. يرجى المحاولة مجدداً بعد :seconds ثوانٍ.',
|
||||
'password_requirements' => 'يجب أن تكون كلمة المرور بطول 8 أحرف على الأقل وأن تكون فريدة لهذا الموقع.',
|
||||
'2fa_must_be_enabled' => 'يتطلب المدير تفعيل التحقق ذو العاملين لحسابك لاستخدام اللوحة.',
|
||||
];
|
59
lang/ar/command/messages.php
Normal file
59
lang/ar/command/messages.php
Normal file
@ -0,0 +1,59 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'user' => [
|
||||
'search_users' => 'أدخل اسم المستخدم، معرّف المستخدم، أو عنوان البريد الإلكتروني',
|
||||
'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_password' => 'كلمة المرور',
|
||||
'ask_password_tip' => 'إذا كنت ترغب في إنشاء حساب بكلمة مرور عشوائية يتم إرسالها بالبريد الإلكتروني للمستخدم، أعد تشغيل هذا الأمر (CTRL+C) ومرر علامة `--no-password`.',
|
||||
'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',
|
||||
'reinstall' => [
|
||||
'failed' => 'فشل طلب إعادة تثبيت ":name" (#:id) على العقدة ":node" مع الخطأ: :message',
|
||||
'confirm' => 'أنت على وشك إعادة تثبيت مجموعة من الخوادم. هل ترغب في المتابعة؟',
|
||||
],
|
||||
'power' => [
|
||||
'confirm' => 'أنت على وشك تنفيذ :action ضد :count خوادم. هل ترغب في المتابعة؟',
|
||||
'action_failed' => 'فشل طلب تنفيذ الطاقة لـ ":name" (#:id) على العقدة ":node" مع الخطأ: :message',
|
||||
],
|
||||
],
|
||||
'environment' => [
|
||||
'mail' => [
|
||||
'ask_smtp_host' => 'مضيف SMTP (مثل smtp.gmail.com)',
|
||||
'ask_smtp_port' => 'منفذ SMTP',
|
||||
'ask_smtp_username' => 'اسم مستخدم SMTP',
|
||||
'ask_smtp_password' => 'كلمة مرور SMTP',
|
||||
'ask_mailgun_domain' => 'نطاق Mailgun',
|
||||
'ask_mailgun_endpoint' => 'نقطة نهاية Mailgun',
|
||||
'ask_mailgun_secret' => 'سر Mailgun',
|
||||
'ask_mandrill_secret' => 'سر Mandrill',
|
||||
'ask_postmark_username' => 'مفتاح API Postmark',
|
||||
'ask_driver' => 'أي برنامج يجب استخدامه لإرسال الرسائل البريدية؟',
|
||||
'ask_mail_from' => 'عنوان البريد الإلكتروني الذي يجب أن تنشأ منه الرسائل',
|
||||
'ask_mail_name' => 'الاسم الذي يجب أن تظهر منه الرسائل',
|
||||
'ask_encryption' => 'طريقة التشفير المستخدمة',
|
||||
],
|
||||
],
|
||||
];
|
28
lang/ar/dashboard/account.php
Normal file
28
lang/ar/dashboard/account.php
Normal file
@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'email' => [
|
||||
'title' => 'تحديث بريدك الإلكتروني',
|
||||
'updated' => 'تم تحديث عنوان بريدك الإلكتروني.',
|
||||
],
|
||||
'password' => [
|
||||
'title' => 'تغيير كلمة مرورك',
|
||||
'requirements' => 'يجب أن تكون كلمة المرور الجديدة مكونة من 8 أحرف على الأقل.',
|
||||
'updated' => 'تم تحديث كلمة المرور الخاصة بك.',
|
||||
],
|
||||
'two_factor' => [
|
||||
'button' => 'إعداد التوثيق الثنائي',
|
||||
'disabled' => 'تم تعطيل التوثيق الثنائي في حسابك. لن يُطلب منك تقديم رمز عند تسجيل الدخول.',
|
||||
'enabled' => 'تم تفعيل التوثيق الثنائي في حسابك! من الآن فصاعدًا، عند تسجيل الدخول، سيُطلب منك تقديم الرمز الذي يُنتجه جهازك.',
|
||||
'invalid' => 'الرمز المقدم غير صالح.',
|
||||
'setup' => [
|
||||
'title' => 'إعداد التوثيق الثنائي',
|
||||
'help' => 'لا يمكن مسح الرمز؟ أدخل الرمز أدناه في تطبيقك:',
|
||||
'field' => 'أدخل الرمز',
|
||||
],
|
||||
'disable' => [
|
||||
'title' => 'تعطيل التوثيق الثنائي',
|
||||
'field' => 'أدخل الرمز',
|
||||
],
|
||||
],
|
||||
];
|
8
lang/ar/dashboard/index.php
Normal file
8
lang/ar/dashboard/index.php
Normal file
@ -0,0 +1,8 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'search' => 'ابحث عن الخوادم...',
|
||||
'no_matches' => 'لم يتم العثور على خوادم تطابق معايير البحث المقدمة.',
|
||||
'cpu_title' => 'المعالج',
|
||||
'memory_title' => 'الذاكرة',
|
||||
];
|
55
lang/ar/exceptions.php
Normal file
55
lang/ar/exceptions.php
Normal file
@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'daemon_connection_failed' => 'حدث استثناء أثناء محاولة التواصل مع الدايمون مما أدى إلى رمز استجابة HTTP/:code. تم تسجيل هذا الاستثناء.',
|
||||
'node' => [
|
||||
'servers_attached' => 'يجب ألا يكون هناك أي خوادم مرتبطة بالعقدة لكي يتم حذفها.',
|
||||
'daemon_off_config_updated' => 'تم تحديث تكوين الدايمون <strong>لكن</strong>، واجهت مشكلة أثناء محاولة تحديث ملف التكوين تلقائيًا على الدايمون. ستحتاج إلى تحديث ملف التكوين (config.yml) يدويًا لتطبيق هذه التغييرات.',
|
||||
],
|
||||
'allocations' => [
|
||||
'server_using' => 'تم تعيين خادم حاليًا لهذا التخصيص. لا يمكن حذف التخصيص إلا إذا لم يكن هناك خادم معين حاليًا.',
|
||||
'too_many_ports' => 'لا يتم دعم إضافة أكثر من 1000 منفذ في نطاق واحد دفعة واحدة.',
|
||||
'invalid_mapping' => 'التعيين المقدم للمنفذ :port كان غير صالح ولا يمكن معالجته.',
|
||||
'cidr_out_of_range' => 'تسمح ترميزات CIDR فقط بالأقنعة بين /25 و /32.',
|
||||
'port_out_of_range' => 'يجب أن تكون المنافذ في التخصيص أكبر من 1024 وأقل من أو يساوي 65535.',
|
||||
],
|
||||
'egg' => [
|
||||
'delete_has_servers' => 'لا يمكن حذف بيضة تحتوي على خوادم نشطة مرتبطة بها من اللوحة.',
|
||||
'invalid_copy_id' => 'البيضة المختارة لنسخ سكربت منها إما أنها غير موجودة، أو أنها تقوم بنسخ سكربت نفسها.',
|
||||
'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 المقدم ليس بتنسيق يمكن التعرف عليه.',
|
||||
],
|
||||
'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</a>. :error',
|
||||
],
|
||||
'deployment' => [
|
||||
'no_viable_nodes' => 'لم يتم العثور على عقد تلبي المتطلبات المحددة للنشر التلقائي.',
|
||||
'no_viable_allocations' => 'لم يتم العثور على تخصيصات تلبي المتطلبات للنشر التلقائي.',
|
||||
],
|
||||
'api' => [
|
||||
'resource_not_found' => 'المورد المطلوب غير موجود على هذا الخادم.',
|
||||
],
|
||||
];
|
17
lang/ar/pagination.php
Normal file
17
lang/ar/pagination.php
Normal 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' => '« السابق',
|
||||
'next' => 'التالي »',
|
||||
];
|
19
lang/ar/passwords.php
Normal file
19
lang/ar/passwords.php
Normal 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' => 'لا يمكننا العثور على مستخدم بهذا العنوان البريدي الإلكتروني.',
|
||||
];
|
33
lang/ar/server/users.php
Normal file
33
lang/ar/server/users.php
Normal file
@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'permissions' => [
|
||||
'websocket_*' => 'يتيح الوصول إلى الويب سوكيت لهذا الخادم.',
|
||||
'control_console' => 'يسمح للمستخدم بإرسال بيانات إلى وحدة تحكم الخادم.',
|
||||
'control_start' => 'يسمح للمستخدم بتشغيل نموذج الخادم.',
|
||||
'control_stop' => 'يسمح للمستخدم بإيقاف نموذج الخادم.',
|
||||
'control_restart' => 'يسمح للمستخدم بإعادة تشغيل نموذج الخادم.',
|
||||
'control_kill' => 'يسمح للمستخدم بإنهاء نموذج الخادم.',
|
||||
'user_create' => 'يسمح للمستخدم بإنشاء حسابات مستخدمين جديدة للخادم.',
|
||||
'user_read' => 'يمنح المستخدم إذنًا لعرض المستخدمين المرتبطين بهذا الخادم.',
|
||||
'user_update' => 'يسمح للمستخدم بتعديل المستخدمين الآخرين المرتبطين بهذا الخادم.',
|
||||
'user_delete' => 'يسمح للمستخدم بحذف المستخدمين الآخرين المرتبطين بهذا الخادم.',
|
||||
'file_create' => 'يمنح المستخدم إذنًا بإنشاء ملفات ودلائل جديدة.',
|
||||
'file_read' => 'يسمح للمستخدم برؤية الملفات والمجلدات المرتبطة بهذا نموذج الخادم، بالإضافة إلى عرض محتوياتها.',
|
||||
'file_update' => 'يسمح للمستخدم بتحديث الملفات والمجلدات المرتبطة بالخادم.',
|
||||
'file_delete' => 'يسمح للمستخدم بحذف الملفات والدلائل.',
|
||||
'file_archive' => 'يسمح للمستخدم بإنشاء أرشيفات الملفات وفك ضغط الأرشيفات الموجودة.',
|
||||
'file_sftp' => 'يسمح للمستخدم بتنفيذ الإجراءات المذكورة أعلاه للملفات باستخدام عميل SFTP.',
|
||||
'allocation_read' => 'يتيح الوصول إلى صفحات إدارة تخصيص الخادم.',
|
||||
'allocation_update' => 'يمنح المستخدم إذنًا بإجراء تعديلات على تخصيصات الخادم.',
|
||||
'database_create' => 'يمنح المستخدم إذنًا لإنشاء قاعدة بيانات جديدة للخادم.',
|
||||
'database_read' => 'يمنح المستخدم إذنًا لعرض قواعد البيانات الخاصة بالخادم.',
|
||||
'database_update' => 'يمنح المستخدم إذنًا لإجراء تعديلات على قاعدة بيانات. إذا لم يمتلك المستخدم إذن "عرض كلمة المرور" أيضًا، فلن يتمكن من تعديل كلمة المرور.',
|
||||
'database_delete' => 'يمنح المستخدم إذنًا بحذف نموذج قاعدة البيانات.',
|
||||
'database_view_password' => 'يمنح المستخدم إذنًا لعرض كلمة مرور قاعدة البيانات في النظام.',
|
||||
'schedule_create' => 'يسمح للمستخدم بإنشاء جدول زمني جديد للخادم.',
|
||||
'schedule_read' => 'يمنح المستخدم إذنًا لعرض جداول الخادم.',
|
||||
'schedule_update' => 'يمنح المستخدم إذنًا لإجراء تعديلات على جدول الخادم الحالي.',
|
||||
'schedule_delete' => 'يسمح للمستخدم بحذف جدول الخادم.',
|
||||
],
|
||||
];
|
95
lang/ar/strings.php
Normal file
95
lang/ar/strings.php
Normal file
@ -0,0 +1,95 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'email' => 'البريد الإلكتروني',
|
||||
'email_address' => 'عنوان البريد الإلكتروني',
|
||||
'user_identifier' => 'اسم المستخدم أو البريد الإلكتروني',
|
||||
'password' => 'كلمة المرور',
|
||||
'new_password' => 'كلمة المرور الجديدة',
|
||||
'confirm_password' => 'تأكيد كلمة المرور الجديدة',
|
||||
'login' => 'تسجيل الدخول',
|
||||
'home' => 'الرئيسية',
|
||||
'servers' => 'الخوادم',
|
||||
'id' => 'الهوية',
|
||||
'name' => 'الاسم',
|
||||
'node' => 'العقدة',
|
||||
'connection' => 'الاتصال',
|
||||
'memory' => 'الذاكرة',
|
||||
'cpu' => 'المعالج',
|
||||
'disk' => 'القرص',
|
||||
'status' => 'الحالة',
|
||||
'search' => 'بحث',
|
||||
'suspended' => 'معلق',
|
||||
'account' => 'الحساب',
|
||||
'security' => 'الأمان',
|
||||
'ip' => 'عنوان IP',
|
||||
'last_activity' => 'آخر نشاط',
|
||||
'revoke' => 'سحب',
|
||||
'2fa_token' => 'رمز التوثيق',
|
||||
'submit' => 'إرسال',
|
||||
'close' => 'إغلاق',
|
||||
'settings' => 'الإعدادات',
|
||||
'configuration' => 'التكوين',
|
||||
'sftp' => 'اتصال FTP محمى',
|
||||
'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' => 'المصادقة الثنائية',
|
||||
'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' => 'آخر استخدام',
|
||||
'enable' => 'تمكين',
|
||||
'disable' => 'تعطيل',
|
||||
'save' => 'حفظ',
|
||||
'copyright' => '® 2024 - بيليكان سنة',
|
||||
];
|
106
lang/ar/validation.php
Normal file
106
lang/ar/validation.php
Normal file
@ -0,0 +1,106 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Validation Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines contain the default error messages used by
|
||||
| the validator class. Some of these rules have multiple versions such
|
||||
| as the size rules. Feel free to tweak each of these messages here.
|
||||
|
|
||||
*/
|
||||
|
||||
'accepted' => 'يجب قبول :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 صحيحًا أو خاطئًا.',
|
||||
'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
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines are used to swap attribute place-holders
|
||||
| with something more reader friendly such as E-Mail Address instead
|
||||
| of "email". This simply helps us make messages a little cleaner.
|
||||
|
|
||||
*/
|
||||
|
||||
'attributes' => [],
|
||||
|
||||
// Internal validation logic for Panel
|
||||
'internal' => [
|
||||
'variable_value' => 'متغير :env',
|
||||
'invalid_password' => 'كلمة المرور التي تم تقديمها غير صالحة لهذا الحساب.',
|
||||
],
|
||||
];
|
130
lang/ca/activity.php
Normal file
130
lang/ca/activity.php
Normal file
@ -0,0 +1,130 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Contains all of the translation strings for different activity log
|
||||
* events. These should be keyed by the value in front of the colon (:)
|
||||
* in the event name. If there is no colon present, they should live at
|
||||
* the top level.
|
||||
*/
|
||||
return [
|
||||
'auth' => [
|
||||
'fail' => 'Failed log in',
|
||||
'success' => 'Logged in',
|
||||
'password-reset' => 'Password reset',
|
||||
'reset-password' => 'Requested password reset',
|
||||
'checkpoint' => 'Two-factor authentication requested',
|
||||
'recovery-token' => 'Used two-factor recovery token',
|
||||
'token' => 'Solved two-factor challenge',
|
||||
'ip-blocked' => 'Blocked request from unlisted IP address for :identifier',
|
||||
'sftp' => [
|
||||
'fail' => 'Failed SFTP log in',
|
||||
],
|
||||
],
|
||||
'user' => [
|
||||
'account' => [
|
||||
'email-changed' => 'Changed email from :old to :new',
|
||||
'password-changed' => 'Changed password',
|
||||
],
|
||||
'api-key' => [
|
||||
'create' => 'Created new API key :identifier',
|
||||
'delete' => 'Deleted API key :identifier',
|
||||
],
|
||||
'ssh-key' => [
|
||||
'create' => 'Added SSH key :fingerprint to account',
|
||||
'delete' => 'Removed SSH key :fingerprint from account',
|
||||
],
|
||||
'two-factor' => [
|
||||
'create' => 'Enabled two-factor auth',
|
||||
'delete' => 'Disabled two-factor auth',
|
||||
],
|
||||
],
|
||||
'server' => [
|
||||
'reinstall' => 'Reinstalled server',
|
||||
'console' => [
|
||||
'command' => 'Executed ":command" on the server',
|
||||
],
|
||||
'power' => [
|
||||
'start' => 'Started the server',
|
||||
'stop' => 'Stopped the server',
|
||||
'restart' => 'Restarted the server',
|
||||
'kill' => 'Killed the server process',
|
||||
],
|
||||
'backup' => [
|
||||
'download' => 'Downloaded the :name backup',
|
||||
'delete' => 'Deleted the :name backup',
|
||||
'restore' => 'Restored the :name backup (deleted files: :truncate)',
|
||||
'restore-complete' => 'Completed restoration of the :name backup',
|
||||
'restore-failed' => 'Failed to complete restoration of the :name backup',
|
||||
'start' => 'Started a new backup :name',
|
||||
'complete' => 'Marked the :name backup as complete',
|
||||
'fail' => 'Marked the :name backup as failed',
|
||||
'lock' => 'Locked the :name backup',
|
||||
'unlock' => 'Unlocked the :name backup',
|
||||
],
|
||||
'database' => [
|
||||
'create' => 'Created new database :name',
|
||||
'rotate-password' => 'Password rotated for database :name',
|
||||
'delete' => 'Deleted database :name',
|
||||
],
|
||||
'file' => [
|
||||
'compress_one' => 'Compressed :directory:file',
|
||||
'compress_other' => 'Compressed :count files in :directory',
|
||||
'read' => 'Viewed the contents of :file',
|
||||
'copy' => 'Created a copy of :file',
|
||||
'create-directory' => 'Created directory :directory:name',
|
||||
'decompress' => 'Decompressed :files in :directory',
|
||||
'delete_one' => 'Deleted :directory:files.0',
|
||||
'delete_other' => 'Deleted :count files in :directory',
|
||||
'download' => 'Downloaded :file',
|
||||
'pull' => 'Downloaded a remote file from :url to :directory',
|
||||
'rename_one' => 'Renamed :directory:files.0.from to :directory:files.0.to',
|
||||
'rename_other' => 'Renamed :count files in :directory',
|
||||
'write' => 'Wrote new content to :file',
|
||||
'upload' => 'Began a file upload',
|
||||
'uploaded' => 'Uploaded :directory:file',
|
||||
],
|
||||
'sftp' => [
|
||||
'denied' => 'Blocked SFTP access due to permissions',
|
||||
'create_one' => 'Created :files.0',
|
||||
'create_other' => 'Created :count new files',
|
||||
'write_one' => 'Modified the contents of :files.0',
|
||||
'write_other' => 'Modified the contents of :count files',
|
||||
'delete_one' => 'Deleted :files.0',
|
||||
'delete_other' => 'Deleted :count files',
|
||||
'create-directory_one' => 'Created the :files.0 directory',
|
||||
'create-directory_other' => 'Created :count directories',
|
||||
'rename_one' => 'Renamed :files.0.from to :files.0.to',
|
||||
'rename_other' => 'Renamed or moved :count files',
|
||||
],
|
||||
'allocation' => [
|
||||
'create' => 'Added :allocation to the server',
|
||||
'notes' => 'Updated the notes for :allocation from ":old" to ":new"',
|
||||
'primary' => 'Set :allocation as the primary server allocation',
|
||||
'delete' => 'Deleted the :allocation allocation',
|
||||
],
|
||||
'schedule' => [
|
||||
'create' => 'Created the :name schedule',
|
||||
'update' => 'Updated the :name schedule',
|
||||
'execute' => 'Manually executed the :name schedule',
|
||||
'delete' => 'Deleted the :name schedule',
|
||||
],
|
||||
'task' => [
|
||||
'create' => 'Created a new ":action" task for the :name schedule',
|
||||
'update' => 'Updated the ":action" task for the :name schedule',
|
||||
'delete' => 'Deleted a task for the :name schedule',
|
||||
],
|
||||
'settings' => [
|
||||
'rename' => 'Renamed the server from :old to :new',
|
||||
'description' => 'Changed the server description from :old to :new',
|
||||
],
|
||||
'startup' => [
|
||||
'edit' => 'Changed the :variable variable from ":old" to ":new"',
|
||||
'image' => 'Updated the Docker Image for the server from :old to :new',
|
||||
],
|
||||
'subuser' => [
|
||||
'create' => 'Added :email as a subuser',
|
||||
'update' => 'Updated the subuser permissions for :email',
|
||||
'delete' => 'Removed :email as a subuser',
|
||||
],
|
||||
],
|
||||
];
|
19
lang/ca/admin/eggs.php
Normal file
19
lang/ca/admin/eggs.php
Normal file
@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'notices' => [
|
||||
'imported' => 'S\'ha importat amb èxit aquest Egg i les seves variables associades.',
|
||||
'updated_via_import' => 'Aquest Egg s\'ha actualitzat utilitzant el fitxer proporcionat.',
|
||||
'deleted' => 'S\'ha eliminat amb èxit l\'egg sol·licitat del Panell.',
|
||||
'updated' => 'La configuració de l\'Egg s\'ha actualitzat correctament.',
|
||||
'script_updated' => 'El script d\'instal·lació de l\'Egg s\'ha actualitzat i s\'executarà sempre que s\'instal·lin els servidors.',
|
||||
'egg_created' => 'S\'ha posat amb èxit un nou egg. Necessitarà reiniciar qualsevol daemon en execució per aplicar aquest nou egg.',
|
||||
],
|
||||
'variables' => [
|
||||
'notices' => [
|
||||
'variable_deleted' => 'La variable ":variable" s\'ha eliminat i ja no estarà disponible per als servidors una vegada es reconstrueixin.',
|
||||
'variable_updated' => 'S\'ha actualitzat la variable ":variable". Hauràs de reconstruir qualsevol servidor que utilitzi aquesta variable per aplicar els canvis.',
|
||||
'variable_created' => 'S\'ha creat amb èxit una nova variable i s\'ha assignat a aquest egg.',
|
||||
],
|
||||
],
|
||||
];
|
15
lang/ca/admin/node.php
Normal file
15
lang/ca/admin/node.php
Normal file
@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'validation' => [
|
||||
'fqdn_not_resolvable' => 'The FQDN or IP address provided does not resolve to a valid IP address.',
|
||||
'fqdn_required_for_ssl' => 'A fully qualified domain name that resolves to a public IP address is required in order to use SSL for this node.',
|
||||
],
|
||||
'notices' => [
|
||||
'allocations_added' => 'Allocations have successfully been added to this node.',
|
||||
'node_deleted' => 'Node has been successfully removed from the panel.',
|
||||
'node_created' => 'Successfully created new node. You can automatically configure the daemon on this machine by visiting the \'Configuration\' tab. <strong>Before you can add any servers you must first allocate at least one IP address and port.</strong>',
|
||||
'node_updated' => 'Node information has been updated. If any daemon settings were changed you will need to reboot it for those changes to take effect.',
|
||||
'unallocated_deleted' => 'Deleted all un-allocated ports for <code>:ip</code>.',
|
||||
],
|
||||
];
|
27
lang/ca/admin/server.php
Normal file
27
lang/ca/admin/server.php
Normal file
@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'exceptions' => [
|
||||
'no_new_default_allocation' => 'You are attempting to delete the default allocation for this server but there is no fallback allocation to use.',
|
||||
'marked_as_failed' => 'This server was marked as having failed a previous installation. Current status cannot be toggled in this state.',
|
||||
'bad_variable' => 'There was a validation error with the :name variable.',
|
||||
'daemon_exception' => 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged. (request id: :request_id)',
|
||||
'default_allocation_not_found' => 'The requested default allocation was not found in this server\'s allocations.',
|
||||
],
|
||||
'alerts' => [
|
||||
'startup_changed' => 'The startup configuration for this server has been updated. If this server\'s egg was changed a reinstall will be occurring now.',
|
||||
'server_deleted' => 'Server has successfully been deleted from the system.',
|
||||
'server_created' => 'Server was successfully created on the panel. Please allow the daemon a few minutes to completely install this server.',
|
||||
'build_updated' => 'The build details for this server have been updated. Some changes may require a restart to take effect.',
|
||||
'suspension_toggled' => 'Server suspension status has been changed to :status.',
|
||||
'rebuild_on_boot' => 'This server has been marked as requiring a Docker Container rebuild. This will happen the next time the server is started.',
|
||||
'install_toggled' => 'The installation status for this server has been toggled.',
|
||||
'server_reinstalled' => 'This server has been queued for a reinstallation beginning now.',
|
||||
'details_updated' => 'Server details have been successfully updated.',
|
||||
'docker_image_updated' => 'Successfully changed the default Docker image to use for this server. A reboot is required to apply this change.',
|
||||
'node_required' => 'You must have at least one node configured before you can add a server to this panel.',
|
||||
'transfer_nodes_required' => 'You must have at least two nodes configured before you can transfer servers.',
|
||||
'transfer_started' => 'Server transfer has been started.',
|
||||
'transfer_not_viable' => 'The node you selected does not have the required disk space or memory available to accommodate this server.',
|
||||
],
|
||||
];
|
12
lang/ca/admin/user.php
Normal file
12
lang/ca/admin/user.php
Normal file
@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'exceptions' => [
|
||||
'user_has_servers' => 'Cannot delete a user with active servers attached to their account. Please delete their servers before continuing.',
|
||||
'user_is_self' => 'Cannot delete your own user account.',
|
||||
],
|
||||
'notices' => [
|
||||
'account_created' => 'Account has been created successfully.',
|
||||
'account_updated' => 'Account has been successfully updated.',
|
||||
],
|
||||
];
|
27
lang/ca/auth.php
Normal file
27
lang/ca/auth.php
Normal file
@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'sign_in' => 'Sign In',
|
||||
'go_to_login' => 'Go to Login',
|
||||
'failed' => 'No account matching those credentials could be found.',
|
||||
|
||||
'forgot_password' => [
|
||||
'label' => 'Forgot Password?',
|
||||
'label_help' => 'Enter your account email address to receive instructions on resetting your password.',
|
||||
'button' => 'Recover Account',
|
||||
],
|
||||
|
||||
'reset_password' => [
|
||||
'button' => 'Reset and Sign In',
|
||||
],
|
||||
|
||||
'two_factor' => [
|
||||
'label' => '2-Factor Token',
|
||||
'label_help' => 'This account requires a second layer of authentication in order to continue. Please enter the code generated by your device to complete this login.',
|
||||
'checkpoint_failed' => 'The two-factor authentication token was invalid.',
|
||||
],
|
||||
|
||||
'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',
|
||||
'password_requirements' => 'Password must be at least 8 characters in length and should be unique to this site.',
|
||||
'2fa_must_be_enabled' => 'The administrator has required that 2-Factor Authentication be enabled for your account in order to use the Panel.',
|
||||
];
|
59
lang/ca/command/messages.php
Normal file
59
lang/ca/command/messages.php
Normal file
@ -0,0 +1,59 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'user' => [
|
||||
'search_users' => 'Enter a Username, User ID, or Email Address',
|
||||
'select_search_user' => 'ID of user to delete (Enter \'0\' to re-search)',
|
||||
'deleted' => 'User successfully deleted from the Panel.',
|
||||
'confirm_delete' => 'Are you sure you want to delete this user from the Panel?',
|
||||
'no_users_found' => 'No users were found for the search term provided.',
|
||||
'multiple_found' => 'Multiple accounts were found for the user provided, unable to delete a user because of the --no-interaction flag.',
|
||||
'ask_admin' => 'Is this user an administrator?',
|
||||
'ask_email' => 'Email Address',
|
||||
'ask_username' => 'Username',
|
||||
'ask_name_first' => 'First Name',
|
||||
'ask_name_last' => 'Last Name',
|
||||
'ask_password' => 'Password',
|
||||
'ask_password_tip' => 'If you would like to create an account with a random password emailed to the user, re-run this command (CTRL+C) and pass the `--no-password` flag.',
|
||||
'ask_password_help' => 'Passwords must be at least 8 characters in length and contain at least one capital letter and number.',
|
||||
'2fa_help_text' => [
|
||||
'This command will disable 2-factor authentication for a user\'s account if it is enabled. This should only be used as an account recovery command if the user is locked out of their account.',
|
||||
'If this is not what you wanted to do, press CTRL+C to exit this process.',
|
||||
],
|
||||
'2fa_disabled' => '2-Factor authentication has been disabled for :email.',
|
||||
],
|
||||
'schedule' => [
|
||||
'output_line' => 'Dispatching job for first task in `:schedule` (:hash).',
|
||||
],
|
||||
'maintenance' => [
|
||||
'deleting_service_backup' => 'Deleting service backup file :file.',
|
||||
],
|
||||
'server' => [
|
||||
'rebuild_failed' => 'Rebuild request for ":name" (#:id) on node ":node" failed with error: :message',
|
||||
'reinstall' => [
|
||||
'failed' => 'Reinstall request for ":name" (#:id) on node ":node" failed with error: :message',
|
||||
'confirm' => 'You are about to reinstall against a group of servers. Do you wish to continue?',
|
||||
],
|
||||
'power' => [
|
||||
'confirm' => 'You are about to perform a :action against :count servers. Do you wish to continue?',
|
||||
'action_failed' => 'Power action request for ":name" (#:id) on node ":node" failed with error: :message',
|
||||
],
|
||||
],
|
||||
'environment' => [
|
||||
'mail' => [
|
||||
'ask_smtp_host' => 'SMTP Host (e.g. smtp.gmail.com)',
|
||||
'ask_smtp_port' => 'SMTP Port',
|
||||
'ask_smtp_username' => 'SMTP Username',
|
||||
'ask_smtp_password' => 'SMTP Password',
|
||||
'ask_mailgun_domain' => 'Mailgun Domain',
|
||||
'ask_mailgun_endpoint' => 'Mailgun Endpoint',
|
||||
'ask_mailgun_secret' => 'Mailgun Secret',
|
||||
'ask_mandrill_secret' => 'Mandrill Secret',
|
||||
'ask_postmark_username' => 'Postmark API Key',
|
||||
'ask_driver' => 'Which driver should be used for sending emails?',
|
||||
'ask_mail_from' => 'Email address emails should originate from',
|
||||
'ask_mail_name' => 'Name that emails should appear from',
|
||||
'ask_encryption' => 'Encryption method to use',
|
||||
],
|
||||
],
|
||||
];
|
28
lang/ca/dashboard/account.php
Normal file
28
lang/ca/dashboard/account.php
Normal file
@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'email' => [
|
||||
'title' => 'Update your email',
|
||||
'updated' => 'Your email address has been updated.',
|
||||
],
|
||||
'password' => [
|
||||
'title' => 'Change your password',
|
||||
'requirements' => 'Your new password should be at least 8 characters in length.',
|
||||
'updated' => 'Your password has been updated.',
|
||||
],
|
||||
'two_factor' => [
|
||||
'button' => 'Configure 2-Factor Authentication',
|
||||
'disabled' => 'Two-factor authentication has been disabled on your account. You will no longer be prompted to provide a token when logging in.',
|
||||
'enabled' => 'Two-factor authentication has been enabled on your account! From now on, when logging in, you will be required to provide the code generated by your device.',
|
||||
'invalid' => 'The token provided was invalid.',
|
||||
'setup' => [
|
||||
'title' => 'Setup two-factor authentication',
|
||||
'help' => 'Can\'t scan the code? Enter the code below into your application:',
|
||||
'field' => 'Enter token',
|
||||
],
|
||||
'disable' => [
|
||||
'title' => 'Disable two-factor authentication',
|
||||
'field' => 'Enter token',
|
||||
],
|
||||
],
|
||||
];
|
8
lang/ca/dashboard/index.php
Normal file
8
lang/ca/dashboard/index.php
Normal file
@ -0,0 +1,8 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'search' => 'Search for servers...',
|
||||
'no_matches' => 'There were no servers found matching the search criteria provided.',
|
||||
'cpu_title' => 'CPU',
|
||||
'memory_title' => 'Memory',
|
||||
];
|
55
lang/ca/exceptions.php
Normal file
55
lang/ca/exceptions.php
Normal file
@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'daemon_connection_failed' => 'There was an exception while attempting to communicate with the daemon resulting in a HTTP/:code response code. This exception has been logged.',
|
||||
'node' => [
|
||||
'servers_attached' => 'A node must have no servers linked to it in order to be deleted.',
|
||||
'daemon_off_config_updated' => 'The daemon configuration <strong>has been updated</strong>, however there was an error encountered while attempting to automatically update the configuration file on the Daemon. You will need to manually update the configuration file (config.yml) for the daemon to apply these changes.',
|
||||
],
|
||||
'allocations' => [
|
||||
'server_using' => 'A server is currently assigned to this allocation. An allocation can only be deleted if no server is currently assigned.',
|
||||
'too_many_ports' => 'Adding more than 1000 ports in a single range at once is not supported.',
|
||||
'invalid_mapping' => 'The mapping provided for :port was invalid and could not be processed.',
|
||||
'cidr_out_of_range' => 'CIDR notation only allows masks between /25 and /32.',
|
||||
'port_out_of_range' => 'Ports in an allocation must be greater than 1024 and less than or equal to 65535.',
|
||||
],
|
||||
'egg' => [
|
||||
'delete_has_servers' => 'An Egg with active servers attached to it cannot be deleted from the Panel.',
|
||||
'invalid_copy_id' => 'The Egg selected for copying a script from either does not exist, or is copying a script itself.',
|
||||
'has_children' => 'This Egg is a parent to one or more other Eggs. Please delete those Eggs before deleting this Egg.',
|
||||
],
|
||||
'variables' => [
|
||||
'env_not_unique' => 'The environment variable :name must be unique to this Egg.',
|
||||
'reserved_name' => 'The environment variable :name is protected and cannot be assigned to a variable.',
|
||||
'bad_validation_rule' => 'The validation rule ":rule" is not a valid rule for this application.',
|
||||
],
|
||||
'importer' => [
|
||||
'json_error' => 'There was an error while attempting to parse the JSON file: :error.',
|
||||
'file_error' => 'The JSON file provided was not valid.',
|
||||
'invalid_json_provided' => 'The JSON file provided is not in a format that can be recognized.',
|
||||
],
|
||||
'subusers' => [
|
||||
'editing_self' => 'Editing your own subuser account is not permitted.',
|
||||
'user_is_owner' => 'You cannot add the server owner as a subuser for this server.',
|
||||
'subuser_exists' => 'A user with that email address is already assigned as a subuser for this server.',
|
||||
],
|
||||
'databases' => [
|
||||
'delete_has_databases' => 'Cannot delete a database host server that has active databases linked to it.',
|
||||
],
|
||||
'tasks' => [
|
||||
'chain_interval_too_long' => 'The maximum interval time for a chained task is 15 minutes.',
|
||||
],
|
||||
'locations' => [
|
||||
'has_nodes' => 'Cannot delete a location that has active nodes attached to it.',
|
||||
],
|
||||
'users' => [
|
||||
'node_revocation_failed' => 'Failed to revoke keys on <a href=":link">Node #:node</a>. :error',
|
||||
],
|
||||
'deployment' => [
|
||||
'no_viable_nodes' => 'No nodes satisfying the requirements specified for automatic deployment could be found.',
|
||||
'no_viable_allocations' => 'No allocations satisfying the requirements for automatic deployment were found.',
|
||||
],
|
||||
'api' => [
|
||||
'resource_not_found' => 'The requested resource does not exist on this server.',
|
||||
],
|
||||
];
|
17
lang/ca/pagination.php
Normal file
17
lang/ca/pagination.php
Normal 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' => '« Previous',
|
||||
'next' => 'Next »',
|
||||
];
|
19
lang/ca/passwords.php
Normal file
19
lang/ca/passwords.php
Normal 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' => 'Passwords must be at least six characters and match the confirmation.',
|
||||
'reset' => 'Your password has been reset!',
|
||||
'sent' => 'We have e-mailed your password reset link!',
|
||||
'token' => 'This password reset token is invalid.',
|
||||
'user' => 'We can\'t find a user with that e-mail address.',
|
||||
];
|
33
lang/ca/server/users.php
Normal file
33
lang/ca/server/users.php
Normal file
@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'permissions' => [
|
||||
'websocket_*' => 'Allows access to the websocket for this server.',
|
||||
'control_console' => 'Allows the user to send data to the server console.',
|
||||
'control_start' => 'Allows the user to start the server instance.',
|
||||
'control_stop' => 'Allows the user to stop the server instance.',
|
||||
'control_restart' => 'Allows the user to restart the server instance.',
|
||||
'control_kill' => 'Allows the user to kill the server instance.',
|
||||
'user_create' => 'Allows the user to create new user accounts for the server.',
|
||||
'user_read' => 'Allows the user permission to view users associated with this server.',
|
||||
'user_update' => 'Allows the user to modify other users associated with this server.',
|
||||
'user_delete' => 'Allows the user to delete other users associated with this server.',
|
||||
'file_create' => 'Allows the user permission to create new files and directories.',
|
||||
'file_read' => 'Allows the user to see files and folders associated with this server instance, as well as view their contents.',
|
||||
'file_update' => 'Allows the user to update files and folders associated with the server.',
|
||||
'file_delete' => 'Allows the user to delete files and directories.',
|
||||
'file_archive' => 'Allows the user to create file archives and decompress existing archives.',
|
||||
'file_sftp' => 'Allows the user to perform the above file actions using a SFTP client.',
|
||||
'allocation_read' => 'Allows access to the server allocation management pages.',
|
||||
'allocation_update' => 'Allows user permission to make modifications to the server\'s allocations.',
|
||||
'database_create' => 'Allows user permission to create a new database for the server.',
|
||||
'database_read' => 'Allows user permission to view the server databases.',
|
||||
'database_update' => 'Allows a user permission to make modifications to a database. If the user does not have the "View Password" permission as well they will not be able to modify the password.',
|
||||
'database_delete' => 'Allows a user permission to delete a database instance.',
|
||||
'database_view_password' => 'Allows a user permission to view a database password in the system.',
|
||||
'schedule_create' => 'Allows a user to create a new schedule for the server.',
|
||||
'schedule_read' => 'Allows a user permission to view schedules for a server.',
|
||||
'schedule_update' => 'Allows a user permission to make modifications to an existing server schedule.',
|
||||
'schedule_delete' => 'Allows a user to delete a schedule for the server.',
|
||||
],
|
||||
];
|
95
lang/ca/strings.php
Normal file
95
lang/ca/strings.php
Normal file
@ -0,0 +1,95 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'email' => 'Email',
|
||||
'email_address' => 'Email address',
|
||||
'user_identifier' => 'Username or Email',
|
||||
'password' => 'Password',
|
||||
'new_password' => 'New password',
|
||||
'confirm_password' => 'Confirm new password',
|
||||
'login' => 'Login',
|
||||
'home' => 'Home',
|
||||
'servers' => 'Servers',
|
||||
'id' => 'ID',
|
||||
'name' => 'Name',
|
||||
'node' => 'Node',
|
||||
'connection' => 'Connection',
|
||||
'memory' => 'Memory',
|
||||
'cpu' => 'CPU',
|
||||
'disk' => 'Disk',
|
||||
'status' => 'Status',
|
||||
'search' => 'Search',
|
||||
'suspended' => 'Suspended',
|
||||
'account' => 'Account',
|
||||
'security' => 'Security',
|
||||
'ip' => 'IP Address',
|
||||
'last_activity' => 'Last Activity',
|
||||
'revoke' => 'Revoke',
|
||||
'2fa_token' => 'Authentication Token',
|
||||
'submit' => 'Submit',
|
||||
'close' => 'Close',
|
||||
'settings' => 'Settings',
|
||||
'configuration' => 'Configuration',
|
||||
'sftp' => 'SFTP',
|
||||
'databases' => 'Databases',
|
||||
'memo' => 'Memo',
|
||||
'created' => 'Created',
|
||||
'expires' => 'Expires',
|
||||
'public_key' => 'Token',
|
||||
'api_access' => 'Api Access',
|
||||
'never' => 'never',
|
||||
'sign_out' => 'Sign out',
|
||||
'admin_control' => 'Admin Control',
|
||||
'required' => 'Required',
|
||||
'port' => 'Port',
|
||||
'username' => 'Username',
|
||||
'database' => 'Database',
|
||||
'new' => 'New',
|
||||
'danger' => 'Danger',
|
||||
'create' => 'Create',
|
||||
'select_all' => 'Select All',
|
||||
'select_none' => 'Select None',
|
||||
'alias' => 'Alias',
|
||||
'primary' => 'Primary',
|
||||
'make_primary' => 'Make Primary',
|
||||
'none' => 'None',
|
||||
'cancel' => 'Cancel',
|
||||
'created_at' => 'Created At',
|
||||
'action' => 'Action',
|
||||
'data' => 'Data',
|
||||
'queued' => 'Queued',
|
||||
'last_run' => 'Last Run',
|
||||
'next_run' => 'Next Run',
|
||||
'not_run_yet' => 'Not Run Yet',
|
||||
'yes' => 'Yes',
|
||||
'no' => 'No',
|
||||
'delete' => 'Delete',
|
||||
'2fa' => '2FA',
|
||||
'logout' => 'Logout',
|
||||
'admin_cp' => 'Admin Control Panel',
|
||||
'optional' => 'Optional',
|
||||
'read_only' => 'Read Only',
|
||||
'relation' => 'Relation',
|
||||
'owner' => 'Owner',
|
||||
'admin' => 'Admin',
|
||||
'subuser' => 'Subuser',
|
||||
'captcha_invalid' => 'The provided captcha is invalid.',
|
||||
'tasks' => 'Tasks',
|
||||
'seconds' => 'Seconds',
|
||||
'minutes' => 'Minutes',
|
||||
'under_maintenance' => 'Under Maintenance',
|
||||
'days' => [
|
||||
'sun' => 'Sunday',
|
||||
'mon' => 'Monday',
|
||||
'tues' => 'Tuesday',
|
||||
'wed' => 'Wednesday',
|
||||
'thurs' => 'Thursday',
|
||||
'fri' => 'Friday',
|
||||
'sat' => 'Saturday',
|
||||
],
|
||||
'last_used' => 'Last Used',
|
||||
'enable' => 'Enable',
|
||||
'disable' => 'Disable',
|
||||
'save' => 'Save',
|
||||
'copyright' => '® 2024 - :year Pelican',
|
||||
];
|
106
lang/ca/validation.php
Normal file
106
lang/ca/validation.php
Normal file
@ -0,0 +1,106 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Validation Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines contain the default error messages used by
|
||||
| the validator class. Some of these rules have multiple versions such
|
||||
| as the size rules. Feel free to tweak each of these messages here.
|
||||
|
|
||||
*/
|
||||
|
||||
'accepted' => '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' => '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' => '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' => 'The :attribute may not be greater than :max.',
|
||||
'file' => 'The :attribute may not be greater than :max kilobytes.',
|
||||
'string' => 'The :attribute may not be greater than :max characters.',
|
||||
'array' => 'The :attribute may not have more than :max items.',
|
||||
],
|
||||
'mimes' => 'The :attribute must be a file of type: :values.',
|
||||
'mimetypes' => 'The :attribute must be a file of type: :values.',
|
||||
'min' => [
|
||||
'numeric' => 'The :attribute must be at least :min.',
|
||||
'file' => 'The :attribute must be at least :min kilobytes.',
|
||||
'string' => 'The :attribute must be at least :min characters.',
|
||||
'array' => 'The :attribute must have at least :min items.',
|
||||
],
|
||||
'not_in' => 'The selected :attribute is invalid.',
|
||||
'numeric' => 'The :attribute must be a number.',
|
||||
'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' => 'The :attribute must be :size.',
|
||||
'file' => 'The :attribute must be :size kilobytes.',
|
||||
'string' => 'The :attribute must be :size characters.',
|
||||
'array' => 'The :attribute must contain :size items.',
|
||||
],
|
||||
'string' => 'The :attribute must be a string.',
|
||||
'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.',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Custom Validation Attributes
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines are used to swap attribute place-holders
|
||||
| with something more reader friendly such as E-Mail Address instead
|
||||
| of "email". This simply helps us make messages a little cleaner.
|
||||
|
|
||||
*/
|
||||
|
||||
'attributes' => [],
|
||||
|
||||
// Internal validation logic for Panel
|
||||
'internal' => [
|
||||
'variable_value' => ':env variable',
|
||||
'invalid_password' => 'The password provided was invalid for this account.',
|
||||
],
|
||||
];
|
130
lang/cs/activity.php
Normal file
130
lang/cs/activity.php
Normal file
@ -0,0 +1,130 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Contains all of the translation strings for different activity log
|
||||
* events. These should be keyed by the value in front of the colon (:)
|
||||
* in the event name. If there is no colon present, they should live at
|
||||
* the top level.
|
||||
*/
|
||||
return [
|
||||
'auth' => [
|
||||
'fail' => 'Přihlášení se nezdařilo',
|
||||
'success' => 'Přihlášen',
|
||||
'password-reset' => 'Obnovit heslo',
|
||||
'reset-password' => 'Požádáno o změnu hesla',
|
||||
'checkpoint' => 'Požadováno dvoufaktorové ověření',
|
||||
'recovery-token' => 'Použitý dvoufázový obnovovací token',
|
||||
'token' => 'Vyřešená dvoufázová výzva',
|
||||
'ip-blocked' => 'Blokovaný požadavek z neuvedené IP adresy pro :identifier',
|
||||
'sftp' => [
|
||||
'fail' => 'Selhalo přihlášení k SFTP',
|
||||
],
|
||||
],
|
||||
'user' => [
|
||||
'account' => [
|
||||
'email-changed' => 'Změněn e-mail z :old na :new',
|
||||
'password-changed' => 'Změněno heslo',
|
||||
],
|
||||
'api-key' => [
|
||||
'create' => 'Vytvořen nový API klíč :identifier',
|
||||
'delete' => 'Odstraněný API klíč :identifier',
|
||||
],
|
||||
'ssh-key' => [
|
||||
'create' => 'Přidán SSH klíč :fingerprint k účtu',
|
||||
'delete' => 'Odstraněný SSH klíč :fingerprint z účtu',
|
||||
],
|
||||
'two-factor' => [
|
||||
'create' => 'Povolené doufázové ověření',
|
||||
'delete' => 'Vypnuté dvoufázové ověření',
|
||||
],
|
||||
],
|
||||
'server' => [
|
||||
'reinstall' => 'Přeinstalovaný server',
|
||||
'console' => [
|
||||
'command' => 'Proveden příkaz „:command“ na serveru',
|
||||
],
|
||||
'power' => [
|
||||
'start' => 'Server byl spuštěn',
|
||||
'stop' => 'Server byl vypnut',
|
||||
'restart' => 'Server byl restartován',
|
||||
'kill' => 'Ukončen proces serveru',
|
||||
],
|
||||
'backup' => [
|
||||
'download' => 'Záloha :name stažena',
|
||||
'delete' => 'Záloha :name smazána',
|
||||
'restore' => 'Obnovena záloha :name (smazané soubory: :truncate)',
|
||||
'restore-complete' => 'Dokončená obnova zálohy :name',
|
||||
'restore-failed' => 'Nepodařilo se dokončit obnovení zálohy :name',
|
||||
'start' => 'Zahájeno zálohování :name',
|
||||
'complete' => 'Označit zálohu :name jako dokončená',
|
||||
'fail' => 'Záloha :name označena jako neúspěšná',
|
||||
'lock' => 'Záloha :name uzamčena',
|
||||
'unlock' => 'Záloha :name odemčena',
|
||||
],
|
||||
'database' => [
|
||||
'create' => 'Vytvořena nová databáze :name',
|
||||
'rotate-password' => 'Heslo pro databázi :name změněno',
|
||||
'delete' => 'Smazána databáze :name',
|
||||
],
|
||||
'file' => [
|
||||
'compress_one' => 'Komprimováno :directory:file',
|
||||
'compress_other' => 'Komprimováno :count souborů v :directory',
|
||||
'read' => 'Zobrazen obsah :file',
|
||||
'copy' => 'Vytvořena kopie :file',
|
||||
'create-directory' => 'Vytvořen adresář :directory:name',
|
||||
'decompress' => 'Dekomprimováno :files souborů v :directory',
|
||||
'delete_one' => 'Smazáno :directory:files.0',
|
||||
'delete_other' => ':count souborů v :directory bylo smazáno',
|
||||
'download' => 'Staženo :file',
|
||||
'pull' => 'Stažen vzdálený soubor z :url do :directory',
|
||||
'rename_one' => 'Přejmenováno :directory:files.0.from na :directory:files.0.to',
|
||||
'rename_other' => 'Přejmenováno :count souborů v :directory',
|
||||
'write' => 'Přepsaný nový obsah v :file',
|
||||
'upload' => 'Zahájeno nahrávání souboru',
|
||||
'uploaded' => 'Nahráno :directory:file',
|
||||
],
|
||||
'sftp' => [
|
||||
'denied' => 'Zablokován SFTP přístup z důvodu nedostatku oprávnění',
|
||||
'create_one' => 'Vytvořeno :files.0',
|
||||
'create_other' => 'Vytvořeno :count nových souborů',
|
||||
'write_one' => 'Změněn obsah :files.0',
|
||||
'write_other' => 'Změněn obsah :count souborů',
|
||||
'delete_one' => 'Smazáno :files.0',
|
||||
'delete_other' => 'Smazáno :count souborů',
|
||||
'create-directory_one' => 'Vytvořen adresář :files.0',
|
||||
'create-directory_other' => 'Vytvořeno :count adresářů',
|
||||
'rename_one' => 'Přejmenováno :files.0.from na :files.0.to',
|
||||
'rename_other' => 'Přejmenováno nebo přesunuto :count souborů',
|
||||
],
|
||||
'allocation' => [
|
||||
'create' => 'Přidáno :alokace k serveru',
|
||||
'notes' => 'Aktualizovány poznámky pro :allocation z „:old“ na „:new“',
|
||||
'primary' => 'Nastavit :allocation jako primární alokaci serveru',
|
||||
'delete' => 'Odstraněno :allocation',
|
||||
],
|
||||
'schedule' => [
|
||||
'create' => 'Vytvořen plán :name',
|
||||
'update' => 'Aktualizován plán :name',
|
||||
'execute' => 'Manuálně proveden plán :name',
|
||||
'delete' => 'Odstraněn plán :name',
|
||||
],
|
||||
'task' => [
|
||||
'create' => 'Vytvořen nový úkol „:action“ pro plán :name',
|
||||
'update' => 'Aktualizován úkol „:action“ pro plán :name',
|
||||
'delete' => 'Odstraněn úkol pro plán :name',
|
||||
],
|
||||
'settings' => [
|
||||
'rename' => 'Přejmenován server z :old na :new',
|
||||
'description' => 'Změněn popis serveru z :old na :new',
|
||||
],
|
||||
'startup' => [
|
||||
'edit' => ':variable byla změněna z „:old“ na „:new“',
|
||||
'image' => 'Aktualizoval Docker Image pro server z :old na :new',
|
||||
],
|
||||
'subuser' => [
|
||||
'create' => ':email přidán jako poduživatel',
|
||||
'update' => 'Aktualizována oprávnění poduživatele pro :email',
|
||||
'delete' => ':email odebrán jako poduživatel',
|
||||
],
|
||||
],
|
||||
];
|
19
lang/cs/admin/eggs.php
Normal file
19
lang/cs/admin/eggs.php
Normal file
@ -0,0 +1,19 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'notices' => [
|
||||
'imported' => 'Úspěšně importováno toto vejce a jeho související proměnné.',
|
||||
'updated_via_import' => 'Toto vejce bylo aktualizováno pomocí poskytnutého souboru.',
|
||||
'deleted' => 'Požadované vejce bylo úspěšně smazáno z panelu.',
|
||||
'updated' => 'Konfigurace vejce byla úspěšně aktualizována.',
|
||||
'script_updated' => 'Instalační skript vejce byl aktualizován a bude spuštěn vždy, když budou nainstalovány servery.',
|
||||
'egg_created' => 'Nové vejce bylo úspěšně přidáno. Abyste mohli použít toto nové vejce, budete muset restartovat všechny spuštěné daemony.',
|
||||
],
|
||||
'variables' => [
|
||||
'notices' => [
|
||||
'variable_deleted' => 'Proměnná „:variable“ byla odstraněna a nebude serverům po rekonstrukci k dispozici.',
|
||||
'variable_updated' => 'Proměnná „:variable“ byla aktualizována. Budete muset obnovit všechny servery používající tuto proměnnou pro použití změn.',
|
||||
'variable_created' => 'Nová proměnná byla úspěšně vytvořena a přiřazena k tomuto vejci.',
|
||||
],
|
||||
],
|
||||
];
|
15
lang/cs/admin/node.php
Normal file
15
lang/cs/admin/node.php
Normal file
@ -0,0 +1,15 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'validation' => [
|
||||
'fqdn_not_resolvable' => 'Poskytnutá FQDN neodpovídá platné IP adrese.',
|
||||
'fqdn_required_for_ssl' => 'Pro použití SSL pro tento uzel je vyžadován plně kvalifikovaný název domény, který odpovídá veřejné IP adrese',
|
||||
],
|
||||
'notices' => [
|
||||
'allocations_added' => 'Alokace byly úspěšně přidány do tohoto uzlu.',
|
||||
'node_deleted' => 'Uzel byl úspěšně odebrán z panelu.',
|
||||
'node_created' => 'Nový uzel byl úspěšně vytvořen. Daemon na tomto uzlu můžete automaticky nakonfigurovat na kartě Konfigurace. <strong>Před přidáním všech serverů musíte nejprve přidělit alespoň jednu IP adresu a port.</strong>',
|
||||
'node_updated' => 'Informace o uzlu byly aktualizovány. Pokud bylo změněno nastavení daemonu, budete jej muset restartovat, aby se tyto změny projevily.',
|
||||
'unallocated_deleted' => 'Smazány všechny nepřidělené porty pro <code>:ip</code>.',
|
||||
],
|
||||
];
|
27
lang/cs/admin/server.php
Normal file
27
lang/cs/admin/server.php
Normal file
@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'exceptions' => [
|
||||
'no_new_default_allocation' => 'Pokoušíte se odstranit výchozí alokaci pro tento server, ale není k dispozici žádná záložní alokace.',
|
||||
'marked_as_failed' => 'Tento server byl označen jako neúspěšný předchozí instalace. Aktuální stav nelze v tomto stavu přepnout.',
|
||||
'bad_variable' => 'Došlo k chybě ověření proměnné :name.',
|
||||
'daemon_exception' => 'Při pokusu o komunikaci s daemonem došlo k výjimce, která vedla k HTTP/:code kódu odpovědi. Tato výjimka byla zaznamenána. (požadavek id: :request_id)',
|
||||
'default_allocation_not_found' => 'Požadovaná výchozí alokace nebyla nalezena v alokaci tohoto serveru.',
|
||||
],
|
||||
'alerts' => [
|
||||
'startup_changed' => 'Konfigurace spouštění pro tento server byla aktualizována. Pokud bylo vejce tohoto serveru změněno, přeinstalování se nyní bude opakovat.',
|
||||
'server_deleted' => 'Server byl ze systému úspěšně odstraněn.',
|
||||
'server_created' => 'Server byl úspěšně vytvořen v panelu. Povolte prosím démonovi několik minut pro úplnou instalaci tohoto serveru.',
|
||||
'build_updated' => 'Detaily sestavení tohoto serveru byly aktualizovány. Některé změny mohou vyžadovat restartování.',
|
||||
'suspension_toggled' => 'Stav pozastavení serveru byl změněn na :status.',
|
||||
'rebuild_on_boot' => 'Tento server byl označen jako server vyžadující přesestavení kontejneru Docker. To se stane při příštím spuštění serveru.',
|
||||
'install_toggled' => 'Stav instalace pro tento server byl přepnut.',
|
||||
'server_reinstalled' => 'Tento server byl zařazen do fronty pro reinstalaci, která je nyní zahájena.',
|
||||
'details_updated' => 'Podrobnosti o serveru byly úspěšně aktualizovány.',
|
||||
'docker_image_updated' => 'Úspěšně změněn výchozí obraz Dockeru, který má být použit pro tento server. Pro tuto změnu je nutný restart.',
|
||||
'node_required' => 'Před přidáním serveru do tohoto panelu musíte mít nakonfigurován alespoň jeden uzel.',
|
||||
'transfer_nodes_required' => 'Před přenosem serverů musíte mít nakonfigurovány alespoň dva uzly.',
|
||||
'transfer_started' => 'Přenos serveru byl zahájen.',
|
||||
'transfer_not_viable' => 'Vybraný uzel nemá k dispozici požadovaný prostor na disku nebo paměť pro uložení tohoto serveru.',
|
||||
],
|
||||
];
|
12
lang/cs/admin/user.php
Normal file
12
lang/cs/admin/user.php
Normal file
@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'exceptions' => [
|
||||
'user_has_servers' => 'Nelze odstranit uživatele s aktivními servery připojenými k jeho účtu. Před pokračováním prosím odstraňte jeho servery.',
|
||||
'user_is_self' => 'Nemůžete smazat svůj vlastní uživatelský účet!',
|
||||
],
|
||||
'notices' => [
|
||||
'account_created' => 'Účet byl úspěšně vytvořen',
|
||||
'account_updated' => 'Účet byl úspěšně aktualizován.',
|
||||
],
|
||||
];
|
27
lang/cs/auth.php
Normal file
27
lang/cs/auth.php
Normal file
@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'sign_in' => 'Přihlásit se',
|
||||
'go_to_login' => 'Přejít na přihlášení',
|
||||
'failed' => 'Nebyl nalezen žádný účet odpovídající těmto přihlašovacím údajům.',
|
||||
|
||||
'forgot_password' => [
|
||||
'label' => 'Zapomněli jste heslo?',
|
||||
'label_help' => 'Zadejte e-mailovou adresu vašeho účtu pro příjem pokynů k obnovení hesla.',
|
||||
'button' => 'Obnovit účet',
|
||||
],
|
||||
|
||||
'reset_password' => [
|
||||
'button' => 'Obnovit a přihlásit se',
|
||||
],
|
||||
|
||||
'two_factor' => [
|
||||
'label' => 'Dvoufázový token',
|
||||
'label_help' => 'Tento účet vyžaduje druhou vrstvu ověřování, abyste mohli pokračovat. Pro dokončení přihlášení zadejte kód generovaný zařízením.',
|
||||
'checkpoint_failed' => 'Dvoufaktorový ověřovací token je neplatný.',
|
||||
],
|
||||
|
||||
'throttle' => 'Příliš mnoho pokusů o přihlášení. Zkuste to prosím znovu za :seconds sekund.',
|
||||
'password_requirements' => 'Heslo musí mít délku nejméně 8 znaků a mělo by být pro tento web jedinečné.',
|
||||
'2fa_must_be_enabled' => 'Správce požaduje, aby bylo dvoufázové ověření povoleno pro váš účet, aby jste mohl použit panel.',
|
||||
];
|
59
lang/cs/command/messages.php
Normal file
59
lang/cs/command/messages.php
Normal file
@ -0,0 +1,59 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'user' => [
|
||||
'search_users' => 'Zadejte uživatelské jméno, ID uživatele nebo e-mailovou adresu',
|
||||
'select_search_user' => 'ID uživatele k odstranění (Zadejte \'0\' k opětovnému vyhledávání)',
|
||||
'deleted' => 'Uživatel byl úspěšně odstraněn z panelu.',
|
||||
'confirm_delete' => 'Opravdu chcete odstranit tohoto uživatele z panelu?',
|
||||
'no_users_found' => 'Pro hledaný výraz nebyl nalezen žádný uživatel.',
|
||||
'multiple_found' => 'Pro uživatele bylo nalezeno více účtů, není možné odstranit uživatele z důvodu vlajky --no-interaction.',
|
||||
'ask_admin' => 'Je tento uživatel správcem?',
|
||||
'ask_email' => 'Emailová adresa',
|
||||
'ask_username' => 'Uživatelské jméno',
|
||||
'ask_name_first' => 'Jméno',
|
||||
'ask_name_last' => 'Příjmení',
|
||||
'ask_password' => 'Heslo',
|
||||
'ask_password_tip' => 'Pokud chcete vytvořit účet s náhodným heslem zaslaným uživateli, spusťte znovu tento příkaz (CTRL+C) a přejděte do proměnné `--no-password`.',
|
||||
'ask_password_help' => 'Heslo musí mít délku nejméně 8 znaků a obsahovat alespoň jedno velké písmeno a číslo.',
|
||||
'2fa_help_text' => [
|
||||
'Tento příkaz zakáže dvoufázové ověření pro uživatelský účet, pokud je povoleno. Toto by mělo být použito jako příkaz k obnovení účtu pouze v případě, že je uživatel uzamčen mimo jeho účet.',
|
||||
'Pokud toto nechcete udělat, stiskněte CTRL + C pro ukončení tohoto procesu.',
|
||||
],
|
||||
'2fa_disabled' => 'Dvoufázové ověření bylo vypnuto pro :email.',
|
||||
],
|
||||
'schedule' => [
|
||||
'output_line' => 'Odesílání první úlohy v `:schedule` (:hash).',
|
||||
],
|
||||
'maintenance' => [
|
||||
'deleting_service_backup' => 'Odstraňování záložního souboru služby :file.',
|
||||
],
|
||||
'server' => [
|
||||
'rebuild_failed' => 'Žádost o obnovení „:name“ (#:id) v uzlu „:node“ selhala s chybou: :message',
|
||||
'reinstall' => [
|
||||
'failed' => 'Žádost o přeinstalaci „:name“ (#:id) v uzlu „:node“ selhala s chybou: :message',
|
||||
'confirm' => 'Chystáte se přeinstalovat skupinu serverů. Chcete pokračovat?',
|
||||
],
|
||||
'power' => [
|
||||
'confirm' => 'Chystáte se provést :action proti :count serverům. Přejete si pokračovat?',
|
||||
'action_failed' => 'Požadavek na výkonovou akci „:name“ (#:id) v uzlu „:node“ selhal s chybou: :message',
|
||||
],
|
||||
],
|
||||
'environment' => [
|
||||
'mail' => [
|
||||
'ask_smtp_host' => 'SMTP hostitel (např. smtp.gmail.com)',
|
||||
'ask_smtp_port' => 'SMTP Port',
|
||||
'ask_smtp_username' => 'SMTP Uživatelské jméno',
|
||||
'ask_smtp_password' => 'SMTP heslo',
|
||||
'ask_mailgun_domain' => 'Mailgun doména',
|
||||
'ask_mailgun_endpoint' => 'Mailgun Endpoint',
|
||||
'ask_mailgun_secret' => 'Mailgun Secret',
|
||||
'ask_mandrill_secret' => 'Mandrill Secret',
|
||||
'ask_postmark_username' => 'Postmark API klíč',
|
||||
'ask_driver' => 'Který ovladač by měl být použit pro odesílání e-mailů?',
|
||||
'ask_mail_from' => 'E-mailové adresy by měly pocházet z',
|
||||
'ask_mail_name' => 'Název, ze kterého by se měly zobrazit e-maily',
|
||||
'ask_encryption' => 'Šifrovací metoda',
|
||||
],
|
||||
],
|
||||
];
|
28
lang/cs/dashboard/account.php
Normal file
28
lang/cs/dashboard/account.php
Normal file
@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'email' => [
|
||||
'title' => 'Aktualizovat e-mail',
|
||||
'updated' => 'E-mailová adresa byla úspěšně změněna.',
|
||||
],
|
||||
'password' => [
|
||||
'title' => 'Změnit heslo',
|
||||
'requirements' => 'Vaše heslo by mělo mít délku alespoň 8 znaků.',
|
||||
'updated' => 'Vaše heslo bylo změněno.',
|
||||
],
|
||||
'two_factor' => [
|
||||
'button' => 'Nastavení dvoufázového ověření',
|
||||
'disabled' => 'Dvoufázové ověřování bylo na vašem účtu zakázáno. Po přihlášení již nebudete vyzváni k poskytnutí tokenu.',
|
||||
'enabled' => 'Dvoufázové ověřování bylo na vašem účtu povoleno! Od nynějška při přihlášení budete muset zadat kód vygenerovaný vaším zařízením.',
|
||||
'invalid' => 'Zadaný token není platný.',
|
||||
'setup' => [
|
||||
'title' => 'Nastavit dvoufázové ověřování',
|
||||
'help' => 'Nelze naskenovat kód? Zadejte kód níže do vaší aplikace:',
|
||||
'field' => 'Zadejte token',
|
||||
],
|
||||
'disable' => [
|
||||
'title' => 'Zakázat dvoufázové ověření',
|
||||
'field' => 'Zadejte token',
|
||||
],
|
||||
],
|
||||
];
|
8
lang/cs/dashboard/index.php
Normal file
8
lang/cs/dashboard/index.php
Normal file
@ -0,0 +1,8 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'search' => 'Vyhledat servery...',
|
||||
'no_matches' => 'Nebyly nalezeny žádné servery, které odpovídají zadaným kritériím.',
|
||||
'cpu_title' => 'CPU',
|
||||
'memory_title' => 'Paměť',
|
||||
];
|
55
lang/cs/exceptions.php
Normal file
55
lang/cs/exceptions.php
Normal file
@ -0,0 +1,55 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'daemon_connection_failed' => 'Byla zaznamenána nečekaná vyjímka při pokusu komunikovat s daemonem vyusaťující v chybu HTTP/:code. Tahle vyjímka byla logována.',
|
||||
'node' => [
|
||||
'servers_attached' => 'Uzel nesmí mít žádné s ním spojené servery, aby mohl být smazán',
|
||||
'daemon_off_config_updated' => 'Konfigurace daemonu <strong>byla aktualizována</strong>, ale byla zde chyba při automatické aktualizaci souborů konfigurace Daemonu. Je třeba soubory konfigurace Daemonu aktualizovat manuálně (config.yml), aby změny damemonu byly aplikovány.',
|
||||
],
|
||||
'allocations' => [
|
||||
'server_using' => 'Server již využívá tuhle alokaci. Pro odstranění alokace, nesmí být žádný server spojen s alokací.',
|
||||
'too_many_ports' => 'Přidání více než 1000 portů v jednom rozsahu najednou není podporováno.',
|
||||
'invalid_mapping' => 'Mapování poskytnuto pro :port bylo nesprávné a nebylo možné ho zpracovat.',
|
||||
'cidr_out_of_range' => 'CIDR zápis je možný jen pro masky /25 až /32 subnetu.',
|
||||
'port_out_of_range' => 'Porty v alokacích musí být vyšší než 1024 a nížší nebo se rovnat 65535.',
|
||||
],
|
||||
'egg' => [
|
||||
'delete_has_servers' => 'Vejce s aktivními servery není možné smazat z panelu.',
|
||||
'invalid_copy_id' => 'Zvolený vejce na kopii skriptu buď neexistuje nebo neobsahuje samotný skript.',
|
||||
'has_children' => 'Toto vejce je nadřazeno jednomu či více vajec. Prosím vymažte tyto vejce předtím než smažete toto.',
|
||||
],
|
||||
'variables' => [
|
||||
'env_not_unique' => 'Proměnná prostředí :name musí mít unikátní pro toto vejce.',
|
||||
'reserved_name' => 'Proměnná prostředí :name je chráněna a nemůže být přidělena k této proměnné',
|
||||
'bad_validation_rule' => 'Pravidlo pro ověření „:rule“ není platné pravidlo pro tuto aplikaci.',
|
||||
],
|
||||
'importer' => [
|
||||
'json_error' => 'Při pokusu o analyzování souboru JSON došlo k chybě: :error.',
|
||||
'file_error' => 'Poskytnutý JSON soubor není platný.',
|
||||
'invalid_json_provided' => 'Formát poskytnutého JSON souboru nebylo možné rozeznat',
|
||||
],
|
||||
'subusers' => [
|
||||
'editing_self' => 'Úprava tvého vlastního podúčtu není dovolena.',
|
||||
'user_is_owner' => 'Nemůžete přidat vlastníka serveru jako poduživatele pro tento server.',
|
||||
'subuser_exists' => 'Uživatel s touto emailovou adresou je již poduživatel na tomto serveru.',
|
||||
],
|
||||
'databases' => [
|
||||
'delete_has_databases' => 'Nelze odstranit hostitelský server databáze, který má s ním spojené aktivní databáze.',
|
||||
],
|
||||
'tasks' => [
|
||||
'chain_interval_too_long' => 'Maximální čas intervalu pro tuto řetězovou úlohu je 15 minut.',
|
||||
],
|
||||
'locations' => [
|
||||
'has_nodes' => 'Nelze smazat lokaci, která má s ní spojené aktivní uzly.',
|
||||
],
|
||||
'users' => [
|
||||
'node_revocation_failed' => 'Odstranění klíču pro uzel <a href=":link">Uzel #:node</a> nevyšlo: :error.',
|
||||
],
|
||||
'deployment' => [
|
||||
'no_viable_nodes' => 'Žadné uzly nesplňují specifikované požadavky pro automatické aplikování.',
|
||||
'no_viable_allocations' => 'Žádné alokace nesplňující požadavky pro automatickou aplikaci nebyly nalezeny.',
|
||||
],
|
||||
'api' => [
|
||||
'resource_not_found' => 'Požadovaný dokument neexistuje na tomto serveru.',
|
||||
],
|
||||
];
|
17
lang/cs/pagination.php
Normal file
17
lang/cs/pagination.php
Normal 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' => '« Předchozí',
|
||||
'next' => 'Další »',
|
||||
];
|
19
lang/cs/passwords.php
Normal file
19
lang/cs/passwords.php
Normal 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' => 'Heslo musí obsahovat alespoň 6 znaků a musí se shodovat s ověřením.',
|
||||
'reset' => 'Vaše heslo bylo obnoveno!',
|
||||
'sent' => 'Na váš e-mal byl odeslán link pro obnovu hesla!',
|
||||
'token' => 'Tento klíč pro obnovu hesla je neplatný.',
|
||||
'user' => 'Nelze najít uživatele s touto e-mailovou adresou.',
|
||||
];
|
33
lang/cs/server/users.php
Normal file
33
lang/cs/server/users.php
Normal file
@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'permissions' => [
|
||||
'websocket_*' => 'Umožňuje přístup do websocketu pro tento server.',
|
||||
'control_console' => 'Umožňuje uživateli odesílat data do konzole serveru.',
|
||||
'control_start' => 'Umožňuje uživateli spustit instanci serveru.',
|
||||
'control_stop' => 'Umožňuje uživateli zastavit instanci serveru.',
|
||||
'control_restart' => 'Umožňuje uživateli restartovat instanci serveru.',
|
||||
'control_kill' => 'Umožňuje uživateli ukončit instanci serveru.',
|
||||
'user_create' => 'Umožňuje uživateli vytvářet nové uživatelské účty pro server.',
|
||||
'user_read' => 'Umožňuje uživateli zobrazit oprávnění uživatele asociované s tímto serverem.',
|
||||
'user_update' => 'Umožňuje uživateli upravovat ostatní oprávnění uživatelů spojené s tímto serverem.',
|
||||
'user_delete' => 'Umožňuje uživateli odstranit ostatní uživatele přidružené k tomuto serveru.',
|
||||
'file_create' => 'Umožňuje uživateli oprávnění vytvářet nové soubory a adresáře.',
|
||||
'file_read' => 'Umožňuje uživateli vidět soubory a složky spojené s touto instancí serveru a také zobrazit jejich obsah.',
|
||||
'file_update' => 'Umožňuje uživateli aktualizovat soubory a složky spojené se serverem.',
|
||||
'file_delete' => 'Umožňuje uživateli odstranit soubory a adresáře.',
|
||||
'file_archive' => 'Umožňuje uživateli vytvářet archivy souborů a dekomprimovat existující archivy.',
|
||||
'file_sftp' => 'Umožňuje uživateli provést výše uvedené akce souborů pomocí SFTP klienta.',
|
||||
'allocation_read' => 'Umožňuje přístup ke stránkám správy alokace serveru.',
|
||||
'allocation_update' => 'Umožňuje uživateli oprávnění provádět změny alokací serveru.',
|
||||
'database_create' => 'Umožňuje uživateli oprávnění k vytvoření nové databáze pro server.',
|
||||
'database_read' => 'Umožňuje uživateli oprávnění zobrazit databáze serverů.',
|
||||
'database_update' => 'Umožňuje uživateli oprávnění provádět změny v databázi. Pokud uživatel nemá také oprávnění "Zobrazit heslo", nebude moci heslo upravit.',
|
||||
'database_delete' => 'Umožňuje uživateli oprávnění odstranit instanci databáze.',
|
||||
'database_view_password' => 'Umožňuje uživateli oprávnění zobrazit heslo do databáze.',
|
||||
'schedule_create' => 'Umožňuje uživateli vytvořit nový plán pro server.',
|
||||
'schedule_read' => 'Umožňuje uživateli oprávnění k prohlížení plánů serveru.',
|
||||
'schedule_update' => 'Umožňuje uživateli oprávnění provádět změny plánu existujícího serveru.',
|
||||
'schedule_delete' => 'Umožňuje uživateli odstranit plán pro server.',
|
||||
],
|
||||
];
|
95
lang/cs/strings.php
Normal file
95
lang/cs/strings.php
Normal file
@ -0,0 +1,95 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
'email' => 'Email',
|
||||
'email_address' => 'E-mailová adresa',
|
||||
'user_identifier' => 'Uživatelské jméno nebo e-mail',
|
||||
'password' => 'Heslo',
|
||||
'new_password' => 'Nové heslo',
|
||||
'confirm_password' => 'Potvrdit nové heslo',
|
||||
'login' => 'Přihlášení',
|
||||
'home' => 'Domovská stránka',
|
||||
'servers' => 'Servery',
|
||||
'id' => 'ID',
|
||||
'name' => 'Název',
|
||||
'node' => 'Uzel',
|
||||
'connection' => 'Připojení',
|
||||
'memory' => 'Paměť',
|
||||
'cpu' => 'CPU',
|
||||
'disk' => 'Disk',
|
||||
'status' => 'Stav',
|
||||
'search' => 'Hledat',
|
||||
'suspended' => 'Pozastaveno',
|
||||
'account' => 'Účet',
|
||||
'security' => 'Zabezpečení',
|
||||
'ip' => 'IP adresa',
|
||||
'last_activity' => 'Poslední aktivita',
|
||||
'revoke' => 'Odvolat',
|
||||
'2fa_token' => 'Ověřovací Token',
|
||||
'submit' => 'Odeslat',
|
||||
'close' => 'Zavřít',
|
||||
'settings' => 'Nastavení',
|
||||
'configuration' => 'Nastavení',
|
||||
'sftp' => 'SFTP',
|
||||
'databases' => 'Databáze',
|
||||
'memo' => 'Poznámka',
|
||||
'created' => 'Vytvořeno',
|
||||
'expires' => 'Expirace',
|
||||
'public_key' => 'Token',
|
||||
'api_access' => 'Api Přístup',
|
||||
'never' => 'nikdy',
|
||||
'sign_out' => 'Odhlásit se',
|
||||
'admin_control' => 'Administrace',
|
||||
'required' => 'Povinné pole',
|
||||
'port' => 'Port',
|
||||
'username' => 'Uživatelské jméno',
|
||||
'database' => 'Databáze',
|
||||
'new' => 'Nový',
|
||||
'danger' => 'Nebezpečí',
|
||||
'create' => 'Vytořit',
|
||||
'select_all' => 'Vybrat vše',
|
||||
'select_none' => 'Zrušit výběr',
|
||||
'alias' => 'Přezdívka',
|
||||
'primary' => 'Primární',
|
||||
'make_primary' => 'Nastavit jako výchozí',
|
||||
'none' => 'Žádný',
|
||||
'cancel' => 'Zrušit',
|
||||
'created_at' => 'Vytvořeno v',
|
||||
'action' => 'Akce',
|
||||
'data' => 'Data',
|
||||
'queued' => 'Ve frontě',
|
||||
'last_run' => 'Poslední spuštění',
|
||||
'next_run' => 'Další spuštění',
|
||||
'not_run_yet' => 'Zatím nespustěno',
|
||||
'yes' => 'Ano',
|
||||
'no' => 'Ne',
|
||||
'delete' => 'Smazat',
|
||||
'2fa' => '2FA',
|
||||
'logout' => 'Odhlásit se',
|
||||
'admin_cp' => 'Administrace',
|
||||
'optional' => 'Volitelné',
|
||||
'read_only' => 'Pouze pro čtení',
|
||||
'relation' => 'Souvislost',
|
||||
'owner' => 'Vlastník',
|
||||
'admin' => 'Administrátor',
|
||||
'subuser' => 'Poduživatel',
|
||||
'captcha_invalid' => 'Zadaný captcha je neplatný.',
|
||||
'tasks' => 'Úkoly',
|
||||
'seconds' => 'Sekund',
|
||||
'minutes' => 'Minut',
|
||||
'under_maintenance' => 'Probíhá údržba',
|
||||
'days' => [
|
||||
'sun' => 'Neděle',
|
||||
'mon' => 'Pondělí',
|
||||
'tues' => 'Úterý',
|
||||
'wed' => 'Středa',
|
||||
'thurs' => 'Čtvrtek',
|
||||
'fri' => 'Pátek',
|
||||
'sat' => 'Sobota',
|
||||
],
|
||||
'last_used' => 'Naposledy použito',
|
||||
'enable' => 'Povolit',
|
||||
'disable' => 'Zakázat',
|
||||
'save' => 'Uložit',
|
||||
'copyright' => '® 2024 - :year Pelican',
|
||||
];
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user