Compare commits

...

23 Commits

Author SHA1 Message Date
Charles
d7e60f2456 Fix Console Fit... again (#1537) 2025-07-19 15:40:18 -04:00
Charles
38e746240d Fix delayed status update, and graphs (#1536) 2025-07-19 14:45:50 -04:00
Lance Pioch
986063dce4 Use default startup variable value when creating server via api (#1518)
Co-authored-by: Boy132 <mail@boy132.de>
2025-07-19 13:58:04 -04:00
Charles
71d0326cb2 Call FitConsole after page load (#1534) 2025-07-19 13:04:22 -04:00
Boy132
62ca53eeaf Server Policy: Only do owner check if checking for subuser permissions (#1521) 2025-07-19 18:52:28 +02:00
Boy132
9f2305f351 Use filaments password broker for reset link token when creating subuser (#1498) 2025-07-19 18:51:42 +02:00
Boy132
340d1b543c Add import & export for schedules (#1530) 2025-07-19 16:48:21 +02:00
Boy132
61098b11f2 Add migration to clear password from auth:fail logs (#1533) 2025-07-19 16:47:49 +02:00
Boy132
4d03d6b948 Improve Mounts API (#1531) 2025-07-18 13:50:31 +02:00
Boy132
1f67054777 Fix phpstan (#1532) 2025-07-18 13:49:26 +02:00
Charles
4a9814f16c Move fullscreen file editor down to not cover top bar (#1527) 2025-07-18 05:05:09 -04:00
Boy132
e0697d3288 Cleanup & fix server deployment (#1497) 2025-07-18 08:23:48 +02:00
Boy132
d165da20ec Improve schedule form (#1514) 2025-07-18 08:23:08 +02:00
Charles
ae27b179fe Fix memory leak caused by shift pr (#1528) 2025-07-17 17:41:41 -04:00
Rain
1113ffe0f7 Filters sensitive credential fields from auth:fail logs (#1504) 2025-07-17 16:45:38 -04:00
Lance Pioch
5531bc0ba1 Laravel 12.20.0 Shift (#1500)
Co-authored-by: Shift <shift@laravelshift.com>
2025-07-17 16:44:27 -04:00
Charles
a3819122db Fix power actions (#1517) 2025-07-15 05:02:55 -04:00
MartinOscar
c5528a61f3 Filter out already used ips with the same port (#1496) 2025-07-10 08:59:46 +02:00
Boy132
5a7c6ac6e5 Improve turnstile error handling (+ cleanup) (#1501) 2025-07-09 13:51:43 +02:00
Boy132
5e8cccef19 Fix options for script_entry Select (#1505) 2025-07-09 09:14:46 +02:00
Charles
0ccb248d91 Add Languages (#1499)
Co-authored-by: Boy132 <mail@boy132.de>
2025-07-08 21:16:11 -04:00
Boy132
514d961c24 Add migration to match node ports (#1489) 2025-07-07 08:37:45 +02:00
Charles
f8e802afcd Fix table view power actions (#1490) 2025-07-06 19:03:09 -04:00
385 changed files with 18345 additions and 594 deletions

View File

@@ -56,9 +56,4 @@ abstract class BaseSchema
->default(env("CAPTCHA_{$id}_SECRET_KEY")),
];
}
public function verifyDomain(string $hostname, ?string $requestUrl = null): bool
{
return true;
}
}

View File

@@ -26,10 +26,5 @@ interface CaptchaSchemaInterface
public function getIcon(): ?string;
/**
* @return array<string, string|bool>
*/
public function validateResponse(?string $captchaResponse = null): array;
public function verifyDomain(string $hostname, ?string $requestUrl = null): bool;
public function validateResponse(?string $captchaResponse = null): void;
}

View File

@@ -4,6 +4,7 @@ namespace App\Extensions\Captcha\Schemas\Turnstile;
use App\Extensions\Captcha\CaptchaService;
use Closure;
use Exception;
use Illuminate\Contracts\Validation\ValidationRule;
use Illuminate\Support\Facades\App;
@@ -11,10 +12,12 @@ class Rule implements ValidationRule
{
public function validate(string $attribute, mixed $value, Closure $fail): void
{
$response = App::call(fn (CaptchaService $service) => $service->getActiveSchema()->validateResponse($value));
try {
App::call(fn (CaptchaService $service) => $service->get('turnstile')->validateResponse($value));
} catch (Exception $exception) {
report($exception);
if (!$response['success']) {
$fail($response['message'] ?? 'Unknown error occurred, please try again');
$fail('Captcha validation failed: ' . $exception->getMessage());
}
}
}

View File

@@ -66,9 +66,9 @@ class TurnstileSchema extends BaseSchema implements CaptchaSchemaInterface
}
/**
* @return array<string, string|bool>
* @throws Exception
*/
public function validateResponse(?string $captchaResponse = null): array
public function validateResponse(?string $captchaResponse = null): void
{
$captchaResponse ??= request()->get('cf-turnstile-response');
@@ -83,22 +83,33 @@ class TurnstileSchema extends BaseSchema implements CaptchaSchemaInterface
->post('https://challenges.cloudflare.com/turnstile/v0/siteverify', [
'secret' => $secret,
'response' => $captchaResponse,
]);
])
->json();
return count($response->json()) ? $response->json() : [
'success' => false,
'message' => 'Unknown error occurred, please try again',
];
if (!$response['success']) {
match ($response['error-codes'][0] ?? null) {
'missing-input-secret' => throw new Exception('The secret parameter was not passed.'),
'invalid-input-secret' => throw new Exception('The secret parameter was invalid, did not exist, or is a testing secret key with a non-testing response.'),
'missing-input-response' => throw new Exception('The response parameter (token) was not passed.'),
'invalid-input-response' => throw new Exception('The response parameter (token) is invalid or has expired.'),
'bad-request' => throw new Exception('The request was rejected because it was malformed.'),
'timeout-or-duplicate' => throw new Exception('The response parameter (token) has already been validated before.'),
default => throw new Exception('An internal error happened while validating the response.'),
};
}
if (!$this->verifyDomain($response['hostname'] ?? '')) {
throw new Exception('Domain verification failed.');
}
}
public function verifyDomain(string $hostname, ?string $requestUrl = null): bool
private function verifyDomain(string $hostname): bool
{
if (!env('CAPTCHA_TURNSTILE_VERIFY_DOMAIN', true)) {
return true;
}
$requestUrl ??= request()->url;
$requestUrl = parse_url($requestUrl);
$requestUrl = parse_url(request()->url());
return $hostname === array_get($requestUrl, 'host');
}

View File

@@ -254,7 +254,11 @@ class CreateEgg extends CreateRecord
->native(false)
->selectablePlaceholder(false)
->default('bash')
->options(['bash', 'ash', '/bin/bash'])
->options([
'bash' => 'bash',
'ash' => 'ash',
'/bin/bash' => '/bin/bash',
])
->required(),
MonacoEditor::make('script_install')
->label(trans('admin/egg.script_install'))

View File

@@ -243,7 +243,11 @@ class EditEgg extends EditRecord
->label(trans('admin/egg.script_entry'))
->native(false)
->selectablePlaceholder(false)
->options(['bash', 'ash', '/bin/bash'])
->options([
'bash' => 'bash',
'ash' => 'ash',
'/bin/bash' => '/bin/bash',
])
->required(),
MonacoEditor::make('script_install')
->label(trans('admin/egg.script_install'))

View File

@@ -62,7 +62,16 @@ class AllocationsRelationManager extends RelationManager
->label(trans('admin/node.table.allocation_notes'))
->placeholder(trans('admin/node.table.no_notes')),
SelectColumn::make('ip')
->options(fn (Allocation $allocation) => collect($this->getOwnerRecord()->ipAddresses())->merge([$allocation->ip])->mapWithKeys(fn (string $ip) => [$ip => $ip]))
->options(function (Allocation $allocation) {
$ips = Allocation::where('port', $allocation->port)->pluck('ip');
return collect($this->getOwnerRecord()->ipAddresses())
->diff($ips)
->unshift($allocation->ip)
->unique()
->mapWithKeys(fn (string $ip) => [$ip => $ip])
->all();
})
->selectablePlaceholder(false)
->searchable()
->label(trans('admin/node.table.ip')),

View File

@@ -110,7 +110,7 @@ class ListServers extends ListRecords
->poll('15s')
->columns($usingGrid ? $this->gridColumns() : $this->tableColumns())
->recordUrl(!$usingGrid ? (fn (Server $server) => Console::getUrl(panel: 'server', tenant: $server)) : null)
->actions(!$usingGrid ? ActionGroup::make(static::getPowerActions()) : [])
->actions(!$usingGrid ? ActionGroup::make(static::getPowerActions(view: 'table')) : [])
->actionsAlignment(Alignment::Center->value)
->contentGrid($usingGrid ? ['default' => 1, 'md' => 2] : null)
->emptyStateIcon('tabler-brand-docker')
@@ -221,40 +221,46 @@ class ListServers extends ListRecords
}
/** @return Action[]|ActionGroup[] */
public static function getPowerActions(): array
public static function getPowerActions(string $view): array
{
return [
ActionGroup::make([
Action::make('start')
->color('primary')
->icon('tabler-player-play-filled')
->authorize(fn (Server $server) => auth()->user()->can(Permission::ACTION_CONTROL_START, $server))
->visible(fn (Server $server) => !$server->isInConflictState() & $server->retrieveStatus()->isStartable())
->dispatch('powerAction', fn (Server $server) => ['server' => $server, 'action' => 'start']),
Action::make('restart')
->color('gray')
->icon('tabler-reload')
->authorize(fn (Server $server) => auth()->user()->can(Permission::ACTION_CONTROL_RESTART, $server))
->visible(fn (Server $server) => !$server->isInConflictState() & $server->retrieveStatus()->isRestartable())
->dispatch('powerAction', fn (Server $server) => ['server' => $server, 'action' => 'restart']),
Action::make('stop')
->color('danger')
->icon('tabler-player-stop-filled')
->authorize(fn (Server $server) => auth()->user()->can(Permission::ACTION_CONTROL_STOP, $server))
->visible(fn (Server $server) => !$server->isInConflictState() & $server->retrieveStatus()->isStoppable())
->dispatch('powerAction', fn (Server $server) => ['server' => $server, 'action' => 'stop']),
Action::make('kill')
->color('danger')
->icon('tabler-alert-square')
->tooltip('This can result in data corruption and/or data loss!')
->authorize(fn (Server $server) => auth()->user()->can(Permission::ACTION_CONTROL_STOP, $server))
->visible(fn (Server $server) => !$server->isInConflictState() & $server->retrieveStatus()->isKillable())
->dispatch('powerAction', fn (Server $server) => ['server' => $server, 'action' => 'kill']),
])
->icon(fn (Server $server) => $server->condition->getIcon())
->color(fn (Server $server) => $server->condition->getColor())
->tooltip(fn (Server $server) => $server->condition->getLabel())
->iconSize(IconSize::Large),
$actions = [
Action::make('start')
->color('primary')
->icon('tabler-player-play-filled')
->authorize(fn (Server $server) => auth()->user()->can(Permission::ACTION_CONTROL_START, $server))
->visible(fn (Server $server) => !$server->isInConflictState() & $server->retrieveStatus()->isStartable())
->dispatch('powerAction', fn (Server $server) => ['server' => $server, 'action' => 'start']),
Action::make('restart')
->color('gray')
->icon('tabler-reload')
->authorize(fn (Server $server) => auth()->user()->can(Permission::ACTION_CONTROL_RESTART, $server))
->visible(fn (Server $server) => !$server->isInConflictState() & $server->retrieveStatus()->isRestartable())
->dispatch('powerAction', fn (Server $server) => ['server' => $server, 'action' => 'restart']),
Action::make('stop')
->color('danger')
->icon('tabler-player-stop-filled')
->authorize(fn (Server $server) => auth()->user()->can(Permission::ACTION_CONTROL_STOP, $server))
->visible(fn (Server $server) => !$server->isInConflictState() & $server->retrieveStatus()->isStoppable())
->dispatch('powerAction', fn (Server $server) => ['server' => $server, 'action' => 'stop']),
Action::make('kill')
->color('danger')
->icon('tabler-alert-square')
->tooltip('This can result in data corruption and/or data loss!')
->authorize(fn (Server $server) => auth()->user()->can(Permission::ACTION_CONTROL_STOP, $server))
->visible(fn (Server $server) => !$server->isInConflictState() & $server->retrieveStatus()->isKillable())
->dispatch('powerAction', fn (Server $server) => ['server' => $server, 'action' => 'kill']),
];
if ($view === 'table') {
return $actions;
} else {
return [
ActionGroup::make($actions)
->icon('tabler-power')
->color('primary')
->tooltip('Power Actions')
->iconSize(IconSize::Large),
];
}
}
}

View File

@@ -0,0 +1,34 @@
<?php
namespace App\Filament\Components\Actions;
use App\Models\Permission;
use App\Models\Schedule;
use App\Models\Server;
use App\Services\Schedules\Sharing\ScheduleExporterService;
use Filament\Actions\Action;
use Filament\Facades\Filament;
class ExportScheduleAction extends Action
{
public static function getDefaultName(): ?string
{
return 'export';
}
protected function setUp(): void
{
parent::setUp();
/** @var Server $server */
$server = Filament::getTenant();
$this->label(trans('filament-actions::export.modal.actions.export.label'));
$this->authorize(fn () => auth()->user()->can(Permission::ACTION_SCHEDULE_READ, $server));
$this->action(fn (ScheduleExporterService $service, Schedule $schedule) => response()->streamDownload(function () use ($service, $schedule) {
echo $service->handle($schedule);
}, 'schedule-' . str($schedule->name)->kebab()->lower()->trim() . '.json'));
}
}

View File

@@ -0,0 +1,121 @@
<?php
namespace App\Filament\Components\Actions;
use App\Models\Permission;
use App\Models\Server;
use App\Services\Schedules\Sharing\ScheduleImporterService;
use Exception;
use Filament\Actions\Action;
use Filament\Facades\Filament;
use Filament\Forms\Components\FileUpload;
use Filament\Forms\Components\Repeater;
use Filament\Forms\Components\Tabs;
use Filament\Forms\Components\Tabs\Tab;
use Filament\Forms\Components\TextInput;
use Filament\Notifications\Notification;
use Illuminate\Support\Arr;
use Livewire\Features\SupportFileUploads\TemporaryUploadedFile;
class ImportScheduleAction extends Action
{
public static function getDefaultName(): ?string
{
return 'import';
}
protected function setUp(): void
{
parent::setUp();
/** @var Server $server */
$server = Filament::getTenant();
$this->label(trans('filament-actions::import.modal.actions.import.label'));
$this->authorize(fn () => auth()->user()->can(Permission::ACTION_SCHEDULE_CREATE, $server));
$this->form([
Tabs::make('Tabs')
->contained(false)
->tabs([
Tab::make(trans('admin/schedule.import.file'))
->icon('tabler-file-upload')
->schema([
FileUpload::make('files')
->label(trans('admin/schedule.model_label'))
->hint(trans('admin/schedule.import.schedule_help'))
->acceptedFileTypes(['application/json'])
->preserveFilenames()
->previewable(false)
->storeFiles(false)
->multiple(true),
]),
Tab::make(trans('admin/schedule.import.url'))
->icon('tabler-world-upload')
->schema([
Repeater::make('urls')
->label('')
->itemLabel(fn (array $state) => str($state['url'])->afterLast('/schedule-')->before('.json')->headline())
->hint(trans('admin/schedule.import.url_help'))
->addActionLabel(trans('admin/schedule.import.add_url'))
->grid(2)
->reorderable(false)
->addable(true)
->deletable(fn (array $state) => count($state) > 1)
->schema([
TextInput::make('url')
->live()
->label(trans('admin/schedule.import.url'))
->url()
->endsWith('.json')
->validationAttribute(trans('admin/schedule.import.url')),
]),
]),
]),
]);
$this->action(function (array $data, ScheduleImporterService $service) use ($server) {
$schedules = array_merge(collect($data['urls'])->flatten()->whereNotNull()->unique()->all(), Arr::wrap($data['files']));
if (empty($schedules)) {
return;
}
[$success, $failed] = [collect(), collect()];
foreach ($schedules as $schedule) {
if ($schedule instanceof TemporaryUploadedFile) {
$name = str($schedule->getClientOriginalName())->afterLast('schedule-')->before('.json')->headline();
$method = 'fromFile';
} else {
$schedule = str($schedule);
$schedule = $schedule->contains('github.com') ? $schedule->replaceFirst('blob', 'raw') : $schedule;
$name = $schedule->afterLast('/schedule-')->before('.json')->headline();
$method = 'fromUrl';
}
try {
$service->$method($schedule, $server);
$success->push($name);
} catch (Exception $exception) {
$failed->push($name);
report($exception);
}
}
if ($failed->count() > 0) {
Notification::make()
->title(trans('admin/schedule.import.import_failed'))
->body($failed->join(', '))
->danger()
->send();
}
if ($success->count() > 0) {
Notification::make()
->title(trans('admin/schedule.import.import_success'))
->body($success->join(', '))
->success()
->send();
}
});
}
}

View File

@@ -0,0 +1,53 @@
<?php
namespace App\Filament\Components\Forms\Actions;
use Filament\Forms\Components\Actions\Action;
use Filament\Forms\Get;
use Filament\Forms\Set;
class CronPresetAction extends Action
{
protected string $minute = '0';
protected string $hour = '0';
protected string $dayOfMonth = '*';
protected string $month = '*';
protected string $dayOfWeek = '*';
protected function setUp(): void
{
parent::setUp();
$this->disabled(fn (string $operation) => $operation === 'view');
$this->color(fn (Get $get) => $get('cron_minute') == $this->minute &&
$get('cron_hour') == $this->hour &&
$get('cron_day_of_month') == $this->dayOfMonth &&
$get('cron_month') == $this->month &&
$get('cron_day_of_week') == $this->dayOfWeek
? 'success' : 'primary');
$this->action(function (Set $set) {
$set('cron_minute', $this->minute);
$set('cron_hour', $this->hour);
$set('cron_day_of_month', $this->dayOfMonth);
$set('cron_month', $this->month);
$set('cron_day_of_week', $this->dayOfWeek);
});
}
public function cron(string $minute, string $hour, string $dayOfMonth, string $month, string $dayOfWeek): static
{
$this->minute = $minute;
$this->hour = $hour;
$this->dayOfMonth = $dayOfMonth;
$this->month = $month;
$this->dayOfWeek = $dayOfWeek;
return $this;
}
}

View File

@@ -139,7 +139,8 @@ class EditProfile extends BaseEditProfile
->live()
->default('en')
->selectablePlaceholder(false)
->helperText(fn ($state, LanguageService $languageService) => new HtmlString($languageService->isLanguageTranslated($state) ? '' : trans('profile.language_help', ['state' => $state])))
->helperText(fn ($state, LanguageService $languageService) => new HtmlString($languageService->isLanguageTranslated($state) ? ''
: trans('profile.language_help', ['state' => $state]) . ' <u><a href="https://crowdin.com/project/pelican-dev/">Update On Crowdin</a></u>'))
->options(fn (LanguageService $languageService) => $languageService->getAvailableLanguages())
->native(false),
FileUpload::make('avatar')
@@ -536,7 +537,7 @@ class EditProfile extends BaseEditProfile
return new HtmlString(<<<HTML
<style>
{$style}
{$style}
</style>
<span class="preview-text">The quick blue pelican jumps over the lazy pterodactyl. :)</span>
HTML);

View File

@@ -141,8 +141,12 @@ class Console extends Page
#[On('console-status')]
public function receivedConsoleUpdate(?string $state = null): void
{
/** @var Server $server */
$server = Filament::getTenant();
if ($state) {
$this->status = ContainerStatus::from($state);
cache()->put("servers.$server->uuid.status", $this->status, now()->addSeconds(15));
}
$this->cachedHeaderActions = [];

View File

@@ -3,6 +3,7 @@
namespace App\Filament\Server\Resources;
use App\Facades\Activity;
use App\Filament\Components\Forms\Actions\CronPresetAction;
use App\Filament\Components\Tables\Columns\DateTimeColumn;
use App\Filament\Server\Resources\ScheduleResource\Pages;
use App\Filament\Server\Resources\ScheduleResource\RelationManagers\TasksRelationManager;
@@ -18,13 +19,14 @@ use Carbon\Carbon;
use Exception;
use Filament\Facades\Filament;
use Filament\Forms\Components\Actions;
use Filament\Forms\Components\Actions\Action;
use Filament\Forms\Components\Group;
use Filament\Forms\Components\Section;
use Filament\Forms\Components\Select;
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Toggle;
use Filament\Forms\Components\ToggleButtons;
use Filament\Forms\Form;
use Filament\Forms\Get;
use Filament\Forms\Set;
use Filament\Notifications\Notification;
use Filament\Resources\Pages\PageRegistration;
@@ -38,6 +40,7 @@ use Filament\Tables\Columns\IconColumn;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\HtmlString;
class ScheduleResource extends Resource
{
@@ -77,20 +80,31 @@ class ScheduleResource extends Resource
{
return $form
->columns([
'default' => 4,
'lg' => 5,
'default' => 1,
'lg' => 2,
])
->schema([
TextInput::make('name')
->columnSpan([
'default' => 4,
'md' => 3,
'lg' => 4,
])
->columnSpanFull()
->label('Schedule Name')
->placeholder('A human readable identifier for this schedule.')
->autocomplete(false)
->required(),
Toggle::make('only_when_online')
->label('Only when Server is Online?')
->hintIconTooltip('Only execute this schedule when the server is in a running state.')
->hintIcon('tabler-question-mark')
->inline(false)
->required()
->default(1),
Toggle::make('is_active')
->label('Enable Schedule?')
->hintIconTooltip('This schedule will be executed automatically if enabled.')
->hintIcon('tabler-question-mark')
->inline(false)
->hiddenOn('view')
->required()
->default(1),
ToggleButtons::make('Status')
->formatStateUsing(fn (Schedule $schedule) => !$schedule->is_active ? 'inactive' : ($schedule->is_processing ? 'processing' : 'active'))
->options(fn (Schedule $schedule) => !$schedule->is_active ? ['inactive' => 'Inactive'] : ($schedule->is_processing ? ['processing' => 'Processing'] : ['active' => 'Active']))
@@ -99,117 +113,29 @@ class ScheduleResource extends Resource
'processing' => 'warning',
'active' => 'success',
])
->visibleOn('view')
->columnSpan([
'default' => 4,
'md' => 1,
'lg' => 1,
]),
Toggle::make('only_when_online')
->label('Only when Server is Online?')
->hintIconTooltip('Only execute this schedule when the server is in a running state.')
->hintIcon('tabler-question-mark')
->inline(false)
->columnSpan([
'default' => 2,
'lg' => 3,
])
->required()
->default(1),
Toggle::make('is_active')
->label('Enable Schedule?')
->hintIconTooltip('This schedule will be executed automatically if enabled.')
->hintIcon('tabler-question-mark')
->inline(false)
->columnSpan([
'default' => 2,
'lg' => 2,
])
->required()
->default(1),
TextInput::make('cron_minute')
->columnSpan([
'default' => 2,
'lg' => 1,
])
->label('Minute')
->default('*/5')
->required(),
TextInput::make('cron_hour')
->columnSpan([
'default' => 2,
'lg' => 1,
])
->label('Hour')
->default('*')
->required(),
TextInput::make('cron_day_of_month')
->columnSpan([
'default' => 2,
'lg' => 1,
])
->label('Day of Month')
->default('*')
->required(),
TextInput::make('cron_month')
->columnSpan([
'default' => 2,
'lg' => 1,
])
->label('Month')
->default('*')
->required(),
TextInput::make('cron_day_of_week')
->columnSpan([
'default' => 2,
'lg' => 1,
])
->label('Day of Week')
->default('*')
->required(),
Section::make('Presets')
->hiddenOn('view')
->columns(1)
->visibleOn('view'),
Section::make('Cron')
->description(fn (Get $get) => new HtmlString('Please keep in mind that the cron inputs below always assume UTC.<br>Next run in your timezone (' . auth()->user()->timezone . '): <b>'. Utilities::getScheduleNextRunDate($get('cron_minute'), $get('cron_hour'), $get('cron_day_of_month'), $get('cron_month'), $get('cron_day_of_week'))->timezone(auth()->user()->timezone) . '</b>'))
->schema([
Actions::make([
Action::make('hourly')
->disabled(fn (string $operation) => $operation === 'view')
->action(function (Set $set) {
$set('cron_minute', '0');
$set('cron_hour', '*');
$set('cron_day_of_month', '*');
$set('cron_month', '*');
$set('cron_day_of_week', '*');
}),
Action::make('daily')
->disabled(fn (string $operation) => $operation === 'view')
->action(function (Set $set) {
$set('cron_minute', '0');
$set('cron_hour', '0');
$set('cron_day_of_month', '*');
$set('cron_month', '*');
$set('cron_day_of_week', '*');
}),
Action::make('weekly')
->disabled(fn (string $operation) => $operation === 'view')
->action(function (Set $set) {
$set('cron_minute', '0');
$set('cron_hour', '0');
$set('cron_day_of_month', '*');
$set('cron_month', '*');
$set('cron_day_of_week', '0');
}),
Action::make('monthly')
->disabled(fn (string $operation) => $operation === 'view')
->action(function (Set $set) {
$set('cron_minute', '0');
$set('cron_hour', '0');
$set('cron_day_of_month', '1');
$set('cron_month', '*');
$set('cron_day_of_week', '0');
}),
Action::make('every_x_minutes')
->disabled(fn (string $operation) => $operation === 'view')
CronPresetAction::make('hourly')
->cron('0', '*', '*', '*', '*'),
CronPresetAction::make('daily')
->cron('0', '0', '*', '*', '*'),
CronPresetAction::make('weekly_monday')
->label('Weekly (Monday)')
->cron('0', '0', '*', '*', '1'),
CronPresetAction::make('weekly_sunday')
->label('Weekly (Sunday)')
->cron('0', '0', '*', '*', '0'),
CronPresetAction::make('monthly')
->cron('0', '0', '1', '*', '*'),
CronPresetAction::make('every_x_minutes')
->color(fn (Get $get) => str($get('cron_minute'))->startsWith('*/')
&& $get('cron_hour') == '*'
&& $get('cron_day_of_month') == '*'
&& $get('cron_month') == '*'
&& $get('cron_day_of_week') == '*' ? 'success' : 'primary')
->form([
TextInput::make('x')
->label('')
@@ -226,8 +152,12 @@ class ScheduleResource extends Resource
$set('cron_month', '*');
$set('cron_day_of_week', '*');
}),
Action::make('every_x_hours')
->disabled(fn (string $operation) => $operation === 'view')
CronPresetAction::make('every_x_hours')
->color(fn (Get $get) => $get('cron_minute') == '0'
&& str($get('cron_hour'))->startsWith('*/')
&& $get('cron_day_of_month') == '*'
&& $get('cron_month') == '*'
&& $get('cron_day_of_week') == '*' ? 'success' : 'primary')
->form([
TextInput::make('x')
->label('')
@@ -244,8 +174,12 @@ class ScheduleResource extends Resource
$set('cron_month', '*');
$set('cron_day_of_week', '*');
}),
Action::make('every_x_days')
->disabled(fn (string $operation) => $operation === 'view')
CronPresetAction::make('every_x_days')
->color(fn (Get $get) => $get('cron_minute') == '0'
&& $get('cron_hour') == '0'
&& str($get('cron_day_of_month'))->startsWith('*/')
&& $get('cron_month') == '*'
&& $get('cron_day_of_week') == '*' ? 'success' : 'primary')
->form([
TextInput::make('x')
->label('')
@@ -262,8 +196,12 @@ class ScheduleResource extends Resource
$set('cron_month', '*');
$set('cron_day_of_week', '*');
}),
Action::make('every_x_months')
->disabled(fn (string $operation) => $operation === 'view')
CronPresetAction::make('every_x_months')
->color(fn (Get $get) => $get('cron_minute') == '0'
&& $get('cron_hour') == '0'
&& $get('cron_day_of_month') == '1'
&& str($get('cron_month'))->startsWith('*/')
&& $get('cron_day_of_week') == '*' ? 'success' : 'primary')
->form([
TextInput::make('x')
->label('')
@@ -280,8 +218,12 @@ class ScheduleResource extends Resource
$set('cron_month', '*/' . $data['x']);
$set('cron_day_of_week', '*');
}),
Action::make('every_x_day_of_week')
->disabled(fn (string $operation) => $operation === 'view')
CronPresetAction::make('every_x_day_of_week')
->color(fn (Get $get) => $get('cron_minute') == '0'
&& $get('cron_hour') == '0'
&& $get('cron_day_of_month') == '*'
&& $get('cron_month') == '*'
&& $get('cron_day_of_week') != '*' ? 'success' : 'primary')
->form([
Select::make('x')
->label('')
@@ -305,7 +247,59 @@ class ScheduleResource extends Resource
$set('cron_month', '*');
$set('cron_day_of_week', $data['x']);
}),
]),
])
->hiddenOn('view'),
Group::make([
TextInput::make('cron_minute')
->columnSpan([
'default' => 2,
'lg' => 1,
])
->label('Minute')
->default('*/5')
->required()
->live(),
TextInput::make('cron_hour')
->columnSpan([
'default' => 2,
'lg' => 1,
])
->label('Hour')
->default('*')
->required()
->live(),
TextInput::make('cron_day_of_month')
->columnSpan([
'default' => 2,
'lg' => 1,
])
->label('Day of Month')
->default('*')
->required()
->live(),
TextInput::make('cron_month')
->columnSpan([
'default' => 2,
'lg' => 1,
])
->label('Month')
->default('*')
->required()
->live(),
TextInput::make('cron_day_of_week')
->columnSpan([
'default' => 2,
'lg' => 1,
])
->label('Day of Week')
->default('*')
->required()
->live(),
])
->columns([
'default' => 4,
'lg' => 5,
]),
]),
]);
}

View File

@@ -3,6 +3,7 @@
namespace App\Filament\Server\Resources\ScheduleResource\Pages;
use App\Facades\Activity;
use App\Filament\Components\Actions\ExportScheduleAction;
use App\Filament\Server\Resources\ScheduleResource;
use App\Models\Schedule;
use App\Traits\Filament\CanCustomizeHeaderActions;
@@ -50,6 +51,7 @@ class EditSchedule extends EditRecord
->property('name', $record->name)
->log();
}),
ExportScheduleAction::make(),
$this->getSaveFormAction()->formId('form')->label('Save'),
$this->getCancelFormAction()->formId('form'),
];

View File

@@ -2,6 +2,7 @@
namespace App\Filament\Server\Resources\ScheduleResource\Pages;
use App\Filament\Components\Actions\ImportScheduleAction;
use App\Filament\Server\Resources\ScheduleResource;
use App\Traits\Filament\CanCustomizeHeaderActions;
use App\Traits\Filament\CanCustomizeHeaderWidgets;
@@ -23,6 +24,7 @@ class ListSchedules extends ListRecords
return [
CreateAction::make()
->label('New Schedule'),
ImportScheduleAction::make(),
];
}

View File

@@ -36,7 +36,7 @@ class DatabaseHostController extends ApplicationApiController
*/
public function index(GetDatabaseHostRequest $request): array
{
$databases = QueryBuilder::for(DatabaseHost::query())
$databases = QueryBuilder::for(DatabaseHost::class)
->allowedFilters(['name', 'host'])
->allowedSorts(['id', 'name', 'host'])
->paginate($request->query('per_page') ?? 10);

View File

@@ -14,6 +14,12 @@ use App\Http\Requests\Api\Application\Mounts\StoreMountRequest;
use App\Http\Requests\Api\Application\Mounts\DeleteMountRequest;
use App\Http\Requests\Api\Application\Mounts\UpdateMountRequest;
use App\Exceptions\Service\HasActiveServersException;
use App\Http\Requests\Api\Application\Eggs\GetEggsRequest;
use App\Http\Requests\Api\Application\Nodes\GetNodesRequest;
use App\Http\Requests\Api\Application\Servers\GetServerRequest;
use App\Transformers\Api\Application\EggTransformer;
use App\Transformers\Api\Application\NodeTransformer;
use App\Transformers\Api\Application\ServerTransformer;
class MountController extends ApplicationApiController
{
@@ -26,7 +32,7 @@ class MountController extends ApplicationApiController
*/
public function index(GetMountRequest $request): array
{
$mounts = QueryBuilder::for(Mount::query())
$mounts = QueryBuilder::for(Mount::class)
->allowedFilters(['uuid', 'name'])
->allowedSorts(['id', 'uuid'])
->paginate($request->query('per_page') ?? 50);
@@ -113,6 +119,42 @@ class MountController extends ApplicationApiController
return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);
}
/**
* List assigned eggs
*
* @return array<array-key, mixed>
*/
public function getEggs(GetEggsRequest $request, Mount $mount): array
{
return $this->fractal->collection($mount->eggs)
->transformWith($this->getTransformer(EggTransformer::class))
->toArray();
}
/**
* List assigned nodes
*
* @return array<array-key, mixed>
*/
public function getNodes(GetNodesRequest $request, Mount $mount): array
{
return $this->fractal->collection($mount->nodes)
->transformWith($this->getTransformer(NodeTransformer::class))
->toArray();
}
/**
* List assigned servers
*
* @return array<array-key, mixed>
*/
public function getServers(GetServerRequest $request, Mount $mount): array
{
return $this->fractal->collection($mount->servers)
->transformWith($this->getTransformer(ServerTransformer::class))
->toArray();
}
/**
* Assign eggs to mount
*
@@ -123,13 +165,11 @@ class MountController extends ApplicationApiController
public function addEggs(Request $request, Mount $mount): array
{
$validatedData = $request->validate([
'eggs' => 'required|exists:eggs,id',
'eggs' => 'required|array|exists:eggs,id',
'eggs.*' => 'integer',
]);
$eggs = $validatedData['eggs'] ?? [];
if (count($eggs) > 0) {
$mount->eggs()->attach($eggs);
}
$mount->eggs()->attach($validatedData['eggs']);
return $this->fractal->item($mount)
->transformWith($this->getTransformer(MountTransformer::class))
@@ -137,7 +177,7 @@ class MountController extends ApplicationApiController
}
/**
* Assign mounts to mount
* Assign nodes to mount
*
* Adds nodes to the mount's many-to-many relation.
*
@@ -145,12 +185,33 @@ class MountController extends ApplicationApiController
*/
public function addNodes(Request $request, Mount $mount): array
{
$data = $request->validate(['nodes' => 'required|exists:nodes,id']);
$validatedData = $request->validate([
'nodes' => 'required|array|exists:nodes,id',
'nodes.*' => 'integer',
]);
$nodes = $data['nodes'] ?? [];
if (count($nodes) > 0) {
$mount->nodes()->attach($nodes);
}
$mount->nodes()->attach($validatedData['nodes']);
return $this->fractal->item($mount)
->transformWith($this->getTransformer(MountTransformer::class))
->toArray();
}
/**
* Assign servers to mount
*
* Adds servers to the mount's many-to-many relation.
*
* @return array<array-key, mixed>
*/
public function addServers(Request $request, Mount $mount): array
{
$validatedData = $request->validate([
'servers' => 'required|array|exists:servers,id',
'servers.*' => 'integer',
]);
$mount->servers()->attach($validatedData['servers']);
return $this->fractal->item($mount)
->transformWith($this->getTransformer(MountTransformer::class))
@@ -180,4 +241,16 @@ class MountController extends ApplicationApiController
return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);
}
/**
* Unassign server from mount
*
* Deletes a server from the mount's many-to-many relation.
*/
public function deleteServer(Mount $mount, int $server_id): JsonResponse
{
$mount->servers()->detach($server_id);
return new JsonResponse([], JsonResponse::HTTP_NO_CONTENT);
}
}

View File

@@ -39,7 +39,7 @@ class NodeController extends ApplicationApiController
*/
public function index(GetNodesRequest $request): array
{
$nodes = QueryBuilder::for(Node::query())
$nodes = QueryBuilder::for(Node::class)
->allowedFilters(['uuid', 'name', 'fqdn', 'daemon_token_id'])
->allowedSorts(['id', 'uuid', 'memory', 'disk', 'cpu'])
->paginate($request->query('per_page') ?? 50);

View File

@@ -25,7 +25,7 @@ class RoleController extends ApplicationApiController
*/
public function index(GetRoleRequest $request): array
{
$roles = QueryBuilder::for(Role::query())
$roles = QueryBuilder::for(Role::class)
->allowedFilters(['id', 'name'])
->allowedSorts(['id', 'name'])
->paginate($request->query('per_page') ?? 10);

View File

@@ -38,7 +38,7 @@ class ServerController extends ApplicationApiController
*/
public function index(GetServersRequest $request): array
{
$servers = QueryBuilder::for(Server::query())
$servers = QueryBuilder::for(Server::class)
->allowedFilters(['uuid', 'uuid_short', 'name', 'description', 'image', 'external_id'])
->allowedSorts(['id', 'uuid'])
->paginate($request->query('per_page') ?? 50);

View File

@@ -41,7 +41,7 @@ class UserController extends ApplicationApiController
*/
public function index(GetUsersRequest $request): array
{
$users = QueryBuilder::for(User::query())
$users = QueryBuilder::for(User::class)
->allowedFilters(['email', 'uuid', 'username', 'external_id'])
->allowedSorts(['id', 'uuid'])
->paginate($request->query('per_page') ?? 50);

View File

@@ -11,6 +11,8 @@ use App\Models\Filters\MultiFieldServerFilter;
use App\Transformers\Api\Client\ServerTransformer;
use App\Http\Requests\Api\Client\GetServersRequest;
use Dedoc\Scramble\Attributes\Group;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
#[Group('Base')]
class ClientController extends ClientApiController
@@ -36,10 +38,11 @@ class ClientController extends ClientApiController
$user = $request->user();
$transformer = $this->getTransformer(ServerTransformer::class);
/** @var Builder<Model> $query */
$query = Server::query()->with($this->getIncludesForTransformer($transformer, ['node']));
// Start the query builder and ensure we eager load any requested relationships from the request.
$builder = QueryBuilder::for(
Server::query()->with($this->getIncludesForTransformer($transformer, ['node']))
)->allowedFilters([
$builder = QueryBuilder::for($query)->allowedFilters([
'uuid',
'name',
'description',

View File

@@ -138,15 +138,7 @@ class SubuserController extends ClientApiController
*/
protected function getDefaultPermissions(Request $request): array
{
$allowed = Permission::permissions()
->map(function ($value, $prefix) {
return array_map(function ($value) use ($prefix) {
return "$prefix.$value";
}, array_keys($value['keys']));
})
->flatten()
->all();
$allowed = Permission::permissionKeys()->all();
$cleaned = array_intersect($request->input('permissions') ?? [], $allowed);
return array_unique(array_merge($cleaned, [Permission::ACTION_WEBSOCKET_CONNECT]));

View File

@@ -1,39 +0,0 @@
<?php
namespace App\Http\Middleware;
use App\Extensions\Captcha\CaptchaService;
use Closure;
use Illuminate\Foundation\Application;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use App\Events\Auth\FailedCaptcha;
use Symfony\Component\HttpKernel\Exception\HttpException;
readonly class VerifyCaptcha
{
public function __construct(private Application $app) {}
public function handle(Request $request, Closure $next, CaptchaService $captchaService): mixed
{
if ($this->app->isLocal()) {
return $next($request);
}
$schemas = $captchaService->getActiveSchemas();
foreach ($schemas as $schema) {
$response = $schema->validateResponse();
if ($response['success'] && $schema->verifyDomain($response['hostname'] ?? '', $request->url())) {
return $next($request);
}
event(new FailedCaptcha($request->ip(), $response['message'] ?? null));
throw new HttpException(Response::HTTP_BAD_REQUEST, "Failed to validate {$schema->getId()} captcha data.");
}
// No captcha enabled
return $next($request);
}
}

View File

@@ -55,6 +55,7 @@ class StoreServerRequest extends ApplicationApiRequest
// Automatic deployment rules
'deploy' => 'sometimes|required|array',
// Locations are deprecated, use tags
'deploy.locations' => 'sometimes|array',
'deploy.locations.*' => 'required_with:deploy.locations|integer|min:1',
'deploy.tags' => 'array',
@@ -176,7 +177,6 @@ class StoreServerRequest extends ApplicationApiRequest
$object->setDedicated($this->input('deploy.dedicated_ip', false));
$object->setTags($this->input('deploy.tags', $this->input('deploy.locations', [])));
$object->setPorts($this->input('deploy.port_range', []));
$object->setNode($this->input('deploy.node_id'));
return $object;
}

View File

@@ -22,7 +22,8 @@ class SendPowerRequest extends ClientApiRequest
return Permission::ACTION_CONTROL_RESTART;
}
return '__invalid';
// Fallback for invalid signals
return Permission::ACTION_WEBSOCKET_CONNECT;
}
/**

View File

@@ -8,6 +8,10 @@ use Illuminate\Auth\Events\Login;
class AuthenticationListener
{
private const PROTECTED_FIELDS = [
'password', 'token', 'secret',
];
/**
* Handles an authentication event by logging the user and information about
* the request.
@@ -22,7 +26,9 @@ class AuthenticationListener
if ($event instanceof Failed) {
foreach ($event->credentials as $key => $value) {
$activity = $activity->property($key, $value);
if (!in_array($key, self::PROTECTED_FIELDS, true)) {
$activity = $activity->property($key, $value);
}
}
}

View File

@@ -2,12 +2,8 @@
namespace App\Models\Objects;
use App\Models\Node;
class DeploymentObject
{
private ?Node $node = null;
private bool $dedicated = false;
/** @var string[] */
@@ -16,18 +12,6 @@ class DeploymentObject
/** @var array<int|string> */
private array $ports = [];
public function getNode(): ?Node
{
return $this->node;
}
public function setNode(Node $node): self
{
$this->node = $node;
return $this;
}
public function isDedicated(): bool
{
return $this->dedicated;

View File

@@ -211,4 +211,11 @@ class Permission extends Model implements Validatable
return collect($permissions);
}
public static function permissionKeys(): Collection
{
return static::permissions()
->map(fn ($value, $prefix) => array_map(fn ($value) => "$prefix.$value", array_keys($value['keys'])))
->flatten();
}
}

View File

@@ -2,6 +2,7 @@
namespace App\Policies;
use App\Models\Permission;
use App\Models\Server;
use App\Models\User;
@@ -21,15 +22,17 @@ class ServerPolicy
return null;
}
// Owner has full server permissions
if ($server->owner_id === $user->id) {
return true;
}
if (Permission::permissionKeys()->contains($ability)) {
// Owner has full server permissions
if ($server->owner_id === $user->id) {
return true;
}
$subuser = $server->subusers->where('user_id', $user->id)->first();
// If the user is a subuser check their permissions
if ($subuser && in_array($ability, $subuser->permissions)) {
return true;
$subuser = $server->subusers->where('user_id', $user->id)->first();
// If the user is a subuser check their permissions
if ($subuser && in_array($ability, $subuser->permissions)) {
return true;
}
}
// Make sure user can target node of the server

View File

@@ -52,11 +52,11 @@ class AdminPanelProvider extends PanelProvider
->sort(24),
])
->navigationGroups([
NavigationGroup::make(trans('admin/dashboard.server'))
NavigationGroup::make(fn () => trans('admin/dashboard.server'))
->collapsible(false),
NavigationGroup::make(trans('admin/dashboard.user'))
NavigationGroup::make(fn () => trans('admin/dashboard.user'))
->collapsible(false),
NavigationGroup::make(trans('admin/dashboard.advanced')),
NavigationGroup::make(fn () => trans('admin/dashboard.advanced')),
])
->sidebarCollapsibleOnDesktop()
->discoverResources(in: app_path('Filament/Admin/Resources'), for: 'App\\Filament\\Admin\\Resources')

View File

@@ -0,0 +1,39 @@
<?php
namespace App\Services\Schedules\Sharing;
use App\Models\Schedule;
use App\Models\Task;
class ScheduleExporterService
{
public function handle(Schedule|int $schedule): string
{
if (!$schedule instanceof Schedule) {
$schedule = Schedule::findOrFail($schedule);
}
$data = [
'name' => $schedule->name,
'is_active' => $schedule->is_active,
'only_when_online' => $schedule->only_when_online,
'cron_minute' => $schedule->cron_minute,
'cron_hour' => $schedule->cron_hour,
'cron_day_of_month' => $schedule->cron_day_of_month,
'cron_month' => $schedule->cron_month,
'cron_day_of_week' => $schedule->cron_day_of_week,
'tasks' => $schedule->tasks->map(function (Task $task) {
return [
'sequence_id' => $task->sequence_id,
'action' => $task->action,
'payload' => $task->payload,
'time_offset' => $task->time_offset,
'continue_on_failure' => $task->continue_on_failure,
];
}),
];
return json_encode($data, JSON_PRETTY_PRINT);
}
}

View File

@@ -0,0 +1,78 @@
<?php
namespace App\Services\Schedules\Sharing;
use App\Exceptions\Service\InvalidFileUploadException;
use App\Helpers\Utilities;
use Illuminate\Support\Arr;
use Illuminate\Http\UploadedFile;
use App\Models\Schedule;
use App\Models\Server;
use App\Models\Task;
use Illuminate\Database\ConnectionInterface;
use Spatie\TemporaryDirectory\TemporaryDirectory;
class ScheduleImporterService
{
public function __construct(protected ConnectionInterface $connection) {}
public function fromFile(UploadedFile $file, Server $server): Schedule
{
if ($file->getError() !== UPLOAD_ERR_OK) {
throw new InvalidFileUploadException('The selected file was not uploaded successfully');
}
try {
$parsed = json_decode($file->getContent(), true, 512, JSON_THROW_ON_ERROR);
} catch (\JsonException $exception) {
throw new InvalidFileUploadException('Could not read JSON file: ' . $exception->getMessage());
}
return $this->connection->transaction(function () use ($server, $parsed) {
$minute = Arr::get($parsed, 'cron_minute', '0');
$hour = Arr::get($parsed, 'cron_hour', '0');
$dayOfMonth = Arr::get($parsed, 'cron_day_of_month', '*');
$month = Arr::get($parsed, 'cron_month', '*');
$dayOfWeek = Arr::get($parsed, 'cron_day_of_week', '*');
$schedule = Schedule::create([
'server_id' => $server->id,
'name' => Arr::get($parsed, 'name'),
'is_active' => Arr::get($parsed, 'is_active'),
'only_when_online' => Arr::get($parsed, 'only_when_online'),
'cron_minute' => $minute,
'cron_hour' => $hour,
'cron_day_of_month' => $dayOfMonth,
'cron_month' => $month,
'cron_day_of_week' => $dayOfWeek,
'next_run_at' => Utilities::getScheduleNextRunDate($minute, $hour, $dayOfMonth, $month, $dayOfWeek),
]);
foreach (Arr::get($parsed, 'tasks', []) as $task) {
Task::create([
'schedule_id' => $schedule->id,
'sequence_id' => Arr::get($task, 'sequence_id'),
'action' => Arr::get($task, 'action'),
'payload' => Arr::get($task, 'payload'),
'time_offset' => Arr::get($task, 'time_offset'),
'continue_on_failure' => Arr::get($task, 'continue_on_failure'),
]);
}
return $schedule;
});
}
public function fromUrl(string $url, Server $server): Schedule
{
$info = pathinfo($url);
$tmpDir = TemporaryDirectory::make()->deleteWhenDestroyed();
$tmpPath = $tmpDir->path($info['basename']);
if (!file_put_contents($tmpPath, file_get_contents($url))) {
throw new InvalidFileUploadException('Could not write temporary file.');
}
return $this->fromFile(new UploadedFile($tmpPath, $info['basename'], 'application/json'), $server);
}
}

View File

@@ -67,19 +67,35 @@ class ServerCreationService
$data['image'] = $data['image'] ?? collect($egg->docker_images)->first();
$data['startup'] = $data['startup'] ?? $egg->startup;
// If a deployment object has been passed we need to get the allocation
// that the server should use, and assign the node from that allocation.
// If a deployment object has been passed we need to get the allocation and node that the server should use.
if ($deployment) {
$allocation = $this->configureDeployment($data, $deployment);
$nodes = $this->findViableNodesService->handle(
Arr::get($data, 'memory', 0),
Arr::get($data, 'disk', 0),
Arr::get($data, 'cpu', 0),
$deployment->getTags(),
)->pluck('id');
if ($nodes->isEmpty()) {
throw new NoViableNodeException(trans('exceptions.deployment.no_viable_nodes'));
}
$ports = $deployment->getPorts();
if (!empty($ports)) {
$allocation = $this->allocationSelectionService->setDedicated($deployment->isDedicated())
->setNodes($nodes->toArray())
->setPorts($ports)
->handle();
if ($allocation) {
$data['allocation_id'] = $allocation->id;
// Auto-configure the node based on the selected allocation
// if no node was defined.
$data['node_id'] = $allocation->node_id;
}
$data['node_id'] ??= $deployment->getNode()->id;
if (empty($data['node_id'])) {
$data['node_id'] = $nodes->first();
}
}
Assert::false(empty($data['node_id']), 'Expected a non-empty node_id in server creation data.');
$eggVariableData = $this->validatorService
@@ -118,39 +134,6 @@ class ServerCreationService
return $server;
}
/**
* Gets an allocation to use for automatic deployment.
*
* @param array{memory?: ?int, disk?: ?int, cpu?: ?int, tags?: ?string[]} $data
*
* @throws \App\Exceptions\Service\Deployment\NoViableAllocationException
* @throws \App\Exceptions\Service\Deployment\NoViableNodeException
*/
private function configureDeployment(array $data, DeploymentObject $deployment): ?Allocation
{
$nodes = $this->findViableNodesService->handle(
Arr::get($data, 'memory', 0),
Arr::get($data, 'disk', 0),
Arr::get($data, 'cpu', 0),
$deployment->getTags(),
);
$availableNodes = $nodes->pluck('id');
if ($availableNodes->isEmpty()) {
throw new NoViableNodeException(trans('exceptions.deployment.no_viable_nodes'));
}
if (!$deployment->getPorts()) {
return null;
}
return $this->allocationSelectionService->setDedicated($deployment->isDedicated())
->setNodes($availableNodes->toArray())
->setPorts($deployment->getPorts())
->handle();
}
/**
* Store the server in the database and return the model.
*

View File

@@ -36,7 +36,7 @@ class VariableValidatorService
$data = $rules = $customAttributes = [];
foreach ($variables as $variable) {
$data['environment'][$variable->env_variable] = array_get($fields, $variable->env_variable);
$data['environment'][$variable->env_variable] = $fields[$variable->env_variable] ?? $variable->default_value;
$rules['environment.' . $variable->env_variable] = $variable->rules;
$customAttributes['environment.' . $variable->env_variable] = trans('validation.internal.variable_value', ['env' => $variable->name]);
}

View File

@@ -7,15 +7,16 @@ use Ramsey\Uuid\Uuid;
use App\Models\User;
use Illuminate\Contracts\Hashing\Hasher;
use Illuminate\Database\ConnectionInterface;
use Illuminate\Contracts\Auth\PasswordBroker;
use App\Notifications\AccountCreated;
use Filament\Facades\Filament;
use Illuminate\Auth\Passwords\PasswordBroker;
use Illuminate\Support\Facades\Password;
class UserCreationService
{
public function __construct(
private readonly ConnectionInterface $connection,
private readonly Hasher $hasher,
private readonly PasswordBroker $passwordBroker,
) {}
/**
@@ -51,7 +52,9 @@ class UserCreationService
}
if (isset($generateResetToken)) {
$token = $this->passwordBroker->createToken($user);
/** @var PasswordBroker $broker */
$broker = Password::broker(Filament::getPanel('app')->getAuthPasswordBroker());
$token = $broker->createToken($user);
}
$this->connection->commit();

View File

@@ -44,7 +44,6 @@ return Application::configure(basePath: dirname(__DIR__))
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'node.maintenance' => \App\Http\Middleware\MaintenanceMiddleware::class,
'captcha' => \App\Http\Middleware\VerifyCaptcha::class,
]);
})
->withSingletons([

View File

@@ -17,7 +17,7 @@
"doctrine/dbal": "~3.6.0",
"filament/filament": "^3.3",
"guzzlehttp/guzzle": "^7.9",
"laravel/framework": "^12.19",
"laravel/framework": "^12.20",
"laravel/helpers": "^1.7",
"laravel/sanctum": "^4.1",
"laravel/socialite": "^5.21",
@@ -104,4 +104,4 @@
},
"minimum-stability": "stable",
"prefer-stable": true
}
}

495
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -16,4 +16,6 @@ return [
'report_all' => env('APP_REPORT_ALL_EXCEPTIONS', false),
],
'fallback_locale' => 'en',
];

View File

@@ -0,0 +1,29 @@
<?php
use App\Models\Node;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
DB::transaction(function () {
$nodes = Node::where('behind_proxy', false)->get();
foreach ($nodes as $node) {
$node->update(['daemon_connect' => $node->daemon_listen]);
}
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
// Not needed
}
};

View File

@@ -0,0 +1,29 @@
<?php
use App\Models\ActivityLog;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\DB;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
DB::transaction(function () {
$logs = ActivityLog::where('event', 'auth:fail')->get();
foreach ($logs as $log) {
$log->update(['properties' => collect($log->properties)->except(['password'])->toArray()]);
}
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
// Not needed
}
};

122
lang/ar/activity.php Normal file
View File

@@ -0,0 +1,122 @@
<?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' => 'إعادة تعيين كلمة المرور',
'checkpoint' => 'تم طلب المصادقة الثنائية',
'recovery-token' => 'تم استخدام رمز استعادة المصادقة الثنائية',
'token' => 'تم حل تحدي المصادقة الثنائية',
'ip-blocked' => 'تم حظر الطلب من عنوان IP غير مدرج لـ <b>:identifier</b>',
'sftp' => [
'fail' => 'فشل تسجيل الدخول عبر SFTP',
],
],
'user' => [
'account' => [
'email-changed' => 'تم تغيير البريد الإلكتروني من <b>:old</b> إلى <b>:new</b>',
'password-changed' => 'تم تغيير كلمة المرور',
],
'api-key' => [
'create' => 'تم إنشاء مفتاح API جديد <b>:identifier</b>',
'delete' => 'تم حذف مفتاح API <b>:identifier</b>',
],
'ssh-key' => [
'create' => 'تمت إضافة مفتاح SSH <b>:fingerprint</b> إلى الحساب',
'delete' => 'تمت إزالة مفتاح SSH <b>:fingerprint</b> من الحساب',
],
'two-factor' => [
'create' => 'تم تمكين المصادقة الثنائية',
'delete' => 'تم تعطيل المصادقة الثنائية',
],
],
'server' => [
'console' => [
'command' => 'تم تنفيذ الأمر "<b>:command</b>" على الخادم',
],
'power' => [
'start' => 'تم تشغيل الخادم',
'stop' => 'تم إيقاف الخادم',
'restart' => 'تم إعادة تشغيل الخادم',
'kill' => 'تم إنهاء عملية الخادم',
],
'backup' => [
'download' => 'تم تنزيل النسخة الاحتياطية <b>:name</b>',
'delete' => 'تم حذف النسخة الاحتياطية <b>:name</b>',
'restore' => 'تمت استعادة النسخة الاحتياطية <b>:name</b> (تم حذف الملفات: <b>:truncate</b>)',
'restore-complete' => 'تمت استعادة النسخة الاحتياطية <b>:name</b> بنجاح',
'restore-failed' => 'فشلت استعادة النسخة الاحتياطية <b>:name</b>',
'start' => 'تم بدء نسخة احتياطية جديدة <b>:name</b>',
'complete' => 'تم تمييز النسخة الاحتياطية <b>:name</b> كمكتملة',
'fail' => 'تم تمييز النسخة الاحتياطية <b>:name</b> كفاشلة',
'lock' => 'تم قفل النسخة الاحتياطية <b>:name</b>',
'unlock' => 'تم فك قفل النسخة الاحتياطية <b>:name</b>',
],
'database' => [
'create' => 'تم إنشاء قاعدة بيانات جديدة <b>:name</b>',
'rotate-password' => 'تم تغيير كلمة مرور قاعدة البيانات <b>:name</b>',
'delete' => 'تم حذف قاعدة البيانات <b>:name</b>',
],
'file' => [
'compress' => 'تم ضغط <b>:directory:files</b>|تم ضغط <b>:count</b> ملفات في <b>:directory</b>',
'read' => 'تم عرض محتوى <b>:file</b>',
'copy' => 'تم إنشاء نسخة من <b>:file</b>',
'create-directory' => 'تم إنشاء المجلد <b>:directory:name</b>',
'decompress' => 'تم فك ضغط <b>:file</b> في <b>:directory</b>',
'delete' => 'تم حذف <b>:directory:files</b>|تم حذف <b>:count</b> ملفات في <b>:directory</b>',
'download' => 'تم تنزيل <b>:file</b>',
'pull' => 'تم تنزيل ملف عن بعد من <b>:url</b> إلى <b>:directory</b>',
'rename' => 'تم نقل/إعادة تسمية <b>:from</b> إلى <b>:to</b>|تم نقل/إعادة تسمية <b>:count</b> ملفات في <b>:directory</b>',
'write' => 'تمت كتابة محتوى جديد إلى <b>:file</b>',
'upload' => 'تم بدء رفع ملف',
'uploaded' => 'تم رفع <b>:directory:file</b>',
],
'sftp' => [
'denied' => 'تم حظر الوصول إلى SFTP بسبب الأذونات',
'create' => 'تم إنشاء <b>:files</b>|تم إنشاء <b>:count</b> ملفات جديدة',
'write' => 'تم تعديل محتوى <b>:files</b>|تم تعديل محتوى <b>:count</b> ملفات',
'delete' => 'تم حذف <b>:files</b>|تم حذف <b>:count</b> ملفات',
'create-directory' => 'تم إنشاء المجلد <b>:files</b>|تم إنشاء <b>:count</b> مجلدات',
'rename' => 'تمت إعادة تسمية <b>:from</b> إلى <b>:to</b>|تمت إعادة تسمية أو نقل <b>:count</b> ملفات',
],
'allocation' => [
'create' => 'تمت إضافة <b>:allocation</b> إلى الخادم',
'notes' => 'تم تحديث الملاحظات لـ <b>:allocation</b> من "<b>:old</b>" إلى "<b>:new</b>"',
'primary' => 'تم تعيين <b>:allocation</b> كالتخصيص الأساسي للخادم',
'delete' => 'تم حذف التخصيص <b>:allocation</b>',
],
'schedule' => [
'create' => 'تم إنشاء الجدولة <b>:name</b>',
'update' => 'تم تحديث الجدولة <b>:name</b>',
'execute' => 'تم تنفيذ الجدولة <b>:name</b> يدويًا',
'delete' => 'تم حذف الجدولة <b>:name</b>',
],
'task' => [
'create' => 'تم إنشاء مهمة جديدة "<b>:action</b>" لجدولة <b>:name</b>',
'update' => 'تم تحديث المهمة "<b>:action</b>" لجدولة <b>:name</b>',
'delete' => 'تم حذف "<b>:action</b>" لمهمة الجدول <b>:name</b>',
],
'settings' => [
'rename' => 'تمت إعادة تسمية الخادم من "<b>:old</b>" إلى "<b>:new</b>"',
'description' => 'تم تغيير وصف الخادم من "<b>:old</b>" إلى "<b>:new</b>"',
'reinstall' => 'تم إعادة تثبيت الخادم',
],
'startup' => [
'edit' => 'تم تغيير المتغير <b>:variable</b> من "<b>:old</b>" إلى "<b>:new</b>"',
'image' => 'تم تحديث صورة Docker للخادم من <b>:old</b> إلى <b>:new</b>',
],
'subuser' => [
'create' => 'تمت إضافة <b>:email</b> كمستخدم فرعي',
'update' => 'تم تحديث أذونات المستخدم الفرعي <b>:email</b>',
'delete' => 'تمت إزالة <b>:email</b> كمستخدم فرعي',
],
'crashed' => 'تعطل الخادم',
],
];

27
lang/ar/admin/apikey.php Normal file
View File

@@ -0,0 +1,27 @@
<?php
return [
'title' => 'مفاتيح API للتطبيق',
'empty_table' => 'لا توجد مفاتيح API.',
'whitelist' => 'عناوين IPv4 المسموح بها',
'whitelist_help' => 'يمكن تقييد مفاتيح API بحيث تعمل فقط من عناوين IPv4 محددة. أدخل كل عنوان في سطر جديد.',
'whitelist_placeholder' => 'مثال: 127.0.0.1 أو 192.168.1.1',
'description' => 'الوصف',
'description_help' => 'وصف موجز لاستخدام هذا المفتاح.',
'nav_title' => 'مفاتيح API',
'model_label' => 'مفتاح API للتطبيق',
'model_label_plural' => 'مفاتيح API للتطبيق',
'table' => [
'key' => 'المفتاح',
'description' => 'الوصف',
'last_used' => 'آخر استخدام',
'created' => 'تم الإنشاء',
'created_by' => 'تم الإنشاء بواسطة',
'never_used' => 'لم يُستخدم أبدًا',
],
'permissions' => [
'none' => 'لا شيء',
'read' => 'قراءة',
'read_write' => 'قراءة وكتابة',
],
];

View File

@@ -0,0 +1,44 @@
<?php
return [
'heading' => 'مرحبًا بك في Pelican!',
'version' => 'الإصدار: :version',
'advanced' => 'متقدم',
'server' => 'الخادم',
'user' => 'المستخدم',
'sections' => [
'intro-developers' => [
'heading' => 'معلومات للمطورين',
'content' => 'شكرًا لك على تجربة الإصدار التجريبي!',
'extra_note' => 'إذا واجهت أي مشاكل، يرجى الإبلاغ عنها على GitHub.',
'button_issues' => 'إنشاء مشكلة',
'button_features' => 'مناقشة الميزات',
],
'intro-update-available' => [
'heading' => 'تحديث متاح',
'content' => ':latestVersion متوفر الآن! اقرأ وثائقنا لتحديث اللوحة الخاصة بك.',
],
'intro-no-update' => [
'heading' => 'لوحتك محدثة',
'content' => 'أنت تستخدم حاليًا الإصدار :version. لوحتك محدثة بالكامل!',
],
'intro-first-node' => [
'heading' => 'لم يتم اكتشاف أي عقد',
'content' => 'يبدو أنه لم يتم إعداد أي عقد حتى الآن، لكن لا تقلق، يمكنك النقر على زر الإجراء لإنشاء العقدة الأولى!',
'extra_note' => 'إذا واجهت أي مشاكل، يرجى الإبلاغ عنها على GitHub.',
'button_label' => 'إنشاء العقدة الأولى في Pelican',
],
'intro-support' => [
'heading' => 'دعم Pelican',
'content' => 'شكرًا لاستخدامك Pelican، لقد تحقق هذا بفضل دعمك، ودعم المساهمين، وبقية داعمينا!',
'extra_note' => 'نقدر أي نوع من الدعم من الجميع.',
'button_translate' => 'المساعدة في الترجمة',
'button_donate' => 'التبرع مباشرة',
],
'intro-help' => [
'heading' => 'بحاجة إلى مساعدة؟',
'content' => 'تحقق من الوثائق أولًا! إذا كنت لا تزال بحاجة إلى المساعدة، انضم إلى خادم الديسكورد الخاص بنا!',
'button_docs' => 'قراءة الوثائق',
],
],
];

View File

@@ -0,0 +1,73 @@
<?php
return [
'nav_title' => 'مضيفو قواعد البيانات',
'model_label' => 'مضيف قاعدة بيانات',
'model_label_plural' => 'مضيفو قواعد البيانات',
'table' => [
'database' => 'قاعدة البيانات',
'name' => 'الاسم',
'host' => 'المضيف',
'port' => 'المنفذ',
'name_helper' => 'ترك هذا الحقل فارغًا سيؤدي إلى إنشاء اسم عشوائي تلقائيًا',
'username' => 'اسم المستخدم',
'password' => 'كلمة المرور',
'remote' => 'الاتصالات من',
'remote_helper' => 'المكان الذي يجب السماح بالاتصالات منه. اتركه فارغًا للسماح بالاتصالات من أي مكان.',
'max_connections' => 'الحد الأقصى للاتصالات',
'created_at' => 'تم الإنشاء في',
'connection_string' => 'سلسلة اتصال JDBC',
],
'error' => 'خطأ في الاتصال بالمضيف',
'host' => 'المضيف',
'host_help' => 'عنوان IP أو اسم النطاق الذي يجب استخدامه عند محاولة الاتصال بهذا المضيف MySQL من هذه اللوحة لإنشاء قواعد بيانات جديدة.',
'port' => 'المنفذ',
'port_help' => 'المنفذ الذي يعمل عليه MySQL لهذا المضيف.',
'max_database' => 'الحد الأقصى لعدد قواعد البيانات',
'max_databases_help' => 'الحد الأقصى لعدد قواعد البيانات التي يمكن إنشاؤها على هذا المضيف. إذا تم الوصول إلى الحد، فلن يمكن إنشاء قواعد بيانات جديدة على هذا المضيف. اتركه فارغًا ليكون غير محدود.',
'display_name' => 'اسم العرض',
'display_name_help' => 'عنوان IP أو اسم المجال الذي يجب أن يظهر للمستخدم النهائي.',
'username' => 'اسم المستخدم',
'username_help' => 'اسم المستخدم لحساب لديه أذونات كافية لإنشاء مستخدمين جدد وقواعد بيانات على النظام.',
'password' => 'كلمة المرور',
'password_help' => 'كلمة المرور الخاصة بمستخدم قاعدة البيانات.',
'linked_nodes' => 'العقد المرتبطة',
'linked_nodes_help' => 'يكون هذا الإعداد افتراضيًا فقط لهذا المضيف عند إضافة قاعدة بيانات إلى خادم على العقدة المحددة.',
'connection_error' => 'خطأ في الاتصال بمضيف قاعدة البيانات',
'no_database_hosts' => 'لا توجد مضيفات قواعد بيانات',
'no_nodes' => 'لا توجد عقد',
'delete_help' => 'مضيف قاعدة البيانات يحتوي على قواعد بيانات',
'unlimited' => 'غير محدود',
'anywhere' => 'في أي مكان',
'rotate' => 'تدوير',
'rotate_password' => 'تدوير كلمة المرور',
'rotated' => 'تم تدوير كلمة المرور',
'rotate_error' => 'فشل تدوير كلمة المرور',
'databases' => 'قواعد البيانات',
'setup' => [
'preparations' => 'التحضيرات',
'database_setup' => 'إعداد قاعدة البيانات',
'panel_setup' => 'إعداد اللوحة',
'note' => 'حالياً، يتم دعم قواعد البيانات MySQL/MariaDB فقط لمضيفي قاعدة البيانات!',
'different_server' => 'هل اللوحة وقاعدة البيانات <i>ليسا</i> على نفس الخادم؟',
'database_user' => 'مستخدم قاعدة البيانات',
'cli_login' => 'استخدم <code>mysql -u root -p</code> للوصول إلى mysql cli.',
'command_create_user' => 'الأمر لإنشاء المستخدم',
'command_assign_permissions' => 'الأمر لتعيين الصلاحيات',
'cli_exit' => 'للخروج من mysql cli عليك تشغيل الأمر <code>exit</code>.',
'external_access' => 'الوصول الخارجي',
'allow_external_access' => '
<p>من المحتمل أنك ستحتاج إلى السماح بالوصول الخارجي إلى قاعدة البيانات MySQL حتى تتمكن الخوادم من الاتصال به.</p>
<br>
<p>لتفعل ذلك، عليك فتح الملف<code>my.cnf</code>، الذي يختلف مكانه اعتمادا على نظام التشغيل وكيفية تثبيت قاعدة البيانات MYSQL، يمكنك كتابة <code>/etc -iname my.cnf</code> لتجده</p>
<br>
<p>افتح الملف <code>my.cnf</code>، اضف النص المشار عليه في الأسفل إلى نهاية الملف ثم قم بحفظه:<br>
<code>[mysqld]<br>bind-address=0.0.0.0</code></p>
<br>
<p>أعد تشغيل MySQL/ MariaDB لتطبيق هذه التغيرات، هذا سيتجاوز إعدادات MySQL الافتراضية، التي في الافتراضي تقبل الطلبات فقط من الجهاز المحلي، تحديث هذا سيسمح بالاتصالات على جميع الواجهات، وبالتالي الاتصالات الخارجية، تأكد من السماح لمنفذ MySQL (الافتراضي 3306) في جدار الحماية الخاص بك.</p> ',
],
];

60
lang/ar/admin/health.php Normal file
View File

@@ -0,0 +1,60 @@
<?php
return [
'title' => 'الصحة',
'results_refreshed' => 'تم تحديث نتائج فحص الصحة',
'checked' => 'تم التحقق من النتائج منذ :time',
'refresh' => 'تحديث',
'results' => [
'cache' => [
'label' => 'التخزين المؤقت',
'ok' => 'موافق',
'failed_retrieve' => 'تعذر تعيين أو استرجاع قيمة التخزين المؤقت للتطبيق.',
'failed' => 'حدث استثناء في التخزين المؤقت للتطبيق: :error',
],
'database' => [
'label' => 'قاعدة البيانات',
'ok' => 'موافق',
'failed' => 'تعذر الاتصال بقاعدة البيانات: :error',
],
'debugmode' => [
'label' => 'وضع التصحيح',
'ok' => 'وضع التصحيح معطل',
'failed' => 'كان من المتوقع أن يكون وضع التصحيح :expected، لكنه كان :actual',
],
'environment' => [
'label' => 'البيئة',
'ok' => 'موافق، تم التعيين إلى :actual',
'failed' => 'تم تعيين البيئة إلى :actual، بينما كان المتوقع :expected',
],
'nodeversions' => [
'label' => 'إصدارات العقد',
'ok' => 'العقد محدثة',
'failed' => ':outdated/:all من العقد قديمة',
'no_nodes_created' => 'لم يتم إنشاء أي عقد',
'no_nodes' => 'لا توجد عقد',
'all_up_to_date' => 'جميعها محدثة',
'outdated' => ':outdated/:all قديمة',
],
'panelversion' => [
'label' => 'إصدار اللوحة',
'ok' => 'اللوحة محدثة',
'failed' => 'الإصدار المثبت هو :currentVersion بينما الأحدث هو :latestVersion',
'up_to_date' => 'محدث',
'outdated' => 'قديم',
],
'schedule' => [
'label' => 'الجدولة',
'ok' => 'موافق',
'failed_last_ran' => 'آخر تشغيل للجدولة كان قبل أكثر من :time دقيقة',
'failed_not_ran' => 'لم يتم تشغيل الجدولة بعد.',
],
'useddiskspace' => [
'label' => 'مساحة القرص',
],
],
'checks' => [
'successful' => 'ناجح',
'failed' => 'فشل',
],
];

30
lang/ar/admin/mount.php Normal file
View File

@@ -0,0 +1,30 @@
<?php
return [
'nav_title' => 'التوصيلات',
'model_label' => 'التوصيل',
'model_label_plural' => 'التوصيلات',
'name' => 'الاسم',
'name_help' => 'اسم فريد يستخدم لتمييز هذا التوصيل عن غيره.',
'source' => 'المصدر',
'source_help' => 'مسار الملف في نظام المضيف ليتم توصيله بالحاوية.',
'target' => 'الهدف',
'target_help' => 'المكان الذي سيكون فيه التوصيل متاحًا داخل الحاوية.',
'read_only' => 'للقراءة فقط؟',
'read_only_help' => 'هل التوصيل للقراءة فقط داخل الحاوية؟',
'description' => 'الوصف',
'description_help' => 'وصف تفصيلي لهذا التوصيل',
'no_mounts' => 'لا توجد توصيلات',
'eggs' => 'البيوض',
'nodes' => 'العقد',
'toggles' => [
'writable' => 'قابل للكتابة',
'read_only' => 'للقراءة فقط',
],
'table' => [
'name' => 'الاسم',
'all_eggs' => 'جميع البيض',
'all_nodes' => 'جميع العقد',
'read_only' => 'للقراءة فقط',
],
];

17
lang/ar/admin/role.php Normal file
View File

@@ -0,0 +1,17 @@
<?php
return [
'nav_title' => 'الأدوار',
'model_label' => 'الدور',
'model_label_plural' => 'الأدوار',
'no_roles' => 'لا توجد أدوار',
'name' => 'اسم الدور',
'permissions' => 'الأذونات',
'in_use' => 'قيد الاستخدام',
'all' => 'الكل',
'root_admin' => 'الدور :role يمتلك جميع الأذونات.',
'root_admin_delete' => 'لا يمكن حذف المسؤول الجذري',
'users' => 'المستخدمون',
'nodes' => 'العقد',
'nodes_hint' => 'اتركه فارغاً للسماح بالوصول إلى جميع العقد.',
];

18
lang/ar/admin/user.php Normal file
View File

@@ -0,0 +1,18 @@
<?php
return [
'nav_title' => 'المستخدمون',
'model_label' => 'المستخدم',
'model_label_plural' => 'المستخدمون',
'self_delete' => 'لا يمكنك حذف نفسك',
'has_servers' => 'المستخدم يمتلك خوادم',
'email' => 'البريد الإلكتروني',
'username' => 'اسم المستخدم',
'password' => 'كلمة المرور',
'password_help' => 'إدخال كلمة المرور للمستخدم اختياري. سيتلقى المستخدم الجديد بريدًا إلكترونيًا يطلب منه إنشاء كلمة مرور عند تسجيل الدخول لأول مرة.',
'admin_roles' => 'أدوار المسؤول',
'roles' => 'الأدوار',
'no_roles' => 'لا توجد أدوار',
'servers' => 'الخوادم',
'subusers' => 'المستخدمون الفرعيون',
];

View File

@@ -0,0 +1,57 @@
<?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_password' => 'كلمة المرور',
'ask_password_tip' => 'إذا كنت ترغب في إنشاء حساب بكلمة مرور عشوائية يتم إرسالها بالبريد الإلكتروني للمستخدم، أعد تشغيل هذا الأمر (CTRL+C) ومرر علامة `--no-password`.',
'ask_password_help' => 'يجب أن تكون كلمات المرور بطول 8 أحرف على الأقل وتحتوي على حرف كبير ورقم على الأقل.',
'2fa_help_text' => [
'هذا الأمر سيعطل التوثيق الثنائي لحساب المستخدم إذا كان مفعلاً. يجب استخدام هذا فقط كأمر استرداد حساب إذا كان المستخدم محظورًا من حسابه.',
'إذا لم يكن هذا ما تريد القيام به، اضغط CTRL+C للخروج من هذه العملية.',
],
'2fa_disabled' => 'تم تعطيل التوثيق الثنائي لـ :email.',
],
'schedule' => [
'output_line' => 'يتم تنفيذ المهمة الأولى في `:schedule` (:id).',
],
'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' => 'طريقة التشفير المستخدمة',
],
],
];

73
lang/ar/commands.php Normal file
View File

@@ -0,0 +1,73 @@
<?php
return [
'appsettings' => [
'comment' => [
'author' => 'قم بتوفير عنوان البريد الإلكتروني الذي يجب أن تصدر منه البيوض المصدرة بواسطة هذا اللوحة. يجب أن يكون عنوان بريد إلكتروني صالحًا.',
'url' => 'يجب أن يبدأ عنوان URL للتطبيق بـ https:// أو http:// حسب استخدامك لـ SSL أم لا. إذا لم تقم بتضمين المخطط، فقد يتم ربط رسائل البريد الإلكتروني والمحتوى الآخر بموقع غير صحيح.',
'timezone' => 'يجب أن تتطابق المنطقة الزمنية مع إحدى المناطق الزمنية المدعومة من PHP. إذا كنت غير متأكد، يرجى الرجوع إلى https://php.net/manual/en/timezones.php.',
],
'redis' => [
'note' => 'لقد اخترت برنامج Redis لسائق واحد أو أكثر، يرجى تقديم معلومات اتصال صالحة أدناه. في معظم الحالات، يمكنك استخدام الإعدادات الافتراضية ما لم تكن قد عدلت إعدادك.',
'comment' => 'بشكل افتراضي، يكون اسم المستخدم الافتراضي لخادم Redis بدون كلمة مرور لأنه يعمل محليًا وغير متاح للعالم الخارجي. إذا كان هذا هو الحال، فقط اضغط على Enter دون إدخال قيمة.',
'confirm' => 'يبدو أن هناك قيمة :field محددة بالفعل لـ Redis، هل ترغب في تغييرها؟',
],
],
'database_settings' => [
'DB_HOST_note' => 'يُوصى بشدة بعدم استخدام "localhost" كمضيف قاعدة البيانات، حيث لاحظنا مشكلات متكررة في اتصال المقبس. إذا كنت تريد استخدام اتصال محلي، فيجب أن تستخدم "127.0.0.1".',
'DB_USERNAME_note' => 'استخدام حساب الجذر لاتصالات MySQL ليس فقط مرفوضًا بشدة، ولكنه غير مسموح به في هذا التطبيق. ستحتاج إلى إنشاء مستخدم MySQL لهذا البرنامج.',
'DB_PASSWORD_note' => 'يبدو أن لديك بالفعل كلمة مرور اتصال MySQL محددة، هل ترغب في تغييرها؟',
'DB_error_2' => 'لم يتم حفظ بيانات الاعتماد الخاصة باتصالك. ستحتاج إلى تقديم معلومات اتصال صالحة قبل المتابعة.',
'go_back' => 'العودة والمحاولة مرة أخرى',
],
'make_node' => [
'name' => 'أدخل معرفًا قصيرًا لتمييز هذه العقدة عن غيرها',
'description' => 'أدخل وصفًا لتحديد العقدة',
'scheme' => 'يرجى إدخال https لاستخدام SSL أو http لاتصال غير مشفر',
'fqdn' => 'أدخل اسم النطاق (مثل node.example.com) ليتم استخدامه للاتصال بالـ Daemon. يمكن استخدام عنوان IP فقط إذا لم تكن تستخدم SSL لهذه العقدة.',
'public' => 'هل يجب أن تكون هذه العقدة عامة؟ ملاحظة: تعيين العقدة كخاصة سيمنع إمكانية النشر التلقائي لهذه العقدة.',
'behind_proxy' => 'هل اسم النطاق الخاص بك خلف وكيل؟',
'maintenance_mode' => 'هل يجب تمكين وضع الصيانة؟',
'memory' => 'أدخل الحد الأقصى للذاكرة',
'memory_overallocate' => 'أدخل مقدار الذاكرة المطلوب تجاوزه، -1 سيعطل الفحص و 0 سيمنع إنشاء خوادم جديدة',
'disk' => 'أدخل الحد الأقصى لمساحة القرص',
'disk_overallocate' => 'أدخل مقدار القرص المطلوب تجاوزه، -1 سيعطل الفحص و 0 سيمنع إنشاء خوادم جديدة',
'cpu' => 'أدخل الحد الأقصى لاستخدام المعالج',
'cpu_overallocate' => 'أدخل مقدار تجاوز استخدام المعالج، -1 سيعطل الفحص و 0 سيمنع إنشاء خوادم جديدة',
'upload_size' => 'أدخل الحد الأقصى لحجم التحميل',
'daemonListen' => 'أدخل منفذ استماع الـ Daemon',
'daemonSFTP' => 'أدخل منفذ استماع SFTP لـ Daemon',
'daemonSFTPAlias' => 'أدخل اسم مستعار لـ SFTP (يمكن أن يكون فارغًا)',
'daemonBase' => 'أدخل المجلد الأساسي',
'success' => 'تم إنشاء عقدة جديدة بنجاح بالاسم :name ومعرفها :id',
],
'node_config' => [
'error_not_exist' => 'العقدة المحددة غير موجودة.',
'error_invalid_format' => 'تنسيق غير صالح محدد. الخيارات الصالحة هي yaml و json.',
],
'key_generate' => [
'error_already_exist' => 'يبدو أنك قمت بالفعل بتكوين مفتاح تشفير التطبيق. المتابعة مع هذه العملية ستؤدي إلى استبدال هذا المفتاح وقد تسبب في تلف البيانات المشفرة الموجودة. لا تتابع ما لم تكن متأكدًا مما تفعله.',
'understand' => 'أفهم عواقب تنفيذ هذا الأمر وأتحمل كامل المسؤولية عن فقدان البيانات المشفرة.',
'continue' => 'هل أنت متأكد أنك تريد المتابعة؟ تغيير مفتاح تشفير التطبيق سيسبب فقدان البيانات.',
],
'schedule' => [
'process' => [
'no_tasks' => 'لا توجد مهام مجدولة للخوادم تحتاج إلى التشغيل.',
'error_message' => 'حدث خطأ أثناء معالجة الجدولة: ',
],
],
'upgrade' => [
'integrity' => 'هذا الأمر لا يتحقق من سلامة الأصول التي تم تنزيلها. يرجى التأكد من أنك تثق في مصدر التنزيل قبل المتابعة. إذا كنت لا ترغب في تنزيل أرشيف، يرجى تحديد ذلك باستخدام العلامة --skip-download، أو الإجابة بـ "لا" على السؤال أدناه.',
'source_url' => 'مصدر التنزيل (يتم تعيينه باستخدام --url=):',
'php_version' => 'تعذر تنفيذ عملية الترقية الذاتية. الحد الأدنى المطلوب لإصدار PHP هو 7.4.0، لديك',
'skipDownload' => 'هل ترغب في تنزيل واستخراج ملفات الأرشيف لأحدث إصدار؟',
'webserver_user' => 'تم اكتشاف مستخدم خادم الويب الخاص بك على أنه <fg=blue>[{:user}]:</> هل هذا صحيح؟',
'name_webserver' => 'يرجى إدخال اسم المستخدم الذي يشغل عملية خادم الويب لديك. يختلف هذا من نظام إلى آخر، لكنه عادةً يكون "www-data"، "nginx"، أو "apache".',
'group_webserver' => 'تم اكتشاف مجموعة خادم الويب الخاصة بك على أنها <fg=blue>[{:group}]:</> هل هذا صحيح؟',
'group_webserver_question' => 'يرجى إدخال اسم المجموعة التي تشغل عملية خادم الويب لديك. عادةً ما تكون هي نفس اسم المستخدم.',
'are_your_sure' => 'هل أنت متأكد أنك تريد تنفيذ عملية الترقية للوحة التحكم؟',
'terminated' => 'تم إنهاء عملية الترقية بواسطة المستخدم.',
'success' => 'تم ترقية اللوحة بنجاح. يرجى التأكد من تحديث أي مثيلات Daemon أيضًا.',
],
];

64
lang/ar/exceptions.php Normal file
View File

@@ -0,0 +1,64 @@
<?php
return [
'daemon_connection_failed' => 'حدث خطأ أثناء محاولة الاتصال بـ Daemon مما أدى إلى استجابة برمز HTTP/:code. تم تسجيل هذا الاستثناء.',
'node' => [
'servers_attached' => 'يجب ألا يكون هناك أي خوادم مرتبطة بهذه العقدة حتى يتم حذفها.',
'error_connecting' => 'حدث خطأ أثناء الاتصال بـ :node',
'daemon_off_config_updated' => 'تم <strong>تحديث تكوين Daemon</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' => [
'is_self' => 'لا يمكنك حذف حسابك الشخصي.',
'has_servers' => 'لا يمكن حذف مستخدم لديه خوادم نشطة مرتبطة بحسابه. يرجى حذف خوادمه قبل المتابعة.',
'node_revocation_failed' => 'فشل إلغاء المفاتيح على <a href=":link">العقدة #:node</a>. :error',
],
'deployment' => [
'no_viable_nodes' => 'لم يتم العثور على أي عقد تفي بالمتطلبات المحددة للنشر التلقائي.',
'no_viable_allocations' => 'لم يتم العثور على أي تخصيصات تفي بمتطلبات النشر التلقائي.',
],
'api' => [
'resource_not_found' => 'المورد المطلوب غير موجود على هذا الخادم.',
],
'mount' => [
'servers_attached' => 'يجب ألا يكون هناك أي خوادم مرتبطة بهذا التوصيل ليتم حذفه.',
],
'server' => [
'marked_as_failed' => 'لم يكتمل بعد تثبيت هذا الخادم، يرجى المحاولة مرة أخرى لاحقًا.',
],
];

19
lang/ar/pagination.php Normal file
View File

@@ -0,0 +1,19 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Pagination Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used by the paginator library to build
| the simple pagination links. You are free to change them to anything
| you want to customize your views to better match your application.
|
*/
'previous' => '&laquo; السابق',
'next' => 'التالي &raquo;',
];

22
lang/ar/passwords.php Normal file
View File

@@ -0,0 +1,22 @@
<?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
| outcome such as failure due to an invalid password / reset token.
|
*/
'reset' => 'تم إعادة تعيين كلمة المرور الخاصة بك.',
'sent' => 'لقد أرسلنا رابط إعادة تعيين كلمة المرور إلى بريدك الإلكتروني.',
'throttled' => 'يرجى الانتظار قبل المحاولة مرة أخرى.',
'token' => 'رمز إعادة تعيين كلمة المرور غير صالح.',
'user' => 'لا يمكننا العثور على مستخدم بعنوان البريد الإلكتروني هذا.',
];

54
lang/ar/profile.php Normal file
View File

@@ -0,0 +1,54 @@
<?php
return [
'title' => 'الملف الشخصي',
'tabs' => [
'account' => 'الحساب',
'oauth' => 'OAuth',
'activity' => 'النشاط',
'api_keys' => 'مفاتيح API',
'ssh_keys' => 'مفاتيح SSH',
'2fa' => 'المصادقة الثنائية',
'customization' => 'التخصيص',
],
'username' => 'اسم المستخدم',
'exit_admin' => 'الخروج من المسؤول',
'email' => 'البريد الإلكتروني',
'password' => 'كلمة المرور',
'current_password' => 'كلمة المرور الحالية',
'password_confirmation' => 'تأكيد كلمة المرور',
'timezone' => 'المنطقة الزمنية',
'language' => 'اللغة',
'language_help' => 'لغتك :state لم تتم ترجمتها بعد!',
'link' => 'ربط',
'unlink' => 'إلغاء الربط',
'unlinked' => ':name تم إلغاء ربطه',
'scan_qr' => 'مسح رمز QR',
'code' => 'الرمز',
'setup_key' => 'مفتاح الإعداد',
'invalid_code' => 'رمز المصادقة الثنائية غير صالح',
'code_help' => 'قم بمسح رمز QR أعلاه باستخدام تطبيق المصادقة الثنائية، ثم أدخل الرمز الذي تم إنشاؤه.',
'2fa_enabled' => 'المصادقة الثنائية مفعلة حالياً!',
'backup_help' => 'لن يتم عرض هذه الأكواد مرة أخرى!',
'backup_codes' => 'أكواد النسخ الاحتياطي',
'disable_2fa' => 'تعطيل المصادقة الثنائية',
'disable_2fa_help' => 'أدخل رمز المصادقة الثنائية الحالي لتعطيل المصادقة الثنائية',
'keys' => 'المفاتيح',
'create_key' => 'إنشاء مفتاح API',
'key_created' => 'تم إنشاء المفتاح',
'description' => 'الوصف',
'allowed_ips' => 'عناوين IP المسموح بها',
'allowed_ips_help' => 'اضغط على Enter لإضافة عنوان IP جديد أو اتركه فارغًا للسماح بأي عنوان IP',
'dashboard' => 'لوحة التحكم',
'dashboard_layout' => 'تصميم لوحة التحكم',
'console' => 'وحدة التحكم',
'grid' => 'شبكة',
'table' => 'جدول',
'rows' => 'صفوف',
'font_size' => 'حجم الخط',
'font' => 'نوع الخط',
'font_preview' => 'معاينة الخط',
'seconds' => 'ثواني',
'graph_period' => 'فترة الرسم البياني',
'graph_period_helper' => 'كمية نقاط البيانات و الثواني المعروضة على الرسوم البيانية',
];

9
lang/ar/search.php Normal file
View File

@@ -0,0 +1,9 @@
<?php
return [
'validation' => 'يرجى إدخال ثلاثة أحرف على الأقل لبدء البحث.',
'term' => [
'label' => 'مصطلح البحث',
'description' => 'أدخل اسم الخادم أو UUID أو التخصيص لبدء البحث.',
],
];

101
lang/ar/validation.php Normal file
View File

@@ -0,0 +1,101 @@
<?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 عناصر.',
],
'confirmed' => 'تأكيد :attribute غير متطابق.',
'date' => ':attribute ليس تاريخًا صالحًا.',
'date_format' => ':attribute لا يتطابق مع الشكل :format.',
'different' => 'يجب أن يكون :attribute و :other مختلفين.',
'digits' => 'يجب أن يكون :attribute :digits أرقام.',
'digits_between' => 'يجب أن يكون :attribute بين :min و :max رقمًا.',
'dimensions' => ':attribute يحتوي على أبعاد صورة غير صالحة.',
'email' => 'يجب أن يكون :attribute عنوان بريد إلكتروني صالحًا.',
'file' => 'يجب أن يكون :attribute ملفًا.',
'filled' => 'حقل :attribute إلزامي.',
'image' => 'يجب أن يكون :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 عناصر.',
],
'numeric' => 'يجب أن يكون :attribute رقمًا.',
'regex' => 'تنسيق :attribute غير صالح.',
'required_with_all' => 'حقل :attribute مطلوب عند توفر كل من :values.',
'same' => 'يجب أن يتطابق :attribute و :other.',
'size' => [
'numeric' => 'يجب أن يكون :attribute :size.',
'file' => 'يجب أن يكون حجم :attribute :size كيلوبايت.',
'string' => 'يجب أن يكون طول :attribute :size حرفًا.',
'array' => 'يجب أن يحتوي :attribute على :size عناصر.',
],
'string' => 'يجب أن يكون :attribute نصًا.',
'timezone' => 'يجب أن تكون :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' => 'كلمة المرور التي تم تقديمها غير صالحة لهذا الحساب.',
],
];

122
lang/be/activity.php Normal file
View File

@@ -0,0 +1,122 @@
<?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' => 'Скінуць пароль',
'checkpoint' => 'Двухфактарная аўтэнтыфікацыя ўключана',
'recovery-token' => 'Использован резервный код 2FA',
'token' => 'Пройдена двухфакторная проверка',
'ip-blocked' => 'Блакаваная заявка ад неўлічанага IP-адрасу для <b>:identifier</b>',
'sftp' => [
'fail' => 'Не атрымалася аўтарызавацца',
],
],
'user' => [
'account' => [
'email-changed' => 'Зменена электронная пошта з <b>:old</b> на <b>:new</b>',
'password-changed' => 'Змяніць пароль',
],
'api-key' => [
'create' => 'Створаны новы API ключ <b>:identifier</b>',
'delete' => 'Выдалены API ключ <b>:identifier</b>',
],
'ssh-key' => [
'create' => 'Дададзены SSH ключ <b>:fingerprint</b> да ўліковага запісу',
'delete' => 'Выдалены SSH ключ <b>:fingerprint</b> з уліковага запісу',
],
'two-factor' => [
'create' => 'Включена двухфакторная авторизация',
'delete' => 'Включена двухфакторная авторизация',
],
],
'server' => [
'console' => [
'command' => 'Выканана дзеянне <b>:command</b> на серверы',
],
'power' => [
'start' => 'Сервер запушчаны',
'stop' => 'Сервер спынены',
'restart' => 'Сервер перазапушчаны',
'kill' => 'Працэс сервера завершаны',
],
'backup' => [
'download' => 'Спампавана рэзервовая копія <b>:name</b>',
'delete' => 'Выдалена рэзервовая копія <b>:name</b>',
'restore' => 'Адноўлена рэзервовая копія <b>:name</b> (выдаленыя файлы: <b>:truncate</b>)',
'restore-complete' => 'Завершана аднаўленне рэзервовай копіі <b>:name</b>',
'restore-failed' => 'Няўдалася завяршыць аднаўленне рэзервовай копіі <b>:name</b>',
'start' => 'Пачата новая рэзервовая копія <b>:identifier</b>',
'complete' => 'Рэзервовая копія <b>:name</b> адзначана як завершаная',
'fail' => 'Рэзервовая копія <b>:name</b> адзначана як няўдалая',
'lock' => 'Замкнута рэзервовая копія <b>:name</b>',
'unlock' => 'Адкрылі рэзервовую копію <b>:name</b>',
],
'database' => [
'create' => 'Створана новая база дадзеных <b>:name</b>',
'rotate-password' => 'Пароль для базы даных <b>:name</b> зменены',
'delete' => 'Выдалена база дадзеных <b>:name</b>',
],
'file' => [
'compress' => 'Кампрэсаваны <b>:directory:files</b>|Кампрэсавана <b>:count</b> файлаў у <b>:directory</b>',
'read' => 'Паглядзелі змесціва файла <b>:file</b>',
'copy' => 'Створана копія файла <b>:file</b>',
'create-directory' => 'Створана тэчка <b>:directory:name</b>',
'decompress' => 'Распакоўка файла <b>:file</b> у <b>:directory</b>',
'delete' => 'Выдалены <b>:directory:files</b>|Выдалены <b>:count</b> файлаў у <b>:directory</b>',
'download' => 'Спампаваны файл <b>:file</b>',
'pull' => 'Спампаваны файл з аддаленага сэрвера з <b>:url</b> у <b>:directory</b>',
'rename' => 'Перамешчаны/ Пераназваны <b>:from</b> у <b>:to</b>|Перамешчаны/ Пераназваны <b>:count</b> файлаў у <b>:directory</b>',
'write' => 'Запісаны новы кантэнт у файл <b>:file</b>',
'upload' => 'Пачата загрузка файла',
'uploaded' => 'Загружаны файл <b>:directory:file</b>',
],
'sftp' => [
'denied' => 'Блакаваная магчымасць доступу SFTP з-за правоў',
'create' => 'Створаны <b>:files</b>|Створана <b>:count</b> новых файлаў',
'write' => 'Заменен змест у <b>:files</b>|Зменены змест <b>:count</b> файлаў',
'delete' => 'Выдалены <b>:files</b>|Выдалены <b>:count</b> файлы',
'create-directory' => 'Створана папка <b>:files</b>|Створана <b>:count</b> папак',
'rename' => 'Пераназваны <b>:from</b> у <b>:to</b>|Пераназваны або перамешчаны <b>:count</b> файлы',
],
'allocation' => [
'create' => 'Дададзена <b>:allocation</b> на сервер',
'notes' => 'Абноўлены заўвагі для <b>:allocation</b> з <b>:old</b> на <b>:new</b>',
'primary' => 'Усталявана <b>:allocation</b> як асноўная сетка для сервера',
'delete' => 'Выдалена сетка <b>:allocation</b>',
],
'schedule' => [
'create' => 'Створана задача <b>:name</b>',
'update' => 'Абноўлена задача <b>:name</b>',
'execute' => 'Уручную выканана задача <b>:name</b>',
'delete' => 'Выдалена задача <b>:name</b>',
],
'task' => [
'create' => 'Створана новая дзеянне "<b>:action</b>" для задачы "<b>:name</b>"',
'update' => 'Абноўлена дзеянне "<b>:action</b>" для задачы "<b>:name</b>".',
'delete' => 'Выдалена дзеянне "<b>:action</b>" для задачы "<b>:name</b>"',
],
'settings' => [
'rename' => 'Пераназваны сервер з "<b>:old</b>" на "<b>:new</b>"',
'description' => 'Змянёна апісанне сервера з "<b>:old</b>" на "<b>:new</b>"',
'reinstall' => 'Сервер пераўсталяваны',
],
'startup' => [
'edit' => 'Змянёна зменная "<b>:variable</b>" з "<b>:old</b>" на "<b>:new</b>"',
'image' => 'Абноўлены Docker-вобраз для сервера з "<b>:old</b>" на "<b>:new</b>"',
],
'subuser' => [
'create' => 'Дададзены "<b>:email</b>" як падкарыстальнік',
'update' => 'Абноўлены правы падкарыстальніка для "<b>:email</b>"',
'delete' => 'Выдалены "<b>:email</b>" як падкарыстальнік',
],
'crashed' => 'Сервер выйшаў з ладу',
],
];

27
lang/be/admin/apikey.php Normal file
View File

@@ -0,0 +1,27 @@
<?php
return [
'title' => 'API ключы прыкладання',
'empty_table' => 'Няма API ключоў',
'whitelist' => 'Белы спіс IPv4 адрасоў',
'whitelist_help' => 'API ключы могуць быць абмежаваны для працы з пэўнымі IPv4 адрасамі. Увядзіце кожны адрас на новым радку.',
'whitelist_placeholder' => 'Напрыклад: 127.0.0.1 або 192.168.1.1',
'description' => 'Апісанне',
'description_help' => 'Кароткае апісанне гэтага ключа.',
'nav_title' => 'API ключы',
'model_label' => 'API ключ прыкладання',
'model_label_plural' => 'API ключы прыкладання',
'table' => [
'key' => 'Ключ',
'description' => 'Апісанне',
'last_used' => 'Апошняе выкарыстанне',
'created' => 'Створаны',
'created_by' => 'Стварыў',
'never_used' => 'Не выкарыстоўвалася',
],
'permissions' => [
'none' => 'Няма',
'read' => 'Чытаць',
'read_write' => 'Чытаць і пісаць',
],
];

View File

@@ -0,0 +1,45 @@
<?php
return [
'heading' => 'Сардэчна запрашаем у Pelican!',
'version' => 'Версія: :version',
'advanced' => 'Дадатковыя',
'server' => 'Сервер',
'user' => 'Карыстальнік',
'sections' => [
'intro-developers' => [
'heading' => 'Інфармацыя для Распрацоўшчыкаў
',
'content' => 'Дзякуем, што паспрабавалі распрацоўчую версію!',
'extra_note' => 'Калі ўзнікнуць якія-небудзь праблемы, калі ласка, паведаміце пра іх на GitHub.',
'button_issues' => 'Апавясціць аб праблеме.',
'button_features' => 'Абмеркаваць функцыі.',
],
'intro-update-available' => [
'heading' => 'Даступна абнаўленне.',
'content' => ':latestVersion цяпер даступная! Прачытайце нашу дакументацыю, каб абнавіць вашу панэль.',
],
'intro-no-update' => [
'heading' => 'Ваша панэль абноўлена да актуальнай версіі.',
'content' => 'Цяпер вы выкарыстоўваеце :version. Ваша панэль абноўлена!',
],
'intro-first-node' => [
'heading' => 'Вузлы не выяўленыя.',
'content' => 'Здаецца, у вас яшчэ няма наладжаных вузлоў, але не хвалюйцеся — проста націсніце кнопку дзеяння, каб стварыць свой першы вузел!',
'extra_note' => 'Калі ў вас узнікнуць якія-небудзь праблемы, калі ласка, паведаміце пра іх на GitHub.',
'button_label' => 'Стварыце першы вузел у Pelican',
],
'intro-support' => [
'heading' => 'Падтрымка Pelican',
'content' => 'Дзякуй за выкарыстанне Pelican! Гэта стала магчымым толькі дзякуючы падтрымцы вас, нашых удзельнікаў і ўсіх астатніх, хто нас падтрымлівае!',
'extra_note' => 'Мы ўдзячныя кожнаму за любую падтрымку.',
'button_translate' => 'Дапамагчы з перакладам',
'button_donate' => 'Ахвяраваць напрамую',
],
'intro-help' => [
'heading' => 'Патрэбна дапамога?',
'content' => 'Спачатку азнаёмцеся з дакументацыяй! Калі ўсё яшчэ патрэбна дапамога — заходзьце на наш Discord-сервер!',
'button_docs' => 'Прачытаць дакументацыю',
],
],
];

View File

@@ -0,0 +1,72 @@
<?php
return [
'nav_title' => 'Базы даных',
'model_label' => 'База даных',
'model_label_plural' => 'Хост базы даных',
'table' => [
'database' => 'База даных',
'name' => 'Імя',
'host' => 'Хост',
'port' => 'Порт',
'name_helper' => 'Калі пакінуць гэта поле пустым, імя будзе створана аўтаматычна.',
'username' => 'Ідэнтыфікатар карыстальніка',
'password' => 'Пароль',
'remote' => 'Падключэнні з',
'remote_helper' => 'Адкуль павінны дазваляцца падключэнні. Пакіньце пустым, каб дазволіць іх з любога месца.',
'max_connections' => 'Максімальная колькасць злучэнняў',
'created_at' => 'Створана ў',
'connection_string' => 'Радок падключэння да JDBC',
],
'error' => 'Памылка пры падключэнні з хостам',
'host' => 'Хост',
'host_help' => 'IP-адрас або даменнае імя, якое павінна выкарыстоўвацца пры спробе падключэння з гэтым хостам MySQL з панэлі для стварэння новых баз даных.',
'port' => 'Порт',
'port_help' => 'Порт, на якім працуе MySQL для гэтага хоста.',
'max_database' => 'Максімальная колькасць баз даных',
'max_databases_help' => 'Максімальная колькасць баз дадзеных, якія можна стварыць на гэтым хосце. Калі ліміт дасягнуты, новыя базы дадзеных на гэтым хосце ствараць нельга. Пустое значэнне — без абмежавання.',
'display_name' => 'Назва',
'display_name_help' => 'IP-адрас або даменнае імя, якое павінна адлюстроўвацца для канчатковага карыстальніка.',
'username' => 'Имя пользователя',
'username_help' => 'Ідэнтыфікатар карыстальніка ўліковага запісу, які мае дастатковыя правы для стварэння новых карыстальнікаў і баз даных у сістэме.',
'password' => 'Пароль',
'password_help' => 'Пароль да карыстальніка базы даных.',
'linked_nodes' => 'Звязаныя вузлы',
'linked_nodes_help' => 'Гэта налада выкарыстоўваецца па змаўчанні толькі для гэтага хоста базы даных пры даданні базы на сервер, што знаходзіцца на выбраным вузле.',
'connection_error' => 'Памылка пры падключэнні з хостам базы даных',
'no_database_hosts' => 'Няма хостаў базы даных',
'no_nodes' => 'Няма вузлоў',
'delete_help' => 'Хост базы дадзеных ужо ўтрымлівае базы даных',
'unlimited' => 'Без абмежавання',
'anywhere' => 'З любога месца',
'rotate' => 'Павярнуць',
'rotate_password' => 'Абнавіць пароль',
'rotated' => 'Пароль абноўлены',
'rotate_error' => 'Не атрымалася абнавіць пароль',
'databases' => 'Базы данных',
'setup' => [
'preparations' => 'Падрыхтоўка',
'database_setup' => 'Устаноўка базы даных',
'panel_setup' => 'Устаноўка панэлі',
'note' => 'На дадзены момант падтрымліваюцца толькі базы MySQL / MariaDB!',
'different_server' => 'Панэль і база даных <i>не</i> знаходзяцца на адным серверы?',
'database_user' => 'Карыстальнік базы даных',
'cli_login' => 'Выкарыстай <code>mysql -u root -p</code>, каб атрымаць доступ да mysql cli.',
'command_create_user' => 'Каманда для стварэння карыстальніка',
'command_assign_permissions' => 'Каманда для прызначэння разрашэнняў',
'cli_exit' => 'Каб выйсці з mysql cli, увядзіце <code>exit</code>.',
'external_access' => 'Знешні доступ',
'allow_external_access' => '
<p>Скорэй за ўсё, табе спатрэбіцца дазволіць знешні доступ да гэтай інстанцыі MySQL, каб серверы маглі падключацца да яе.</p>
<br>
<p>Для гэтага адкрый файл <code>my.cnf</code>, які можа знаходзіцца ў розных месцах у залежнасці ад аперацыйнай сістэмы і спосабу ўстаноўкі MySQL. Ты можаш увесці каманду <code>find /etc -iname my.cnf</code>, каб знайсці яго.</p>
<br>
<p>Адкрый <code>my.cnf</code>, дадай наступны тэкст у канец файла і запішы змены:<br> <code>[mysqld]<br>bind-address=0.0.0.0</code></p>
<br>
<p>Перазапусці MySQL або MariaDB, каб прымяніць змены. Гэта зменіць стандартную канфігурацыю MySQL, якая па змаўчанні прымае злучэнні толькі з localhost. Пасля абнаўлення канфігурацыі сервер зможа прымаць злучэнні на ўсіх інтэрфейсах, у тым ліку і знешнія. Абавязкова дазволь порт MySQL (па змаўчанні 3306) у брандмаўэры.</p>',
],
];

60
lang/be/admin/health.php Normal file
View File

@@ -0,0 +1,60 @@
<?php
return [
'title' => 'Стан',
'results_refreshed' => 'Рэкамендацыі па праверцы стану абноўлены',
'checked' => 'Правераныя вынікі ад :time',
'refresh' => 'Абнавіць',
'results' => [
'cache' => [
'label' => 'Кэш',
'ok' => 'Добра',
'failed_retrieve' => 'Няўдалося ўсталяваць або атрымаць значэнне кэша прыкладання.',
'failed' => 'Адбылася памылка з кэшам прыкладання: :error',
],
'database' => [
'label' => 'База даных',
'ok' => 'Добра',
'failed' => 'Няўдалося падключыцца да базы даных: :error',
],
'debugmode' => [
'label' => 'Рэжым адладки',
'ok' => 'Рэжым адладки адключаны',
'failed' => 'Чакалася, што рэжым адладки будзе: :expected, але на самой справе быў: :actual',
],
'environment' => [
'label' => 'Асяроддзе',
'ok' => 'Добра, усталявана на :actual',
'failed' => 'Асяроддзе ўсталявана на :actual, чакалася :expected',
],
'nodeversions' => [
'label' => 'Версіі вузлоў',
'ok' => 'Вузлы абноўлены',
'failed' => ':outdated:/:all вузлы састарэлі',
'no_nodes_created' => 'Вузлоў няма',
'no_nodes' => 'Вузлоў няма',
'all_up_to_date' => 'Усе абноўлена',
'outdated' => ':outdated:/:all састарэла',
],
'panelversion' => [
'label' => 'Версія панэлі',
'ok' => 'Панэль абноўлена да актуальнай версіі',
'failed' => 'Усталяваная версія: :currentVersion, але апошняя: :latestVersion',
'up_to_date' => 'Абноўлена',
'outdated' => 'Састарэла',
],
'schedule' => [
'label' => 'Задача',
'ok' => 'Добра',
'failed_last_ran' => 'Апошні запуск задачы адбыўся больш за :time хвілін таму назад',
'failed_not_ran' => 'Задача яшчэ не выканана',
],
'useddiskspace' => [
'label' => 'Месца на дыску',
],
],
'checks' => [
'successful' => 'Паспяхова',
'failed' => 'Няўдалося',
],
];

30
lang/be/admin/mount.php Normal file
View File

@@ -0,0 +1,30 @@
<?php
return [
'nav_title' => 'Маунты',
'model_label' => 'Маунт',
'model_label_plural' => 'Маунты',
'name' => 'Імя',
'name_help' => 'Унікальнае імя, якое выкарыстоўваецца для аддзялення гэтага маунта ад іншых.',
'source' => 'Крыніца',
'source_help' => 'Шлях да файла на сістэме для маунта ў кантэйнер.',
'target' => 'Месца прызначэння',
'target_help' => 'Месца, дзе маунт будзе даступны ўнутры кантэйнера.',
'read_only' => 'Толькі для чытання?',
'read_only_help' => 'Ці з\'яўляецца маунт толькі для чытання ўнутры кантэйнера?',
'description' => 'Апісанне',
'description_help' => 'Больш падрабязнае апісанне для гэтага маунта',
'no_mounts' => 'Няма маунтаў',
'eggs' => 'Вобразы',
'nodes' => 'Вузлы',
'toggles' => [
'writable' => 'Даступна для запісу',
'read_only' => 'Толькі для чытання',
],
'table' => [
'name' => 'Імя',
'all_eggs' => 'Усе вобразы',
'all_nodes' => 'Усе вузлы',
'read_only' => 'Толькі для чытання',
],
];

18
lang/be/admin/user.php Normal file
View File

@@ -0,0 +1,18 @@
<?php
return [
'nav_title' => 'Карыстальнікі',
'model_label' => 'Карыстальнік',
'model_label_plural' => 'Карыстальнікі',
'self_delete' => 'Нельга выдаліць сябе',
'has_servers' => 'Карыстальнік мае серверы',
'email' => 'Пошта',
'username' => 'Имя пользователя',
'password' => 'Пароль',
'password_help' => 'Прапанаванне пароля карыстальніка з\'яўляецца неабавязковым. Электронная пошта новага карыстальніка падказвае стварыць пароль пры першым уводзе.',
'admin_roles' => 'Ролі адміністратара',
'roles' => 'Ролі',
'no_roles' => 'Няма роляў',
'servers' => 'Серверы',
'subusers' => 'Падкарыстальнікі',
];

View File

@@ -0,0 +1,57 @@
<?php
return [
'user' => [
'search_users' => 'Увядзіце імя карыстальніка, ID карыстальніка або адрас пошты',
'select_search_user' => 'ID карыстальніка для выдалення (увядзіце \'0\' для паўторнага пошуку)',
'deleted' => 'Карыстальнік паспяхова выдалены з панэлі.',
'confirm_delete' => 'Вы ўпэўнены, што хочаце выдаліць гэтага карыстальніка з панэлі?',
'no_users_found' => 'Карыстальнікі не знойдзены па дадзеным пошукавым тэрміне.',
'multiple_found' => 'Знойдзена некалькі ўліковых запісаў для гэтага карыстальніка, нельга выдаліць карыстальніка з-за флага --no-interaction.',
'ask_admin' => 'Ці з\'яўляецца гэты карыстальнік адміністратарам?',
'ask_email' => 'Адрас пошты',
'ask_username' => 'Ідэнтыфікатар карыстальніка',
'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` (:id).',
],
'maintenance' => [
'deleting_service_backup' => 'Выдаленне файла рэзервовай копіі сэрвісу.',
],
'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' => 'Метад шыфравання для выкарыстання',
],
],
];

73
lang/be/commands.php Normal file
View File

@@ -0,0 +1,73 @@
<?php
return [
'appsettings' => [
'comment' => [
'author' => 'Увядзіце адрас электроннай пошты, з якога павінны быць адпраўлены вобразамі, экспартаваныя з гэтай панэлі. Гэта павінен быць сапраўдны адрас электроннай пошты.',
'url' => 'URL прыкладання павінен пачынацца з https:// або http:// ў залежнасці ад таго, ці выкарыстоўваецца SSL. Калі схема не будзе ўключаная, вашыя электронныя лісты і іншы кантэнт будуць спасылацца на няправільнае месца.',
'timezone' => 'Часавы пояс павінен супадаць з адным з падтрымліваемых часавых паясоў PHP. Калі вы не ўпэўнены, калі ласка, звярніцеся да https://php.net/manual/en/timezones.php.',
],
'redis' => [
'note' => 'Вы выбралі драйвер Redis для адной або некалькіх опцый, калі ласка, прадастаўце сапраўдныя дадзеныя для падключэння ніжэй. У большасці выпадкаў вы можаце выкарыстоўваць па змоўчанні параметры, калі не змянялі вашу наладу.',
'comment' => 'Па змоўчанні экземпляр Redis мае імя карыстальніка "default" і не мае пароля, паколькі ён працуе лакальна і недаступны знешняму свету. Калі гэта так, проста націсніце enter без уводу значэння.',
'confirm' => 'Выглядае, што :field ужо вызначаны для Redis, хочаце змяніць?',
],
],
'database_settings' => [
'DB_HOST_note' => 'Рекомендуецца не выкарыстоўваць "localhost" як хост базы дадзеных, бо мы часта сутыкаліся з праблемамі падключэння праз сокеты. Калі вы хочаце выкарыстоўваць лакальнае падключэнне, вам трэба выкарыстоўваць "127.0.0.1".',
'DB_USERNAME_note' => 'Выкарыстанне ўліковага запісу root для падключэнняў да MySQL не толькі настойліва не рэкамендуецца, але таксама не дазваляецца гэтым прыкладаннем. Вам трэба стварыць карыстальніка MySQL для гэтага праграмнага забеспячэння.',
'DB_PASSWORD_note' => 'Выглядае, што ў вас ужо вызначаны пароль для падключэння MySQL, хочаце яго змяніць?',
'DB_error_2' => 'Вашы дадзеныя для падключэння не былі захаваныя. Вам трэба ўвесці сапраўдныя дадзеныя для падключэння, перш чым працягнуць.',
'go_back' => 'Вярнуцца і паспрабаваць зноў',
],
'make_node' => [
'name' => 'Увядзіце кароткі ідэнтыфікатар, які выкарыстоўваецца для адрознення гэтага вузла ад іншых',
'description' => 'Увядзіце апісанне для ідэнтыфікацыі вузла',
'scheme' => 'Калі ласка, увядзіце https для SSL або http для не-ssl злучэння',
'fqdn' => 'Увядзіце даменнае імя (напрыклад, node.example.com), якое будзе выкарыстоўвацца для падключэння да дэману. IP-адрас можа выкарыстоўвацца толькі ў тым выпадку, калі вы не выкарыстоўваеце SSL для гэтага вузла',
'public' => 'Ці павінен гэты вузел быць публічным? Як заўвага, усталёўка вузла ў рэжым прыватнасці будзе адмаўляць магчымасць аўтаматычнага разгортвання на гэтым вузле',
'behind_proxy' => 'Ваш FQDN знаходзіцца за проксі?',
'maintenance_mode' => 'Ці павінен быць уключаны рэжым абслугоўвання?',
'memory' => 'Увядзіце максімальную колькасць памяці',
'memory_overallocate' => 'Увядзіце колькасць памяці для пераразмеркавання, -1 адключыць праверку, а 0 не дазволіць ствараць новыя серверы',
'disk' => 'Увядзіце максімальную колькасць месца на дыску',
'disk_overallocate' => 'Увядзіце колькасць месца на дыску для пераразмеркавання, -1 адключыць праверку, а 0 не дазволіць ствараць новыя серверы',
'cpu' => 'Увядзіце максімальную колькасць працэсарных рэсурсаў',
'cpu_overallocate' => 'Увядзіце колькасць працэсарных рэсурсаў для пераразмеркавання, -1 адключыць праверку, а 0 не дазволіць ствараць новыя серверы',
'upload_size' => 'Увядзіце максімальны памер файла для загрузкі',
'daemonListen' => 'Увядзіце порт для праслухоўвання дэману',
'daemonSFTP' => 'Увядзіце порт праслухоўвання SFTP дэману',
'daemonSFTPAlias' => 'Увядзіце псеўданім SFTP дэману (можа быць пустым)',
'daemonBase' => 'Увядзіце асноўную тэчку',
'success' => 'Паспяхова створаны новы вузел з імем :name і Id :id',
],
'node_config' => [
'error_not_exist' => 'Выбраны вузел не існуе.',
'error_invalid_format' => 'Указаны няправільны фармат. Дапушчальныя фарматы: yaml і json.',
],
'key_generate' => [
'error_already_exist' => 'Выглядае, што вы ўжо наладзілі ключ шыфравання прыкладання. Працягваючы гэты працэс, вы перазапішаце гэты ключ і выклікаеце пашкоджанне дадзеных для ўжо зашыфраваных дадзеных. НЕ ПРАДАЛЖАЙЦЕ, КАЛІ НЕ ВЕДАЕЦЕ, ШТО РАБІЦЕ.',
'understand' => 'Я разумею наступствы выканання гэтай каманды і бяру на сябе ўсю адказнасць за страту зашыфраваных дадзеных.',
'continue' => 'Вы ўпэўнены, што хочаце працягнуць? Змена ключа шыфравання прыкладання прівядзе да страту дадзеных.',
],
'schedule' => [
'process' => [
'no_tasks' => 'Няма запланаваных задач для сервера, якія трэба выканаць.',
'error_message' => 'Узнікла памылка пры апрацоўцы задачы: ',
],
],
'upgrade' => [
'integrity' => 'Гэтая каманда не правярае цэласнасць загружаных рэсурсаў. Пераканайцеся, што вы давяраеце крыніцы загрузкі перад працягам. Калі вы не хочаце загружаць архіў, указвайце гэта, выкарыстоўваючы флаг --skip-download, ці адказвайце "не" на наступнае пытанне.',
'source_url' => 'Крыніца загрузкі (устанаўліваецца з --url=):',
'php_version' => 'Немагчыма выканаць працэс саманалажэння. Мінімальная патрабаваная версія PHP — 7.4.0, у вас',
'skipDownload' => 'Хочаце загрузіць і распакаваць архіўныя файлы для апошняй версіі?',
'webserver_user' => 'Ваш карыстальнік вэб-сервера выяўлены як <fg=blue>[{:user}]</>. Ці правільна гэта?',
'name_webserver' => 'Увядзіце імя карыстальніка, які выконвае працэс вэб-сервера. Гэта можа адрознівацца ў залежнасці ад сістэмы, але звычайна гэта "www-data", "nginx" або "apache".',
'group_webserver' => 'Ваша група вэб-сервера выяўлена як <fg=blue>[{:group}]</>. Ці правільна гэта?',
'group_webserver_question' => 'Увядзіце імя групы, якая выконвае працэс вэб-сервера. Звычайна гэта тая ж група, што і ваш карыстальнік.',
'are_your_sure' => 'Вы ўпэўнены, што хочаце запусціць працэс абнаўлення для вашай панэлі?',
'terminated' => 'Працэс абнаўлення быў спынены карыстальнікам.',
'success' => 'Панэль была паспяхова абноўлена. Пераканайцеся, што вы таксама абнаўляеце ўсе экземпляры дэману.',
],
];

19
lang/be/pagination.php Normal file
View File

@@ -0,0 +1,19 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Pagination Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used by the paginator library to build
| the simple pagination links. You are free to change them to anything
| you want to customize your views to better match your application.
|
*/
'previous' => '&laquo; Папярэдняя',
'next' => 'Наступная &raquo;',
];

22
lang/be/passwords.php Normal file
View File

@@ -0,0 +1,22 @@
<?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
| outcome such as failure due to an invalid password / reset token.
|
*/
'reset' => 'Ваш пароль быў скінуты.',
'sent' => 'Мы адправілі вам спасылку для скіду пароля.',
'throttled' => 'Калі ласка, пачакайце перад паўторным спробам.',
'token' => 'Гэты токен скіду пароля недакладны.',
'user' => 'Мы не можам знайсці карыстальніка з гэтай поштай.',
];

9
lang/be/search.php Normal file
View File

@@ -0,0 +1,9 @@
<?php
return [
'validation' => 'Калі ласка, увядзіце хаця б тры сімвалы, каб пачаць пошук.',
'term' => [
'label' => 'Тэрмін для пошуку',
'description' => 'Увядзіце назву сервера, UUID або сець, каб пачаць пошук.',
],
];

101
lang/be/validation.php Normal file
View File

@@ -0,0 +1,101 @@
<?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' => 'Атрибут: может содержать только буквы, цифры и тире.',
'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',
],
'confirmed' => ':attribute подтверждение не совпадает.',
'date' => '{{ attribute }} з\'яўляецца несапраўдным URL-адрасам',
'date_format' => 'Атрибут: не соответствует формату: формат.',
'different' => ':attribute и :other должны быть разными.',
'digits' => ':attribute должен содержать :digits цифр.',
'digits_between' => ':attribute павінен быць паміж :min і :max лічбамі.',
'dimensions' => ':attribute мае недапушчальныя памеры выявы.',
'email' => ':attribute павінен быць правільным адрасам пошты.',
'file' => ':attribute павінен быць файлам.',
'filled' => 'Поле :attribute абавязковае.',
'image' => ':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 элементаў.',
],
'numeric' => ':attribute павінен быць лікам.',
'regex' => 'Фармат :attribute недапушчальны.',
'required_with_all' => 'Поле :attribute абавязковае, калі :values прысутнічае.',
'same' => ':attribute і :other павінны супадаць.',
'size' => [
'numeric' => ':attribute павінен быць :size.',
'file' => ':attribute павінен быць :size кілабайт.',
'string' => ':attribute павінен быць :size сімвалаў.',
'array' => ':attribute павінен утрымліваць :size элементаў.',
],
'string' => ':attribute павінен быць радком.',
'timezone' => ':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' => 'Уведзены пароль недапушчальны для гэтага акаўнта.',
],
];

View File

@@ -0,0 +1,44 @@
<?php
return [
'heading' => 'Добре дошъл в Pelican!',
'version' => 'Верия: :version',
'advanced' => 'За напреднали',
'server' => 'Сървър',
'user' => 'Потребител',
'sections' => [
'intro-developers' => [
'heading' => 'Информация за разработчици',
'content' => 'Благодарим ви че изпробвате версията за разработка!',
'extra_note' => 'Ако намерите някакви проблеми, моля докладвайте ги в GitHub.',
'button_issues' => 'Създай проблем',
'button_features' => 'Обсъждане на характеристиките',
],
'intro-update-available' => [
'heading' => 'Налична актуализация',
'content' => ':latestVersion вече е налична! Прочети нашата докоментация за да актуализираш твоя панел.',
],
'intro-no-update' => [
'heading' => 'Вашият панел е актуален',
'content' => 'Използвате Pelican версия :version. Вашият панел е актуален!',
],
'intro-first-node' => [
'heading' => 'Не са намерени node-ове',
'content' => 'Изглежда че нямаш конфигурирани node-ове но не се притеснявай, защото можеш да натиснеш бутона за действие да създадеш първия си node.',
'extra_note' => 'Ако намерите някакви проблеми моля, докладвайте ги в GitHub.',
'button_label' => 'Създай първия си Node в Pelican',
],
'intro-support' => [
'heading' => 'Подкрепете Pelican',
'content' => 'Благодарим ви че използваш Pelican, Това можеше да се случи само чрез твойта подкрепа, на нашите сътрудници и останалите ни поддръжници!',
'extra_note' => 'Оценяваме каквато и да е подкрепа от всеки.',
'button_translate' => 'Помогнете с превода',
'button_donate' => 'Дари директно',
],
'intro-help' => [
'heading' => 'Нужда от помощ?',
'content' => 'Погледни документацията първо! Ако още ти е нужна помощ, отиди в нашият Discord сървър!',
'button_docs' => 'Прочети документацията',
],
],
];

19
lang/bg/pagination.php Normal file
View File

@@ -0,0 +1,19 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Pagination Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used by the paginator library to build
| the simple pagination links. You are free to change them to anything
| you want to customize your views to better match your application.
|
*/
'previous' => '&laquo; Предишно',
'next' => 'Следващо &raquo;',
];

101
lang/bg/validation.php Normal file
View File

@@ -0,0 +1,101 @@
<?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 не е валиден линк.',
'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 елемента.',
],
'confirmed' => 'Потвържденито на :attribute не съвпада.',
'date' => ':attribute не е валидна дата.',
'date_format' => ':attribute не съотвества на формата :format.',
'different' => ':attribute и :other трябва да са различни.',
'digits' => ':attribute трябва да е :digits цифри.',
'digits_between' => ':attribute трябва да бъде между :min и :max цифри.',
'dimensions' => 'Изображението :attribute има невалидни размери.',
'email' => ':attribute трябва да бъде валиден имейл адрес.',
'file' => ':attribute трябва да бъде файл.',
'filled' => 'Полето :attribute е задължително.',
'image' => ':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 елемента.',
],
'numeric' => ':attribute трябва да е число.',
'regex' => 'Формата :attribute е невалиден',
'required_with_all' => 'Полето :attribute е задължително когато :values присъства.',
'same' => ':attribute и :other трябва да съвпадат.',
'size' => [
'numeric' => ':attribute трябва да е :size.',
'file' => ':attribute трябвада бъде :size килобайта.',
'string' => ':attribute трябва да е :size знака.',
'array' => ':attribute трябва да съдържа :size елемента.',
],
'string' => ':attribute трябва да бъде низ.',
'timezone' => ':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' => 'Зададената парола е невалидна за този акаунт.',
],
];

122
lang/cs/activity.php Normal file
View File

@@ -0,0 +1,122 @@
<?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/a',
'password-reset' => 'Obnovit heslo',
'checkpoint' => 'Požadováno dvoufaktorové ověření',
'recovery-token' => 'Použitý dvoufázový obnovovací token',
'token' => 'Vyřešená dvoufaktorová výzva',
'ip-blocked' => 'Zablokován požadavek z neuvedené IP adresy pro <b>:identifier</b>',
'sftp' => [
'fail' => 'Selhalo přihlášení SFTP',
],
],
'user' => [
'account' => [
'email-changed' => 'Změněný e-mail z <b>:old</b> na <b>:new</b>',
'password-changed' => 'Změněné heslo',
],
'api-key' => [
'create' => 'Vytvořen nový API klíč <b>:identifier</b>',
'delete' => 'Smazán API klíč <b>:identifier</b>',
],
'ssh-key' => [
'create' => 'Přidán SSH klíč <b>:fingerprint</b> k účtu',
'delete' => 'Odstraněn SSH klíč <b>:fingerprint</b> z účtu',
],
'two-factor' => [
'create' => 'Povoleno dvoufaktorové ověření',
'delete' => 'Zakázáno dvoufaktorové ověření',
],
],
'server' => [
'console' => [
'command' => 'Proveden příkaz "<b>:command</b>“ 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' => 'Stáhnuto <b>:name</b> zálohu',
'delete' => 'Smazána záloha <b>:name</b>',
'restore' => 'Obnovena záloha <b>:name</b> (smazané soubory: <b>:truncate</b>)',
'restore-complete' => 'Dokončená obnova zálohy <b>:name</b>',
'restore-failed' => 'Nepodařilo se dokončit obnovení zálohy <b>:name</b>',
'start' => 'Nová záloha byla spuštěna <b>:name</b>',
'complete' => 'Označil <b>:name</b> záloha jako kompletní',
'fail' => 'Záloha označena jako neúspěšná <b>:name</b>',
'lock' => 'Uzamčeno <b>:name</b> záloha',
'unlock' => 'Odemknul <b>:name</b> zálohu',
],
'database' => [
'create' => 'Vytvořena nová databáze <b>:name</b>',
'rotate-password' => 'Heslo pro databázi <b>:name</b>',
'delete' => 'Smazána databáze <b>:name</b><b>',
],
'file' => [
'compress' => 'Komprimováno <b>:directory:files</b>|Komprimováno <b>:count</b> souborů v <b>:directory</b>',
'read' => 'Zobrazen obsah <b>:file</b>',
'copy' => 'Vytvořena kopie <b>:file</b>',
'create-directory' => 'Vytvořený adresář <b>:directory:name</b>',
'decompress' => 'Dekomprimován <b>:file</b> v <b>:directory</b>',
'delete' => 'Smazáno <b>:directory:files</b>|Smazáno <b>:count</b> souborů v <b>:directory</b>',
'download' => 'Staženo <b>:file</b>',
'pull' => 'Stáhnout vzdálený soubor z <b>:url</b> do <b>:directory</b>',
'rename' => 'Přesunuto / přejmenováno <b>:from</b> to <b>:to</b>|Moved/ přejmenováno <b>:count</b> souborů v <b>:directory</b>',
'write' => 'Přepsaný nový obsah v <b>:file</b>',
'upload' => 'Zahájeno nahrávání souboru',
'uploaded' => 'Nahráno <b>:directory:file</b>',
],
'sftp' => [
'denied' => 'Zablokován přístup SFTP z důvodu oprávnění',
'create' => 'Vytvořeno <b>:files</b>|Vytvořeno <b>:count</b> nových souborů',
'write' => 'Upravil obsah <b>:files</b>|Upravil obsah <b>:count</b> souborů',
'delete' => 'Smazáno <b>:files</b>|Smazáno <b>:count</b> souborů',
'create-directory' => 'Vytvořil adresář <b>:files</b> | Vytvořil <b>:count</b> adresáře',
'rename' => 'Přejmenováno <b>:z</b> na <b>:to</b>|přejmenováno nebo přesunuto <b>:count</b> souborů',
],
'allocation' => [
'create' => 'Přidáno <b>:allocace</b> na server',
'notes' => 'Aktualizovány poznámky pro <b>:allocation</b> z "<b>:old</b>" na "<b>:new</b>"',
'primary' => 'Nastavil <b>:allocation</b> jako primární rozvržení serveru',
'delete' => 'Smazáno <b>:allocation</b> alokace',
],
'schedule' => [
'create' => 'Vytvořil/a plán <b>:name</b>',
'update' => 'Aktualizován plán <b>:name</b>',
'execute' => 'Manuálně provést plán <b>:name</b>',
'delete' => 'Smazán plán <b>:name</b>',
],
'task' => [
'create' => 'Vytvořil nový úkol "<b>:action</b>" pro <b>:name</b> plán',
'update' => 'Aktualizoval úkol "<b>:action</b>" pro plán <b>:name</b>',
'delete' => 'Odstraněna akce "<b>:action</b>" pro plán <b>:name</b>',
],
'settings' => [
'rename' => 'Přejmenoval server z "<b>:old</b>" na "<b>:new</b>"',
'description' => 'Změnil popis serveru z "<b>:old</b>" na "<b>:new</b>"',
'reinstall' => 'Server přeinstalován',
],
'startup' => [
'edit' => 'Změnil proměnnou <b>:variable</b> z "<b>:old</b>" na "<b>:new</b>"',
'image' => 'Aktualizoval Docker Image pro server z <b>:old</b> na <b>:new</b>',
],
'subuser' => [
'create' => 'Přidáno <b>:email</b> jako poduživatel',
'update' => 'Aktualizována oprávnění poduživatele pro <b>:email</b>',
'delete' => 'Odstraněno <b>:email</b> jako poduživatel',
],
'crashed' => 'Server havaroval',
],
];

27
lang/cs/admin/apikey.php Normal file
View File

@@ -0,0 +1,27 @@
<?php
return [
'title' => 'API klíče aplikace',
'empty_table' => 'Žádné API klíče.',
'whitelist' => 'Povolené IPv4 adresy',
'whitelist_help' => 'API klíče mohou být omezeny pouze na práci z konkrétních IPv4 adres. Zadejte každou adresu na novém řádku.',
'whitelist_placeholder' => 'Příklad: 127.0.0.1 nebo 192.168.1.1',
'description' => 'Popis:',
'description_help' => 'Stručný popis toho, k čemu tento klíč je.',
'nav_title' => 'API klíče',
'model_label' => 'API klíče aplikace',
'model_label_plural' => 'API klíče aplikace',
'table' => [
'key' => 'Klíč',
'description' => 'Popis:',
'last_used' => 'Naposledy použito',
'created' => 'Vytvořeno',
'created_by' => 'Vytvořil:',
'never_used' => 'Nikdy nepoužito',
],
'permissions' => [
'none' => 'Žádný',
'read' => 'Přečteno',
'read_write' => 'Čtení / zápis',
],
];

View File

@@ -0,0 +1,44 @@
<?php
return [
'heading' => 'Vítejte v Pelican!',
'version' => 'Verze: :version',
'advanced' => 'Pokročilé',
'server' => 'Server',
'user' => 'Uživatel',
'sections' => [
'intro-developers' => [
'heading' => 'Inofmace o vývojářích',
'content' => 'Děkujeme za zkoušení naší vývojářské verze',
'extra_note' => 'Pokud naleznete bugy nahlaste je přes GitHub',
'button_issues' => 'Vytvořit problém',
'button_features' => 'Diskutujte o funkcích',
],
'intro-update-available' => [
'heading' => 'Aktulizace je dostupná',
'content' => ':latestVersion je nyní dostupná! Přečtěte si dokumentaci jak aktulizovat váš panel.',
],
'intro-no-update' => [
'heading' => 'Máte nejnovější verzy panelu',
'content' => 'Právě používáte verzy :version. Váš panel je aktuální',
],
'intro-first-node' => [
'heading' => 'Nebyly nalezeny žádné uzly',
'content' => 'Vypadá to že nemáš žádné Nodes nastavené, ale kliknutím na tlačítko akce můžete vytvořit váš první!',
'extra_note' => 'Pokud naleznete bugy nahlaste je na GitHub',
'button_label' => 'Vytvořte první Node v Pelican',
],
'intro-support' => [
'heading' => 'Podpořte Pelican!',
'content' => 'Děkujeme za používání Pelican, toto je možné vytvářet jen díky vaší podpoře, přespěvatelům a dalším podporovatelům!',
'extra_note' => 'Vážíme si jaké koliv podpory od kohokoliv.',
'button_translate' => 'Pomocte Přeložit',
'button_donate' => 'Darovat přímo',
],
'intro-help' => [
'heading' => 'Potřebujete pomoc?',
'content' => 'Nejdříve se podívejte na dokumentaci! Pokud stále potřebujete pomoc, přejděte na náš Discord server!',
'button_docs' => 'Přečtěte si dokumentaci',
],
],
];

View File

@@ -0,0 +1,74 @@
<?php
return [
'nav_title' => 'Hostitelé databáze',
'model_label' => 'Hostitel databáze',
'model_label_plural' => 'Hostitelé databáze',
'table' => [
'database' => 'Databáze',
'name' => 'Název',
'host' => 'Hostitel',
'port' => 'Port',
'name_helper' => 'Ponecháním tohoto prázdného bude automaticky generováno náhodné jméno',
'username' => 'Uživatelské jméno',
'password' => 'Heslo',
'remote' => 'Připojení od',
'remote_helper' => 'Kde by mělo být povoleno připojení. Ponechte prázdné pro povolení připojení odkudkoliv.',
'max_connections' => 'Maximální počet připojení',
'created_at' => 'Vytvořeno v',
'connection_string' => 'JDBC Connection String',
],
'error' => 'Chyba při připojování k serveru',
'host' => 'Hostitel',
'host_help' => 'IP adresa nebo název domény, které by měly být použity při pokusu o připojení k tomuto MySQL hostiteli z tohoto panelu pro vytvoření nových databází.',
'port' => 'Port',
'port_help' => 'Port který MySQL používá na hostiteli',
'max_database' => 'Maximální počet databází',
'max_databases_help' => 'Maximální počet databází, které mohou být vytvořeny na tomto serveru. Pokud je dosaženo limitu, na tomto hostiteli nelze vytvořit žádné nové databáze. Prázdné je neomezené.',
'display_name' => 'Zobrazené jméno',
'display_name_help' => 'Krátký identifikátor používaný k odlišení tohoto umístění od ostatních. Musí mít 1 až 60 znaků, například us.nyc.lvl3.',
'username' => 'Uživatelské jméno',
'username_help' => 'Uživatelské jméno účtu, který má dostatečná oprávnění pro vytvoření nových uživatelů a databází v systému.',
'password' => 'Heslo',
'password_help' => 'Heslo pro uživatele databáze.',
'linked_nodes' => 'Propojený Nodes',
'linked_nodes_help' => 'Toto nastavení je výchozí pouze pro tuto databázi hostitele při přidání databáze na server vybraného uzlu.',
'connection_error' => 'Chyba při připojování k serveru',
'no_database_hosts' => 'Žádné hostitele databáze',
'no_nodes' => 'Žádné Nodes',
'delete_help' => 'Databáze hostitel má databáze',
'unlimited' => 'Neomezené',
'anywhere' => 'Kdekoliv',
'rotate' => 'Otočit',
'rotate_password' => 'Změnit heslo',
'rotated' => 'Heslo změněné',
'rotate_error' => 'Změna hesla se nezdařila',
'databases' => 'Databáze',
'setup' => [
'preparations' => 'Přípravy',
'database_setup' => 'Nastavení databáze',
'panel_setup' => 'Nastavení panelu',
'note' => 'V současné době jsou podporovány pouze databáze MySQL/ MariaDB!',
'different_server' => 'Jsou panel a databáze <i>ne</i> na stejném serveru?',
'database_user' => 'Uživatel databáze',
'cli_login' => 'Použijte <code>mysql -u root -p</code> pro přístup mysql CLI.',
'command_create_user' => 'Příkaz k vytvoření uživatele',
'command_assign_permissions' => 'Příkaz k přiřazení oprávnění',
'cli_exit' => 'Pro ukončení mysql cli spusťte <code>exit</code>.',
'external_access' => 'Externí přístup',
'allow_external_access' => '
<p>Šance budete muset povolit externí přístup k této instanci MySQL, abyste se k ní mohli připojit.</p>
<br>
<p>otevřít <code>my. nf</code>, které se liší v umístění v závislosti na vašem OS a jak byl MySQL nainstalován. Můžete napsat <code>/etc -iname my.cnf</code> a najít ji.</p>
<br>
<p>Open <code>my. nf</code>, přidejte text níže do spodní části souboru a uložte jej:<br>
<code>[mysqld]<br>bind-address=0. .0.</code></p>
<br>
<p>Restart MySQL/ MariaDB, aby se tyto změny použily. Toto přepíše výchozí konfiguraci MySQL, která bude ve výchozím nastavení přijímat pouze žádosti od localhost. Aktualizace umožní připojení na všech rozhraních, a tedy i externí připojení. Ujistěte se, že povolíte MySQL port (výchozí 3306) ve vaší firewall.</p>
',
],
];

92
lang/cs/admin/egg.php Normal file
View File

@@ -0,0 +1,92 @@
<?php
return [
'nav_title' => 'Vejce',
'model_label' => 'Vejce',
'model_label_plural' => 'Vejce',
'tabs' => [
'configuration' => 'Konfigurace',
'process_management' => 'Správce procesů',
'egg_variables' => 'Egg Variables',
'install_script' => 'Nainstalovat skript',
],
'import' => [
'file' => 'Soubor',
'url' => 'URL',
'egg_help' => 'Toto by mělo být raw .json soubor ( egg-minecraft.json )',
'url_help' => 'URL musí odkazovat přímo na raw .json soubor',
'add_url' => 'Nová URL',
'import_failed' => 'Import se nezdařil',
'import_success' => 'Import proběhl úspěšně',
'github' => 'Přidat z Githubu',
'refresh' => 'Obnovit',
],
'in_use' => 'Používá se',
'servers' => 'Servery',
'name' => 'Název',
'egg_uuid' => 'Egg UUID',
'egg_id' => 'Egg ID',
'name_help' => 'Jednoduché, člověkem čitelné jméno k použití jako identifikátor pro toto vejce.',
'author' => 'Autor',
'uuid_help' => 'Toto je globálně jedinečný identifikátor pro toto vejce, které Wings používá jako identifikátor.',
'author_help' => 'Autor této verze Eggu.',
'author_help_edit' => 'Autor této verze Egg. Nahrání nové konfigurace Egg od jiného autora to změní.',
'description' => 'Popis',
'description_help' => 'Popis tohoto vejce, který se zobrazí v panelu podle potřeby.',
'startup' => 'Příkaz pro spuštění',
'startup_help' => 'Výchozí spouštěcí příkaz, který by měl být použit pro nové servery používající tento egg.',
'file_denylist' => 'Soubor OdmítnoutList',
'file_denylist_help' => 'Seznam souborů, které koncovému uživateli není povoleno upravovat.',
'features' => 'Funkce',
'force_ip' => 'Vynutit odchozí IP',
'force_ip_help' => 'Nutí veškerý odchozí provoz sítě, aby jeho zdrojová IP IP byla zasazena do IP primární alokační IP serveru.
Je vyžadováno pro některé hry, aby fungovaly správně, pokud má uzel více veřejných IP adres.
Povolení této volby zakáže interní síťové připojení pro všechny servery používající tento egg, což způsobí, že nemohou interně přistupovat k jiným serverům ve stejném uzlu.',
'tags' => 'Štítky',
'update_url' => 'Aktualizace adres URL',
'update_url_help' => 'URL musí odkazovat přímo na raw .json soubor',
'add_image' => 'Přidat obrázek Dockeru',
'docker_images' => 'Docker obrazy',
'docker_name' => 'Název obrázku',
'docker_uri' => 'URI obrázku',
'docker_help' => 'Docker obrazy jsou k dispozici pro servery používající tento Egg.',
'stop_command' => 'Příkaz pro zastavení',
'stop_command_help' => 'Příkaz, který by měl být odeslán serveru, aby byl zastaven. Pokud potřebujete poslat SIGINT měli byste zadat ^C zde.',
'copy_from' => 'Zkopírovat nastavení z',
'copy_from_help' => 'Pokud chcete výchozí nastavení z jiného Eggu vyberte z menu výše.',
'none' => 'Žádný',
'start_config' => 'Zahájit konfiguraci',
'start_config_help' => 'Seznam hodnot, které by měl daemon hledat při zapínání serveru, aby bylo možné určit jejich dokončení.',
'config_files' => 'Konfigurační soubor',
'config_files_help' => 'Toto by mělo být zastoupení konfiguračních souborů JSON, které mají být změněny a které části by se měly změnit.',
'log_config' => 'Nastavení logu',
'log_config_help' => 'Toto by mělo být JSON reprezentace místa, kde jsou uloženy logy a zda by démon měl vytvářet vlastní logy.',
'environment_variable' => 'Proměnná prostředí',
'default_value' => 'Výchozí hodnota',
'user_permissions' => 'Oprávnění uživatele',
'viewable' => 'Zobrazitelné',
'editable' => 'Upravitelné',
'rules' => 'Pravidla',
'add_new_variable' => 'Přidat novou proměnnou',
'error_unique' => 'Proměnná s tímto názvem již existuje!',
'error_required' => 'Pole proměnné prostředí je povinné.',
'error_reserved' => 'Tato proměnná prostředí je rezervována a nelze ji použít.',
'script_from' => 'Skript od',
'script_container' => 'Kontejner skriptů',
'script_entry' => 'Záznam skriptu',
'script_install' => 'Nainstalovat skript',
'no_eggs' => 'Žádná vejce',
'no_servers' => 'Žádný Server',
'no_servers_help' => 'K tomuto vejci nejsou přiřazeny žádné servery.',
'update' => 'Aktualizovat|Aktualizovat vybrané',
'updated' => 'Vejce aktualizována|:count/:total vajec aktualizováno',
'updated_failed' => ':count se nezdařilo',
'update_question' => 'Opravdu chcete aktualizovat toto vejce?|Jste si jisti, že chcete aktualizovat vybraná vejce?',
'update_description' => 'Pokud jste provedli nějaké změny vajec, budou přepsáni!|Pokud jste provedli nějaké změny vajec, budou přepsány!',
'no_updates' => 'Žádné aktualizace pro vybrané vejce k dispozici',
];

60
lang/cs/admin/health.php Normal file
View File

@@ -0,0 +1,60 @@
<?php
return [
'title' => 'Zdraví',
'results_refreshed' => 'Výsledky kontroly stavu byly aktualizovány',
'checked' => 'Kontrolované výsledky od :time',
'refresh' => 'Obnovit',
'results' => [
'cache' => [
'label' => 'Mezipaměť',
'ok' => 'Ok',
'failed_retrieve' => 'Nelze nastavit nebo načíst hodnotu mezipaměti aplikace.',
'failed' => 'Došlo k výjimce v mezipaměti aplikace: :error',
],
'database' => [
'label' => 'Databáze',
'ok' => 'Ok',
'failed' => 'Nelze se připojit k databázi: :error',
],
'debugmode' => [
'label' => 'Režim ladění',
'ok' => 'Režim ladění je zakázán',
'failed' => 'Režim ladění byl očekáván :expected, ale ve skutečnosti byl :actual',
],
'environment' => [
'label' => 'Prostředí',
'ok' => 'Ok, nastavte na :actual',
'failed' => 'Prostředí je nastaveno na :actual , Očekáváno :expected',
],
'nodeversions' => [
'label' => 'Verze uzlu',
'ok' => 'Uzly jsou aktuální',
'failed' => ':zastaralý/:all uzly jsou zastaralé',
'no_nodes_created' => 'Nebyly vytvořeny žádné uzly',
'no_nodes' => 'Žádné uzly',
'all_up_to_date' => 'Všechny aktuální',
'outdated' => ':zastaralý/:all zastaralý',
],
'panelversion' => [
'label' => 'Verze panelu',
'ok' => 'Máte nejnovější verzy panelu',
'failed' => 'Nainstalovaná verze je :currentVersion ale nejnovější je :latestversion',
'up_to_date' => 'Aktuální',
'outdated' => 'Neaktuální',
],
'schedule' => [
'label' => 'Rozvrh',
'ok' => 'Ok',
'failed_last_ran' => 'Poslední běh plánu byl před více než :time minutami',
'failed_not_ran' => 'Plán se ještě nespustil.',
],
'useddiskspace' => [
'label' => 'Místo na disku',
],
],
'checks' => [
'successful' => 'Úspěšné',
'failed' => 'Selhání',
],
];

30
lang/cs/admin/mount.php Normal file
View File

@@ -0,0 +1,30 @@
<?php
return [
'nav_title' => 'Připojení',
'model_label' => 'Připojit',
'model_label_plural' => 'Připojit',
'name' => 'Název',
'name_help' => 'Jedinečný název použitý k oddělení tohoto přípojného zařízení od jiného.',
'source' => 'Zdroj',
'source_help' => 'Cesta k souboru v hostitelském systému pro připojení k kontejneru.',
'target' => 'Cíl',
'target_help' => 'Tam, kde bude montáž přístupná uvnitř kontejneru.',
'read_only' => 'Pouze pro čtení?',
'read_only_help' => 'Je připojení čteno pouze uvnitř kontejneru?',
'description' => 'Popis:',
'description_help' => 'Delší popis pro toto připojení',
'no_mounts' => 'Žádná připojení',
'eggs' => 'Vejce',
'nodes' => 'Uzly',
'toggles' => [
'writable' => 'Lze zapisovat',
'read_only' => 'Pouze pro čtení',
],
'table' => [
'name' => 'Název',
'all_eggs' => 'Všechna vejce.',
'all_nodes' => 'Všechny uzly',
'read_only' => 'Pouze pro čtení',
],
];

115
lang/cs/admin/node.php Normal file
View File

@@ -0,0 +1,115 @@
<?php
return [
'nav_title' => 'Uzly',
'model_label' => 'Uzel',
'model_label_plural' => 'Uzly',
'tabs' => [
'overview' => 'Přehled',
'basic_settings' => 'Základní nastavení',
'advanced_settings' => 'Pokročilá nastavení',
'config_file' => 'Konfigurační soubor',
],
'table' => [
'health' => 'Zdraví',
'name' => 'Název',
'address' => 'Adresa',
'public' => 'Veřejné',
'servers' => 'Servery',
'alias' => 'Alias',
'ip' => 'IP',
'egg' => 'Vejce',
'owner' => 'Vlastník',
'allocation_notes' => 'Poznámky',
'no_notes' => 'Žádné poznámky',
],
'node_info' => 'Systémové Informace',
'wings_version' => 'Verze Wings',
'cpu_threads' => 'CPU vlákna',
'architecture' => 'Architektura',
'kernel' => 'Jádro',
'unknown' => 'Neznámý',
'latest' => 'Nejnovější',
'node_uuid' => 'ID uzlu',
'node_id' => 'ID uzlu',
'ip_address' => 'IP adresa',
'ip_help' => 'Obvykle veřejná IP adresa Vašeho počítače, pokud neportujete přeposílání.',
'alias_help' => 'Volitelné zobrazované jméno, které vám pomůže si zapamatovat, co to je.',
'domain' => 'Název domény',
'ssl_ip' => 'Nelze se připojit k IP adrese přes SSL',
'error' => 'Toto je doménový název, který odkazuje na IP adresu vašeho uzlu. Pokud jste již tuto možnost nastavili, můžete ji ověřit zaškrtnutím dalšího pole!',
'fqdn_help' => 'Váš panel je v současné době zabezpečen pomocí SSL certifikátu a to znamená, že vaše uzly vyžadují také. Musíte použít název domény, protože nelze získat SSL certifikáty pro IP adresy.',
'dns' => 'Kontrola záznamu DNS',
'dns_help' => 'To vám umožní zjistit, zda DNS záznam ukazuje na správnou IP adresu.',
'valid' => 'Platné',
'invalid' => 'Neplatné',
'port' => 'Port',
'ports' => 'Porty',
'port_help' => 'Pokud používáte daemon za Cloudflare, měli byste nastavit daemon port na 8443, aby bylo umožněno proxying websocketu přes SSL.',
'connect_port' => 'Port pro připojení',
'connect_port_help' => 'Připojení s wings použije tento port. Pokud používáte reverzní proxy tak se tohle může lišit od naslouchajícího portu. Při použití Cloudflare proxy byste měli použít 8443.',
'listen_port' => 'Naslouchat na portu',
'listen_port_help' => 'Wings budou běžet na tomto portu.',
'display_name' => 'Zobrazovaný název',
'ssl' => 'Komunikovat přes SSL',
'panel_on_ssl' => 'Váš panel používá zabezpečené SSL připojení,<br>takže váš Daemon musí.',
'ssl_help' => 'IP adresa nemůže použít SSL.',
'tags' => 'Tagy',
'upload_limit' => 'Limit odesílání',
'upload_limit_help' => [
'Zadejte maximální velikost souborů, které lze nahrát prostřednictvím webového správce souborů.',
'Ujistěte se, že váš webserver podporuje nahrávání souborů této velikosti!',
],
'sftp_port' => 'SFTP port',
'sftp_alias' => 'SFTP Alias',
'sftp_alias_help' => 'Zobrazit alias pro SFTP adresu. Ponechte prázdné pro použití Node FQDN.',
'use_for_deploy' => 'Použít pro zaměstnání?',
'maintenance_mode' => 'Režim údržby',
'maintenance_mode_help' => 'Pokud je uzel označen jako \'v rámci údržby\', uživatelé nebudou moci přistupovat k serverům, které jsou na tomto uzlu',
'cpu' => 'CPU',
'cpu_limit' => 'Limit CPU',
'memory' => 'Paměť',
'memory_limit' => 'Limit paměti',
'disk' => 'Disk',
'disk_limit' => 'Limit Disk',
'unlimited' => 'Neomezené',
'limited' => 'Omezené',
'overallocate' => 'Přetížené',
'enabled' => 'Aktivováno',
'disabled' => 'Deaktivován',
'yes' => 'Ano',
'no' => 'Ne',
'instructions' => 'Pokyny',
'instructions_help' => 'Uložit tento soubor do kořenového adresáře vašeho daemonu, s názvem config.yml',
'auto_deploy' => 'Příkaz automatického nasazení',
'auto_question' => 'Vyberte si mezi samostatnou instalací a instalací Docker.',
'standalone' => 'Samostatný',
'docker' => 'Docker',
'auto_command' => 'Pro automatickou konfiguraci vašeho uzlu spusťte následující příkaz:',
'reset_token' => 'Resetovat autorizační token',
'token_reset' => 'Token daemona byl resetován.',
'reset_help' => 'Resetování daemon token zruší jakýkoliv požadavek pocházející ze starého tokenu. Tento token se používá pro všechny citlivé operace na démonu, včetně vytvoření a smazání serveru. Z důvodu bezpečnosti doporučujeme tento token pravidelně měnit.',
'no_nodes' => 'Žádné uzly',
'cpu_chart' => 'CPU - :cpu% of :max%',
'memory_chart' => 'Pamětí - :used of :total',
'disk_chart' => 'Úložiště - :used z :total',
'used' => 'Použité',
'unused' => 'Nepoužité',
'next_step' => 'Další krok',
'node_has_servers' => 'Uzel má servery',
'create_allocation' => 'Vytvořit alokaci',
'primary_allocation' => 'Vytvořit alokaci',
'databases' => 'Databáze',
'backups' => 'Zálohy',
'error_connecting' => 'Chyba při připojování k serveru',
'error_connecting_description' => 'Konfiguraci nebylo možné automaticky aktualizovat, budete muset manuálně aktualizovat konfigurační soubor.',
'allocation' => 'Alokace',
];

17
lang/cs/admin/role.php Normal file
View File

@@ -0,0 +1,17 @@
<?php
return [
'nav_title' => 'Role',
'model_label' => 'Role',
'model_label_plural' => 'Role',
'no_roles' => 'Žádné role',
'name' => 'Název role',
'permissions' => 'Oprávnění',
'in_use' => 'Používá se',
'all' => 'Vše',
'root_admin' => ':role má všechna oprávnění.',
'root_admin_delete' => 'Nelze odstranit Root Admin',
'users' => 'Uživatelé',
'nodes' => 'Síťové uzly',
'nodes_hint' => 'Ponechte prázdné pro povolení přístupu ke všem uzlům.',
];

138
lang/cs/admin/server.php Normal file
View File

@@ -0,0 +1,138 @@
<?php
return [
'nav_title' => 'Servery',
'model_label' => 'Server',
'model_label_plural' => 'Servery',
'no_servers' => 'Žádné servery',
'next_step' => 'Další krok',
'ip_address' => 'IP adresa',
'ip_address_helper' => 'Obvykle veřejná IP adresa Vašeho počítače, pokud neportujete přeposílání.',
'port' => 'Port',
'ports' => 'Porty',
'alias' => 'Alias',
'alias_helper' => 'Volitelné zobrazované jméno, které vám pomůže si zapamatovat, co to je.',
'name' => 'Název',
'external_id' => 'Externí ID',
'owner' => 'Vlastník',
'description' => 'Popis',
'install_script' => 'Spustit instalační Script?',
'start_after' => 'Začít po instalaci?',
'yes' => 'Ano',
'no' => 'Ne',
'skip' => 'Přeskočit',
'primary' => 'Primární',
'already_primary' => 'Již primární',
'make_primary' => 'Nastavit jako primární',
'startup_cmd' => 'Příkaz pro spuštění',
'default_startup' => 'Výchozí příkaz pro spuštění',
'variables' => 'Proměnné',
'resource_limits' => 'Limity zdrojů',
'cpu' => 'CPU',
'cpu_limit' => 'Limit CPU',
'cpu_helper' => '100% se rovná jednomu jádru CPU.',
'unlimited' => 'Neomezené',
'limited' => 'Omezené',
'enabled' => 'Aktivováno',
'disabled' => 'Deaktivováno',
'memory' => 'Paměť',
'memory_limit' => 'Limit paměti',
'memory_helper' => 'Křídla k této hodnotě přidají hlavu při vytváření kontejneru, aby se ujistila, že při používání maximální paměti nehladoví.',
'disk' => 'Místo na disku',
'disk_limit' => 'Limit místa na disku',
'advanced_limits' => 'Pokročilé limity',
'cpu_pin' => 'Připnutí CPU',
'threads' => 'Připnuté vlákna',
'pin_help' => 'Přidat připnuté vlákno, např. 0 nebo 2-4',
'swap' => 'Přepnout paměť',
'swap_limit' => 'Přepnout limit paměti',
'oom' => 'OOM zabiják',
'feature_limits' => 'Omezení funkcí',
'docker_settings' => 'Nastavení Dockeru',
'docker_image' => 'Docker Image',
'image_name' => 'Název obrázku',
'primary_allocation' => 'Hlavní alokace',
'image' => 'Obrázek',
'image_placeholder' => 'Zadejte vlastní obrázek',
'container_labels' => 'Popisek kontejneru:',
'title' => 'Název',
'actions' => 'Akce',
'console' => 'Konzole',
'suspend' => 'Pozastavit',
'unsuspend' => 'Zrušit pozastavení',
'reinstall' => 'Přeinstalovat',
'reinstall_help' => 'Toto přeinstaluje server pomocí přiřazeného instalačního skriptu z vajec.',
'reinstall_modal_heading' => 'Opravdu chcete přeinstalovat tento server?',
'reinstall_modal_description' => '!! To může mít za následek nevratnou ztrátu dat!!',
'server_status' => 'Stav serveru',
'view_install_log' => 'Zobrazit protokol instalace',
'uuid' => 'UUID',
'node' => 'Uzel',
'short_uuid' => 'Krátká UUID',
'toggle_install' => 'Přepnout stav instalace',
'toggle_install_help' => 'Pokud potřebujete změnit stav instalace z odinstalovaného na instalovaný nebo naopak, můžete tak učinit tímto tlačítkem.',
'toggle_install_failed_header' => 'Server je ve stavu selhání',
'toggle_install_failed_desc' => 'Chcete to opravit přeinstalací serveru?',
'transfer' => 'Převést',
'transfer_help' => 'Přenést server na jiný uzel. <br/><b>Upozornění!</b> Tato funkce je stále experimentální. Doporučujeme si nejdříve vytvořit zálohu pro případ ztráty dat.',
'condition' => 'Podmínky',
'suspend_all' => 'Zastavit všechny servery',
'unsuspend_all' => 'Zrušit pozastavení všech serverů',
'select_allocation' => 'Vybrat alokaci',
'new_allocation' => 'Vytvořit novou alokaci',
'additional_allocations' => 'Další alokace',
'select_additional' => 'Vybrat další alokace',
'no_variables' => 'Vybrané vejce nemá žádné proměnné!',
'select_egg' => 'Vyberte nejprve vajíčko pro zobrazení proměnných!',
'allocations' => 'Alokace',
'databases' => 'Databáze',
'no_databases' => 'Pro tento server neexistují žádné databáze',
'delete_db' => 'Jste si jisti, že chcete odstranit',
'delete_db_heading' => 'Smazat databázi?',
'backups' => 'Zálohy',
'egg' => 'Vejce',
'mounts' => 'Připojení',
'no_mounts' => 'Pro tento uzel neexistují žádná zařízení',
'create_database' => 'Vytvořit databázi',
'no_db_hosts' => 'Žádní hostitelé databáze',
'failed_to_create' => 'Chyba při vytváření databáze',
'change_egg' => 'Změna vejce',
'new_egg' => 'Nové vejce.',
'keep_old_variables' => 'Ponechat staré proměnné, pokud je to možné.',
'create_allocation' => 'Vytvořit alokace',
'add_allocation' => 'Přidat alokace',
'view' => 'Zobrazit',
'no_log' => 'Žádný protokol není k dispozici',
'tabs' => [
'information' => 'Informace',
'egg_configuration' => 'Nastavení vejce',
'environment_configuration' => 'Konfigurace prostředí',
],
'notifications' => [
'server_suspension' => 'Pozastavení serveru',
'server_suspended' => 'Server byl zablokován',
'server_suspend_help' => 'To zastaví server, zastaví všechny procesy spuštění, a okamžitě zablokovat uživateli přístup ke svým souborům nebo jiným způsobem spravovat server prostřednictvím panelu nebo API.',
'server_unsuspend_help' => 'Zruší se pozastavení serveru a obnoví přístup k běžnému uživateli.',
'server_unsuspended' => 'Server byl zablokován',
'error_server_delete' => 'Server nemohl být bezpečně odstraněn.',
'error_server_delete_body' => 'Můžete si jej odstranit vynuceně.',
'create_failed' => 'Nelze vytvořit server',
'invalid_port_range' => 'Neplatný rozsah portu',
'invalid_port_range_body' => 'Rozsah portu není platná čísla: :port',
'too_many_ports' => 'Příliš mnoho portů najednou!',
'too_many_ports_body' => 'Aktuální limit je :limit počtu portů najednou.',
'invalid_port' => 'Port není v platném rozsahu',
'invalid_port_body' => ':i není v platném rozsahu portu mezi :portFloor-:portCeil',
'already_exists' => 'Port už je používán',
'already_exists_body' => ':i již má alokaci',
'error_connecting' => 'Chyba při připojování k :node',
'error_connecting_description' => 'Konfiguraci nebylo možné automaticky synchronizovat, budete muset manuálně restartovat server.',
'install_toggled' => 'Stav instalace přepnutý',
'install_toggle_failed' => 'Stav instalace nelze přepnout',
'reinstall_started' => 'Přeinstalování zahájeno',
'reinstall_failed' => 'Nelze spustit přeinstalaci',
'log_failed' => 'Nelze se připojit k křídlu pro načítání instalačního protokolu serveru.',
],
'notes' => 'Poznámky',
'no_notes' => 'Žádné poznámky',
];

150
lang/cs/admin/setting.php Normal file
View File

@@ -0,0 +1,150 @@
<?php
return [
'title' => 'Nastavení',
'save_success' => 'Nastavení uloženo',
'save_failed' => 'Nepodařilo se uložit nastavení',
'navigation' => [
'general' => 'Všeobecné',
'captcha' => 'Captcha',
'mail' => 'E-mail',
'backup' => 'Záloha',
'oauth' => 'OAuth',
'misc' => 'OstatnÍ',
],
'general' => [
'app_name' => 'Název aplikace',
'app_logo' => 'Logo aplikace',
'app_logo_help' => 'Logo by mělo být umístěno ve veřejné složce umístěné v kořenovém panelu. Nechte prázdné pro použití názvu aplikace.',
'app_favicon' => 'Aplikace ikona (favicon)',
'app_favicon_help' => 'Favicon by měly být umístěny ve veřejné složce, umístěné v kořenovém panelu.',
'debug_mode' => 'Režim ladění',
'navigation' => 'Navigace',
'sidebar' => 'Postranní panel',
'topbar' => 'Horní lišta',
'unit_prefix' => 'Prefix jednotky',
'decimal_prefix' => 'Desetinná předpona (MB/GB)',
'binary_prefix' => 'Binární předpona (MiB/GiB)',
'2fa_requirement' => '2FA požadavek',
'not_required' => 'Nevyžadováno',
'admins_only' => 'Vyžadováno pouze pro administrátory',
'all_users' => 'Vyžadováno pro všechny uživatele',
'trusted_proxies' => 'Důvěryhodné proxies',
'trusted_proxies_help' => 'Rozsah nové IP nebo IP adresy',
'clear' => 'Vymazat',
'set_to_cf' => 'Nastavit na Cloudflare IP',
'display_width' => 'Šířka displeje',
'avatar_provider' => 'Poskytovatel Avataru',
'uploadable_avatars' => 'Povolit uživatelům nahrát vlastní avatar?',
],
'captcha' => [
'enable' => 'Povolit',
'disable' => 'Zakázat',
'info_label' => 'Informace',
'info' => 'Tlačítka můžete vygenerovat na <u><a href="https://developers.cloudflare.com/turnstile/get-started/#get-a-sitekey-and-secret-key" target="_blank">Cloudflare Dashboard</a></u>. Je vyžadován účet Cloudflare.',
'site_key' => 'Klíč webu',
'secret_key' => 'Tajný klíč:',
'verify' => 'Ověřit Doménu?',
],
'mail' => [
'mail_driver' => 'Ovladač pro e-mail',
'test_mail' => 'Odeslat zkušební poštu',
'test_mail_sent' => 'Zkušební pošta odeslána',
'test_mail_failed' => 'Testovací Mail se nezdařil',
'from_settings' => 'Od nastavení',
'from_settings_help' => 'Nastavte adresu a jméno použité jako "Od" v e-mailu.',
'from_address' => 'Odesilatel',
'from_name' => 'Od (jméno)',
'smtp' => [
'smtp_title' => 'Nastavení SMTP',
'host' => 'Hostitel',
'port' => 'Port',
'username' => 'Uživatelské jméno',
'password' => 'Heslo',
'scheme' => 'Schéma',
],
'mailgun' => [
'mailgun_title' => 'Konfigurace schránky',
'domain' => 'Doména',
'secret' => 'Tajný klíč (Secret)',
'endpoint' => 'Endpoint',
],
],
'backup' => [
'backup_driver' => 'Ovladač zálohy',
'throttle' => 'Štětce',
'throttle_help' => 'Nakonfigurujte, kolik záloh lze vytvořit v periodě. Nastavte období 0 pro vypnutí tohoto tahu.',
'limit' => 'Limit',
'period' => 'Období',
'seconds' => 'Sekundy',
's3' => [
's3_title' => 'S3 Konfigurace',
'default_region' => 'Výchozí region',
'access_key' => 'Přístupový ID klíč',
'secret_key' => 'Tajný Přístupový klíč',
'bucket' => 'Kbelík',
'endpoint' => 'Endpoint',
'use_path_style_endpoint' => 'Použít koncový styl trasy',
],
],
'oauth' => [
'enable' => 'Aktivovat',
'disable' => 'Deaktivovat',
'client_id' => 'ID klienta',
'client_secret' => 'Tajný klíč klienta',
'redirect' => 'Přesměrovat na URL',
'web_api_key' => 'Klíč webového API',
'base_url' => 'Základní adresa URL',
'display_name' => 'Zobrazovaný název',
'auth_url' => 'Autorizační URL zpětného volání',
],
'misc' => [
'auto_allocation' => [
'title' => 'Automatické vytváření alokace',
'helper' => 'Zvolte, zda mohou uživatelé vytvářet alokace přes klientskou oblast.',
'question' => 'Povolit uživatelům vytvářet alokace?',
'start' => 'Spustit port',
'end' => 'Koncový port',
],
'mail_notifications' => [
'title' => 'Upozorňování na e-mail',
'helper' => 'Určuje, která e-mailová oznámení by měla být odeslána uživatelům.',
'server_installed' => 'Server nainstalován',
'server_reinstalled' => 'Server přeinstalován',
],
'connections' => [
'title' => 'Spojení',
'helper' => 'Časový limit použitý při vytváření požadavků.',
'request_timeout' => 'Čas vypršel',
'connection_timeout' => 'Vypršel čas pro připojení',
'seconds' => 'Sekundy',
],
'activity_log' => [
'title' => 'Historie akcí',
'helper' => 'Nakonfigurujte, jak často by měly být staré záznamy o aktivitách vykresleny a zda by měly být logovány administrativní činnosti.',
'prune_age' => 'Vyčistit věk',
'days' => 'Dny',
'log_admin' => 'Skrýt administrátorské aktivity?',
],
'api' => [
'title' => 'API',
'helper' => 'Určuje limit sazby pro počet žádostí za minutu, které lze provést.',
'client_rate' => 'Limit API rychlosti klienta',
'app_rate' => 'Limit API frekvence aplikace',
'rpm' => 'Požadavky za minutu',
],
'server' => [
'title' => 'Servery',
'helper' => 'Nastavení pro servery',
'edit_server_desc' => 'Povolit uživatelům upravovat popisy?',
'console_font_upload' => 'Nahrát písmo konzole',
'console_font_hint' => 'Jsou podporována pouze písma *.ttf. důrazně doporučujeme fonty!',
],
'webhook' => [
'title' => 'Webové háčky',
'helper' => 'Nakonfigurujte, jak často by měly být staré protokoly webových háčků oříznuty.',
'prune_age' => 'Vyčistit stáří',
'days' => 'Dny',
],
],
];

18
lang/cs/admin/user.php Normal file
View File

@@ -0,0 +1,18 @@
<?php
return [
'nav_title' => 'Uživatelé',
'model_label' => 'Uživatel',
'model_label_plural' => 'Uživatelé',
'self_delete' => 'Nelze odstranit sám sebe',
'has_servers' => 'Uživatel má servery',
'email' => 'E-mail',
'username' => 'Uživatelské jméno',
'password' => 'Heslo',
'password_help' => 'Poskytnutí uživatelského hesla je volitelné. Nový uživatelský e-mail vyzve uživatele, aby si při prvním přihlášení vytvořili heslo.',
'admin_roles' => 'Administrátorské role',
'roles' => 'Role',
'no_roles' => 'Žádné role',
'servers' => 'Servery',
'subusers' => 'Poduživatelé',
];

24
lang/cs/auth.php Normal file
View File

@@ -0,0 +1,24 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Authentication Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used during authentication for various
| messages that we need to display to the user. You are free to modify
| these language lines according to your application's requirements.
|
*/
'failed' => 'Tyto přihlašovací údaje neodpovídají uloženým záznamům.',
'failed-two-factor' => 'Nesprávný 2FA kód',
'two-factor-code' => 'Dvojfaktorový kód',
'two-factor-hint' => 'Můžete použít záložní kódy, pokud jste ztratili přístup k vašemu zařízení.',
'password' => 'Zadané heslo není správné.',
'throttle' => 'Příliš mnoho pokusů o přihlášení. Zkuste to prosím znovu za :seconds sekund.',
'2fa_must_be_enabled' => 'Správce požadoval, aby 2-Factor ověření bylo povoleno pro váš účet, aby bylo možné použít panel.',
];

View File

@@ -0,0 +1,57 @@
<?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_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` (:id).',
],
'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 (doména)',
'ask_mailgun_endpoint' => 'Mailgun Endpoint',
'ask_mailgun_secret' => 'Mailgun tajný klíč',
'ask_mandrill_secret' => 'Mandrill Tajný klíč',
'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' => 'Používat šifrovací metodu',
],
],
];

73
lang/cs/commands.php Normal file
View File

@@ -0,0 +1,73 @@
<?php
return [
'appsettings' => [
'comment' => [
'author' => 'Zadejte e-mailovou adresu, ze které by měly být vajíčka exportovaná tímto panelem. Toto by mělo být platná e-mailová adresa.',
'url' => 'URL aplikace MUSÍ začít s https:// nebo http:// v závislosti na tom, zda používáte SSL nebo ne. Pokud nezahrnete do schématu vaše e-maily a jiný obsah bude odkazovat na nesprávné umístění.',
'timezone' => 'Časové pásmo by mělo odpovídat jednomu z podporovaných časových pásem PHP. Pokud si nejste jisti, prosím na https://php.net/manual/en/timezones.php.',
],
'redis' => [
'note' => 'Vybrali jste ovladač Redis pro jednu nebo více možností, poskytněte prosím platné informace o připojení níže. Ve většině případů můžete použít výchozí hodnoty, pokud jste nezměnili nastavení.',
'comment' => 'Ve výchozím nastavení má instance Redis serveru výchozí uživatelské jméno a žádné heslo, protože běží lokálně a je nepřístupné vnějšímu světu. Pokud tomu tak je, stiskněte klávesu Enter bez zadání hodnoty.',
'confirm' => 'Zdá se, že :field je již definovaný pro Redis, chcete ho změnit?',
],
],
'database_settings' => [
'DB_HOST_note' => 'Je důrazně doporučeno nepoužívat "localhost" jako hostitele databáze, protože jsme viděli časté problémy s připojením socketu. Pokud chcete použít místní připojení, měli byste použít "127.0.0.1".',
'DB_USERNAME_note' => 'Použití kořenového účtu pro MySQL spojení není pouze velmi rozblednuté, ale tato aplikace také nepovoluje. Pro tento software budete muset vytvořit MySQL uživatele.',
'DB_PASSWORD_note' => 'Zdá se, že heslo pro připojení k MySQL je již definováno, chcete jej změnit?',
'DB_error_2' => 'Vaše přihlašovací údaje k připojení NEJSOU uloženy. Před pokračováním budete muset poskytnout platné informace o připojení.',
'go_back' => 'Vraťte se zpět a zkuste to znovu',
],
'make_node' => [
'name' => 'Zadejte krátký identifikátor používaný k rozlišení tohoto uzlu od ostatních',
'description' => 'Zadejte popis pro identifikaci uzlu',
'scheme' => 'Prosím, zadejte https for SSL nebo http pro jiné než ssl připojení',
'fqdn' => 'Zadejte název domény (např. node.example.com) pro připojení k Démonu. IP adresa může být použita pouze v případě, že pro tento uzel nepoužíváte SSL',
'public' => 'Měl by být tento uzel veřejný? Pro poznámku, nastavením uzlu soukromému vám bude odepřena možnost automatické nasazení do tohoto uzlu.',
'behind_proxy' => 'Je tvá FQDN za proxy?',
'maintenance_mode' => 'Měl by být režim údržby aktivován?',
'memory' => 'Zadejte maximální množství paměti',
'memory_overallocate' => 'Zadejte množství paměti k překročení alokace, -1 vypne kontrolu a 0 zabrání vytvoření nových serverů',
'disk' => 'Zadejte maximální množství diskového místa',
'disk_overallocate' => 'Zadejte množství disku na překrytí přiděleného množství, -1 zakáže kontrolu a 0 zabrání vytváření nového serveru',
'cpu' => 'Zadejte maximální množství pro Cpu',
'cpu_overallocate' => 'Zadejte množství Cpu k překročení přiděleného množství, -1 vypne kontrolu a 0 zabrání vytvoření nového serveru',
'upload_size' => 'Zadejte maximální velikost nahrávání',
'daemonListen' => 'Vložte port poslechu daemon',
'daemonSFTP' => 'Zadejte port pro poslech SFTP',
'daemonSFTPAlias' => 'Zadejte alias Démon SFTP (může být prázdný)',
'daemonBase' => 'Zadej základní složku',
'success' => 'Nový uzel s názvem :name byl úspěšně vytvořen a obsahuje Id :id',
],
'node_config' => [
'error_not_exist' => 'Vybraný uzel neexistuje.',
'error_invalid_format' => 'Byl zadán neplatný formát. Platné možnosti jsou yaml a json.',
],
'key_generate' => [
'error_already_exist' => 'Zdá se, že již jste nakonfigurovali šifrovací klíč aplikace. Pokračujte v tomto procesu přepsáním klíče a způsobte poškození dat u všech existujících šifrovaných dat. NEPOTVRZUJTE NEPOVINNÉ, KE KTERÉ JSOU JSOU DOTČENÉ.',
'understand' => 'Chápu důsledky provedení tohoto příkazu a přebírám veškerou odpovědnost za ztrátu šifrovaných dat.',
'continue' => 'Opravdu chcete pokračovat? Změna šifrovacího klíče aplikace ZPŮSOBÍ ZTRÁTU DAT.',
],
'schedule' => [
'process' => [
'no_tasks' => 'Neexistují žádné naplánované úkoly pro servery, které je třeba spustit.',
'error_message' => 'Došlo k chybě při zpracování plánu: ',
],
],
'upgrade' => [
'integrity' => 'Tento příkaz neověřuje celistvost stažených aktiv. Před pokračováním se ujistěte, že věříte zdroji stahování. Pokud si nepřejete stáhnout archiv, prosím upřesněte, že použijete parametr --skip-download nebo odpovědět "ne" na níže uvedenou otázku.',
'source_url' => 'Zdroj stahování (nastavit pomocí --url=):',
'php_version' => 'Nelze spustit proces samo-upgrade. Minimální požadovaná verze PHP je 7.4.0, máte',
'skipDownload' => 'Chcete stáhnout a rozbalit archivační soubory pro nejnovější verzi?',
'webserver_user' => 'Váš uživatel webového serveru byl detekován jako <fg=blue>[{:user}]:</> je to správně?',
'name_webserver' => 'Zadejte prosím jméno uživatele, který běží na vašem webovém serveru. To se liší od systému po systém, ale obecně se jedná o "www-data", "nginx" nebo "apache".',
'group_webserver' => 'Vaše webová skupina byla zjištěna jako <fg=blue>[{:group}]:</> je to správné?',
'group_webserver_question' => 'Zadejte prosím název skupiny, která běží na vašem webovém serveru. Obvykle je to stejné jako váš uživatel.',
'are_your_sure' => 'Opravdu chcete spustit proces aktualizace pro váš panel?',
'terminated' => 'Proces aktualizace byl ukončen uživatelem',
'success' => 'Panel byl úspěšně aktualizován. Ujistěte se prosím, že aktualizujete všechny daemon instance',
],
];

64
lang/cs/exceptions.php Normal file
View File

@@ -0,0 +1,64 @@
<?php
return [
'daemon_connection_failed' => 'Při pokusu o komunikaci s daemonem došlo k výjimce, což vedlo k HTTP/:code kódu odpovědi. Tato výjimka byla zaznamenána.',
'node' => [
'servers_attached' => 'Uzel nesmí mít žádné servery spojené s ním, aby mohl být odstraněn.',
'error_connecting' => 'Chyba při připojování k :node',
'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 daemonu byly aplikovány.',
],
'allocations' => [
'server_using' => 'Server je v současné době přiřazen k této alokaci. Přidělení může být odstraněno pouze v případě, že žádný server není aktuálně přiřazen.',
'too_many_ports' => 'Přidání více než 1000 portů v jednom rozsahu najednou není podporováno.',
'invalid_mapping' => 'Mapování poskytováno pro :port bylo neplatné a nelze jej zpracovat.',
'cidr_out_of_range' => 'Poznámka CIDR umožňuje pouze masky mezi /25 a /32.',
'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, které jsou k němu připojeny, nemůže být odstraněna z panelu.',
'invalid_copy_id' => 'Vejce vybraná pro kopírování skriptu buď neexistuje, nebo kopíruje 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í být pro toto vejce jedinečná.',
'reserved_name' => 'Proměnná prostředí :name je chráněná a nemůže být přiřazena k proměnné.',
'bad_validation_rule' => 'Pravidlo ověření „:rule“ není platným pravidlem pro tuto aplikaci.',
],
'importer' => [
'json_error' => 'Při pokusu o analyzování souboru JSON došlo k chybě: :error.',
'file_error' => 'Poskytnutý soubor JSON není platný.',
'invalid_json_provided' => 'Poskytnutý soubor JSON není ve formátu, který lze rozpoznat.',
],
'subusers' => [
'editing_self' => 'Úprava vlastního poduživatele není povolena.',
'user_is_owner' => 'Nemůžete přidat vlastníka serveru jako poduživatele pro tento server.',
'subuser_exists' => 'Uživatel s touto e-mailovou adresou je již přiřazen jako subuživatel pro tento server.',
],
'databases' => [
'delete_has_databases' => 'Nelze odstranit databázový hostitelský server, který obsahuje aktivní databáze, které jsou k němu připojeny.',
],
'tasks' => [
'chain_interval_too_long' => 'Maximální interval pro zadaný úkol je 15 minut.',
],
'locations' => [
'has_nodes' => 'Nelze odstranit umístění, které má k němu připojené aktivní uzly.',
],
'users' => [
'is_self' => 'Nelze odstranit vlastní uživatelský účet.',
'has_servers' => 'Nelze odstranit uživatele s aktivním serverem připojeným k jeho účtu. Před pokračováním prosím odstraňte jeho servery.',
'node_revocation_failed' => 'Nepodařilo se zrušit klíče na <a href=":link">uzel #:node</a>. :error',
],
'deployment' => [
'no_viable_nodes' => 'Nebyly nalezeny žádné uzly splňující požadavky stanovené pro automatické spuštění.',
'no_viable_allocations' => 'Nebyly nalezeny žádné příděly splňující požadavky pro automatické nasazení.',
],
'api' => [
'resource_not_found' => 'Požadovaný zdroj na tomto serveru neexistuje.',
],
'mount' => [
'servers_attached' => 'Připojení nesmí mít připojené žádné servery, aby mohlo být odstraněno.',
],
'server' => [
'marked_as_failed' => 'Tento server ještě nedokončil instalační proces, zkuste to prosím později.',
],
];

19
lang/cs/pagination.php Normal file
View File

@@ -0,0 +1,19 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Pagination Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used by the paginator library to build
| the simple pagination links. You are free to change them to anything
| you want to customize your views to better match your application.
|
*/
'previous' => '&laquo; Předchozí',
'next' => 'Další &raquo;',
];

22
lang/cs/passwords.php Normal file
View File

@@ -0,0 +1,22 @@
<?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
| outcome such as failure due to an invalid password / reset token.
|
*/
'reset' => 'Vaše heslo bylo obnoveno.',
'sent' => 'Zaslali jsme e-mail s odkazem pro obnovení hesla.',
'throttled' => 'Počkejte prosím před dalším pokusem.',
'token' => 'Tento odkaz pro reset hesla je neplatný.',
'user' => 'Nelze najít uživatele s touto e-mailovou adresou.',
];

54
lang/cs/profile.php Normal file
View File

@@ -0,0 +1,54 @@
<?php
return [
'title' => 'Profil',
'tabs' => [
'account' => 'Účet',
'oauth' => 'OAuth',
'activity' => 'Aktivita',
'api_keys' => 'API klíče',
'ssh_keys' => 'SSH klíče',
'2fa' => '2FA',
'customization' => 'Přizpůsobení',
],
'username' => 'Uživatelské jméno',
'exit_admin' => 'Ukončit administrátora',
'email' => 'E-mail',
'password' => 'Heslo',
'current_password' => 'Aktuální heslo',
'password_confirmation' => 'Potvrzení hesla',
'timezone' => 'Časové pásmo',
'language' => 'Jazyk',
'language_help' => 'Váš jazyk :state nebyl dosud přeložen!',
'link' => 'Odkaz ',
'unlink' => 'Odpojit ',
'unlinked' => ':name odpojeno',
'scan_qr' => 'Naskenovat QR kód',
'code' => 'Kód',
'setup_key' => 'Nastavit Klíč!',
'invalid_code' => 'Neplatný kód 2FA',
'code_help' => 'Naskenujte výše uvedený QR kód pomocí dvoufázové ověřovací aplikace, poté zadejte generovaný kód.',
'2fa_enabled' => 'Dvoufázové ověření je momentálně povoleno!',
'backup_help' => 'Ty nebudou znovu zobrazeny!',
'backup_codes' => 'Záložní kódy',
'disable_2fa' => 'Zakázat 2FA',
'disable_2fa_help' => 'Zadejte svůj aktuální 2FA kód pro vypnutí dvoufázového ověřování',
'keys' => 'Klíče',
'create_key' => 'Vytvořit klíč API',
'key_created' => 'Klíč vytvořen',
'description' => 'Popis',
'allowed_ips' => 'Povolené IP',
'allowed_ips_help' => 'Stiskněte Enter pro přidání nové IP adresy nebo ponechte prázdné pro povolení jakékoli IP adresy',
'dashboard' => 'Přehled',
'dashboard_layout' => 'Rozložení přehledu',
'console' => 'Konzole',
'grid' => 'Mřížka',
'table' => 'Tabulka',
'rows' => 'Řádky',
'font_size' => 'Velikost písma',
'font' => 'Písmo',
'font_preview' => 'Náhled fontu',
'seconds' => 'Sekundy',
'graph_period' => 'Perioda grafu',
'graph_period_helper' => 'Množství datových bodů, sekund, zobrazené na grafech konzoly.',
];

9
lang/cs/search.php Normal file
View File

@@ -0,0 +1,9 @@
<?php
return [
'validation' => 'Pro zahájení hledání zadejte alespoň tři znaky.',
'term' => [
'label' => 'Hledaný výraz',
'description' => 'Zadejte název serveru, uuid, nebo alokaci pro zahájení vyhledávání.',
],
];

101
lang/cs/validation.php Normal file
View File

@@ -0,0 +1,101 @@
<?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 musí být přijat.',
'active_url' => ':attribute není platná URL adresa.',
'after' => ':attribute nemůže být dříve než :date.',
'after_or_equal' => ':attribute musí být datum po nebo stejné jako :date.',
'alpha' => ':attribute smí obsahovat pouze písmena.',
'alpha_dash' => ':attribute smí obsahovat pouze písmena, čísla a pomlčky.',
'alpha_num' => ':attribute může obsahovat pouze písmena a čísla.',
'array' => ':attribute musí být pole.',
'before' => ':attribute musí mít datum před :date.',
'before_or_equal' => ':attribute musí být datum před nebo stejné jako :date.',
'between' => [
'numeric' => ':attribute musí být v rozmezí :min až :max.',
'file' => ':attribute musí být mezi :min a :max kilobajtů.',
'string' => ':attribute musí být v rozmezí :min až :max znaků.',
'array' => ':attribute musí mít v rozmezí :min až :max položek.',
],
'confirmed' => 'Potvrzení :attribute se neshoduje.',
'date' => ':attribute není platné datum.',
'date_format' => ':attribute neodpovídá formátu :formát.',
'different' => ':attribute a :other musí být odlišné.',
'digits' => ':attribute musí obsahovat :digits číslic.',
'digits_between' => ':attribute musí mít délku mezi :min a :max číslicemi.',
'dimensions' => ':attribute má neplatné rozměry obrázku.',
'email' => ':attribute musí obsahovat platnou e-mailovou adresu.',
'file' => ':attribute musí být soubor.',
'filled' => 'Pole :attribute je povinné.',
'image' => ':attribute musí být obrázek.',
'in_array' => 'Pole :attribute neexistuje v :other',
'integer' => ':attribute musí být celé číslo.',
'ip' => ':attribute musí obsahovat platnou IP adresu.',
'json' => ':attribute musí být platný řetězec JSON.',
'max' => [
'numeric' => ':attribute nesmí být delší než :max.',
'file' => ':attribute nesmí být vyšší než :max kilobajtů.',
'string' => ':attribute nesmí být větší než :max znaků.',
'array' => ':attribute nesmí obsahovat více než :max položek.',
],
'mimes' => 'Atribut: musí být soubor typu: :values.',
'mimetypes' => 'Atribut: musí být soubor typu: :values.',
'min' => [
'numeric' => ':attribute musí být alespoň :min.',
'file' => ':attribute musí být alespoň :min kilobajtů.',
'string' => 'Atribut musí být dlouhý alespoň :min znaků.',
'array' => ':attribute musí obsahovat alespoň :min položek.',
],
'numeric' => ':attribute musí být číslo.',
'regex' => 'Formát :attribute je neplatný.',
'required_with_all' => 'Pole :attribute je vyžadováno, pokud je zvoleno :values.',
'same' => 'Atribut :attribute a :other se musí shodovat.',
'size' => [
'numeric' => ':attribute musí mít velikost :size.',
'file' => ':attribute musí mít velikost :size Kb.',
'string' => ':attribute musí mít :size znaků.',
'array' => ':attribute musí obsahovat :size položek.',
],
'string' => 'Atribut musí být textový řetězec.',
'timezone' => ':attribute musí být platná zóna.',
'url' => 'Formát :attribute není platný.',
/*
|--------------------------------------------------------------------------
| 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 proměnná',
'invalid_password' => 'Zadané heslo pro tento účet je neplatné.',
],
];

27
lang/da/admin/apikey.php Normal file
View File

@@ -0,0 +1,27 @@
<?php
return [
'title' => 'Applikations API-nøgler',
'empty_table' => 'Ingen API nøgler.',
'whitelist' => 'Whitelisted IPv4-adresser',
'whitelist_help' => 'API-nøgler kan begrænses til kun at fungere fra bestemte IPv4-adresser. Angiv hver adresse på en ny linje.',
'whitelist_placeholder' => 'Eksempel: 127.0.0.1 eller 192.168.1.1',
'description' => 'Beskriveslse',
'description_help' => 'En kort beskrivelse af, hvad denne nøgle er til.',
'nav_title' => 'API-nøgler',
'model_label' => 'Applikations API-nøgle',
'model_label_plural' => 'Applikation API Nøgler',
'table' => [
'key' => 'Nøgle',
'description' => 'Beskriveslse',
'last_used' => 'Sidst brugt',
'created' => 'Oprettet',
'created_by' => 'Oprettet af',
'never_used' => 'Aldrig brugt',
],
'permissions' => [
'none' => 'Ingen',
'read' => 'Læse',
'read_write' => 'Læse og skrive',
],
];

View File

@@ -0,0 +1,44 @@
<?php
return [
'heading' => 'Velkommen til Pelican!',
'version' => 'Version: :version',
'advanced' => 'Avanceret',
'server' => 'Server',
'user' => 'Bruger',
'sections' => [
'intro-developers' => [
'heading' => 'Information til udviklere',
'content' => 'Tak for at prøve udviklingsversionen!',
'extra_note' => 'Hvis du løber ind i problemer, kan du rapportere dem på GitHub.',
'button_issues' => 'Opret Problem',
'button_features' => 'Diskutér Features',
],
'intro-update-available' => [
'heading' => 'Opdatering tilgængelig',
'content' => ':latestVersion er nu tilgængelig! Læs vores dokumentation for at opdatere dit panel.',
],
'intro-no-update' => [
'heading' => 'Panelet er opdateret',
'content' => 'Du benytter i øjeblikket :version. Dit panel er opdateret!',
],
'intro-first-node' => [
'heading' => 'Ingen Nodes fundet',
'content' => 'Ser ikke ud til at der er nogen nodes opsat endnu, klik på handlingsknappen for at oprette den første!',
'extra_note' => 'Hvis du løber ind i nogen problemer, bedes du rapportere dem på GitHub.',
'button_label' => 'Opret den første node i Pelican',
],
'intro-support' => [
'heading' => 'Støt Pelican',
'content' => 'Tak fordi du bruger Pelican, det kunne kun lade sig gøre med støtte fra dig, vores bidragsydere og resten af vores støtter!',
'extra_note' => 'Vi sætter pris på enhver form for støtte fra alle.',
'button_translate' => 'Hjælp os med at oversætte',
'button_donate' => 'Doner Direkte',
],
'intro-help' => [
'heading' => 'Brug for hjælp?',
'content' => 'Tjek dokumentationen først! Hvis du stadig har brug for hjælp, så tilslut dig vores Discord server!',
'button_docs' => 'Læs dokumentation',
],
],
];

View File

@@ -0,0 +1,74 @@
<?php
return [
'nav_title' => 'Database Host',
'model_label' => 'Database Host',
'model_label_plural' => 'Database servere',
'table' => [
'database' => 'Database',
'name' => 'Navn',
'host' => 'Host',
'port' => 'Port',
'name_helper' => 'Efterlades dette tomt vil der automatisk genereres et tilfældigt navn',
'username' => 'Brugernavn',
'password' => 'Adgangskode',
'remote' => 'Forbindelser fra',
'remote_helper' => 'Hvor forbindelser skal tillades fra. Efterlad blank for at tillade forbindelser fra hvor som helst.',
'max_connections' => 'Maks. forbindelser',
'created_at' => 'Oprettet den',
'connection_string' => 'JDBC-forbindelsesstreng',
],
'error' => 'Fejl ved tilslutning til serveren',
'host' => 'Host',
'host_help' => 'IP-adressen eller domænenavnet, der skal bruges for at oprette forbindelse til denne MySQL server fra panelet for at oprette nye databaser.',
'port' => 'Port',
'port_help' => 'Porten som MySQL kører på ved denne host.',
'max_database' => 'Maks. databaser',
'max_databases_help' => 'Det maksimale antal databaser, som kan oprettes på denne server. Nås kvoten, kan der ikke oprettes flere databaser. Lad stå tomt for ubegrænset.',
'display_name' => 'Visningsnavn',
'display_name_help' => 'En kort identifikation brugt til at adskille denne vært fra andre. Skal være mellem 1 og 60 tegn, f.eks. "us.nyc.lvl3"',
'username' => 'Brugernavn',
'username_help' => 'Brugernavnet på en konto med tilstrækkelige tilladelser til at oprette nye brugere og databaser på systemet.',
'password' => 'Adgangskode',
'password_help' => 'Adgangskoden til databasebrugeren.',
'linked_nodes' => 'Linket Nodes',
'linked_nodes_help' => 'Denne indstilling er kun standard for denne database host, når der føjes en database til en server på den valgte node.',
'connection_error' => 'Fejl under tilslutning til database serveren',
'no_database_hosts' => 'Ingen database servere',
'no_nodes' => 'Ingen noder',
'delete_help' => 'Database serveren har stadig databaser',
'unlimited' => 'Ubegrænset',
'anywhere' => 'Hvor som helst',
'rotate' => 'Rotation',
'rotate_password' => 'Roter Adgangskode',
'rotated' => 'Adgangskode skiftet',
'rotate_error' => 'Adgangskoderotation mislykkedes',
'databases' => 'Databaser',
'setup' => [
'preparations' => 'Forberedelser',
'database_setup' => 'Database Opsætning',
'panel_setup' => 'Panel Opsætning',
'note' => 'I øjeblikket understøttes kun MySQL/MariaDB databaser som databaseværter!',
'different_server' => 'Er panelet og databasen <i>ikke</i> på samme server?',
'database_user' => 'Databasebruger',
'cli_login' => 'Brug <code>mysql -u root -p</code> for at tilgå mysql cli.',
'command_create_user' => 'Kommando til at oprette brugeren',
'command_assign_permissions' => 'Kommando til at tildele rettigheder',
'cli_exit' => 'For at afslutte mysql cli, kør <code>exit</code>.',
'external_access' => 'Ekstern Adgang',
'allow_external_access' => '
<p>Det er sandsynligt, at du skal tillade ekstern adgang til denne MySQL-instans for at lade servere oprette forbindelse til den.</p>
<br>
<p>For at gøre dette skal du åbne <code>my.cnf</code>, hvis placering varierer afhængigt af dit operativsystem og hvordan MySQL blev installeret. Du kan bruge kommandoen find <code>/etc -iname my.cnf</code> for at finde den.</p>
<br>
<p>Åbn <code>my.cnf</code>, tilføj følgende tekst nederst i filen og gem den:<br>
<code>[mysqld]<br>bind-address=0.0.0.0</code></p>
<br>
<p>Genstart MySQL/MariaDB for at anvende ændringerne. Dette vil overskrive standardkonfigurationen, som udgangspunkt kun accepterer forbindelser fra localhost. Ved at opdatere dette tillades forbindelser fra alle netværksgrænseflader altså også eksterne forbindelser. Husk også at åbne MySQL-porten (standard: 3306) i din firewall.</p>
',
],
];

92
lang/da/admin/egg.php Normal file
View File

@@ -0,0 +1,92 @@
<?php
return [
'nav_title' => 'Æg',
'model_label' => 'Æg',
'model_label_plural' => 'Æg',
'tabs' => [
'configuration' => 'Opsætning',
'process_management' => 'Proceshåndtering',
'egg_variables' => 'Egg-variabler',
'install_script' => 'Installations-script',
],
'import' => [
'file' => 'Fil',
'url' => 'URL',
'egg_help' => 'Dette bør være den rå .json-fil ( egg-minecraft.json )',
'url_help' => 'URL\'er skal pege direkte på den rå .json-fil',
'add_url' => 'Ny URL',
'import_failed' => 'Import mislykkedes',
'import_success' => 'Import udført',
'github' => 'Tilføj fra Github',
'refresh' => 'Opdater',
],
'in_use' => 'I brug',
'servers' => 'Servere',
'name' => 'Navn',
'egg_uuid' => 'Egg-UUID',
'egg_id' => 'Egg-ID',
'name_help' => 'Et simpelt, menneskeligt navn til brug som en identifikator for dette Egg.',
'author' => 'Forfatter',
'uuid_help' => 'Dette er den globale, unikke identifikation for dette æg, som Wings bruger som en identifikator.',
'author_help' => 'Forfatteren til denne version af ægget.',
'author_help_edit' => 'Forfatteren til denne version af ægget. Upload en ny konfiguration fra en anden forfatter for at ændre dette.',
'description' => 'Beskriveslse',
'description_help' => 'En beskrivelse af dette æg vist i panelet efter behov.',
'startup' => 'Opstartskommando',
'startup_help' => 'Standard opstartskommando brugt til nye servere, som bruger dette æg.',
'file_denylist' => 'Filsortlist',
'file_denylist_help' => 'En liste over filer, som slutbrugeren ikke må redigere.',
'features' => 'Features',
'force_ip' => 'Tving udgående IP',
'force_ip_help' => 'Tvinger al udgående netværkstrafik til at have sin Kilde-IP NAT\'et til serverens primære tildelte IP.
Kræves, for at visse spil fungerer korrekt, når noden har flere offentlige IP-adresser.
Aktivering af denne mulighed deaktiverer intern netværkstrafik for alle servere, som bruger dette Egg, hvilket betyder, at de ikke internt kan tilgå andre servere på samme node',
'tags' => 'Tags',
'update_url' => 'Opdatér URL',
'update_url_help' => 'URL\'er skal pege direkte på den rå .json-fil',
'add_image' => 'Tilføj Docker-billede',
'docker_images' => 'Docker-billeder',
'docker_name' => 'Billednavn',
'docker_uri' => 'Billede-URI',
'docker_help' => 'Docker-billeder tilgængelige for servere, som bruger dette Egg.',
'stop_command' => 'Stopkommando',
'stop_command_help' => 'Kommandoen, der skal sendes til serverprocesser for at stoppe dem yndefuldt. Ved behov for at sende en SIGINT, angiv ^C her.',
'copy_from' => 'Kopiér indstillinger fra',
'copy_from_help' => 'Ønskes tilbagefald til standardindstillingerne fra et andet Eeg, vælg det fra menuen ovenfor.',
'none' => 'Ingen',
'start_config' => 'Start opsætning',
'start_config_help' => 'Liste over værdier dæmonen skal lede efter ved opstart af en server for at bestemme færdiggørelsen.',
'config_files' => 'Konfigurationsfiler',
'config_files_help' => 'Dette bør være en JSON-repræsentation af opsætningsfiler til ændring, og hvilke dele, som skal ændres.',
'log_config' => 'Start opsætning',
'log_config_help' => 'Dette skal være en JSON-repræsentation af, hvor logfiler gemmes, og hvorvidt dæmonen skal oprette tilpassede logger.',
'environment_variable' => 'Miljøvariabel',
'default_value' => 'Standardværdi',
'user_permissions' => 'Brugertilladelser',
'viewable' => 'Synlig',
'editable' => 'Redigerbar',
'rules' => 'Regler',
'add_new_variable' => 'Tilføj ny variabel',
'error_unique' => 'En variabel med dette navn findes allerede.',
'error_required' => 'Miljøvariabel obligatorisk.',
'error_reserved' => 'Denne miljøvariabel er reserveret og kan ikke anvendes.',
'script_from' => 'Script fra',
'script_container' => 'Script-kontainer',
'script_entry' => 'Script-post',
'script_install' => 'Installations-script',
'no_eggs' => 'Ingen Eggs',
'no_servers' => 'Ingen Servere',
'no_servers_help' => 'Ingen servere tildelt dette Egg.',
'update' => 'Opdater|Opdater valgte',
'updated' => 'Æg opdateret|:count/:total Æg opdateret',
'updated_failed' => ':count mislykkedes',
'update_question' => 'Er du sikker på, at du vil opdatere dette æg?|Er du sikker på, at du vil opdatere de valgte æg?',
'update_description' => 'Hvis du har foretaget ændringer i ægget, vil de blive overskrevet!|Hvis du har foretaget ændringer i æggene, vil de blive overskrevet!',
'no_updates' => 'Ingen opdateringer til de valgte æg tilgængelige',
];

Some files were not shown because too many files have changed in this diff Show More